From 86f47476b2a4780fd1152a7e06ff03a6d336bce0 Mon Sep 17 00:00:00 2001 From: mstroh76 Date: Sun, 28 Apr 2024 16:33:16 +0200 Subject: [PATCH] #212 wiringPiI2CReadBlockData and wiringPiI2CWriteBlockData --- wiringPi/wiringPiI2C.c | 27 ++++++++++++++++++++++++++- wiringPi/wiringPiI2C.h | 4 ++++ 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/wiringPi/wiringPiI2C.c b/wiringPi/wiringPiI2C.c index 3fa787d..51f92dd 100644 --- a/wiringPi/wiringPiI2C.c +++ b/wiringPi/wiringPiI2C.c @@ -47,7 +47,6 @@ #include #include -#include #include #include #include @@ -154,6 +153,21 @@ int wiringPiI2CReadReg16 (int fd, int reg) return data.word & 0xFFFF ; } +int wiringPiI2CReadBlockData (int fd, int reg, uint8_t size, uint8_t *values) +{ + union i2c_smbus_data data; + + if (size>I2C_SMBUS_BLOCK_MAX) { + size = I2C_SMBUS_BLOCK_MAX; + } + data.block[0] = size; + int result = i2c_smbus_access (fd, I2C_SMBUS_READ, reg, I2C_SMBUS_I2C_BLOCK_DATA, &data); + if (result<0) { + return result; + } + memcpy(values, &data.block[1], size); + return data.block[0]; +} /* * wiringPiI2CWrite: @@ -189,6 +203,17 @@ int wiringPiI2CWriteReg16 (int fd, int reg, int value) return i2c_smbus_access (fd, I2C_SMBUS_WRITE, reg, I2C_SMBUS_WORD_DATA, &data) ; } +int wiringPiI2CWriteBlockData (int fd, int reg, uint8_t size, const uint8_t *values) +{ + union i2c_smbus_data data; + + if (size>I2C_SMBUS_BLOCK_MAX) { + size = I2C_SMBUS_BLOCK_MAX; + } + data.block[0] = size; + memcpy(&data.block[1], values, size); + return i2c_smbus_access (fd, I2C_SMBUS_WRITE, reg, I2C_SMBUS_BLOCK_DATA, &data) ; +} /* * wiringPiI2CSetupInterface: diff --git a/wiringPi/wiringPiI2C.h b/wiringPi/wiringPiI2C.h index 73f031c..5734bdb 100644 --- a/wiringPi/wiringPiI2C.h +++ b/wiringPi/wiringPiI2C.h @@ -22,6 +22,8 @@ *********************************************************************** */ +#include + #ifdef __cplusplus extern "C" { #endif @@ -29,10 +31,12 @@ extern "C" { extern int wiringPiI2CRead (int fd) ; extern int wiringPiI2CReadReg8 (int fd, int reg) ; extern int wiringPiI2CReadReg16 (int fd, int reg) ; +extern int wiringPiI2CReadBlockData (int fd, int reg, uint8_t size, uint8_t *values); extern int wiringPiI2CWrite (int fd, int data) ; extern int wiringPiI2CWriteReg8 (int fd, int reg, int data) ; extern int wiringPiI2CWriteReg16 (int fd, int reg, int data) ; +extern int wiringPiI2CWriteBlockData (int fd, int reg, uint8_t size, const uint8_t *values); extern int wiringPiI2CSetupInterface (const char *device, int devId) ; extern int wiringPiI2CSetup (const int devId) ;