[bsp_lpc55sxx] i2c,rtc bsp update (#6885)

* [bsp_lpc55sxx] i2c,rtc bsp update
This commit is contained in:
杨熙 2023-01-31 10:21:52 +08:00 committed by GitHub
parent 5f4b4ae5f1
commit c9c43c8c5b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 76 additions and 57 deletions

View File

@ -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<ARRAY_SIZE(lpc_obj); i++)
{
CLOCK_AttachClk(lpc_obj[i].i2c_clock_id);
/* Change the default baudrate configuration */
masterConfig.baudRate_Bps = 100000U;
I2C_MasterGetDefaultConfig(&masterConfig);
masterConfig.baudRate_Bps = lpc_obj[i].baud;
/* Initialize the I2C master peripheral */
I2C_MasterInit(I2C1, &masterConfig, 12000000);
/* Initialize the I2C master peripheral */
I2C_MasterInit(lpc_obj[i].I2C, &masterConfig, CLOCK_GetFlexCommClkFreq(lpc_obj[i].instance));
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 */
lpc_obj[i].parent.ops = &i2c_ops;
lpc_obj[i].sem = rt_sem_create("sem_i2c", 0, RT_IPC_FLAG_FIFO);
#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);
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);
I2C_MasterGetDefaultConfig(&masterConfig);
/* Change the default baudrate configuration */
masterConfig.baudRate_Bps = 100000U;
/* Initialize the I2C master peripheral */
I2C_MasterInit(I2C4, &masterConfig, 12000000);
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");
#endif /* BSP_USING_I2C4 */
rt_i2c_bus_device_register(&lpc_obj[i].parent, lpc_obj[i].device_name);
}
return 0;
}

View File

@ -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;