diff options
author | px4dev <px4@purgatory.org> | 2013-01-14 00:18:05 -0800 |
---|---|---|
committer | px4dev <px4@purgatory.org> | 2013-01-14 00:18:05 -0800 |
commit | 6e291ddedc8b2d7bfeae8029a37df0b581262796 (patch) | |
tree | 0b28019942cd153efd710799be0528783f70bc70 /apps | |
parent | 4e38615595abd9d27d0cb000caafb98cc3670abe (diff) | |
download | px4-firmware-6e291ddedc8b2d7bfeae8029a37df0b581262796.tar.gz px4-firmware-6e291ddedc8b2d7bfeae8029a37df0b581262796.tar.bz2 px4-firmware-6e291ddedc8b2d7bfeae8029a37df0b581262796.zip |
Add a mechanism for sending multi-part messages to the I2C driver base class.
Diffstat (limited to 'apps')
-rw-r--r-- | apps/drivers/device/i2c.cpp | 20 | ||||
-rw-r--r-- | apps/drivers/device/i2c.h | 10 |
2 files changed, 30 insertions, 0 deletions
diff --git a/apps/drivers/device/i2c.cpp b/apps/drivers/device/i2c.cpp index 474190d83..c513ae2b6 100644 --- a/apps/drivers/device/i2c.cpp +++ b/apps/drivers/device/i2c.cpp @@ -166,4 +166,24 @@ I2C::transfer(const uint8_t *send, unsigned send_len, uint8_t *recv, unsigned re } +int +I2C::transfer(i2c_msg_s *msgv, unsigned msgs) +{ + for (unsigned i = 0; i < msgs; i++) + msgv[i].addr = _address; + + /* + * I2C architecture means there is an unavoidable race here + * if there are any devices on the bus with a different frequency + * preference. Really, this is pointless. + */ + I2C_SETFREQUENCY(_dev, _frequency); + ret = I2C_TRANSFER(_dev, msgv, msgs); + + if (ret != OK) + up_i2creset(_dev); + + return ret; +} + } // namespace device
\ No newline at end of file diff --git a/apps/drivers/device/i2c.h b/apps/drivers/device/i2c.h index 4d630b8a8..66c34dd7c 100644 --- a/apps/drivers/device/i2c.h +++ b/apps/drivers/device/i2c.h @@ -101,6 +101,16 @@ protected: uint8_t *recv, unsigned recv_len); /** + * Perform a multi-part I2C transaction to the device. + * + * @param msgv An I2C message vector. + * @param msgs The number of entries in the message vector. + * @return OK if the transfer was successful, -errno + * otherwise. + */ + int transfer(i2c_msg_s *msgv, unsigned msgs); + + /** * Change the bus address. * * Most often useful during probe() when the driver is testing |