staticint scd30_i2c_xfer(struct scd30_state *state, char *txbuf, int txsize, char *rxbuf, int rxsize)
{ struct i2c_client *client = to_i2c_client(state->dev); int ret;
/* * repeated start is not supported hence instead of sending two i2c * messages in a row we send one by one
*/
ret = i2c_master_send(client, txbuf, txsize); if (ret < 0) return ret; if (ret != txsize) return -EIO;
if (!rxbuf) return 0;
ret = i2c_master_recv(client, rxbuf, rxsize); if (ret < 0) return ret; if (ret != rxsize) return -EIO;
return 0;
}
staticint scd30_i2c_command(struct scd30_state *state, enum scd30_cmd cmd, u16 arg, void *response, int size)
{ char buf[SCD30_I2C_MAX_BUF_SIZE]; char *rsp = response; int i, ret; char crc;
put_unaligned_be16(scd30_i2c_cmd_lookup_tbl[cmd], buf);
i = 2;
if (rsp) { /* each two bytes are followed by a crc8 */
size += size / 2;
} else {
put_unaligned_be16(arg, buf + i);
crc = crc8(scd30_i2c_crc8_tbl, buf + i, 2, CRC8_INIT_VALUE);
i += 2;
buf[i] = crc;
i += 1;
/* commands below don't take an argument */ if ((cmd == CMD_STOP_MEAS) || (cmd == CMD_RESET))
i -= 3;
}
ret = scd30_i2c_xfer(state, buf, i, buf, size); if (ret) return ret;
/* validate received data and strip off crc bytes */ for (i = 0; i < size; i += 3) {
crc = crc8(scd30_i2c_crc8_tbl, buf + i, 2, CRC8_INIT_VALUE); if (crc != buf[i + 2]) {
dev_err(state->dev, "data integrity check failed\n"); return -EIO;
}
*rsp++ = buf[i];
*rsp++ = buf[i + 1];
}
return 0;
}
staticint scd30_i2c_probe(struct i2c_client *client)
{ if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) return -EOPNOTSUPP;
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.