11/*
2- * Copyright (c) 2006-2023, RT-Thread Development Team
2+ * Copyright (c) 2006-2024 RT-Thread Development Team
33 *
44 * SPDX-License-Identifier: Apache-2.0
55 *
1313
1414#ifdef RT_USING_SERIAL_V2
1515
16- //#define DRV_DEBUG
16+ // #define DRV_DEBUG
1717#define DBG_TAG "drv.usart"
1818#ifdef DRV_DEBUG
1919#define DBG_LVL DBG_LOG
@@ -189,7 +189,7 @@ static rt_err_t stm32_configure(struct rt_serial_device *serial, struct serial_c
189189 }
190190
191191#ifdef RT_SERIAL_USING_DMA
192- uart -> dma_rx .remaining_cnt = serial -> config .rx_bufsz ;
192+ uart -> dma_rx .remaining_cnt = serial -> config .dma_ping_bufsz ;
193193#endif
194194
195195 if (HAL_UART_Init (& uart -> handle ) != HAL_OK )
@@ -255,6 +255,9 @@ static rt_err_t stm32_control(struct rt_serial_device *serial, int cmd, void *ar
255255 __HAL_UART_DISABLE_IT (& (uart -> handle ), UART_IT_TC );
256256
257257 HAL_NVIC_DisableIRQ (uart -> config -> dma_tx -> dma_irq );
258+
259+ HAL_DMA_Abort (& (uart -> dma_tx .handle ));
260+
258261 if (HAL_DMA_DeInit (& (uart -> dma_tx .handle )) != HAL_OK )
259262 {
260263 RT_ASSERT (0 );
@@ -414,12 +417,13 @@ static void dma_recv_isr(struct rt_serial_device *serial, rt_uint8_t isr_flag)
414417 if (counter <= uart -> dma_rx .remaining_cnt )
415418 recv_len = uart -> dma_rx .remaining_cnt - counter ;
416419 else
417- recv_len = serial -> config .rx_bufsz + uart -> dma_rx .remaining_cnt - counter ;
420+ recv_len = serial -> config .dma_ping_bufsz + uart -> dma_rx .remaining_cnt - counter ;
418421 if (recv_len )
419422 {
420423#if defined (__DCACHE_PRESENT ) && (__DCACHE_PRESENT == 1U )
421- struct rt_serial_rx_fifo * rx_fifo = (struct rt_serial_rx_fifo * ) serial -> serial_rx ;
422- SCB_InvalidateDCache_by_Addr ((uint32_t * )rx_fifo -> buffer , serial -> config .rx_bufsz );
424+ rt_uint8_t * ptr = NULL ;
425+ rt_hw_serial_control_isr (serial , RT_HW_SERIAL_CTRL_GET_DMA_PING_BUF , & ptr );
426+ SCB_InvalidateDCache_by_Addr ((uint32_t * )ptr , serial -> config .dma_ping_bufsz );
423427#endif
424428 uart -> dma_rx .remaining_cnt = counter ;
425429 rt_hw_serial_isr (serial , RT_SERIAL_EVENT_RX_DMADONE | (recv_len << 8 ));
@@ -923,6 +927,7 @@ static void stm32_uart_get_config(void)
923927 uart_obj [UART1_INDEX ].serial .config .tx_bufsz = BSP_UART1_TX_BUFSIZE ;
924928
925929#ifdef BSP_UART1_RX_USING_DMA
930+ uart_obj [UART1_INDEX ].serial .config .dma_ping_bufsz = BSP_UART1_DMA_PING_BUFSIZE ;
926931 uart_obj [UART1_INDEX ].uart_dma_flag |= RT_DEVICE_FLAG_DMA_RX ;
927932 static struct dma_config uart1_dma_rx = UART1_DMA_RX_CONFIG ;
928933 uart_config [UART1_INDEX ].dma_rx = & uart1_dma_rx ;
@@ -943,6 +948,7 @@ static void stm32_uart_get_config(void)
943948 uart_obj [UART2_INDEX ].serial .config .tx_bufsz = BSP_UART2_TX_BUFSIZE ;
944949
945950#ifdef BSP_UART2_RX_USING_DMA
951+ uart_obj [UART2_INDEX ].serial .config .dma_ping_bufsz = BSP_UART2_DMA_PING_BUFSIZE ;
946952 uart_obj [UART2_INDEX ].uart_dma_flag |= RT_DEVICE_FLAG_DMA_RX ;
947953 static struct dma_config uart2_dma_rx = UART2_DMA_RX_CONFIG ;
948954 uart_config [UART2_INDEX ].dma_rx = & uart2_dma_rx ;
@@ -963,6 +969,7 @@ static void stm32_uart_get_config(void)
963969 uart_obj [UART3_INDEX ].serial .config .tx_bufsz = BSP_UART3_TX_BUFSIZE ;
964970
965971#ifdef BSP_UART3_RX_USING_DMA
972+ uart_obj [UART3_INDEX ].serial .config .dma_ping_bufsz = BSP_UART3_DMA_PING_BUFSIZE ;
966973 uart_obj [UART3_INDEX ].uart_dma_flag |= RT_DEVICE_FLAG_DMA_RX ;
967974 static struct dma_config uart3_dma_rx = UART3_DMA_RX_CONFIG ;
968975 uart_config [UART3_INDEX ].dma_rx = & uart3_dma_rx ;
@@ -983,6 +990,7 @@ static void stm32_uart_get_config(void)
983990 uart_obj [UART4_INDEX ].serial .config .tx_bufsz = BSP_UART4_TX_BUFSIZE ;
984991
985992#ifdef BSP_UART4_RX_USING_DMA
993+ uart_obj [UART4_INDEX ].serial .config .dma_ping_bufsz = BSP_UART4_DMA_PING_BUFSIZE ;
986994 uart_obj [UART4_INDEX ].uart_dma_flag |= RT_DEVICE_FLAG_DMA_RX ;
987995 static struct dma_config uart4_dma_rx = UART4_DMA_RX_CONFIG ;
988996 uart_config [UART4_INDEX ].dma_rx = & uart4_dma_rx ;
@@ -1003,6 +1011,7 @@ static void stm32_uart_get_config(void)
10031011 uart_obj [UART5_INDEX ].serial .config .tx_bufsz = BSP_UART5_TX_BUFSIZE ;
10041012
10051013#ifdef BSP_UART5_RX_USING_DMA
1014+ uart_obj [UART5_INDEX ].serial .config .dma_ping_bufsz = BSP_UART5_DMA_PING_BUFSIZE ;
10061015 uart_obj [UART5_INDEX ].uart_dma_flag |= RT_DEVICE_FLAG_DMA_RX ;
10071016 static struct dma_config uart5_dma_rx = UART5_DMA_RX_CONFIG ;
10081017 uart_config [UART5_INDEX ].dma_rx = & uart5_dma_rx ;
@@ -1023,6 +1032,7 @@ static void stm32_uart_get_config(void)
10231032 uart_obj [UART6_INDEX ].serial .config .tx_bufsz = BSP_UART6_TX_BUFSIZE ;
10241033
10251034#ifdef BSP_UART6_RX_USING_DMA
1035+ uart_obj [UART6_INDEX ].serial .config .dma_ping_bufsz = BSP_UART6_DMA_PING_BUFSIZE ;
10261036 uart_obj [UART6_INDEX ].uart_dma_flag |= RT_DEVICE_FLAG_DMA_RX ;
10271037 static struct dma_config uart6_dma_rx = UART6_DMA_RX_CONFIG ;
10281038 uart_config [UART6_INDEX ].dma_rx = & uart6_dma_rx ;
@@ -1043,6 +1053,7 @@ static void stm32_uart_get_config(void)
10431053 uart_obj [UART7_INDEX ].serial .config .tx_bufsz = BSP_UART7_TX_BUFSIZE ;
10441054
10451055#ifdef BSP_UART7_RX_USING_DMA
1056+ uart_obj [UART7_INDEX ].serial .config .dma_ping_bufsz = BSP_UART7_DMA_PING_BUFSIZE ;
10461057 uart_obj [UART7_INDEX ].uart_dma_flag |= RT_DEVICE_FLAG_DMA_RX ;
10471058 static struct dma_config uart7_dma_rx = UART7_DMA_RX_CONFIG ;
10481059 uart_config [UART7_INDEX ].dma_rx = & uart7_dma_rx ;
@@ -1069,6 +1080,7 @@ static void stm32_uart_get_config(void)
10691080#endif
10701081
10711082#ifdef BSP_UART8_TX_USING_DMA
1083+ uart_obj [UART8_INDEX ].serial .config .dma_ping_bufsz = BSP_UART8_DMA_PING_BUFSIZE ;
10721084 uart_obj [UART8_INDEX ].uart_dma_flag |= RT_DEVICE_FLAG_DMA_TX ;
10731085 static struct dma_config uart8_dma_tx = UART8_DMA_TX_CONFIG ;
10741086 uart_config [UART8_INDEX ].dma_tx = & uart8_dma_tx ;
@@ -1083,6 +1095,7 @@ static void stm32_uart_get_config(void)
10831095 uart_obj [LPUART1_INDEX ].serial .config .tx_bufsz = BSP_LPUART1_TX_BUFSIZE ;
10841096
10851097#ifdef BSP_LPUART1_RX_USING_DMA
1098+ uart_obj [LPUART1_INDEX ].serial .config .dma_ping_bufsz = BSP_LPUART1_DMA_PING_BUFSIZE ;
10861099 uart_obj [LPUART1_INDEX ].uart_dma_flag |= RT_DEVICE_FLAG_DMA_RX ;
10871100 static struct dma_config lpuart1_dma_rx = LPUART1_DMA_CONFIG ;
10881101 uart_config [LPUART1_INDEX ].dma_rx = & lpuart1_dma_rx ;
@@ -1093,7 +1106,6 @@ static void stm32_uart_get_config(void)
10931106#ifdef RT_SERIAL_USING_DMA
10941107static void stm32_dma_config (struct rt_serial_device * serial , rt_ubase_t flag )
10951108{
1096- struct rt_serial_rx_fifo * rx_fifo ;
10971109 DMA_HandleTypeDef * DMA_Handle ;
10981110 struct dma_config * dma_config ;
10991111 struct stm32_uart * uart ;
@@ -1194,10 +1206,11 @@ static void stm32_dma_config(struct rt_serial_device *serial, rt_ubase_t flag)
11941206 /* enable interrupt */
11951207 if (flag == RT_DEVICE_FLAG_DMA_RX )
11961208 {
1197- rx_fifo = (struct rt_serial_rx_fifo * )serial -> serial_rx ;
1198- RT_ASSERT (rx_fifo != RT_NULL );
1209+ rt_uint8_t * ptr = NULL ;
1210+ rt_hw_serial_control_isr (serial , RT_HW_SERIAL_CTRL_GET_DMA_PING_BUF , & ptr );
1211+
11991212 /* Start DMA transfer */
1200- if (HAL_UART_Receive_DMA (& (uart -> handle ), rx_fifo -> buffer , serial -> config .rx_bufsz ) != HAL_OK )
1213+ if (HAL_UART_Receive_DMA (& (uart -> handle ), ptr , serial -> config .dma_ping_bufsz ) != HAL_OK )
12011214 {
12021215 /* Transfer error in reception process */
12031216 RT_ASSERT (0 );
0 commit comments