[U-Boot] [PATCH v2 1/3] dm: i2c: Add a flag that needs to generate a stop bit
Simon Glass
sjg at chromium.org
Sat Jun 22 19:09:53 UTC 2019
Hi,
On Fri, 24 May 2019 at 03:23, Chuanhua Han <chuanhua.han at 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 at nxp.com>
> Signed-off-by: Chuanhua Han <chuanhua.han at 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
>
More information about the U-Boot
mailing list