From b8669dc2090b79ee5627fb0ea656715f3dd413d3 Mon Sep 17 00:00:00 2001 From: Zi Zhou Date: Tue, 1 Nov 2016 15:22:20 -0700 Subject: [PATCH] support SMBus block read --- .../base/any/onlp/src/onlplib/module/inc/onlplib/i2c.h | 5 +++++ packages/base/any/onlp/src/onlplib/module/src/i2c.c | 10 ++++++++-- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/packages/base/any/onlp/src/onlplib/module/inc/onlplib/i2c.h b/packages/base/any/onlp/src/onlplib/module/inc/onlplib/i2c.h index 39741014..e41ae0c0 100644 --- a/packages/base/any/onlp/src/onlplib/module/inc/onlplib/i2c.h +++ b/packages/base/any/onlp/src/onlplib/module/inc/onlplib/i2c.h @@ -66,6 +66,11 @@ */ #define ONLP_I2C_F_USE_BLOCK_READ 0x20 +/** + * Use SMBUS block reads if possible. + */ +#define ONLP_I2C_F_USE_SMBUS_BLOCK_READ 0x40 + /** * @brief Open and prepare for reading or writing. * @param bus The i2c bus number. diff --git a/packages/base/any/onlp/src/onlplib/module/src/i2c.c b/packages/base/any/onlp/src/onlplib/module/src/i2c.c index 480f7631..6c8ee372 100644 --- a/packages/base/any/onlp/src/onlplib/module/src/i2c.c +++ b/packages/base/any/onlp/src/onlplib/module/src/i2c.c @@ -105,11 +105,17 @@ onlp_i2c_block_read(int bus, uint8_t addr, uint8_t offset, int size, int count = size; uint8_t* p = rdata; while(count > 0) { + int rv; int rsize = (count >= ONLPLIB_CONFIG_I2C_BLOCK_SIZE) ? ONLPLIB_CONFIG_I2C_BLOCK_SIZE : count; - int rv = i2c_smbus_read_i2c_block_data(fd, - p - rdata, + if(flags & ONLP_I2C_F_USE_SMBUS_BLOCK_READ) { + rv = i2c_smbus_read_block_data(fd, offset, p); + } else { + rv = i2c_smbus_read_i2c_block_data(fd, + offset, rsize, p); + offset += rsize; + } if(rv != rsize) { AIM_LOG_ERROR("i2c-%d: reading address 0x%x, offset %d, size=%d failed: %{errno}",