From d3b9480658b79800b78b6281af473d2f4933cef2 Mon Sep 17 00:00:00 2001 From: hywing <2112093745@qq.com> Date: Wed, 21 Aug 2024 22:20:26 +0800 Subject: [PATCH] [bsp][nxp][mcxa153] add i2c driver --- bsp/nxp/mcx/mcxa/Libraries/drivers/drv_i2c.c | 146 ++++++++++++++++++ bsp/nxp/mcx/mcxa/frdm-mcxa153/board/Kconfig | 9 +- .../board/MCUX_Config/board/pin_mux.c | 54 +++++++ 3 files changed, 203 insertions(+), 6 deletions(-) create mode 100644 bsp/nxp/mcx/mcxa/Libraries/drivers/drv_i2c.c diff --git a/bsp/nxp/mcx/mcxa/Libraries/drivers/drv_i2c.c b/bsp/nxp/mcx/mcxa/Libraries/drivers/drv_i2c.c new file mode 100644 index 0000000000..5f79a1828f --- /dev/null +++ b/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 +#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