Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions include/i2c/i2c.h
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@ extern "C" {
#include <linux/i2c.h>
#include <linux/i2c-dev.h>

#define MAX_I2C_MSG_LEN 8192

/* I2c device */
typedef struct i2c_device {
int bus; /* I2C Bus fd, return from i2c_open */
Expand Down
20 changes: 11 additions & 9 deletions src/i2c.c
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand All @@ -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;
}


Expand Down