Skip to content

Commit 3d95a3a

Browse files
Ryan-CW-Codehydevcode
authored andcommitted
[components][serial_v2] DMA模式下使用乒乓缓冲、DMA模式支持丢弃新数据策略
1 parent d1b43d9 commit 3d95a3a

File tree

4 files changed

+150
-34
lines changed

4 files changed

+150
-34
lines changed

bsp/stm32/libraries/HAL_Drivers/drivers/drv_usart_v2.c

Lines changed: 23 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
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
*
@@ -13,7 +13,7 @@
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
10941107
static 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);

components/drivers/include/drivers/dev_serial_v2.h

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -191,8 +191,9 @@
191191
/**
192192
* hw serial control commands
193193
*/
194-
#define RT_HW_SERIAL_CTRL_GETC 0x01 /* Tx irq get char */
195-
#define RT_HW_SERIAL_CTRL_PUTC 0x02 /* Rx irq put char */
194+
#define RT_HW_SERIAL_CTRL_GETC 0x01 /* Tx irq get char */
195+
#define RT_HW_SERIAL_CTRL_PUTC 0x02 /* Rx irq put char */
196+
#define RT_HW_SERIAL_CTRL_GET_DMA_PING_BUF 0x03 /* get DMA ping-pong buffer */
196197

197198
/**
198199
* hw isr event
@@ -262,6 +263,10 @@ struct serial_configure
262263
rt_uint32_t tx_bufsz :16;
263264
rt_uint32_t flowcontrol :1;
264265
rt_uint32_t reserved :5;
266+
267+
#ifdef RT_SERIAL_USING_DMA
268+
rt_uint32_t dma_ping_bufsz :16;
269+
#endif
265270
};
266271

267272
/**
@@ -271,14 +276,15 @@ struct rt_serial_rx_fifo
271276
{
272277
struct rt_ringbuffer rb;
273278

274-
struct rt_completion rx_cpt;
279+
#ifdef RT_SERIAL_USING_DMA
280+
struct rt_ringbuffer dma_ping_rb;
281+
#endif
275282

276-
rt_uint16_t rx_cpt_index;
283+
struct rt_completion rx_cpt;
277284

278285
rt_int32_t rx_timeout;
279286

280-
/* software fifo */
281-
rt_uint8_t buffer[];
287+
rt_uint16_t rx_cpt_index;
282288
};
283289

284290
/**
@@ -289,16 +295,13 @@ struct rt_serial_tx_fifo
289295
{
290296
struct rt_ringbuffer rb;
291297

298+
struct rt_completion tx_cpt;
299+
292300
rt_size_t put_size;
293301

294302
rt_int32_t tx_timeout;
295303

296304
rt_atomic_t activated;
297-
298-
struct rt_completion tx_cpt;
299-
300-
/* software fifo */
301-
rt_uint8_t buffer[];
302305
};
303306

304307
/**

components/drivers/serial/Kconfig

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@ menuconfig RT_USING_SERIAL
1919
depends on RT_USING_SERIAL_V2
2020
default RT_SERIAL_BUF_STRATEGY_OVERWRITE
2121
config RT_SERIAL_BUF_STRATEGY_DROP
22-
depends on !RT_SERIAL_USING_DMA
2322
bool "drop new incoming data when the buffer is full"
2423
config RT_SERIAL_BUF_STRATEGY_OVERWRITE
2524
bool "overwrite old data when the buffer is full"

0 commit comments

Comments
 (0)