drivers/i2c: improve common i2c driver

- fix reag/write regs function (NOSTART/NOSTOP flags missing)
- use ret variable name instead of err (cosmetic)
- split PERIPH_I2C_NEED_READ/WRITE_REGS to simplify cpu side implementation
This commit is contained in:
Alexandre Abadie 2018-05-25 11:55:27 +02:00 committed by dylad
parent 406d180dc2
commit c2eb316039

View File

@ -24,22 +24,23 @@
#ifdef I2C_NUMOF #ifdef I2C_NUMOF
#ifdef PERIPH_I2C_NEED_READ_REGS #ifdef PERIPH_I2C_NEED_READ_REG
int i2c_read_reg(i2c_t dev, uint16_t addr, uint16_t reg, int i2c_read_reg(i2c_t dev, uint16_t addr, uint16_t reg,
void *data, uint8_t flags) void *data, uint8_t flags)
{ {
return i2c_read_regs(dev, addr, reg, data, 1, flags); return i2c_read_regs(dev, addr, reg, data, 1, flags);
} }
#endif /* PERIPH_I2C_NEED_READ_REG */
#ifdef PERIPH_I2C_NEED_READ_REGS
int i2c_read_regs(i2c_t dev, uint16_t addr, uint16_t reg, int i2c_read_regs(i2c_t dev, uint16_t addr, uint16_t reg,
void *data, size_t len, uint8_t flags) void *data, size_t len, uint8_t flags)
{ {
int8_t err;
/* First set ADDR and register with no stop */ /* First set ADDR and register with no stop */
err = i2c_write_bytes(dev, addr, &reg, (flags & I2C_REG16) ? 2 : 1, int8_t ret = i2c_write_bytes(dev, addr, &reg, (flags & I2C_REG16) ? 2 : 1,
flags & I2C_NOSTOP ); flags | I2C_NOSTOP);
if (err < 0) { if (ret < 0) {
return err; return ret;
} }
/* Then get the data from device */ /* Then get the data from device */
return i2c_read_bytes(dev, addr, data, len, flags); return i2c_read_bytes(dev, addr, data, len, flags);
@ -56,25 +57,26 @@ int i2c_write_byte(i2c_t dev, uint16_t addr, uint8_t data, uint8_t flags)
return i2c_write_bytes(dev, addr, &data, 1, flags); return i2c_write_bytes(dev, addr, &data, 1, flags);
} }
#ifdef PERIPH_I2C_NEED_WRITE_REGS #ifdef PERIPH_I2C_NEED_WRITE_REG
int i2c_write_reg(i2c_t dev, uint16_t addr, uint16_t reg, int i2c_write_reg(i2c_t dev, uint16_t addr, uint16_t reg,
uint8_t data, uint8_t flags) uint8_t data, uint8_t flags)
{ {
return i2c_write_regs(dev, addr, reg, &data, 1, flags); return i2c_write_regs(dev, addr, reg, &data, 1, flags);
} }
#endif /* PERIPH_I2C_NEED_WRITE_REG */
#ifdef PERIPH_I2C_NEED_WRITE_REGS
int i2c_write_regs(i2c_t dev, uint16_t addr, uint16_t reg, int i2c_write_regs(i2c_t dev, uint16_t addr, uint16_t reg,
const void *data, size_t len, uint8_t flags) const void *data, size_t len, uint8_t flags)
{ {
int8_t err;
/* First set ADDR and register with no stop */ /* First set ADDR and register with no stop */
err = i2c_write_bytes(dev, addr, &reg, (flags & I2C_REG16) ? 2 : 1, int8_t ret = i2c_write_bytes(dev, addr, &reg, (flags & I2C_REG16) ? 2 : 1,
flags & I2C_NOSTOP ); flags | I2C_NOSTOP);
if (err < 0) { if (ret < 0) {
return err; return ret;
} }
/* Then write data to the device */ /* Then write data to the device */
return i2c_write_bytes(dev, addr, data, len, flags); return i2c_write_bytes(dev, addr, data, len, flags | I2C_NOSTART);
} }
#endif /* PERIPH_I2C_NEED_WRITE_REGS */ #endif /* PERIPH_I2C_NEED_WRITE_REGS */