summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author杨熙 <[email protected]>2023-01-31 10:21:52 +0800
committerGitHub <[email protected]>2023-01-30 21:21:52 -0500
commitc9c43c8c5b8a279ae38ceadddfedd65371f182e5 (patch)
tree67f19b40cc87fb8f418a5ed14d4332a666d63f15
parent5f4b4ae5f1a741fd2fd02808de55284e46b1d85f (diff)
[bsp_lpc55sxx] i2c,rtc bsp update (#6885)
* [bsp_lpc55sxx] i2c,rtc bsp update
-rw-r--r--bsp/lpc55sxx/Libraries/drivers/drv_i2c.c117
-rw-r--r--bsp/lpc55sxx/Libraries/drivers/drv_rtc.c16
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;