|
|
|
@ -137,16 +137,60 @@ uint8_t LinuxI2CDriver::read(uint8_t addr, uint8_t len, uint8_t* data)
@@ -137,16 +137,60 @@ uint8_t LinuxI2CDriver::read(uint8_t addr, uint8_t len, uint8_t* data)
|
|
|
|
|
uint8_t LinuxI2CDriver::readRegisters(uint8_t addr, uint8_t reg, |
|
|
|
|
uint8_t len, uint8_t* data) |
|
|
|
|
{ |
|
|
|
|
if (!set_address(addr)) { |
|
|
|
|
struct i2c_msg msgs[] = { |
|
|
|
|
{ |
|
|
|
|
addr : addr, |
|
|
|
|
flags : 0, |
|
|
|
|
len : 1, |
|
|
|
|
buf : ® |
|
|
|
|
}, |
|
|
|
|
{ |
|
|
|
|
addr : addr, |
|
|
|
|
flags : I2C_M_RD, |
|
|
|
|
len : len, |
|
|
|
|
buf : data, |
|
|
|
|
} |
|
|
|
|
}; |
|
|
|
|
struct i2c_rdwr_ioctl_data i2c_data = { |
|
|
|
|
msgs : msgs, |
|
|
|
|
nmsgs : 2 |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
if (ioctl(_fd, I2C_RDWR, &i2c_data) == -1) { |
|
|
|
|
return 1; |
|
|
|
|
} |
|
|
|
|
// send the address to read from
|
|
|
|
|
if (::write(_fd, ®, 1) != 1) { |
|
|
|
|
return 1; |
|
|
|
|
|
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|
if (::read(_fd, data, len) != len) { |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
uint8_t LinuxI2CDriver::readRegistersMultiple(uint8_t addr, uint8_t reg, |
|
|
|
|
uint8_t len,
|
|
|
|
|
uint8_t count, uint8_t* data) |
|
|
|
|
{ |
|
|
|
|
while (count > 0) { |
|
|
|
|
uint8_t n = count>8?8:count; |
|
|
|
|
struct i2c_msg msgs[2*n]; |
|
|
|
|
struct i2c_rdwr_ioctl_data i2c_data = { |
|
|
|
|
msgs : msgs, |
|
|
|
|
nmsgs : 2*n |
|
|
|
|
}; |
|
|
|
|
for (uint8_t i=0; i<n; i++) { |
|
|
|
|
msgs[i*2].addr = addr; |
|
|
|
|
msgs[i*2].flags = 0; |
|
|
|
|
msgs[i*2].len = 1; |
|
|
|
|
msgs[i*2].buf = ® |
|
|
|
|
msgs[i*2+1].addr = addr; |
|
|
|
|
msgs[i*2+1].flags = I2C_M_RD; |
|
|
|
|
msgs[i*2+1].len = len; |
|
|
|
|
msgs[i*2+1].buf = data; |
|
|
|
|
data += len; |
|
|
|
|
}; |
|
|
|
|
if (ioctl(_fd, I2C_RDWR, &i2c_data) == -1) { |
|
|
|
|
return 1; |
|
|
|
|
} |
|
|
|
|
count -= n; |
|
|
|
|
} |
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|