summaryrefslogtreecommitdiff
path: root/bsp
diff options
context:
space:
mode:
authorHonestQiao <[email protected]>2026-07-14 11:59:09 +0800
committerGitHub <[email protected]>2026-07-14 11:59:09 +0800
commit2f992bdd4cc37b73295ac066540356fb0a43a7ad (patch)
tree002db796dac4544c9ddbef0f611105563b5686bf /bsp
parent6c5378a1b033b2c320e345ec89a4b2eb2df11a68 (diff)
[bsp][imxrt1180-nxp-evk]add I2C adapter support
Diffstat (limited to 'bsp')
-rw-r--r--bsp/nxp/imx/imxrt/imxrt1180-nxp-evk/cm33/board/Kconfig38
-rw-r--r--bsp/nxp/imx/imxrt/imxrt1180-nxp-evk/cm33/board/MCUX_Config/pin_mux.c38
-rw-r--r--bsp/nxp/imx/imxrt/imxrt1180-nxp-evk/cm7/applications/main.c8
-rw-r--r--bsp/nxp/imx/imxrt/imxrt1180-nxp-evk/cm7/board/Kconfig50
-rw-r--r--bsp/nxp/imx/imxrt/imxrt1180-nxp-evk/cm7/board/MCUX_Config/pin_mux.c39
-rw-r--r--bsp/nxp/imx/imxrt/libraries/drivers/drv_i2c.c121
6 files changed, 281 insertions, 13 deletions
diff --git a/bsp/nxp/imx/imxrt/imxrt1180-nxp-evk/cm33/board/Kconfig b/bsp/nxp/imx/imxrt/imxrt1180-nxp-evk/cm33/board/Kconfig
index cd9e9fabed..c149a795c1 100644
--- a/bsp/nxp/imx/imxrt/imxrt1180-nxp-evk/cm33/board/Kconfig
+++ b/bsp/nxp/imx/imxrt/imxrt1180-nxp-evk/cm33/board/Kconfig
@@ -17,7 +17,7 @@ config SOC_MIMXRT1189CVM8C_CM33
default y
depends on SOC_MIMXRT1189CVM8C
select ARCH_ARM_CORTEX_M33
- select ARCH_ARM_CORTEX_FPU
+ select ARCH_ARM_CORTEX_FPU
select ARCH_ARM_CORTEX_SECURE
menu "On-chip Peripheral Drivers"
@@ -128,6 +128,42 @@ menu "On-chip Peripheral Drivers"
default 1
endif
+ menuconfig BSP_USING_I2C
+ bool "Enable I2C"
+ select RT_USING_I2C
+ default n
+ if BSP_USING_I2C
+ config BSP_USING_I2C2
+ bool "Enable I2C2"
+ default y
+
+ config BSP_USING_I2C3
+ bool "Enable I2C3"
+ default n
+
+ choice
+ prompt "Select I2C2 badurate"
+ default HW_I2C2_BADURATE_100kHZ
+
+ config HW_I2C2_BADURATE_100kHZ
+ bool "Badurate 100kHZ"
+
+ config HW_I2C2_BADURATE_400kHZ
+ bool "Badurate 400kHZ"
+ endchoice
+
+ choice
+ prompt "Select I2C3 badurate"
+ default HW_I2C3_BADURATE_100kHZ
+
+ config HW_I2C3_BADURATE_100kHZ
+ bool "Badurate 100kHZ"
+
+ config HW_I2C3_BADURATE_400kHZ
+ bool "Badurate 400kHZ"
+ endchoice
+ endif
+
menuconfig BSP_USING_CAN
bool "Enable CAN"
select RT_USING_CAN
diff --git a/bsp/nxp/imx/imxrt/imxrt1180-nxp-evk/cm33/board/MCUX_Config/pin_mux.c b/bsp/nxp/imx/imxrt/imxrt1180-nxp-evk/cm33/board/MCUX_Config/pin_mux.c
index 9ef62aca0e..9756b7a864 100644
--- a/bsp/nxp/imx/imxrt/imxrt1180-nxp-evk/cm33/board/MCUX_Config/pin_mux.c
+++ b/bsp/nxp/imx/imxrt/imxrt1180-nxp-evk/cm33/board/MCUX_Config/pin_mux.c
@@ -88,6 +88,44 @@ void BOARD_InitPins(void) {
Pull / Keep Select Field: Pull Disable, Highz
Pull Up / Down Config. Field: Weak pull down
Open Drain Field: Disabled */
+
+ IOMUXC_SetPinMux(
+ IOMUXC_GPIO_AON_16_LPI2C2_SCL, /* GPIO_AON_16 is configured as LPI2C2_SCL */
+ 1U); /* Software Input On Field: Force input path of pad GPIO_AON_16 */
+ IOMUXC_SetPinMux(
+ IOMUXC_GPIO_AON_15_LPI2C2_SDA, /* GPIO_AON_15 is configured as LPI2C2_SDA */
+ 1U); /* Software Input On Field: Force input path of pad GPIO_AON_15 */
+ IOMUXC_SetPinConfig(
+ IOMUXC_GPIO_AON_16_LPI2C2_SCL, /* GPIO_AON_16 PAD functional properties : */
+ 0x1DU); /* Slew Rate Field: Slow Slew Rate
+ Pull Enable Field: Pull Enable
+ Pull Up / Down Config. Field: Weak pull up
+ Open Drain Field: Enabled */
+ IOMUXC_SetPinConfig(
+ IOMUXC_GPIO_AON_15_LPI2C2_SDA, /* GPIO_AON_15 PAD functional properties : */
+ 0x1DU); /* Slew Rate Field: Slow Slew Rate
+ Pull Enable Field: Pull Enable
+ Pull Up / Down Config. Field: Weak pull up
+ Open Drain Field: Enabled */
+
+ IOMUXC_SetPinMux(
+ IOMUXC_GPIO_AD_18_LPI2C3_SCL, /* GPIO_AD_18 is configured as LPI2C3_SCL */
+ 0U); /* Software Input On Field: Input Path is determined by functionality */
+ IOMUXC_SetPinMux(
+ IOMUXC_GPIO_AD_19_LPI2C3_SDA, /* GPIO_AD_19 is configured as LPI2C3_SDA */
+ 0U); /* Software Input On Field: Input Path is determined by functionality */
+ IOMUXC_SetPinConfig(
+ IOMUXC_GPIO_AD_18_LPI2C3_SCL, /* GPIO_AD_18 PAD functional properties : */
+ 0x1DU); /* Slew Rate Field: Slow Slew Rate
+ Pull Enable Field: Pull Enable
+ Pull Up / Down Config. Field: Weak pull up
+ Open Drain Field: Enabled */
+ IOMUXC_SetPinConfig(
+ IOMUXC_GPIO_AD_19_LPI2C3_SDA, /* GPIO_AD_19 PAD functional properties : */
+ 0x1DU); /* Slew Rate Field: Slow Slew Rate
+ Pull Enable Field: Pull Enable
+ Pull Up / Down Config. Field: Weak pull up
+ Open Drain Field: Enabled */
}
void BOARD_InitLeds(void) {
diff --git a/bsp/nxp/imx/imxrt/imxrt1180-nxp-evk/cm7/applications/main.c b/bsp/nxp/imx/imxrt/imxrt1180-nxp-evk/cm7/applications/main.c
index 5c4b4373df..9a7f3eadac 100644
--- a/bsp/nxp/imx/imxrt/imxrt1180-nxp-evk/cm7/applications/main.c
+++ b/bsp/nxp/imx/imxrt/imxrt1180-nxp-evk/cm7/applications/main.c
@@ -18,8 +18,8 @@ int main(void)
{
rt_kprintf("MIMXRT1180_CM7 Hello_World\r\n");
- while (1)
- {
- rt_thread_mdelay(500);
- }
+ while (1)
+ {
+ rt_thread_mdelay(500);
+ }
}
diff --git a/bsp/nxp/imx/imxrt/imxrt1180-nxp-evk/cm7/board/Kconfig b/bsp/nxp/imx/imxrt/imxrt1180-nxp-evk/cm7/board/Kconfig
index 90ea8d58a2..9199e247ab 100644
--- a/bsp/nxp/imx/imxrt/imxrt1180-nxp-evk/cm7/board/Kconfig
+++ b/bsp/nxp/imx/imxrt/imxrt1180-nxp-evk/cm7/board/Kconfig
@@ -17,8 +17,8 @@ config SOC_MIMXRT1189CVM8C_CM7
default y
depends on SOC_MIMXRT1189CVM8C
select ARCH_ARM_CORTEX_M7
- select ARCH_ARM_CORTEX_FPU
-
+ select ARCH_ARM_CORTEX_FPU
+
config BSP_USING_LCD_MIPI
bool
default n
@@ -131,6 +131,42 @@ menu "On-chip Peripheral Drivers"
default 1
endif
+ menuconfig BSP_USING_I2C
+ bool "Enable I2C"
+ select RT_USING_I2C
+ default n
+ if BSP_USING_I2C
+ config BSP_USING_I2C2
+ bool "Enable I2C2"
+ default y
+
+ config BSP_USING_I2C3
+ bool "Enable I2C3"
+ default n
+
+ choice
+ prompt "Select I2C2 badurate"
+ default HW_I2C2_BADURATE_100kHZ
+
+ config HW_I2C2_BADURATE_100kHZ
+ bool "Badurate 100kHZ"
+
+ config HW_I2C2_BADURATE_400kHZ
+ bool "Badurate 400kHZ"
+ endchoice
+
+ choice
+ prompt "Select I2C3 badurate"
+ default HW_I2C3_BADURATE_100kHZ
+
+ config HW_I2C3_BADURATE_100kHZ
+ bool "Badurate 100kHZ"
+
+ config HW_I2C3_BADURATE_400kHZ
+ bool "Badurate 400kHZ"
+ endchoice
+ endif
+
menuconfig BSP_USING_CAN
bool "Enable CAN"
select RT_USING_CAN
@@ -258,13 +294,13 @@ menu "Onboard Peripheral Drivers"
choice
prompt "Select display panel"
default DISPLAY_USING_RK055AHD091
-
+
config DISPLAY_USING_RK055AHD091
bool "RK055AHD091-CTG (RK055HDMIPI4M 720 * 1280)"
-
+
config DISPLAY_USING_RK055IQH091
bool "RK055IQH091-CTG (540 * 960)"
-
+
config DISPLAY_USING_RK055MHD091
bool "RK055MHD091A0-CTG (RK055HDMIPI4MA0 720 * 1280)"
endchoice
@@ -272,10 +308,10 @@ menu "Onboard Peripheral Drivers"
choice
prompt "Select display controller"
default BSP_USING_LCDIFV2
-
+
config BSP_USING_ELCDIF
bool "ELCDIF"
-
+
config BSP_USING_LCDIFV2
bool "LCDIFV2"
endchoice
diff --git a/bsp/nxp/imx/imxrt/imxrt1180-nxp-evk/cm7/board/MCUX_Config/pin_mux.c b/bsp/nxp/imx/imxrt/imxrt1180-nxp-evk/cm7/board/MCUX_Config/pin_mux.c
index ff39c120f7..e5f2f5f8ba 100644
--- a/bsp/nxp/imx/imxrt/imxrt1180-nxp-evk/cm7/board/MCUX_Config/pin_mux.c
+++ b/bsp/nxp/imx/imxrt/imxrt1180-nxp-evk/cm7/board/MCUX_Config/pin_mux.c
@@ -53,6 +53,7 @@ BOARD_InitPins:
*
* END ****************************************************************************************************************/
void BOARD_InitPins(void) {
+ CLOCK_EnableClock(kCLOCK_Iomuxc1); /* Turn on LPCG: LPCG is ON. */
CLOCK_EnableClock(kCLOCK_Iomuxc2); /* Turn on LPCG: LPCG is ON. */
IOMUXC_SetPinMux(
@@ -75,6 +76,44 @@ void BOARD_InitPins(void) {
Pull / Keep Select Field: Pull Disable, Highz
Pull Up / Down Config. Field: Weak pull down
Open Drain Field: Disabled */
+
+ IOMUXC_SetPinMux(
+ IOMUXC_GPIO_AON_16_LPI2C2_SCL, /* GPIO_AON_16 is configured as LPI2C2_SCL */
+ 1U); /* Software Input On Field: Force input path of pad GPIO_AON_16 */
+ IOMUXC_SetPinMux(
+ IOMUXC_GPIO_AON_15_LPI2C2_SDA, /* GPIO_AON_15 is configured as LPI2C2_SDA */
+ 1U); /* Software Input On Field: Force input path of pad GPIO_AON_15 */
+ IOMUXC_SetPinConfig(
+ IOMUXC_GPIO_AON_16_LPI2C2_SCL, /* GPIO_AON_16 PAD functional properties : */
+ 0x1DU); /* Slew Rate Field: Slow Slew Rate
+ Pull Enable Field: Pull Enable
+ Pull Up / Down Config. Field: Weak pull up
+ Open Drain Field: Enabled */
+ IOMUXC_SetPinConfig(
+ IOMUXC_GPIO_AON_15_LPI2C2_SDA, /* GPIO_AON_15 PAD functional properties : */
+ 0x1DU); /* Slew Rate Field: Slow Slew Rate
+ Pull Enable Field: Pull Enable
+ Pull Up / Down Config. Field: Weak pull up
+ Open Drain Field: Enabled */
+
+ IOMUXC_SetPinMux(
+ IOMUXC_GPIO_AD_18_LPI2C3_SCL, /* GPIO_AD_18 is configured as LPI2C3_SCL */
+ 0U); /* Software Input On Field: Input Path is determined by functionality */
+ IOMUXC_SetPinMux(
+ IOMUXC_GPIO_AD_19_LPI2C3_SDA, /* GPIO_AD_19 is configured as LPI2C3_SDA */
+ 0U); /* Software Input On Field: Input Path is determined by functionality */
+ IOMUXC_SetPinConfig(
+ IOMUXC_GPIO_AD_18_LPI2C3_SCL, /* GPIO_AD_18 PAD functional properties : */
+ 0x1DU); /* Slew Rate Field: Slow Slew Rate
+ Pull Enable Field: Pull Enable
+ Pull Up / Down Config. Field: Weak pull up
+ Open Drain Field: Enabled */
+ IOMUXC_SetPinConfig(
+ IOMUXC_GPIO_AD_19_LPI2C3_SDA, /* GPIO_AD_19 PAD functional properties : */
+ 0x1DU); /* Slew Rate Field: Slow Slew Rate
+ Pull Enable Field: Pull Enable
+ Pull Up / Down Config. Field: Weak pull up
+ Open Drain Field: Enabled */
}
/***********************************************************************************************************************
diff --git a/bsp/nxp/imx/imxrt/libraries/drivers/drv_i2c.c b/bsp/nxp/imx/imxrt/libraries/drivers/drv_i2c.c
index 7210421c31..a953e9a6ca 100644
--- a/bsp/nxp/imx/imxrt/libraries/drivers/drv_i2c.c
+++ b/bsp/nxp/imx/imxrt/libraries/drivers/drv_i2c.c
@@ -35,7 +35,7 @@ struct imxrt_i2c_bus
volatile rt_uint32_t msg_ptr;
volatile rt_uint32_t dptr;
char *device_name;
-#ifdef SOC_IMXRT1170_SERIES
+#if defined(SOC_IMXRT1170_SERIES) || defined(SOC_IMXRT1180_SERIES)
clock_root_t clock_root;
#endif
};
@@ -164,6 +164,9 @@ static rt_err_t imxrt_lpi2c_configure(struct imxrt_i2c_bus *bus, lpi2c_master_co
CLOCK_SetRootClock(bus->clock_root, &rootCfg);
volatile uint32_t freq = CLOCK_GetRootClockFreq(bus->clock_root);
LPI2C_MasterInit(bus->I2C, cfg, freq);
+#elif defined(SOC_IMXRT1180_SERIES)
+ volatile uint32_t freq = CLOCK_GetRootClockFreq(bus->clock_root);
+ LPI2C_MasterInit(bus->I2C, cfg, freq);
#else
CLOCK_SetMux(kCLOCK_Lpi2cMux, LPI2C_CLOCK_SOURCE_SELECT);
CLOCK_SetDiv(kCLOCK_Lpi2cDiv, LPI2C_CLOCK_SOURCE_DIVIDER);
@@ -249,6 +252,93 @@ static status_t LPI2C_MasterWaitForTxFifoAllEmpty(LPI2C_Type *base)
return kStatus_Success;
}
+#ifdef SOC_IMXRT1180_SERIES
+static rt_ssize_t imxrt_i2c_mst_xfer(struct rt_i2c_bus_device *bus,
+ struct rt_i2c_msg msgs[],
+ rt_uint32_t num)
+{
+ struct imxrt_i2c_bus *imxrt_i2c;
+ rt_size_t i;
+ status_t status;
+ rt_bool_t is_read;
+ lpi2c_direction_t dir;
+ RT_ASSERT(bus != RT_NULL);
+ imxrt_i2c = (struct imxrt_i2c_bus *) bus;
+
+ imxrt_i2c->msg = msgs;
+ imxrt_i2c->msg_ptr = 0;
+ imxrt_i2c->msg_cnt = num;
+ imxrt_i2c->dptr = 0;
+
+ for (i = 0; i < num; i++)
+ {
+ is_read = (msgs[i].flags & RT_I2C_RD) != 0U;
+ dir = is_read ? kLPI2C_Read : kLPI2C_Write;
+
+ /* Issue START (first message) or Repeated START (subsequent messages). */
+ if ((msgs[i].flags & RT_I2C_NO_START) != RT_I2C_NO_START)
+ {
+ if (i == 0)
+ {
+ status = LPI2C_MasterStart(imxrt_i2c->I2C, msgs[i].addr, dir);
+ }
+ else
+ {
+ status = LPI2C_MasterRepeatedStart(imxrt_i2c->I2C, msgs[i].addr, dir);
+ }
+ if (status != kStatus_Success)
+ {
+ i = 0;
+ break;
+ }
+
+ /* Wait for address byte to be sent and check ACK/NACK. */
+ status = LPI2C_MasterWaitForTxFifoAllEmpty(imxrt_i2c->I2C);
+ if (status != kStatus_Success)
+ {
+ i = 0;
+ break;
+ }
+ if (LPI2C_MasterGetStatusFlags(imxrt_i2c->I2C) & kLPI2C_MasterNackDetectFlag)
+ {
+ i = 0;
+ break;
+ }
+ }
+
+ if (is_read)
+ {
+ status = LPI2C_MasterReceive(imxrt_i2c->I2C, msgs[i].buf, msgs[i].len);
+ }
+ else
+ {
+ status = LPI2C_MasterSend(imxrt_i2c->I2C, msgs[i].buf, msgs[i].len);
+ if (status == kStatus_Success)
+ {
+ status = LPI2C_MasterWaitForTxFifoAllEmpty(imxrt_i2c->I2C);
+ }
+ }
+ if (status != kStatus_Success)
+ {
+ i = 0;
+ break;
+ }
+ }
+
+ status = LPI2C_MasterStop(imxrt_i2c->I2C);
+ if (status != kStatus_Success)
+ {
+ i = 0;
+ }
+
+ imxrt_i2c->msg = RT_NULL;
+ imxrt_i2c->msg_ptr = 0;
+ imxrt_i2c->msg_cnt = 0;
+ imxrt_i2c->dptr = 0;
+
+ return i;
+}
+#else
static rt_ssize_t imxrt_i2c_mst_xfer(struct rt_i2c_bus_device *bus,
struct rt_i2c_msg msgs[],
rt_uint32_t num)
@@ -364,6 +454,7 @@ static rt_ssize_t imxrt_i2c_mst_xfer(struct rt_i2c_bus_device *bus,
return i;
}
+#endif
static rt_ssize_t imxrt_i2c_slv_xfer(struct rt_i2c_bus_device *bus,
struct rt_i2c_msg msgs[],
@@ -391,6 +482,11 @@ int rt_hw_i2c_init(void)
#elif defined(HW_I2C1_BADURATE_100kHZ)
masterConfig.baudRate_Hz = 100000U;
#endif /*HW_I2C1_BADURATE_400kHZ*/
+#if defined(SOC_IMXRT1170_SERIES)
+ lpi2c1.clock_root = kCLOCK_Root_Lpi2c1;
+#elif defined(SOC_IMXRT1180_SERIES)
+ lpi2c1.clock_root = kCLOCK_Root_Lpi2c0102;
+#endif
imxrt_lpi2c_configure(&lpi2c1, &masterConfig);
rt_i2c_bus_device_register(&lpi2c1.parent, lpi2c1.device_name);
#endif /* BSP_USING_I2C1 */
@@ -402,6 +498,11 @@ int rt_hw_i2c_init(void)
#elif defined(HW_I2C2_BADURATE_100kHZ)
masterConfig.baudRate_Hz = 100000U;
#endif /* HW_I2C2_BADURATE_400kHZ */
+#if defined(SOC_IMXRT1170_SERIES)
+ lpi2c2.clock_root = kCLOCK_Root_Lpi2c2;
+#elif defined(SOC_IMXRT1180_SERIES)
+ lpi2c2.clock_root = kCLOCK_Root_Lpi2c0102;
+#endif
imxrt_lpi2c_configure(&lpi2c2, &masterConfig);
rt_i2c_bus_device_register(&lpi2c2.parent, lpi2c2.device_name);
#endif /* BSP_USING_I2C2 */
@@ -415,6 +516,11 @@ int rt_hw_i2c_init(void)
#elif defined(HW_I2C3_BADURATE_100kHZ)
masterConfig.baudRate_Hz = 100000U;
#endif /* HW_I2C3_BADURATE_400kHZ */
+#if defined(SOC_IMXRT1170_SERIES)
+ lpi2c3.clock_root = kCLOCK_Root_Lpi2c3;
+#elif defined(SOC_IMXRT1180_SERIES)
+ lpi2c3.clock_root = kCLOCK_Root_Lpi2c0304;
+#endif
imxrt_lpi2c_configure(&lpi2c3, &masterConfig);
rt_i2c_bus_device_register(&lpi2c3.parent, lpi2c3.device_name);
#endif /* BSP_USING_I2C3 */
@@ -426,6 +532,11 @@ int rt_hw_i2c_init(void)
#elif defined(HW_I2C4_BADURATE_100kHZ)
masterConfig.baudRate_Hz = 100000U;
#endif /* HW_I2C4_BADURATE_400kHZ */
+#if defined(SOC_IMXRT1170_SERIES)
+ lpi2c4.clock_root = kCLOCK_Root_Lpi2c4;
+#elif defined(SOC_IMXRT1180_SERIES)
+ lpi2c4.clock_root = kCLOCK_Root_Lpi2c0304;
+#endif
imxrt_lpi2c_configure(&lpi2c4, &masterConfig);
rt_i2c_bus_device_register(&lpi2c4.parent, lpi2c4.device_name);
#endif /* BSP_USING_I2C4 */
@@ -437,7 +548,11 @@ int rt_hw_i2c_init(void)
#elif defined(HW_I2C5_BADURATE_100kHZ)
masterConfig.baudRate_Hz = 100000U;
#endif /* HW_I2C5_BADURATE_400kHZ */
+#if defined(SOC_IMXRT1170_SERIES)
lpi2c5.clock_root = kCLOCK_Root_Lpi2c5;
+#elif defined(SOC_IMXRT1180_SERIES)
+ lpi2c5.clock_root = kCLOCK_Root_Lpi2c0506;
+#endif
imxrt_lpi2c_configure(&lpi2c5, &masterConfig);
rt_i2c_bus_device_register(&lpi2c5.parent, lpi2c5.device_name);
#endif /* BSP_USING_I2C5 */
@@ -449,7 +564,11 @@ int rt_hw_i2c_init(void)
#elif defined(HW_I2C6_BADURATE_100kHZ)
masterConfig.baudRate_Hz = 100000U;
#endif /* HW_I2C6_BADURATE_400kHZ */
+#if defined(SOC_IMXRT1170_SERIES)
lpi2c6.clock_root = kCLOCK_Root_Lpi2c6;
+#elif defined(SOC_IMXRT1180_SERIES)
+ lpi2c6.clock_root = kCLOCK_Root_Lpi2c0506;
+#endif
imxrt_lpi2c_configure(&lpi2c6, &masterConfig);
rt_i2c_bus_device_register(&lpi2c6.parent, lpi2c6.device_name);
#endif /* BSP_USING_I2C6 */