Skip to content

Commit 7a6bd1e

Browse files
committed
Added support for block reading and writing
Added three functions to support reading and writing blocks with a specified size to the I2C device. For writing, I added two versions, one that implicitly sends the size as the first byte to the slave device and one that doesn't.
1 parent 8ba9c23 commit 7a6bd1e

File tree

4 files changed

+57
-4
lines changed

4 files changed

+57
-4
lines changed

src/i2c-dev.c

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,4 +70,38 @@ extern inline __s32 i2c_smbus_write_word_data(int fd, int cmd, __u16 value) {
7070
return i2c_smbus_access(fd, I2C_SMBUS_WRITE, cmd, I2C_SMBUS_WORD_DATA, &data);
7171
}
7272

73+
extern inline __s32 i2c_smbus_read_data_block(int fd, int cmd, unsigned char *block, int block_size) {
74+
union i2c_smbus_data data;
75+
if (block_size > I2C_SMBUS_BLOCK_MAX) {
76+
block_size = I2C_SMBUS_BLOCK_MAX;
77+
}
78+
data.block[0] = block_size;
79+
if(i2c_smbus_access(fd, I2C_SMBUS_READ, cmd, I2C_SMBUS_I2C_BLOCK_DATA, &data) < 0) {
80+
return -1;
81+
} else {
82+
memcpy(block, data.block+1, block_size);
83+
return data.block[0];
84+
}
85+
}
86+
87+
extern inline __s32 i2c_smbus_write_data_block(int fd, int cmd, unsigned char *block, int block_size) {
88+
union i2c_smbus_data data;
89+
if (block_size > I2C_SMBUS_BLOCK_MAX) {
90+
block_size = I2C_SMBUS_BLOCK_MAX;
91+
}
92+
data.block[0] = block_size;
93+
memcpy(data.block+1, block, block_size);
94+
return i2c_smbus_access(fd, I2C_SMBUS_WRITE, cmd, I2C_SMBUS_I2C_BLOCK_BROKEN, &data);
95+
}
96+
97+
extern inline __s32 i2c_smbus_write_data_block_with_size(int fd, int cmd, unsigned char *block, int block_size) {
98+
union i2c_smbus_data data;
99+
if (block_size > I2C_SMBUS_BLOCK_MAX) {
100+
block_size = I2C_SMBUS_BLOCK_MAX;
101+
}
102+
data.block[0] = block_size;
103+
memcpy(data.block+1, block, block_size);
104+
return i2c_smbus_access(fd, I2C_SMBUS_WRITE, cmd, I2C_SMBUS_I2C_BLOCK_DATA, &data);
105+
}
106+
73107
#endif

src/i2c-dev.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,5 +34,9 @@ inline __s32 i2c_smbus_read_byte_data(int fd, int cmd);
3434
inline __s32 i2c_smbus_write_byte_data(int fd, int cmd, int value);
3535
inline __s32 i2c_smbus_read_word_data(int fd, int cmd);
3636
inline __s32 i2c_smbus_write_word_data(int fd, int cmd, __u16 value);
37+
inline __s32 i2c_smbus_read_data_block(int fd, int cmd, unsigned char *block, int block_size);
38+
inline __s32 i2c_smbus_write_data_block(int fd, int cmd, unsigned char *block, int block_size);
39+
inline __s32 i2c_smbus_write_data_block_with_size(int fd, int cmd, unsigned char *block, int block_size);
40+
3741

3842
#endif

src/wiringx.c

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -126,8 +126,8 @@ static void delayMicrosecondsHard(unsigned int howLong) {
126126
tLong.tv_sec = howLong / 1000000;
127127
tLong.tv_usec = howLong % 1000000;
128128
#else
129-
tLong.tv_sec = (__time_t)howLong / 1000000;
130-
tLong.tv_usec = (__suseconds_t)howLong % 1000000;
129+
tLong.tv_sec = (time_t)howLong / 1000000;
130+
tLong.tv_usec = (suseconds_t)howLong % 1000000;
131131
#endif
132132
timeradd(&tNow, &tLong, &tEnd);
133133

@@ -142,7 +142,7 @@ EXPORT void delayMicroseconds(unsigned int howLong) {
142142
long int uSecs = howLong % 1000000;
143143
unsigned int wSecs = howLong / 1000000;
144144
#else
145-
long int uSecs = (__time_t)howLong % 1000000;
145+
long int uSecs = (time_t)howLong % 1000000;
146146
unsigned int wSecs = howLong / 1000000;
147147
#endif
148148

@@ -154,7 +154,7 @@ EXPORT void delayMicroseconds(unsigned int howLong) {
154154
#ifdef _WIN32
155155
sleeper.tv_sec = wSecs;
156156
#else
157-
sleeper.tv_sec = (__time_t)wSecs;
157+
sleeper.tv_sec = (time_t)wSecs;
158158
#endif
159159
sleeper.tv_nsec = (long)(uSecs * 1000L);
160160
nanosleep(&sleeper, NULL);
@@ -398,6 +398,10 @@ EXPORT int wiringXI2CReadReg16(int fd, int reg) {
398398
return i2c_smbus_read_word_data(fd, reg);
399399
}
400400

401+
EXPORT int wiringXI2CReadBlockData(int fd, int reg, unsigned char *block, int block_size) {
402+
return i2c_smbus_read_data_block(fd, reg, block, block_size);
403+
}
404+
401405
EXPORT int wiringXI2CWrite(int fd, int data) {
402406
return i2c_smbus_write_byte(fd, data);
403407
}
@@ -410,6 +414,14 @@ EXPORT int wiringXI2CWriteReg16(int fd, int reg, int data) {
410414
return i2c_smbus_write_word_data(fd, reg, data);
411415
}
412416

417+
EXPORT int wiringXI2CWriteBlockData(int fd, int reg, unsigned char *block, int block_size) {
418+
return i2c_smbus_write_data_block(fd, reg, block, block_size);
419+
}
420+
421+
EXPORT int wiringXI2CWriteBlockDataWithSize(int fd, int reg, unsigned char *block, int block_size) {
422+
return i2c_smbus_write_data_block_with_size(fd, reg, block, block_size);
423+
}
424+
413425
EXPORT int wiringXI2CSetup(const char *path, int devId) {
414426
int fd = 0;
415427

src/wiringx.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,9 +80,12 @@ int wiringXISR(int, enum isr_mode_t);
8080
int wiringXI2CRead(int);
8181
int wiringXI2CReadReg8(int, int);
8282
int wiringXI2CReadReg16(int, int);
83+
int wiringXI2CReadBlockData(int, int, unsigned char*, int);
8384
int wiringXI2CWrite(int, int);
8485
int wiringXI2CWriteReg8(int, int, int);
8586
int wiringXI2CWriteReg16(int, int, int);
87+
int wiringXI2CWriteBlockData(int, int, unsigned char*, int);
88+
int wiringXI2CWriteBlockDataWithSize(int, int, unsigned char*, int);
8689
int wiringXI2CSetup(const char *, int);
8790

8891
int wiringXSPIGetFd(int channel);

0 commit comments

Comments
 (0)