diff --git a/arch/arm/src/imxrt/chip/imxrt105x_pinmux.h b/arch/arm/src/imxrt/chip/imxrt105x_pinmux.h index b4216d958b..f1331d1583 100644 --- a/arch/arm/src/imxrt/chip/imxrt105x_pinmux.h +++ b/arch/arm/src/imxrt/chip/imxrt105x_pinmux.h @@ -623,10 +623,14 @@ #define GPIO_LPI2C2_SDA_2 (GPIO_PERIPH | GPIO_ALT3 | GPIO_PADMUX(IMXRT_PADMUX_GPIO_SD_B1_10_INDEX)) #define GPIO_LPI2C3_SCL_1 (GPIO_PERIPH | GPIO_ALT1 | GPIO_PADMUX(IMXRT_PADMUX_GPIO_AD_B1_07_INDEX)) -#define GPIO_LPI2C3_SCL_2 (GPIO_PERIPH | GPIO_ALT2 | GPIO_PADMUX(IMXRT_PADMUX_GPIO_EMC_22_INDEX)) +#define GPIO_LPI2C3_SCL_2 (GPIO_PERIPH | GPIO_ALT2 | GPIO_PADMUX(IMXRT_PADMUX_GPIO_EMC_22_INDEX) | \ + GPIO_SION_ENABLE | IOMUX_OPENDRAIN | \ + IOMUX_SPEED_MEDIUM | IOMUX_DRIVE_33OHM) #define GPIO_LPI2C3_SCL_3 (GPIO_PERIPH | GPIO_ALT2 | GPIO_PADMUX(IMXRT_PADMUX_GPIO_SD_B0_00_INDEX)) #define GPIO_LPI2C3_SDA_1 (GPIO_PERIPH | GPIO_ALT1 | GPIO_PADMUX(IMXRT_PADMUX_GPIO_AD_B1_06_INDEX)) -#define GPIO_LPI2C3_SDA_2 (GPIO_PERIPH | GPIO_ALT2 | GPIO_PADMUX(IMXRT_PADMUX_GPIO_EMC_21_INDEX)) +#define GPIO_LPI2C3_SDA_2 (GPIO_PERIPH | GPIO_ALT2 | GPIO_PADMUX(IMXRT_PADMUX_GPIO_EMC_21_INDEX) | \ + GPIO_SION_ENABLE | IOMUX_OPENDRAIN | \ + IOMUX_SPEED_MEDIUM | IOMUX_DRIVE_33OHM) #define GPIO_LPI2C3_SDA_3 (GPIO_PERIPH | GPIO_ALT2 | GPIO_PADMUX(IMXRT_PADMUX_GPIO_SD_B0_01_INDEX)) #define GPIO_LPI2C4_SCL_1 (GPIO_PERIPH | GPIO_ALT0 | GPIO_PADMUX(IMXRT_PADMUX_GPIO_AD_B0_12_INDEX)) diff --git a/arch/arm/src/imxrt/imxrt_lpi2c.c b/arch/arm/src/imxrt/imxrt_lpi2c.c index 56d0c40539..ebf6bbf4b3 100644 --- a/arch/arm/src/imxrt/imxrt_lpi2c.c +++ b/arch/arm/src/imxrt/imxrt_lpi2c.c @@ -1285,16 +1285,18 @@ static int imxrt_lpi2c_isr_process(struct imxrt_lpi2c_priv_s *priv) imxrt_lpi2c_traceevent(priv, I2CEVENT_NOSTART, priv->msgc); } + priv->msgv++; + priv->msgc--; + if ((priv->flags & I2C_M_READ) != 0) { #ifndef CONFIG_I2C_POLLED /* Stop TX interrupt */ imxrt_lpi2c_modifyreg(priv, IMXRT_LPI2C_MIER_OFFSET, - LPI2C_MIER_TDIE, 0); + LPI2C_MIER_TDIE, LPI2C_MIER_RDIE); #endif /* Set LPI2C in read mode */ - imxrt_lpi2c_putreg(priv, IMXRT_LPI2C_MTDR_OFFSET, LPI2C_MTDR_CMD_RXD | LPI2C_MTDR_DATA((priv->dcnt - 1))); } else @@ -1305,10 +1307,13 @@ static int imxrt_lpi2c_isr_process(struct imxrt_lpi2c_priv_s *priv) imxrt_lpi2c_putreg(priv, IMXRT_LPI2C_MTDR_OFFSET, LPI2C_MTDR_CMD_TXD | LPI2C_MTDR_DATA(*priv->ptr++)); priv->dcnt--; + if ((priv->msgc <= 0) && (priv->dcnt == 0)) + { + imxrt_lpi2c_sendstop(priv); + } } - priv->msgv++; - priv->msgc--; + } else if (priv->msgv && ((status & LPI2C_MSR_SDF) != 0)) { diff --git a/configs/imxrt1050-evk/include/board.h b/configs/imxrt1050-evk/include/board.h index 9fd6abd6d7..490bc8b946 100644 --- a/configs/imxrt1050-evk/include/board.h +++ b/configs/imxrt1050-evk/include/board.h @@ -162,6 +162,9 @@ #define GPIO_LPI2C1_SDA GPIO_LPI2C1_SDA_2 /* GPIO_AD_B1_01 */ #define GPIO_LPI2C1_SCL GPIO_LPI2C1_SCL_2 /* GPIO_AD_B1_00 */ +#define GPIO_LPI2C3_SDA GPIO_LPI2C3_SDA_2 /* GPIO_AD_B1_01 */ +#define GPIO_LPI2C3_SCL GPIO_LPI2C3_SCL_2 /* GPIO_AD_B1_00 */ + /************************************************************************************ * Public Types ************************************************************************************/ diff --git a/configs/imxrt1050-evk/src/imxrt_bringup.c b/configs/imxrt1050-evk/src/imxrt_bringup.c index c4486a976b..1217a93a89 100644 --- a/configs/imxrt1050-evk/src/imxrt_bringup.c +++ b/configs/imxrt1050-evk/src/imxrt_bringup.c @@ -57,7 +57,7 @@ * Private Functions ****************************************************************************/ -#if defined(CONFIG_I2C_DRIVER) && defined(CONFIG_IMXRT_LPI2C1) +#if defined(CONFIG_I2C_DRIVER) static void imxrt_i2c_register(int bus) { FAR struct i2c_master_s *i2c; @@ -114,6 +114,16 @@ int imxrt_bringup(void) #if defined(CONFIG_I2C_DRIVER) && defined(CONFIG_IMXRT_LPI2C1) imxrt_i2c_register(1); #endif +#if defined(CONFIG_I2C_DRIVER) && defined(CONFIG_IMXRT_LPI2C2) + imxrt_i2c_register(2); +#endif +#if defined(CONFIG_I2C_DRIVER) && defined(CONFIG_IMXRT_LPI2C3) + imxrt_i2c_register(3); +#endif +#if defined(CONFIG_I2C_DRIVER) && defined(CONFIG_IMXRT_LPI2C4) + imxrt_i2c_register(4); +#endif + UNUSED(ret); return OK;