diff --git a/include/i2c/i2c.h b/include/i2c/i2c.h index b57f35e..6d8af84 100644 --- a/include/i2c/i2c.h +++ b/include/i2c/i2c.h @@ -9,6 +9,8 @@ extern "C" { #include #include +#define MAX_I2C_MSG_LEN 8192 + /* I2c device */ typedef struct i2c_device { int bus; /* I2C Bus fd, return from i2c_open */ diff --git a/src/i2c.c b/src/i2c.c index 2ce0d6e..6634d6b 100644 --- a/src/i2c.c +++ b/src/i2c.c @@ -214,9 +214,10 @@ ssize_t i2c_ioctl_write(const I2CDevice *device, unsigned int iaddr, const void */ ssize_t i2c_read(const I2CDevice *device, unsigned int iaddr, void *buf, size_t len) { - ssize_t cnt; + ssize_t cnt, total_read = 0; unsigned char addr[INT_ADDR_MAX_BYTES]; unsigned char delay = GET_I2C_DELAY(device->delay); + char *ptr = (char*)buf; /* Set i2c slave address */ if (i2c_select(device->bus, device->addr, device->tenbit) == -1) { @@ -237,15 +238,16 @@ ssize_t i2c_read(const I2CDevice *device, unsigned int iaddr, void *buf, size_t /* Wait a while */ i2c_delay(delay); - - /* Read count bytes data from int_addr specify address */ - if ((cnt = read(device->bus, buf, len)) == -1) { - - perror("Read i2c data error"); - return -1; + while (total_read < len) { + size_t chunk_size = (len - total_read > MAX_I2C_MSG_LEN) ? MAX_I2C_MSG_LEN : (len - total_read); + if ((cnt = read(device->bus, ptr + total_read, chunk_size)) == -1) { + perror("Read i2c data error"); + return -1; + } + total_read += cnt; + i2c_delay(delay); } - - return cnt; + return total_read; }