aboutsummaryrefslogtreecommitdiff
path: root/apps
diff options
context:
space:
mode:
authorpx4dev <px4@purgatory.org>2013-01-14 00:18:05 -0800
committerpx4dev <px4@purgatory.org>2013-01-14 00:18:05 -0800
commit6e291ddedc8b2d7bfeae8029a37df0b581262796 (patch)
tree0b28019942cd153efd710799be0528783f70bc70 /apps
parent4e38615595abd9d27d0cb000caafb98cc3670abe (diff)
downloadpx4-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.cpp20
-rw-r--r--apps/drivers/device/i2c.h10
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