
Hi,
On Fri, 24 May 2019 at 03:23, Chuanhua Han chuanhua.han@nxp.com wrote:
Usually the i2c bus needs to write the address of the register before reading the internal register data of the device (ignoring the transmission of the slave address).
Generally, the stop signal is not needed before the register is read, but there is a special chip that needs this stop signal (such as pcf2127), this patch adds a flag that needs to generate a stop bit to determine whether the i2c host needs to generate a stop signal before reading the register data.
Does this mean that the chip does not comply with the i2c protocol?
Is it possible instead to so a write and then a read?
See dm_i2c_xfer().
Signed-off-by: Biwen Li biwen.li@nxp.com Signed-off-by: Chuanhua Han chuanhua.han@nxp.com
Changes in v2: - Split the original patch into 3 patches - Add detailed description information for each patch
drivers/i2c/i2c-uclass.c | 2 ++ include/i2c.h | 2 ++ 2 files changed, 4 insertions(+)
diff --git a/drivers/i2c/i2c-uclass.c b/drivers/i2c/i2c-uclass.c index e47abf1833..18f7364d72 100644 --- a/drivers/i2c/i2c-uclass.c +++ b/drivers/i2c/i2c-uclass.c @@ -141,6 +141,8 @@ int dm_i2c_read(struct udevice *dev, uint offset, uint8_t *buffer, int len) if (len) { ptr->addr = chip->chip_addr; ptr->flags = chip->flags & DM_I2C_CHIP_10BIT ? I2C_M_TEN : 0;
ptr->flags |= chip->flags & DM_I2C_CHIP_RD_NEED_STOP_BIT ?
I2C_M_RD_NEED_STOP_BIT : 0; ptr->flags |= I2C_M_RD; ptr->len = len; ptr->buf = buffer;
diff --git a/include/i2c.h b/include/i2c.h index a5c760c711..beaa028349 100644 --- a/include/i2c.h +++ b/include/i2c.h @@ -28,6 +28,7 @@ enum dm_i2c_chip_flags { DM_I2C_CHIP_10BIT = 1 << 0, /* Use 10-bit addressing */ DM_I2C_CHIP_RD_ADDRESS = 1 << 1, /* Send address for each read byte */ DM_I2C_CHIP_WR_ADDRESS = 1 << 2, /* Send address for each write byte */
DM_I2C_CHIP_RD_NEED_STOP_BIT = 1 << 3, /* Need generate stop bit */
};
struct udevice; @@ -87,6 +88,7 @@ enum dm_i2c_msg_flags { I2C_M_IGNORE_NAK = 0x1000, /* continue after NAK */ I2C_M_NO_RD_ACK = 0x0800, /* skip the Ack bit on reads */ I2C_M_RECV_LEN = 0x0400, /* length is first received byte */
I2C_M_RD_NEED_STOP_BIT = 0x0002, /* need generate stop bit */
};
/**
2.17.1