aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorpx4dev <px4@purgatory.org>2013-01-26 13:15:57 -0800
committerpx4dev <px4@purgatory.org>2013-01-26 13:15:57 -0800
commit4ea8a64b395026d7df8739bc6c76ea121ee6b977 (patch)
treec691d003975b56953b60c51f4720d8cd850bfff0
parent72fcc8aad32936692814f4e9521a462bedc6c723 (diff)
downloadpx4-firmware-4ea8a64b395026d7df8739bc6c76ea121ee6b977.tar.gz
px4-firmware-4ea8a64b395026d7df8739bc6c76ea121ee6b977.tar.bz2
px4-firmware-4ea8a64b395026d7df8739bc6c76ea121ee6b977.zip
Correct the length calculation for register write transfers so that we send all of the requested registers.
-rw-r--r--apps/drivers/px4io/px4io.cpp15
1 files changed, 11 insertions, 4 deletions
diff --git a/apps/drivers/px4io/px4io.cpp b/apps/drivers/px4io/px4io.cpp
index 769363b4a..2d7495aaa 100644
--- a/apps/drivers/px4io/px4io.cpp
+++ b/apps/drivers/px4io/px4io.cpp
@@ -820,17 +820,24 @@ PX4IO::io_reg_set(uint8_t page, uint8_t offset, const uint16_t *values, unsigned
{
uint8_t buf[_max_transfer + 2];
- if (num_values > ((_max_transfer) / sizeof(*values)))
+ /* range check the transfer */
+ if (num_values > ((_max_transfer) / sizeof(*values))) {
+ debug("io_reg_set: too many registers (%u, max %u)", num_values, _max_transfer / 2);
return -EINVAL;
- unsigned datalen = num_values * sizeof(*values);
+ }
+ /* set page/offset address */
buf[0] = page;
buf[1] = offset;
- if (num_values > 0)
+ /* copy data into our local transfer buffer */
+ /* XXX we could use a msgv and two transactions, maybe? */
+ unsigned datalen = num_values * sizeof(*values);
+ if (datalen > 0)
memcpy(&buf[2], values, datalen);
- int ret = transfer(buf, datalen, nullptr, 0);
+ /* perform the transfer */
+ int ret = transfer(buf, datalen + 2, nullptr, 0);
if (ret != OK)
debug("io_reg_set: error %d", ret);
return ret;