瀏覽代碼

[bsp][nxp][mcxa153] add i2c driver

hywing 11 月之前
父節點
當前提交
d3b9480658

+ 146 - 0
bsp/nxp/mcx/mcxa/Libraries/drivers/drv_i2c.c

@@ -0,0 +1,146 @@
+/*
+ * Copyright (c) 2006-2024 RT-Thread Development Team
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date           Author       Notes
+ * 2023-08-21     hywing       The first version
+ */
+
+#include <rtdevice.h>
+#include "fsl_lpi2c.h"
+#include "fsl_lpi2c_edma.h"
+#include "fsl_edma.h"
+
+
+#ifdef RT_USING_I2C
+
+enum
+{
+#ifdef BSP_USING_I2C0
+    I2C0_INDEX,
+#endif
+};
+
+
+#define i2c_dbg                 rt_kprintf
+
+struct lpc_i2c_bus
+{
+    struct rt_i2c_bus_device    parent;
+    LPI2C_Type                  *I2C;
+    clock_attach_id_t           clock_attach_id;
+    clock_div_name_t            clock_div_name;
+    clock_name_t                clock_src;
+    uint32_t                    baud;
+    char                        *name;
+};
+
+
+struct lpc_i2c_bus lpc_obj[] =
+{
+#ifdef BSP_USING_I2C0
+        {
+            .I2C = LPI2C0,
+            .baud = 100000U,
+            .clock_attach_id = kFRO12M_to_LPI2C0,
+            .clock_div_name = kCLOCK_DivLPI2C0,
+            .clock_src = kCLOCK_Fro12M,
+            .name = "i2c0",
+        },
+#endif
+};
+
+static rt_ssize_t lpc_i2c_xfer(struct rt_i2c_bus_device *bus, struct rt_i2c_msg msgs[], rt_uint32_t num)
+{
+    struct rt_i2c_msg *msg;
+    lpi2c_master_transfer_t xfer = {0};
+    rt_uint32_t i;
+    rt_ssize_t ret = 0;
+
+    struct lpc_i2c_bus *lpc_i2c = (struct lpc_i2c_bus *)bus;
+
+    for (i = 0; i < num; i++)
+    {
+        msg = &msgs[i];
+
+        if (msg->flags & RT_I2C_RD)
+        {
+            xfer.slaveAddress = msg->addr;
+            xfer.direction = kLPI2C_Read;
+            xfer.subaddress = 0;
+            xfer.subaddressSize = 0;
+            xfer.data = msg->buf;
+            xfer.dataSize = msg->len;
+            if(i != 0)
+                xfer.flags = kLPI2C_TransferRepeatedStartFlag;
+            else
+                xfer.flags = kLPI2C_TransferDefaultFlag;
+
+            if (LPI2C_MasterTransferBlocking(lpc_i2c->I2C, &xfer) != kStatus_Success)
+            {
+                i2c_dbg("i2c bus read failed!\n");
+                return i;
+            }
+        }
+        else
+        {
+            xfer.slaveAddress = msg->addr;
+            xfer.direction = kLPI2C_Write;
+            xfer.subaddress = 0;
+            xfer.subaddressSize = 0;
+            xfer.data = msg->buf;
+            xfer.dataSize = msg->len;
+            if(i == 0)
+                xfer.flags = kLPI2C_TransferNoStopFlag;
+            else
+                xfer.flags = kLPI2C_TransferDefaultFlag;
+
+            if (LPI2C_MasterTransferBlocking(lpc_i2c->I2C, &xfer) != kStatus_Success)
+            {
+                i2c_dbg("i2c bus write failed!\n");
+                return i;
+            }
+        }
+    }
+    ret = i;
+
+    return ret;
+}
+
+static const struct rt_i2c_bus_device_ops i2c_ops =
+{
+    lpc_i2c_xfer,
+    RT_NULL,
+    RT_NULL
+};
+
+int rt_hw_i2c_init(void)
+{
+    int i;
+    lpi2c_master_config_t masterConfig;
+
+    for(i=0; i<ARRAY_SIZE(lpc_obj); i++)
+    {
+        CLOCK_SetClockDiv(lpc_obj[i].clock_div_name, 1u);
+        CLOCK_AttachClk(lpc_obj[i].clock_attach_id);
+
+        LPI2C_MasterGetDefaultConfig(&masterConfig);
+        masterConfig.baudRate_Hz = lpc_obj[i].baud;
+
+        LPI2C_MasterInit(lpc_obj[i].I2C, &masterConfig, CLOCK_GetFreq(lpc_obj[i].clock_src));
+
+        lpc_obj[i].parent.ops = &i2c_ops;
+
+        rt_i2c_bus_device_register(&lpc_obj[i].parent, lpc_obj[i].name);
+    }
+
+    return RT_EOK;
+}
+INIT_DEVICE_EXPORT(rt_hw_i2c_init);
+
+#endif /* RT_USING_I2C */
+
+
+

