ret = serdev_device_write(serdev, txbuf, txsize, SCD30_SERDEV_TIMEOUT); if (ret < 0) return ret; if (ret != txsize) return -EIO;
ret = wait_for_completion_interruptible_timeout(&priv->meas_ready, SCD30_SERDEV_TIMEOUT); if (ret < 0) return ret; if (!ret) return -ETIMEDOUT;
return 0;
}
staticint scd30_serdev_command(struct scd30_state *state, enum scd30_cmd cmd, u16 arg, void *response, int size)
{ /* * Communication over serial line is based on modbus protocol (or rather * its variation called modbus over serial to be precise). Upon * receiving a request device should reply with response. * * Frame below represents a request message. Each field takes * exactly one byte. * * +------+------+-----+-----+-------+-------+-----+-----+ * | dev | op | reg | reg | byte1 | byte0 | crc | crc | * | addr | code | msb | lsb | | | lsb | msb | * +------+------+-----+-----+-------+-------+-----+-----+ * * The message device replies with depends on the 'op code' field from * the request. In case it was set to SCD30_SERDEV_WRITE sensor should * reply with unchanged request. Otherwise 'op code' was set to * SCD30_SERDEV_READ and response looks like the one below. As with * request, each field takes one byte. * * +------+------+--------+-------+-----+-------+-----+-----+ * | dev | op | num of | byte0 | ... | byteN | crc | crc | * | addr | code | bytes | | | | lsb | msb | * +------+------+--------+-------+-----+-------+-----+-----+
*/ char txbuf[SCD30_SERDEV_MAX_BUF_SIZE] = { SCD30_SERDEV_ADDR },
rxbuf[SCD30_SERDEV_MAX_BUF_SIZE]; int ret, rxsize, txsize = 2; char *rsp = response;
u16 crc;
ret = scd30_serdev_xfer(state, txbuf, txsize, rxbuf, rxsize); if (ret) return ret;
switch (txbuf[1]) { case SCD30_SERDEV_WRITE: if (memcmp(txbuf, rxbuf, txsize)) {
dev_err(state->dev, "wrong message received\n"); return -EIO;
} break; case SCD30_SERDEV_READ: if (rxbuf[2] != (rxsize - SCD30_SERDEV_RX_HEADER_SIZE - SCD30_SERDEV_CRC_SIZE)) {
dev_err(state->dev, "received data size does not match header\n"); return -EIO;
}
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.