From c9c43c8c5b8a279ae38ceadddfedd65371f182e5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E7=86=99?= Date: Tue, 31 Jan 2023 10:21:52 +0800 Subject: [PATCH] [bsp_lpc55sxx] i2c,rtc bsp update (#6885) * [bsp_lpc55sxx] i2c,rtc bsp update --- bsp/lpc55sxx/Libraries/drivers/drv_i2c.c | 117 +++++++++++++---------- bsp/lpc55sxx/Libraries/drivers/drv_rtc.c | 16 ++-- 2 files changed, 76 insertions(+), 57 deletions(-) diff --git a/bsp/lpc55sxx/Libraries/drivers/drv_i2c.c b/bsp/lpc55sxx/Libraries/drivers/drv_i2c.c index 4dd88693b8..522b4b712f 100644 --- a/bsp/lpc55sxx/Libraries/drivers/drv_i2c.c +++ b/bsp/lpc55sxx/Libraries/drivers/drv_i2c.c @@ -14,18 +14,58 @@ #include "fsl_iocon.h" #include "fsl_gpio.h" #include "fsl_i2c.h" +#include "fsl_i2c_dma.h" #ifdef RT_USING_I2C -#define i2c_dbg rt_kprintf +enum +{ +#ifdef BSP_USING_I2C4 + I2C4_INDEX, +#endif +}; + + +#define i2c_dbg rt_kprintf struct lpc_i2c_bus { - struct rt_i2c_bus_device parent; - I2C_Type *I2C; - char *device_name; + struct rt_i2c_bus_device parent; + I2C_Type *I2C; + DMA_Type *DMA; + i2c_master_dma_handle_t i2c_mst_dma_handle; + dma_handle_t dmaHandle; + rt_sem_t sem; + clock_attach_id_t i2c_clock_id; + uint32_t dma_chl; + uint32_t instance; + uint32_t baud; + char *device_name; }; + +struct lpc_i2c_bus lpc_obj[] = +{ +#ifdef BSP_USING_I2C4 + { + .I2C = I2C4, + .DMA = DMA0, + .dma_chl = 13, + .device_name = "i2c4", + .baud = 400000U, + .instance = 4U, + .i2c_clock_id = kFRO12M_to_FLEXCOMM4, + }, +#endif +}; + + +static void i2c_mst_dma_callback(I2C_Type *base, i2c_master_dma_handle_t *handle, status_t status, void *userData) +{ + struct lpc_i2c_bus *lpc_i2c = (struct lpc_i2c_bus*)userData; + rt_sem_release(lpc_i2c->sem); +} + static rt_size_t lpc_i2c_xfer(struct rt_i2c_bus_device *bus, struct rt_i2c_msg msgs[], rt_uint32_t num) { @@ -53,11 +93,13 @@ static rt_size_t lpc_i2c_xfer(struct rt_i2c_bus_device *bus, else xfer.flags = kI2C_TransferDefaultFlag; - if (I2C_MasterTransferBlocking(lpc_i2c->I2C, &xfer) != kStatus_Success) + // if (I2C_MasterTransferBlocking(lpc_i2c->I2C, &xfer) != kStatus_Success) + if(I2C_MasterTransferDMA(lpc_i2c->I2C, &lpc_i2c->i2c_mst_dma_handle, &xfer) != kStatus_Success) { - i2c_dbg("i2c bus write failed,i2c bus stop!\n"); - goto out; + i2c_dbg("i2c bus read failed!\n"); + return i; } + rt_sem_take(lpc_i2c->sem, RT_WAITING_FOREVER); } else { @@ -72,24 +114,22 @@ static rt_size_t lpc_i2c_xfer(struct rt_i2c_bus_device *bus, else xfer.flags = kI2C_TransferDefaultFlag; - if (I2C_MasterTransferBlocking(lpc_i2c->I2C, &xfer) != kStatus_Success) + //if (I2C_MasterTransferBlocking(lpc_i2c->I2C, &xfer) != kStatus_Success) + if(I2C_MasterTransferDMA(lpc_i2c->I2C, &lpc_i2c->i2c_mst_dma_handle, &xfer) != kStatus_Success) { - i2c_dbg("i2c bus write failed,i2c bus stop!\n"); - goto out; + i2c_dbg("i2c bus write failed!\n"); + return i; } + rt_sem_take(lpc_i2c->sem, RT_WAITING_FOREVER); } } ret = i; -out: - i2c_dbg("send stop condition\n"); - return ret; } static const struct rt_i2c_bus_device_ops i2c_ops = { - lpc_i2c_xfer, RT_NULL, RT_NULL @@ -97,47 +137,28 @@ static const struct rt_i2c_bus_device_ops i2c_ops = int rt_hw_i2c_init(void) { + int i; i2c_master_config_t masterConfig; -#ifdef BSP_USING_I2C1 - static struct lpc_i2c_bus lpc_i2c1; - /* attach 12 MHz clock to FLEXCOMM2 (I2C master for touch controller) */ - CLOCK_AttachClk(kFRO12M_to_FLEXCOMM1); - I2C_MasterGetDefaultConfig(&masterConfig); + for(i=0; i