From 8ea72de00628c59ded9892af841c6395df28d16e Mon Sep 17 00:00:00 2001 From: Segwon Date: Wed, 15 Nov 2017 16:55:08 +0900 Subject: [PATCH] i2c: replace 'i2c_smbus_ioctl()' with another functions. - do not use 'i2c_smbus_ioctl_data' structure in caller. - remove : i2c_smbus_ioctl() - add : peripheral_interface_i2c_read_register_byte() - add : peripheral_interface_i2c_write_register_byte() - add : peripheral_interface_i2c_read_register_word() - add : peripheral_interface_i2c_write_register_word() Change-Id: Ia73f3febcf1412a5101a83b2106a0d7c695a2ce4 Signed-off-by: Segwon --- include/interface/peripheral_interface_i2c.h | 7 ++- src/interface/peripheral_interface_i2c.c | 84 +++++++++++++++++++++++++++- 2 files changed, 87 insertions(+), 4 deletions(-) diff --git a/include/interface/peripheral_interface_i2c.h b/include/interface/peripheral_interface_i2c.h index 6e3dc23..b10fc1a 100644 --- a/include/interface/peripheral_interface_i2c.h +++ b/include/interface/peripheral_interface_i2c.h @@ -58,6 +58,9 @@ struct i2c_smbus_ioctl_data { int peripheral_interface_i2c_close(peripheral_i2c_h i2c); int peripheral_interface_i2c_read(peripheral_i2c_h i2c, uint8_t *data, uint32_t length); int peripheral_interface_i2c_write(peripheral_i2c_h i2c, uint8_t *data, uint32_t length); -int peripheral_interface_i2c_smbus_ioctl(peripheral_i2c_h i2c, struct i2c_smbus_ioctl_data *data); +int peripheral_interface_i2c_read_register_byte(peripheral_i2c_h i2c, uint8_t reg, uint8_t *data_out); +int peripheral_interface_i2c_write_register_byte(peripheral_i2c_h i2c, uint8_t reg, uint8_t data_in); +int peripheral_interface_i2c_read_register_word(peripheral_i2c_h i2c, uint8_t reg, uint16_t *data_out); +int peripheral_interface_i2c_write_register_word(peripheral_i2c_h i2c, uint8_t reg, uint16_t data_in); -#endif/* __PERIPHERAL_INTERFACE_I2C_H__ */ +#endif /* __PERIPHERAL_INTERFACE_I2C_H__ */ diff --git a/src/interface/peripheral_interface_i2c.c b/src/interface/peripheral_interface_i2c.c index d0a9985..3fcb083 100644 --- a/src/interface/peripheral_interface_i2c.c +++ b/src/interface/peripheral_interface_i2c.c @@ -44,10 +44,90 @@ int peripheral_interface_i2c_write(peripheral_i2c_h i2c, uint8_t *data, uint32_t return 0; } -int peripheral_interface_i2c_smbus_ioctl(peripheral_i2c_h i2c, struct i2c_smbus_ioctl_data *data) +int peripheral_interface_i2c_read_register_byte(peripheral_i2c_h i2c, uint8_t reg, uint8_t *data_out) { - int status = ioctl(i2c->fd, I2C_SMBUS, data); + int status; + + struct i2c_smbus_ioctl_data data_arg; + union i2c_smbus_data data; + + memset(&data, 0x0, sizeof(data.block)); + + data_arg.read_write = I2C_SMBUS_READ; + data_arg.size = I2C_SMBUS_BYTE_DATA; + data_arg.data = &data; + data_arg.command = reg; + + status = ioctl(fd, I2C_SMBUS, &data_arg); CHECK_ERROR(status); + *data_out = data.byte; + return 0; } + +int peripheral_interface_i2c_write_register_byte(peripheral_i2c_h i2c, uint8_t reg, uint8_t data_in) +{ + int status; + + struct i2c_smbus_ioctl_data data_arg; + union i2c_smbus_data data; + + memset(&data, 0x0, sizeof(data.block)); + + data_arg.read_write = I2C_SMBUS_WRITE; + data_arg.size = I2C_SMBUS_BYTE_DATA; + data_arg.data = &data; + data_arg.command = reg; + + data.byte = data_in; + + status = ioctl(fd, I2C_SMBUS, &data_arg); + CHECK_ERROR(status); + + return 0; +} + +int peripheral_interface_i2c_read_register_word(peripheral_i2c_h i2c, uint8_t reg, uint16_t *data_out) +{ + int status; + + struct i2c_smbus_ioctl_data data_arg; + union i2c_smbus_data data; + + memset(&data, 0x0, sizeof(data.block)); + + data_arg.read_write = I2C_SMBUS_READ; + data_arg.size = I2C_SMBUS_WORD_DATA; + data_arg.data = &data; + data_arg.command = reg; + + status = ioctl(fd, I2C_SMBUS, &data_arg); + CHECK_ERROR(status); + + *data_out = data.word; + + return 0; +} + +int peripheral_interface_i2c_write_register_word(peripheral_i2c_h i2c, uint8_t reg, uint16_t data_in) +{ + int status; + + struct i2c_smbus_ioctl_data data_arg; + union i2c_smbus_data data; + + memset(&data, 0x0, sizeof(data.block)); + + data_arg.read_write = I2C_SMBUS_WRITE; + data_arg.size = I2C_SMBUS_WORD_DATA; + data_arg.data = &data; + data_arg.command = reg; + + data.word = data_in; + + statis = ioctl(fd, I2C_SMBUS, &data_arg); + CHECK_ERROR(status); + + return 0; +} \ No newline at end of file -- 2.7.4