From 7e5034c67dfe507717e7bb3b267ee8f1b0e045a5 Mon Sep 17 00:00:00 2001 From: LeeChunHei Date: Sun, 14 Feb 2021 12:15:20 +0800 Subject: [PATCH 1/3] change to use non blocking api and use semaphore to sync the transfer --- bsp/imxrt/libraries/drivers/drv_spi.c | 32 ++++++++++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git a/bsp/imxrt/libraries/drivers/drv_spi.c b/bsp/imxrt/libraries/drivers/drv_spi.c index e0375166a2..75813e0eab 100644 --- a/bsp/imxrt/libraries/drivers/drv_spi.c +++ b/bsp/imxrt/libraries/drivers/drv_spi.c @@ -64,6 +64,8 @@ struct imxrt_spi char *bus_name; LPSPI_Type *base; struct rt_spi_bus spi_bus; + rt_sem_t xfer_sem; + lpspi_master_handle_t spi_normal; struct dma_config *dma; rt_uint8_t dma_flag; }; @@ -159,9 +161,18 @@ static void spi_get_dma_config(void) #endif } +void normal_xfer_callback(LPSPI_Type *base, lpspi_master_handle_t *handle, status_t status, void *userData) +{ + /* xfer complete callback */ + struct imxrt_spi *spi = (struct imxrt_spi *)userData; + rt_sem_release(spi->xfer_sem); +} + void edma_xfer_callback(LPSPI_Type *base, lpspi_master_edma_handle_t *handle, status_t status, void *userData) { /* xfer complete callback */ + struct imxrt_spi *spi = (struct imxrt_spi *)userData; + rt_sem_release(spi->xfer_sem); } rt_err_t rt_hw_spi_device_attach(const char *bus_name, const char *device_name, rt_uint32_t pin) @@ -217,6 +228,17 @@ static uint32_t imxrt_get_lpspi_freq(void) return freq; } +static void lpspi_normal_config(struct imxrt_spi *spi) +{ + RT_ASSERT(spi != RT_NULL); + + LPSPI_MasterTransferCreateHandle(spi->base, + &spi->spi_normal, + normal_xfer_callback, + spi); + LOG_D(LOG_TAG" %s normal config done\n", spi->bus_name); +} + static void lpspi_dma_config(struct imxrt_spi *spi) { RT_ASSERT(spi != RT_NULL); @@ -325,12 +347,13 @@ static rt_uint32_t spixfer(struct rt_spi_device *device, struct rt_spi_message * if(RT_FALSE == spi->dma_flag) { - status = LPSPI_MasterTransferBlocking(spi->base, &transfer); + status = LPSPI_MasterTransferNonBlocking(spi->base, &spi->spi_normal, &transfer); } else { status = LPSPI_MasterTransferEDMA(spi->base,&spi->dma->spi_edma,&transfer); } + rt_sem_take(spi->xfer_sem, RT_WAITING_FOREVER); if(message->cs_release) { @@ -369,6 +392,13 @@ int rt_hw_spi_bus_init(void) { lpspi_dma_config(&lpspis[i]); } + else + { + lpspi_normal_config(&lpspis[i]); + } + char sem_name[RT_NAME_MAX]; + rt_sprintf(sem_name, "%s_s", lpspis[i].bus_name); + lpspis[i].xfer_sem = rt_sem_create(sem_name, 0, RT_IPC_FLAG_PRIO); } return ret; From a40bf3b11d614daf827a0f9cc5a53d4d03f0123e Mon Sep 17 00:00:00 2001 From: LeeChunHei Date: Mon, 22 Feb 2021 22:17:07 +0800 Subject: [PATCH 2/3] adding option for using blocking spi transfer --- bsp/imxrt/libraries/drivers/drv_spi.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/bsp/imxrt/libraries/drivers/drv_spi.c b/bsp/imxrt/libraries/drivers/drv_spi.c index 75813e0eab..4f042dc93f 100644 --- a/bsp/imxrt/libraries/drivers/drv_spi.c +++ b/bsp/imxrt/libraries/drivers/drv_spi.c @@ -347,7 +347,11 @@ static rt_uint32_t spixfer(struct rt_spi_device *device, struct rt_spi_message * if(RT_FALSE == spi->dma_flag) { +#ifdef(BSP_USING_BLOCKING_SPI) + status = LPSPI_MasterTransferBlocking(spi->base, &transfer); +#else status = LPSPI_MasterTransferNonBlocking(spi->base, &spi->spi_normal, &transfer); +#endif } else { From 6f0b8a5b7854c388d3480e40152dec39c90030d7 Mon Sep 17 00:00:00 2001 From: LeeChunHei Date: Mon, 22 Feb 2021 22:26:00 +0800 Subject: [PATCH 3/3] change the wrong syntax --- bsp/imxrt/libraries/drivers/drv_spi.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bsp/imxrt/libraries/drivers/drv_spi.c b/bsp/imxrt/libraries/drivers/drv_spi.c index 4f042dc93f..04c9e94020 100644 --- a/bsp/imxrt/libraries/drivers/drv_spi.c +++ b/bsp/imxrt/libraries/drivers/drv_spi.c @@ -347,7 +347,7 @@ static rt_uint32_t spixfer(struct rt_spi_device *device, struct rt_spi_message * if(RT_FALSE == spi->dma_flag) { -#ifdef(BSP_USING_BLOCKING_SPI) +#ifdef BSP_USING_BLOCKING_SPI status = LPSPI_MasterTransferBlocking(spi->base, &transfer); #else status = LPSPI_MasterTransferNonBlocking(spi->base, &spi->spi_normal, &transfer);