+ 3 - 6
bsp/nxp/mcx/mcxa/frdm-mcxa153/board/Kconfig

@@ -35,15 +35,12 @@ menu "On-chip Peripheral Drivers"
         config BSP_USING_I2C
             bool "Enable I2C"
             select RT_USING_I2C
-            default y
+            default n
 
             if BSP_USING_I2C
                 config BSP_USING_I2C0
-                    bool "Enable Flexcomm0 I2C"
-                    default y
-                config BSP_USING_I2C1
-                    bool "Enable Flexcomm1 I2C"
-                    default y
+                    bool "Enable I2C0"
+                    default n
             endif
 
     menuconfig BSP_USING_SPI

+ 54 - 0
bsp/nxp/mcx/mcxa/frdm-mcxa153/board/MCUX_Config/board/pin_mux.c

@@ -54,6 +54,8 @@ void BOARD_InitPins(void)
     RESET_ReleasePeripheralReset(kCTIMER1_RST_SHIFT_RSTn);
     RESET_ReleasePeripheralReset(kLPSPI0_RST_SHIFT_RSTn);
 
+    RESET_ReleasePeripheralReset(kLPI2C0_RST_SHIFT_RSTn);
+
     RESET_ReleasePeripheralReset(kPORT0_RST_SHIFT_RSTn);
     RESET_ReleasePeripheralReset(kPORT1_RST_SHIFT_RSTn);
     RESET_ReleasePeripheralReset(kPORT2_RST_SHIFT_RSTn);
@@ -244,4 +246,56 @@ void BOARD_InitPins(void)
     /* PORT1_3 (pin 59) is configured as LPSPI0_PCS0 */
     PORT_SetPinConfig(PORT1, 3U, &port1_3_pin59_config);
 #endif
+
+#ifdef BSP_USING_I2C0
+    const port_pin_config_t port3_27_pin34_config = {/* Internal pull-up resistor is enabled */
+                                                     kPORT_PullUp,
+                                                     /* Low internal pull resistor value is selected. */
+                                                     kPORT_LowPullResistor,
+                                                     /* Fast slew rate is configured */
+                                                     kPORT_FastSlewRate,
+                                                     /* Passive input filter is disabled */
+                                                     kPORT_PassiveFilterDisable,
+                                                     /* Open drain output is enabled */
+                                                     kPORT_OpenDrainEnable,
+                                                     /* Low drive strength is configured */
+                                                     kPORT_LowDriveStrength,
+                                                     /* Normal drive strength is configured */
+                                                     kPORT_NormalDriveStrength,
+                                                     /* Pin is configured as LPI2C0_SCL */
+                                                     kPORT_MuxAlt2,
+                                                     /* Digital input enabled */
+                                                     kPORT_InputBufferEnable,
+                                                     /* Digital input is not inverted */
+                                                     kPORT_InputNormal,
+                                                     /* Pin Control Register fields [15:0] are not locked */
+                                                     kPORT_UnlockRegister};
+    /* PORT3_27 (pin 34) is configured as LPI2C0_SCL */
+    PORT_SetPinConfig(PORT3, 27U, &port3_27_pin34_config);
+
+    const port_pin_config_t port3_28_pin33_config = {/* Internal pull-up resistor is enabled */
+                                                     kPORT_PullUp,
+                                                     /* Low internal pull resistor value is selected. */
+                                                     kPORT_LowPullResistor,
+                                                     /* Fast slew rate is configured */
+                                                     kPORT_FastSlewRate,
+                                                     /* Passive input filter is disabled */
+                                                     kPORT_PassiveFilterDisable,
+                                                     /* Open drain output is enabled */
+                                                     kPORT_OpenDrainEnable,
+                                                     /* Low drive strength is configured */
+                                                     kPORT_LowDriveStrength,
+                                                     /* Normal drive strength is configured */
+                                                     kPORT_NormalDriveStrength,
+                                                     /* Pin is configured as LPI2C0_SDA */
+                                                     kPORT_MuxAlt2,
+                                                     /* Digital input enabled */
+                                                     kPORT_InputBufferEnable,
+                                                     /* Digital input is not inverted */
+                                                     kPORT_InputNormal,
+                                                     /* Pin Control Register fields [15:0] are not locked */
+                                                     kPORT_UnlockRegister};
+    /* PORT3_28 (pin 33) is configured as LPI2C0_SDA */
+    PORT_SetPinConfig(PORT3, 28U, &port3_28_pin33_config);
+#endif
 }