diff options
author | px4dev <px4@purgatory.org> | 2013-01-26 13:15:57 -0800 |
---|---|---|
committer | px4dev <px4@purgatory.org> | 2013-01-26 13:15:57 -0800 |
commit | 4ea8a64b395026d7df8739bc6c76ea121ee6b977 (patch) | |
tree | c691d003975b56953b60c51f4720d8cd850bfff0 | |
parent | 72fcc8aad32936692814f4e9521a462bedc6c723 (diff) | |
download | px4-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.cpp | 15 |
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; |