From c2eb316039dfe6deca27ef1962e67363bcf7f62f Mon Sep 17 00:00:00 2001 From: Alexandre Abadie Date: Fri, 25 May 2018 11:55:27 +0200 Subject: [PATCH] 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 --- drivers/periph_common/i2c.c | 28 +++++++++++++++------------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/drivers/periph_common/i2c.c b/drivers/periph_common/i2c.c index 4e47439402..dad1be98d2 100644 --- a/drivers/periph_common/i2c.c +++ b/drivers/periph_common/i2c.c @@ -24,22 +24,23 @@ #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, void *data, uint8_t 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, void *data, size_t len, uint8_t flags) { - int8_t err; /* First set ADDR and register with no stop */ - err = i2c_write_bytes(dev, addr, ®, (flags & I2C_REG16) ? 2 : 1, - flags & I2C_NOSTOP ); - if (err < 0) { - return err; + int8_t ret = i2c_write_bytes(dev, addr, ®, (flags & I2C_REG16) ? 2 : 1, + flags | I2C_NOSTOP); + if (ret < 0) { + return ret; } /* Then get the data from device */ 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); } -#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, uint8_t data, uint8_t 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, const void *data, size_t len, uint8_t flags) { - int8_t err; /* First set ADDR and register with no stop */ - err = i2c_write_bytes(dev, addr, ®, (flags & I2C_REG16) ? 2 : 1, - flags & I2C_NOSTOP ); - if (err < 0) { - return err; + int8_t ret = i2c_write_bytes(dev, addr, ®, (flags & I2C_REG16) ? 2 : 1, + flags | I2C_NOSTOP); + if (ret < 0) { + return ret; } /* 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 */