diff options
| author | 杨熙 <[email protected]> | 2023-01-31 10:21:52 +0800 |
|---|---|---|
| committer | GitHub <[email protected]> | 2023-01-30 21:21:52 -0500 |
| commit | c9c43c8c5b8a279ae38ceadddfedd65371f182e5 (patch) | |
| tree | 67f19b40cc87fb8f418a5ed14d4332a666d63f15 | |
| parent | 5f4b4ae5f1a741fd2fd02808de55284e46b1d85f (diff) | |
[bsp_lpc55sxx] i2c,rtc bsp update (#6885)
* [bsp_lpc55sxx] i2c,rtc bsp update
| -rw-r--r-- | bsp/lpc55sxx/Libraries/drivers/drv_i2c.c | 117 | ||||
| -rw-r--r-- | 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); - /* Change the default baudrate configuration */ - masterConfig.baudRate_Bps = 100000U; - - /* Initialize the I2C master peripheral */ - I2C_MasterInit(I2C1, &masterConfig, 12000000); - - rt_memset((void *)&lpc_i2c1, 0, sizeof(struct lpc_i2c_bus)); - lpc_i2c1.parent.ops = &i2c_ops; - lpc_i2c1.I2C = I2C1; - lpc_i2c1.device_name = "i2c1"; - rt_i2c_bus_device_register(&lpc_i2c1.parent, "i2c1"); -#endif /* BSP_USING_I2C1 */ - -#ifdef BSP_USING_I2C4 - static struct lpc_i2c_bus lpc_i2c4; - /* attach 12 MHz clock to FLEXCOMM2 (I2C master for touch controller) */ - CLOCK_AttachClk(kFRO12M_to_FLEXCOMM4); + for(i=0; i<ARRAY_SIZE(lpc_obj); i++) + { + CLOCK_AttachClk(lpc_obj[i].i2c_clock_id); - I2C_MasterGetDefaultConfig(&masterConfig); + I2C_MasterGetDefaultConfig(&masterConfig); + masterConfig.baudRate_Bps = lpc_obj[i].baud; - /* Change the default baudrate configuration */ - masterConfig.baudRate_Bps = 100000U; + /* Initialize the I2C master peripheral */ + I2C_MasterInit(lpc_obj[i].I2C, &masterConfig, CLOCK_GetFlexCommClkFreq(lpc_obj[i].instance)); - /* Initialize the I2C master peripheral */ - I2C_MasterInit(I2C4, &masterConfig, 12000000); + lpc_obj[i].parent.ops = &i2c_ops; + lpc_obj[i].sem = rt_sem_create("sem_i2c", 0, RT_IPC_FLAG_FIFO); - rt_memset((void *)&lpc_i2c4, 0, sizeof(struct lpc_i2c_bus)); - lpc_i2c4.parent.ops = &i2c_ops; - lpc_i2c4.I2C = I2C4; - lpc_i2c4.device_name = "i2c4"; - rt_i2c_bus_device_register(&lpc_i2c4.parent, "i2c4"); + DMA_Init(lpc_obj[i].DMA); + DMA_CreateHandle(&lpc_obj[i].dmaHandle, lpc_obj[i].DMA, lpc_obj[i].dma_chl); + I2C_MasterTransferCreateHandleDMA(lpc_obj[i].I2C, &lpc_obj[i].i2c_mst_dma_handle, i2c_mst_dma_callback, &lpc_obj[i], &lpc_obj[i].dmaHandle); -#endif /* BSP_USING_I2C4 */ + rt_i2c_bus_device_register(&lpc_obj[i].parent, lpc_obj[i].device_name); + } return 0; } diff --git a/bsp/lpc55sxx/Libraries/drivers/drv_rtc.c b/bsp/lpc55sxx/Libraries/drivers/drv_rtc.c index c7a3d66834..65d34bbb4e 100644 --- a/bsp/lpc55sxx/Libraries/drivers/drv_rtc.c +++ b/bsp/lpc55sxx/Libraries/drivers/drv_rtc.c @@ -18,11 +18,7 @@ #ifdef RT_USING_RTC -#if defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL - #error "Please don't define 'FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL'!" -#endif - -static time_t get_timestamp(void) +static rt_err_t lpc_get_timestamp(time_t *timestamp) { struct tm tm_new = {0}; rtc_datetime_t rtcDate; @@ -38,10 +34,12 @@ static time_t get_timestamp(void) tm_new.tm_mon = rtcDate.month - 1; tm_new.tm_year = rtcDate.year - 1900; - return timegm(&tm_new); + timegm(&tm_new); + *timestamp = timegm(&tm_new); + return RT_EOK; } -static int set_timestamp(time_t timestamp) +static int lpc_set_timestamp(time_t timestamp) { struct tm now; rtc_datetime_t rtcDate; @@ -107,13 +105,13 @@ static rt_err_t lpc_rtc_control(rt_device_t dev, int cmd, void *args) { case RT_DEVICE_CTRL_RTC_GET_TIME: { - *(uint32_t *)args = get_timestamp(); + lpc_get_timestamp(args); } break; case RT_DEVICE_CTRL_RTC_SET_TIME: { - set_timestamp(*(time_t *)args); + lpc_set_timestamp(*(time_t *)args); } break; |
