[drivers][serial_v2]允许阻塞接收超过rx缓冲区大小的数据、增加超时时间、flush、获取缓冲区数据长度命令、数据溢出逻辑修复、稳定性细节优化、添加更多serial_v2测试用例

[components][serial_v2] 优化txflush逻辑、对tx的activated做中断保护

[components][at] at_client适配新版serial_v2

[components][at] at_server适配新版serial_v2

[components][serial_v2] 测试用例增加循环调用,format测试用例

[components][serial_v2] poll模式判断逻辑错误

[components][serial_v2] 测试用例去掉一些非必要延时

[components][serial_v2] 测试例程使用menuconfig进行配置,更新readme

[components][at_client] at_client_getchar返回值错误、at_client解析线程优先级错误设置

[components][at] 错误码应该返回负值

[components][serial_v2] TCFLSH和FIONREAD完善、control函数增加错误返回值

[components][serial_v2] RT_SERIAL_CTRL_GET_RX_DATA_LEN更改为RT_SERIAL_CTRL_GET_UNREAD_BYTES_COUNT

[utest][serial_v2] TC_UART_SEND_TIMES替换为RT_SERIAL_TC_SEND_ITERATIONS

[components][serial_v2] FIONREAD参数应该是无符号类型

[utest][serial_v2] 完善测试用例

[components][serial_v2] 避免使用三目运算符

[components][serial_v2] 使用clang-format格式化代码

[components][serial_v2] 添加get超时时间命令

[components][serial_v2] 完善posix接口

[components][serial_v2] 阻塞接口添加阻塞时间为0时的处理逻辑、优化RX阻塞接收逻辑

[components][serial_v2] 设置超时时间命令的参数改为指针形式

[components][serial_v2] nbuf发送添加超时时间为0时的逻辑

[components][serial_v2] 完善添加测试用例

[utest][serial_v2] 修复依赖关系

[components][serial_v2] 非阻塞模式下tx_flush错误修复

[components][serial_v2] activated使用原子API

[components][serial_v2] 优化DMA逻辑、没使能DMA时屏蔽DMA逻辑节约资源

[components][serial_v2] 提供写满时丢弃新数据和覆盖旧数据策略,写满丢弃策略效率更高

[components][serial_v2] 部分平台适配写满时两种策略功能

[components][serial_v2] DMA模式暂不支持丢弃新数据策略

[utest][serial_v2] 优化测试代码

[components][serial_v2] DMA模式下使用乒乓缓冲、DMA模式支持丢弃新数据策略

[utest][serial_v2] 适配DMA乒乓缓冲

[bsp][serial_v2] 部分bsp适配DMA下乒乓缓冲

[components][serial_v2] 使用spinlock替换中断,对部分结构体变量使用原子操作

[utest][serial_v2] 更新测试用例

[components][at] 适配new serialv2不再判断RTT版本号

[components][at] 删除多余的中文注释

[utest][serial_v2] 添加交叉echo示例,qemu环境下专用

[bsp][qemu] 适配串口v2并开启fifo

[components][at] 修复合并导致的错误

[bsp][n32] 适配serial_v2,没有经过测试

[components][serial_v2] 格式化代码

[utest][serial_v2] 删除无意义的打印
This commit is contained in:
ryancw
2024-09-04 10:39:10 +08:00
committed by Rbb666
parent bf96f99d6b
commit ac8fba0129
65 changed files with 4332 additions and 1260 deletions
+18
View File
@@ -80,6 +80,12 @@ menu "On-chip Peripheral Drivers"
range 0 65535
depends on RT_USING_SERIAL_V2
default 0
config BSP_UART1_DMA_PING_BUFSIZE
int "Set UART1 RX DMA ping-pong buffer size"
range 32 65535
depends on RT_USING_SERIAL_V2 && BSP_UART1_RX_USING_DMA
default 64
endif
menuconfig BSP_USING_UART2
@@ -107,6 +113,12 @@ menu "On-chip Peripheral Drivers"
range 0 65535
depends on RT_USING_SERIAL_V2
default 0
config BSP_UART2_DMA_PING_BUFSIZE
int "Set UART2 RX DMA ping-pong buffer size"
range 32 65535
depends on RT_USING_SERIAL_V2 && BSP_UART2_RX_USING_DMA
default 64
endif
menuconfig BSP_USING_UART3
@@ -134,6 +146,12 @@ menu "On-chip Peripheral Drivers"
range 0 65535
depends on RT_USING_SERIAL_V2
default 0
config BSP_UART3_DMA_PING_BUFSIZE
int "Set UART3 RX DMA ping-pong buffer size"
range 32 65535
depends on RT_USING_SERIAL_V2 && BSP_UART3_RX_USING_DMA
default 64
endif
endif
+18
View File
@@ -95,6 +95,12 @@ menu "On-chip Peripheral Drivers"
range 0 65535
depends on RT_USING_SERIAL_V2
default 0
config BSP_UART1_DMA_PING_BUFSIZE
int "Set UART1 RX DMA ping-pong buffer size"
range 32 65535
depends on RT_USING_SERIAL_V2 && BSP_UART1_RX_USING_DMA
default 64
endif
menuconfig BSP_USING_UART2
@@ -122,6 +128,12 @@ menu "On-chip Peripheral Drivers"
range 0 65535
depends on RT_USING_SERIAL_V2
default 0
config BSP_UART2_DMA_PING_BUFSIZE
int "Set UART2 RX DMA ping-pong buffer size"
range 32 65535
depends on RT_USING_SERIAL_V2 && BSP_UART2_RX_USING_DMA
default 64
endif
menuconfig BSP_USING_UART3
@@ -149,6 +161,12 @@ menu "On-chip Peripheral Drivers"
range 0 65535
depends on RT_USING_SERIAL_V2
default 0
config BSP_UART3_DMA_PING_BUFSIZE
int "Set UART3 RX DMA ping-pong buffer size"
range 32 65535
depends on RT_USING_SERIAL_V2 && BSP_UART3_RX_USING_DMA
default 64
endif
endif
+18
View File
@@ -106,6 +106,12 @@ menu "On-chip Peripheral Drivers"
range 0 65535
depends on RT_USING_SERIAL_V2
default 0
config BSP_UART1_DMA_PING_BUFSIZE
int "Set UART1 RX DMA ping-pong buffer size"
range 32 65535
depends on RT_USING_SERIAL_V2 && BSP_UART1_RX_USING_DMA
default 64
endif
menuconfig BSP_USING_UART2
@@ -133,6 +139,12 @@ menu "On-chip Peripheral Drivers"
range 0 65535
depends on RT_USING_SERIAL_V2
default 0
config BSP_UART2_DMA_PING_BUFSIZE
int "Set UART2 RX DMA ping-pong buffer size"
range 32 65535
depends on RT_USING_SERIAL_V2 && BSP_UART2_RX_USING_DMA
default 64
endif
menuconfig BSP_USING_UART3
@@ -160,6 +172,12 @@ menu "On-chip Peripheral Drivers"
range 0 65535
depends on RT_USING_SERIAL_V2
default 0
config BSP_UART3_DMA_PING_BUFSIZE
int "Set UART3 RX DMA ping-pong buffer size"
range 32 65535
depends on RT_USING_SERIAL_V2 && BSP_UART3_RX_USING_DMA
default 64
endif
endif
+18
View File
@@ -80,6 +80,12 @@ menu "On-chip Peripheral Drivers"
range 0 65535
depends on RT_USING_SERIAL_V2
default 0
config BSP_UART1_DMA_PING_BUFSIZE
int "Set UART1 RX DMA ping-pong buffer size"
range 32 65535
depends on RT_USING_SERIAL_V2 && BSP_UART1_RX_USING_DMA
default 64
endif
menuconfig BSP_USING_UART2
@@ -107,6 +113,12 @@ menu "On-chip Peripheral Drivers"
range 0 65535
depends on RT_USING_SERIAL_V2
default 0
config BSP_UART2_DMA_PING_BUFSIZE
int "Set UART2 RX DMA ping-pong buffer size"
range 32 65535
depends on RT_USING_SERIAL_V2 && BSP_UART2_RX_USING_DMA
default 64
endif
menuconfig BSP_USING_UART3
@@ -134,6 +146,12 @@ menu "On-chip Peripheral Drivers"
range 0 65535
depends on RT_USING_SERIAL_V2
default 0
config BSP_UART3_DMA_PING_BUFSIZE
int "Set UART3 RX DMA ping-pong buffer size"
range 32 65535
depends on RT_USING_SERIAL_V2 && BSP_UART3_RX_USING_DMA
default 64
endif
endif
+18
View File
@@ -125,6 +125,12 @@ menu "On-chip Peripheral Drivers"
range 0 65535
depends on RT_USING_SERIAL_V2
default 0
config BSP_UART1_DMA_PING_BUFSIZE
int "Set UART1 RX DMA ping-pong buffer size"
range 32 65535
depends on RT_USING_SERIAL_V2 && BSP_UART1_RX_USING_DMA
default 64
endif
menuconfig BSP_USING_UART2
@@ -152,6 +158,12 @@ menu "On-chip Peripheral Drivers"
range 0 65535
depends on RT_USING_SERIAL_V2
default 0
config BSP_UART2_DMA_PING_BUFSIZE
int "Set UART2 RX DMA ping-pong buffer size"
range 32 65535
depends on RT_USING_SERIAL_V2 && BSP_UART2_RX_USING_DMA
default 64
endif
menuconfig BSP_USING_UART3
@@ -179,6 +191,12 @@ menu "On-chip Peripheral Drivers"
range 0 65535
depends on RT_USING_SERIAL_V2
default 0
config BSP_UART3_DMA_PING_BUFSIZE
int "Set UART3 RX DMA ping-pong buffer size"
range 32 65535
depends on RT_USING_SERIAL_V2 && BSP_UART3_RX_USING_DMA
default 64
endif
endif
+18
View File
@@ -103,6 +103,12 @@ menu "On-chip Peripheral Drivers"
range 0 65535
depends on RT_USING_SERIAL_V2
default 0
config BSP_UART1_DMA_PING_BUFSIZE
int "Set UART1 RX DMA ping-pong buffer size"
range 32 65535
depends on RT_USING_SERIAL_V2 && BSP_UART1_RX_USING_DMA
default 64
endif
menuconfig BSP_USING_UART2
@@ -130,6 +136,12 @@ menu "On-chip Peripheral Drivers"
range 0 65535
depends on RT_USING_SERIAL_V2
default 0
config BSP_UART2_DMA_PING_BUFSIZE
int "Set UART2 RX DMA ping-pong buffer size"
range 32 65535
depends on RT_USING_SERIAL_V2 && BSP_UART2_RX_USING_DMA
default 64
endif
menuconfig BSP_USING_UART3
@@ -157,6 +169,12 @@ menu "On-chip Peripheral Drivers"
range 0 65535
depends on RT_USING_SERIAL_V2
default 0
config BSP_UART3_DMA_PING_BUFSIZE
int "Set UART3 RX DMA ping-pong buffer size"
range 32 65535
depends on RT_USING_SERIAL_V2 && BSP_UART3_RX_USING_DMA
default 64
endif
endif
+18
View File
@@ -80,6 +80,12 @@ menu "On-chip Peripheral Drivers"
range 0 65535
depends on RT_USING_SERIAL_V2
default 0
config BSP_UART1_DMA_PING_BUFSIZE
int "Set UART1 RX DMA ping-pong buffer size"
range 32 65535
depends on RT_USING_SERIAL_V2 && BSP_UART1_RX_USING_DMA
default 64
endif
menuconfig BSP_USING_UART2
@@ -107,6 +113,12 @@ menu "On-chip Peripheral Drivers"
range 0 65535
depends on RT_USING_SERIAL_V2
default 0
config BSP_UART2_DMA_PING_BUFSIZE
int "Set UART2 RX DMA ping-pong buffer size"
range 32 65535
depends on RT_USING_SERIAL_V2 && BSP_UART2_RX_USING_DMA
default 64
endif
menuconfig BSP_USING_UART3
@@ -134,6 +146,12 @@ menu "On-chip Peripheral Drivers"
range 0 65535
depends on RT_USING_SERIAL_V2
default 0
config BSP_UART3_DMA_PING_BUFSIZE
int "Set UART3 RX DMA ping-pong buffer size"
range 32 65535
depends on RT_USING_SERIAL_V2 && BSP_UART3_RX_USING_DMA
default 64
endif
endif
+18
View File
@@ -95,6 +95,12 @@ menu "On-chip Peripheral Drivers"
range 0 65535
depends on RT_USING_SERIAL_V2
default 0
config BSP_UART1_DMA_PING_BUFSIZE
int "Set UART1 RX DMA ping-pong buffer size"
range 32 65535
depends on RT_USING_SERIAL_V2 && BSP_UART1_RX_USING_DMA
default 64
endif
menuconfig BSP_USING_UART2
@@ -122,6 +128,12 @@ menu "On-chip Peripheral Drivers"
range 0 65535
depends on RT_USING_SERIAL_V2
default 0
config BSP_UART2_DMA_PING_BUFSIZE
int "Set UART2 RX DMA ping-pong buffer size"
range 32 65535
depends on RT_USING_SERIAL_V2 && BSP_UART2_RX_USING_DMA
default 64
endif
menuconfig BSP_USING_UART3
@@ -149,6 +161,12 @@ menu "On-chip Peripheral Drivers"
range 0 65535
depends on RT_USING_SERIAL_V2
default 0
config BSP_UART3_DMA_PING_BUFSIZE
int "Set UART3 RX DMA ping-pong buffer size"
range 32 65535
depends on RT_USING_SERIAL_V2 && BSP_UART3_RX_USING_DMA
default 64
endif
endif
+12 -1
View File
@@ -75,6 +75,12 @@ menu "On-chip Peripheral Drivers"
range 0 65535
depends on RT_USING_SERIAL_V2
default 0
config BSP_UART1_DMA_PING_BUFSIZE
int "Set UART1 RX DMA ping-pong buffer size"
range 32 65535
depends on RT_USING_SERIAL_V2 && BSP_UART1_RX_USING_DMA
default 64
endif
menuconfig BSP_USING_UART2
@@ -102,8 +108,13 @@ menu "On-chip Peripheral Drivers"
range 0 65535
depends on RT_USING_SERIAL_V2
default 0
config BSP_UART2_DMA_PING_BUFSIZE
int "Set UART2 RX DMA ping-pong buffer size"
range 32 65535
depends on RT_USING_SERIAL_V2 && BSP_UART2_RX_USING_DMA
default 64
endif
endif
menuconfig BSP_USING_PWM
bool "Enable PWM"
+18
View File
@@ -95,6 +95,12 @@ menu "On-chip Peripheral Drivers"
range 0 65535
depends on RT_USING_SERIAL_V2
default 0
config BSP_UART1_DMA_PING_BUFSIZE
int "Set UART1 RX DMA ping-pong buffer size"
range 32 65535
depends on RT_USING_SERIAL_V2 && BSP_UART1_RX_USING_DMA
default 64
endif
menuconfig BSP_USING_UART2
@@ -122,6 +128,12 @@ menu "On-chip Peripheral Drivers"
range 0 65535
depends on RT_USING_SERIAL_V2
default 0
config BSP_UART2_DMA_PING_BUFSIZE
int "Set UART2 RX DMA ping-pong buffer size"
range 32 65535
depends on RT_USING_SERIAL_V2 && BSP_UART2_RX_USING_DMA
default 64
endif
menuconfig BSP_USING_UART3
@@ -149,6 +161,12 @@ menu "On-chip Peripheral Drivers"
range 0 65535
depends on RT_USING_SERIAL_V2
default 0
config BSP_UART3_DMA_PING_BUFSIZE
int "Set UART3 RX DMA ping-pong buffer size"
range 32 65535
depends on RT_USING_SERIAL_V2 && BSP_UART3_RX_USING_DMA
default 64
endif
endif
+18
View File
@@ -95,6 +95,12 @@ menu "On-chip Peripheral Drivers"
range 0 65535
depends on RT_USING_SERIAL_V2
default 0
config BSP_UART1_DMA_PING_BUFSIZE
int "Set UART1 RX DMA ping-pong buffer size"
range 32 65535
depends on RT_USING_SERIAL_V2 && BSP_UART1_RX_USING_DMA
default 64
endif
menuconfig BSP_USING_UART2
@@ -122,6 +128,12 @@ menu "On-chip Peripheral Drivers"
range 0 65535
depends on RT_USING_SERIAL_V2
default 0
config BSP_UART2_DMA_PING_BUFSIZE
int "Set UART2 RX DMA ping-pong buffer size"
range 32 65535
depends on RT_USING_SERIAL_V2 && BSP_UART2_RX_USING_DMA
default 64
endif
menuconfig BSP_USING_UART3
@@ -149,6 +161,12 @@ menu "On-chip Peripheral Drivers"
range 0 65535
depends on RT_USING_SERIAL_V2
default 0
config BSP_UART3_DMA_PING_BUFSIZE
int "Set UART3 RX DMA ping-pong buffer size"
range 32 65535
depends on RT_USING_SERIAL_V2 && BSP_UART3_RX_USING_DMA
default 64
endif
endif
+18
View File
@@ -129,6 +129,12 @@ menu "On-chip Peripheral Drivers"
range 0 65535
depends on RT_USING_SERIAL_V2
default 0
config BSP_UART1_DMA_PING_BUFSIZE
int "Set UART1 RX DMA ping-pong buffer size"
range 32 65535
depends on RT_USING_SERIAL_V2 && BSP_UART1_RX_USING_DMA
default 64
endif
menuconfig BSP_USING_UART2
@@ -156,6 +162,12 @@ menu "On-chip Peripheral Drivers"
range 0 65535
depends on RT_USING_SERIAL_V2
default 0
config BSP_UART2_DMA_PING_BUFSIZE
int "Set UART2 RX DMA ping-pong buffer size"
range 32 65535
depends on RT_USING_SERIAL_V2 && BSP_UART2_RX_USING_DMA
default 64
endif
menuconfig BSP_USING_UART3
@@ -183,6 +195,12 @@ menu "On-chip Peripheral Drivers"
range 0 65535
depends on RT_USING_SERIAL_V2
default 0
config BSP_UART3_DMA_PING_BUFSIZE
int "Set UART3 RX DMA ping-pong buffer size"
range 32 65535
depends on RT_USING_SERIAL_V2 && BSP_UART3_RX_USING_DMA
default 64
endif
endif
+18
View File
@@ -152,6 +152,12 @@ menu "On-chip Peripheral Drivers"
range 0 65535
depends on RT_USING_SERIAL_V2
default 0
config BSP_UART1_DMA_PING_BUFSIZE
int "Set UART1 RX DMA ping-pong buffer size"
range 32 65535
depends on RT_USING_SERIAL_V2 && BSP_UART1_RX_USING_DMA
default 64
endif
menuconfig BSP_USING_UART2
@@ -179,6 +185,12 @@ menu "On-chip Peripheral Drivers"
range 0 65535
depends on RT_USING_SERIAL_V2
default 0
config BSP_UART2_DMA_PING_BUFSIZE
int "Set UART2 RX DMA ping-pong buffer size"
range 32 65535
depends on RT_USING_SERIAL_V2 && BSP_UART2_RX_USING_DMA
default 64
endif
menuconfig BSP_USING_UART3
@@ -206,6 +218,12 @@ menu "On-chip Peripheral Drivers"
range 0 65535
depends on RT_USING_SERIAL_V2
default 0
config BSP_UART3_DMA_PING_BUFSIZE
int "Set UART3 RX DMA ping-pong buffer size"
range 32 65535
depends on RT_USING_SERIAL_V2 && BSP_UART3_RX_USING_DMA
default 64
endif
endif
+12 -1
View File
@@ -75,6 +75,12 @@ menu "On-chip Peripheral Drivers"
range 0 65535
depends on RT_USING_SERIAL_V2
default 0
config BSP_UART1_DMA_PING_BUFSIZE
int "Set UART1 RX DMA ping-pong buffer size"
range 32 65535
depends on RT_USING_SERIAL_V2 && BSP_UART1_RX_USING_DMA
default 64
endif
menuconfig BSP_USING_UART2
@@ -102,8 +108,13 @@ menu "On-chip Peripheral Drivers"
range 0 65535
depends on RT_USING_SERIAL_V2
default 0
config BSP_UART2_DMA_PING_BUFSIZE
int "Set UART2 RX DMA ping-pong buffer size"
range 32 65535
depends on RT_USING_SERIAL_V2 && BSP_UART2_RX_USING_DMA
default 64
endif
endif
menuconfig BSP_USING_PWM
bool "Enable PWM"
+12 -1
View File
@@ -75,6 +75,12 @@ menu "On-chip Peripheral Drivers"
range 0 65535
depends on RT_USING_SERIAL_V2
default 0
config BSP_UART1_DMA_PING_BUFSIZE
int "Set UART1 RX DMA ping-pong buffer size"
range 32 65535
depends on RT_USING_SERIAL_V2 && BSP_UART1_RX_USING_DMA
default 64
endif
menuconfig BSP_USING_UART2
@@ -102,8 +108,13 @@ menu "On-chip Peripheral Drivers"
range 0 65535
depends on RT_USING_SERIAL_V2
default 0
config BSP_UART2_DMA_PING_BUFSIZE
int "Set UART2 RX DMA ping-pong buffer size"
range 32 65535
depends on RT_USING_SERIAL_V2 && BSP_UART2_RX_USING_DMA
default 64
endif
endif
menuconfig BSP_USING_PWM
bool "Enable PWM"
+17 -16
View File
@@ -153,7 +153,7 @@ static rt_err_t at32_configure(struct rt_serial_device *serial,
}
#ifdef RT_SERIAL_USING_DMA
if (!(serial->parent.open_flag & RT_DEVICE_OFLAG_OPEN)) {
instance->last_index = serial->config.rx_bufsz;
instance->last_index = serial->config.dma_ping_bufsz;
}
#endif
usart_hardware_flow_control_set(instance->uart_x, flow_control);
@@ -321,7 +321,6 @@ static void at32_dma_config(struct rt_serial_device *serial, rt_ubase_t flag)
{
dma_init_type dma_init_struct;
dma_channel_type *dma_channel = NULL;
struct rt_serial_rx_fifo *rx_fifo;
struct at32_uart *instance;
struct dma_config *dma_config;
@@ -380,9 +379,11 @@ static void at32_dma_config(struct rt_serial_device *serial, rt_ubase_t flag)
/* enable interrupt */
if (flag == RT_DEVICE_FLAG_DMA_RX)
{
rx_fifo = (struct rt_serial_rx_fifo *)serial->serial_rx;
rt_uint8_t *ptr = NULL;
rt_hw_serial_control_isr(serial, RT_HW_SERIAL_CTRL_GET_DMA_PING_BUF, &ptr);
/* start dma transfer */
_uart_dma_receive(instance, rx_fifo->buffer, serial->config.rx_bufsz);
_uart_dma_receive(instance, ptr, serial->config.dma_ping_bufsz);
}
/* dma irq should set in dma tx mode */
@@ -441,7 +442,7 @@ void dma_rx_isr(struct rt_serial_device *serial)
if (counter <= instance->last_index)
recv_len = instance->last_index - counter;
else
recv_len = serial->config.rx_bufsz + instance->last_index - counter;
recv_len = serial->config.dma_ping_bufsz + instance->last_index - counter;
if (recv_len)
{
@@ -492,22 +493,14 @@ static void usart_isr(struct rt_serial_device *serial)
if (usart_flag_get(instance->uart_x, USART_RDBF_FLAG) != RESET)
{
struct rt_serial_rx_fifo *rx_fifo;
rx_fifo = (struct rt_serial_rx_fifo *) serial->serial_rx;
RT_ASSERT(rx_fifo != RT_NULL);
rt_ringbuffer_putchar(&(rx_fifo->rb), usart_data_receive(instance->uart_x));
char chr = usart_data_receive(instance->uart_x);
rt_hw_serial_control_isr(serial, RT_HW_SERIAL_CTRL_PUTC, &chr);
rt_hw_serial_isr(serial, RT_SERIAL_EVENT_RX_IND);
}
else if ((usart_flag_get(instance->uart_x, USART_TDBE_FLAG) != RESET) && (instance->uart_x->ctrl1_bit.tdbeien))
{
struct rt_serial_tx_fifo *tx_fifo;
tx_fifo = (struct rt_serial_tx_fifo *) serial->serial_tx;
RT_ASSERT(tx_fifo != RT_NULL);
rt_uint8_t put_char = 0;
if (rt_ringbuffer_getchar(&(tx_fifo->rb), &put_char))
if (rt_hw_serial_control_isr(serial, RT_HW_SERIAL_CTRL_GETC, &put_char) == RT_EOK)
{
usart_data_transmit(instance->uart_x, put_char);
}
@@ -927,6 +920,7 @@ static void at32_uart_get_config(void)
uart_config[UART1_INDEX].serial.config.rx_bufsz = BSP_UART1_RX_BUFSIZE;
uart_config[UART1_INDEX].serial.config.tx_bufsz = BSP_UART1_TX_BUFSIZE;
#ifdef BSP_UART1_RX_USING_DMA
uart_config[UART1_INDEX].serial.config.dma_ping_bufsz = BSP_UART1_DMA_PING_BUFSIZE;
uart_config[UART1_INDEX].uart_dma_flag |= RT_DEVICE_FLAG_DMA_RX;
static struct dma_config uart1_dma_rx = UART1_RX_DMA_CONFIG;
uart_config[UART1_INDEX].dma_rx = &uart1_dma_rx;
@@ -944,6 +938,7 @@ static void at32_uart_get_config(void)
uart_config[UART2_INDEX].serial.config.rx_bufsz = BSP_UART2_RX_BUFSIZE;
uart_config[UART2_INDEX].serial.config.tx_bufsz = BSP_UART2_TX_BUFSIZE;
#ifdef BSP_UART2_RX_USING_DMA
uart_config[UART2_INDEX].serial.config.dma_ping_bufsz = BSP_UART2_DMA_PING_BUFSIZE;
uart_config[UART2_INDEX].uart_dma_flag |= RT_DEVICE_FLAG_DMA_RX;
static struct dma_config uart2_dma_rx = UART2_RX_DMA_CONFIG;
uart_config[UART2_INDEX].dma_rx = &uart2_dma_rx;
@@ -961,6 +956,7 @@ static void at32_uart_get_config(void)
uart_config[UART3_INDEX].serial.config.rx_bufsz = BSP_UART3_RX_BUFSIZE;
uart_config[UART3_INDEX].serial.config.tx_bufsz = BSP_UART3_TX_BUFSIZE;
#ifdef BSP_UART3_RX_USING_DMA
uart_config[UART3_INDEX].serial.config.dma_ping_bufsz = BSP_UART3_DMA_PING_BUFSIZE;
uart_config[UART3_INDEX].uart_dma_flag |= RT_DEVICE_FLAG_DMA_RX;
static struct dma_config uart3_dma_rx = UART3_RX_DMA_CONFIG;
uart_config[UART3_INDEX].dma_rx = &uart3_dma_rx;
@@ -978,6 +974,7 @@ static void at32_uart_get_config(void)
uart_config[UART4_INDEX].serial.config.rx_bufsz = BSP_UART4_RX_BUFSIZE;
uart_config[UART4_INDEX].serial.config.tx_bufsz = BSP_UART4_TX_BUFSIZE;
#ifdef BSP_UART4_RX_USING_DMA
uart_config[UART4_INDEX].serial.config.dma_ping_bufsz = BSP_UART4_DMA_PING_BUFSIZE;
uart_config[UART4_INDEX].uart_dma_flag |= RT_DEVICE_FLAG_DMA_RX;
static struct dma_config uart4_dma_rx = UART4_RX_DMA_CONFIG;
uart_config[UART4_INDEX].dma_rx = &uart4_dma_rx;
@@ -995,6 +992,7 @@ static void at32_uart_get_config(void)
uart_config[UART5_INDEX].serial.config.rx_bufsz = BSP_UART5_RX_BUFSIZE;
uart_config[UART5_INDEX].serial.config.tx_bufsz = BSP_UART5_TX_BUFSIZE;
#ifdef BSP_UART5_RX_USING_DMA
uart_config[UART5_INDEX].serial.config.dma_ping_bufsz = BSP_UART5_DMA_PING_BUFSIZE;
uart_config[UART5_INDEX].uart_dma_flag |= RT_DEVICE_FLAG_DMA_RX;
static struct dma_config uart5_dma_rx = UART5_RX_DMA_CONFIG;
uart_config[UART5_INDEX].dma_rx = &uart5_dma_rx;
@@ -1012,6 +1010,7 @@ static void at32_uart_get_config(void)
uart_config[UART6_INDEX].serial.config.rx_bufsz = BSP_UART6_RX_BUFSIZE;
uart_config[UART6_INDEX].serial.config.tx_bufsz = BSP_UART6_TX_BUFSIZE;
#ifdef BSP_UART6_RX_USING_DMA
uart_config[UART6_INDEX].serial.config.dma_ping_bufsz = BSP_UART6_DMA_PING_BUFSIZE;
uart_config[UART6_INDEX].uart_dma_flag |= RT_DEVICE_FLAG_DMA_RX;
static struct dma_config uart6_dma_rx = UART6_RX_DMA_CONFIG;
uart_config[UART6_INDEX].dma_rx = &uart6_dma_rx;
@@ -1029,6 +1028,7 @@ static void at32_uart_get_config(void)
uart_config[UART7_INDEX].serial.config.rx_bufsz = BSP_UART7_RX_BUFSIZE;
uart_config[UART7_INDEX].serial.config.tx_bufsz = BSP_UART7_TX_BUFSIZE;
#ifdef BSP_UART7_RX_USING_DMA
uart_config[UART7_INDEX].serial.config.dma_ping_bufsz = BSP_UART7_DMA_PING_BUFSIZE;
uart_config[UART7_INDEX].uart_dma_flag |= RT_DEVICE_FLAG_DMA_RX;
static struct dma_config uart7_dma_rx = UART7_RX_DMA_CONFIG;
uart_config[UART7_INDEX].dma_rx = &uart7_dma_rx;
@@ -1046,6 +1046,7 @@ static void at32_uart_get_config(void)
uart_config[UART8_INDEX].serial.config.rx_bufsz = BSP_UART8_RX_BUFSIZE;
uart_config[UART8_INDEX].serial.config.tx_bufsz = BSP_UART8_TX_BUFSIZE;
#ifdef BSP_UART8_RX_USING_DMA
uart_config[UART8_INDEX].serial.config.dma_ping_bufsz = BSP_UART8_DMA_PING_BUFSIZE;
uart_config[UART8_INDEX].uart_dma_flag |= RT_DEVICE_FLAG_DMA_RX;
static struct dma_config uart8_dma_rx = UART8_RX_DMA_CONFIG;
uart_config[UART8_INDEX].dma_rx = &uart8_dma_rx;
+36
View File
@@ -75,6 +75,12 @@ menu "On-chip Peripheral Drivers"
depends on BSP_USING_UART0 && RT_USING_SERIAL_V2
default 0
config BSP_UART0_DMA_PING_BUFSIZE
int "Set UART0 RX DMA ping-pong buffer size"
range 32 65535
depends on RT_USING_SERIAL_V2 && BSP_UART0_RX_USING_DMA
default 32
config BSP_USING_UART1
bool "Enable UART1"
default y
@@ -103,6 +109,12 @@ menu "On-chip Peripheral Drivers"
depends on BSP_USING_UART1 && RT_USING_SERIAL_V2
default 0
config BSP_UART1_DMA_PING_BUFSIZE
int "Set UART1 RX DMA ping-pong buffer size"
range 32 65535
depends on RT_USING_SERIAL_V2 && BSP_UART1_RX_USING_DMA
default 32
config BSP_USING_UART2
bool "Enable UART2"
default n
@@ -131,6 +143,12 @@ menu "On-chip Peripheral Drivers"
depends on BSP_USING_UART2 && RT_USING_SERIAL_V2
default 0
config BSP_UART2_DMA_PING_BUFSIZE
int "Set UART2 RX DMA ping-pong buffer size"
range 32 65535
depends on RT_USING_SERIAL_V2 && BSP_UART2_RX_USING_DMA
default 32
config BSP_USING_UART3
bool "Enable UART3"
default n
@@ -159,6 +177,12 @@ menu "On-chip Peripheral Drivers"
depends on BSP_USING_UART3 && RT_USING_SERIAL_V2
default 0
config BSP_UART3_DMA_PING_BUFSIZE
int "Set UART3 RX DMA ping-pong buffer size"
range 32 65535
depends on RT_USING_SERIAL_V2 && BSP_UART3_RX_USING_DMA
default 32
config BSP_USING_UART4
bool "Enable UART4"
default n
@@ -187,6 +211,12 @@ menu "On-chip Peripheral Drivers"
depends on BSP_USING_UART4 && RT_USING_SERIAL_V2
default 0
config BSP_UART4_DMA_PING_BUFSIZE
int "Set UART4 RX DMA ping-pong buffer size"
range 32 65535
depends on RT_USING_SERIAL_V2 && BSP_UART4_RX_USING_DMA
default 32
config BSP_USING_UART5
bool "Enable UART5"
default n
@@ -214,6 +244,12 @@ menu "On-chip Peripheral Drivers"
range 0 65535
depends on BSP_USING_UART5 && RT_USING_SERIAL_V2
default 0
config BSP_UART5_DMA_PING_BUFSIZE
int "Set UART5 RX DMA ping-pong buffer size"
range 32 65535
depends on RT_USING_SERIAL_V2 && BSP_UART5_RX_USING_DMA
default 32
endif
menuconfig BSP_USING_SPI
+36
View File
@@ -55,6 +55,12 @@ menu "On-chip Peripheral Drivers"
depends on BSP_USING_UART0 && RT_USING_SERIAL_V2
default 0
config BSP_UART0_DMA_PING_BUFSIZE
int "Set UART0 RX DMA ping-pong buffer size"
range 32 65535
depends on RT_USING_SERIAL_V2 && BSP_UART0_RX_USING_DMA
default 32
config BSP_USING_UART1
bool "Enable UART1"
default y
@@ -83,6 +89,12 @@ menu "On-chip Peripheral Drivers"
depends on BSP_USING_UART1 && RT_USING_SERIAL_V2
default 0
config BSP_UART1_DMA_PING_BUFSIZE
int "Set UART1 RX DMA ping-pong buffer size"
range 32 65535
depends on RT_USING_SERIAL_V2 && BSP_UART1_RX_USING_DMA
default 32
config BSP_USING_UART2
bool "Enable UART2"
default n
@@ -111,6 +123,12 @@ menu "On-chip Peripheral Drivers"
depends on BSP_USING_UART2 && RT_USING_SERIAL_V2
default 0
config BSP_UART2_DMA_PING_BUFSIZE
int "Set UART2 RX DMA ping-pong buffer size"
range 32 65535
depends on RT_USING_SERIAL_V2 && BSP_UART2_RX_USING_DMA
default 32
config BSP_USING_UART3
bool "Enable UART3"
default n
@@ -139,6 +157,12 @@ menu "On-chip Peripheral Drivers"
depends on BSP_USING_UART3 && RT_USING_SERIAL_V2
default 0
config BSP_UART3_DMA_PING_BUFSIZE
int "Set UART3 RX DMA ping-pong buffer size"
range 32 65535
depends on RT_USING_SERIAL_V2 && BSP_UART3_RX_USING_DMA
default 32
config BSP_USING_UART4
bool "Enable UART4"
default n
@@ -167,6 +191,12 @@ menu "On-chip Peripheral Drivers"
depends on BSP_USING_UART4 && RT_USING_SERIAL_V2
default 0
config BSP_UART4_DMA_PING_BUFSIZE
int "Set UART4 RX DMA ping-pong buffer size"
range 32 65535
depends on RT_USING_SERIAL_V2 && BSP_UART4_RX_USING_DMA
default 32
config BSP_USING_UART5
bool "Enable UART5"
default n
@@ -194,6 +224,12 @@ menu "On-chip Peripheral Drivers"
range 0 65535
depends on BSP_USING_UART5 && RT_USING_SERIAL_V2
default 0
config BSP_UART5_DMA_PING_BUFSIZE
int "Set UART5 RX DMA ping-pong buffer size"
range 32 65535
depends on RT_USING_SERIAL_V2 && BSP_UART5_RX_USING_DMA
default 32
endif
menuconfig BSP_USING_SPI
+50 -2
View File
@@ -29,7 +29,7 @@ menu "On-chip Peripheral Drivers"
if BSP_USING_UART
config BSP_USING_UART0
bool "Enable UART0"
default y
default n
config BSP_UART0_RX_USING_DMA
bool "Enable UART0 RX DMA"
@@ -55,9 +55,15 @@ menu "On-chip Peripheral Drivers"
depends on BSP_USING_UART0 && RT_USING_SERIAL_V2
default 0
config BSP_UART0_DMA_PING_BUFSIZE
int "Set UART0 RX DMA ping-pong buffer size"
range 32 65535
depends on RT_USING_SERIAL_V2 && BSP_UART0_RX_USING_DMA
default 32
config BSP_USING_UART1
bool "Enable UART1"
default n
default y
config BSP_UART1_RX_USING_DMA
bool "Enable UART1 RX DMA"
@@ -83,6 +89,12 @@ menu "On-chip Peripheral Drivers"
depends on BSP_USING_UART1 && RT_USING_SERIAL_V2
default 0
config BSP_UART1_DMA_PING_BUFSIZE
int "Set UART1 RX DMA ping-pong buffer size"
range 32 65535
depends on RT_USING_SERIAL_V2 && BSP_UART1_RX_USING_DMA
default 32
config BSP_USING_UART2
bool "Enable UART2"
default n
@@ -111,6 +123,12 @@ menu "On-chip Peripheral Drivers"
depends on BSP_USING_UART2 && RT_USING_SERIAL_V2
default 0
config BSP_UART2_DMA_PING_BUFSIZE
int "Set UART2 RX DMA ping-pong buffer size"
range 32 65535
depends on RT_USING_SERIAL_V2 && BSP_UART2_RX_USING_DMA
default 32
config BSP_USING_UART3
bool "Enable UART3"
default n
@@ -139,6 +157,12 @@ menu "On-chip Peripheral Drivers"
depends on BSP_USING_UART3 && RT_USING_SERIAL_V2
default 0
config BSP_UART3_DMA_PING_BUFSIZE
int "Set UART3 RX DMA ping-pong buffer size"
range 32 65535
depends on RT_USING_SERIAL_V2 && BSP_UART3_RX_USING_DMA
default 32
config BSP_USING_UART4
bool "Enable UART4"
default n
@@ -167,6 +191,12 @@ menu "On-chip Peripheral Drivers"
depends on BSP_USING_UART4 && RT_USING_SERIAL_V2
default 0
config BSP_UART4_DMA_PING_BUFSIZE
int "Set UART4 RX DMA ping-pong buffer size"
range 32 65535
depends on RT_USING_SERIAL_V2 && BSP_UART4_RX_USING_DMA
default 32
config BSP_USING_UART5
bool "Enable UART5"
default n
@@ -195,6 +225,12 @@ menu "On-chip Peripheral Drivers"
depends on BSP_USING_UART5 && RT_USING_SERIAL_V2
default 0
config BSP_UART5_DMA_PING_BUFSIZE
int "Set UART5 RX DMA ping-pong buffer size"
range 32 65535
depends on RT_USING_SERIAL_V2 && BSP_UART5_RX_USING_DMA
default 32
config BSP_USING_UART6
bool "Enable UART6"
default n
@@ -223,6 +259,12 @@ menu "On-chip Peripheral Drivers"
depends on BSP_USING_UART6 && RT_USING_SERIAL_V2
default 0
config BSP_UART6_DMA_PING_BUFSIZE
int "Set UART6 RX DMA ping-pong buffer size"
range 32 65535
depends on RT_USING_SERIAL_V2 && BSP_UART6_RX_USING_DMA
default 32
config BSP_USING_UART7
bool "Enable UART7"
default n
@@ -250,6 +292,12 @@ menu "On-chip Peripheral Drivers"
range 0 65535
depends on BSP_USING_UART7 && RT_USING_SERIAL_V2
default 0
config BSP_UART7_DMA_PING_BUFSIZE
int "Set UART7 RX DMA ping-pong buffer size"
range 32 65535
depends on RT_USING_SERIAL_V2 && BSP_UART7_RX_USING_DMA
default 32
endif
menuconfig BSP_USING_SPI
+50 -2
View File
@@ -29,7 +29,7 @@ menu "On-chip Peripheral Drivers"
if BSP_USING_UART
config BSP_USING_UART0
bool "Enable UART0"
default y
default n
config BSP_UART0_RX_USING_DMA
bool "Enable UART0 RX DMA"
@@ -55,9 +55,15 @@ menu "On-chip Peripheral Drivers"
depends on BSP_USING_UART0 && RT_USING_SERIAL_V2
default 0
config BSP_UART0_DMA_PING_BUFSIZE
int "Set UART0 RX DMA ping-pong buffer size"
range 32 65535
depends on RT_USING_SERIAL_V2 && BSP_UART0_RX_USING_DMA
default 32
config BSP_USING_UART1
bool "Enable UART1"
default n
default y
config BSP_UART1_RX_USING_DMA
bool "Enable UART1 RX DMA"
@@ -83,6 +89,12 @@ menu "On-chip Peripheral Drivers"
depends on BSP_USING_UART1 && RT_USING_SERIAL_V2
default 0
config BSP_UART1_DMA_PING_BUFSIZE
int "Set UART1 RX DMA ping-pong buffer size"
range 32 65535
depends on RT_USING_SERIAL_V2 && BSP_UART1_RX_USING_DMA
default 32
config BSP_USING_UART2
bool "Enable UART2"
default n
@@ -111,6 +123,12 @@ menu "On-chip Peripheral Drivers"
depends on BSP_USING_UART2 && RT_USING_SERIAL_V2
default 0
config BSP_UART2_DMA_PING_BUFSIZE
int "Set UART2 RX DMA ping-pong buffer size"
range 32 65535
depends on RT_USING_SERIAL_V2 && BSP_UART2_RX_USING_DMA
default 32
config BSP_USING_UART3
bool "Enable UART3"
default n
@@ -139,6 +157,12 @@ menu "On-chip Peripheral Drivers"
depends on BSP_USING_UART3 && RT_USING_SERIAL_V2
default 0
config BSP_UART3_DMA_PING_BUFSIZE
int "Set UART3 RX DMA ping-pong buffer size"
range 32 65535
depends on RT_USING_SERIAL_V2 && BSP_UART3_RX_USING_DMA
default 32
config BSP_USING_UART4
bool "Enable UART4"
default n
@@ -167,6 +191,12 @@ menu "On-chip Peripheral Drivers"
depends on BSP_USING_UART4 && RT_USING_SERIAL_V2
default 0
config BSP_UART4_DMA_PING_BUFSIZE
int "Set UART4 RX DMA ping-pong buffer size"
range 32 65535
depends on RT_USING_SERIAL_V2 && BSP_UART4_RX_USING_DMA
default 32
config BSP_USING_UART5
bool "Enable UART5"
default n
@@ -195,6 +225,12 @@ menu "On-chip Peripheral Drivers"
depends on BSP_USING_UART5 && RT_USING_SERIAL_V2
default 0
config BSP_UART5_DMA_PING_BUFSIZE
int "Set UART5 RX DMA ping-pong buffer size"
range 32 65535
depends on RT_USING_SERIAL_V2 && BSP_UART5_RX_USING_DMA
default 32
config BSP_USING_UART6
bool "Enable UART6"
default n
@@ -223,6 +259,12 @@ menu "On-chip Peripheral Drivers"
depends on BSP_USING_UART6 && RT_USING_SERIAL_V2
default 0
config BSP_UART6_DMA_PING_BUFSIZE
int "Set UART6 RX DMA ping-pong buffer size"
range 32 65535
depends on RT_USING_SERIAL_V2 && BSP_UART6_RX_USING_DMA
default 32
config BSP_USING_UART7
bool "Enable UART7"
default n
@@ -250,6 +292,12 @@ menu "On-chip Peripheral Drivers"
range 0 65535
depends on BSP_USING_UART7 && RT_USING_SERIAL_V2
default 0
config BSP_UART7_DMA_PING_BUFSIZE
int "Set UART7 RX DMA ping-pong buffer size"
range 32 65535
depends on RT_USING_SERIAL_V2 && BSP_UART7_RX_USING_DMA
default 32
endif
menuconfig BSP_USING_SPI
@@ -247,7 +247,7 @@ static void dma_recv_isr (struct rt_serial_device *serial)
}
else
{
recv_len = serial->config.rx_bufsz + uart->dma.last_index - counter;
recv_len = serial->config.dma_ping_bufsz + uart->dma.last_index - counter;
}
uart->dma.last_index = counter;
rt_hw_interrupt_enable(level);
@@ -272,8 +272,8 @@ static void usart_isr (struct rt_serial_device *serial)
rx_fifo = (struct rt_serial_rx_fifo *) serial->serial_rx;
RT_ASSERT(rx_fifo != RT_NULL);
rt_ringbuffer_putchar(&(rx_fifo->rb), usart_data_receive(uart->periph));
char chr = usart_data_receive(uart->periph);
rt_hw_serial_control_isr(serial, RT_HW_SERIAL_CTRL_PUTC, &chr);
rt_hw_serial_isr(serial, RT_SERIAL_EVENT_RX_IND);
/* Clear RXNE interrupt flag */
@@ -281,12 +281,8 @@ static void usart_isr (struct rt_serial_device *serial)
}
else if (usart_interrupt_flag_get(uart->periph, USART_INT_FLAG_TBE) != RESET)
{
struct rt_serial_tx_fifo *tx_fifo;
tx_fifo = (struct rt_serial_tx_fifo *) serial->serial_tx;
RT_ASSERT(tx_fifo != RT_NULL);
rt_uint8_t put_char = 0;
if (rt_ringbuffer_getchar(&(tx_fifo->rb), &put_char))
if (rt_hw_serial_control_isr(serial, RT_HW_SERIAL_CTRL_GETC, &put_char) == RT_EOK)
{
usart_data_transmit(uart->periph, put_char);
}
@@ -709,7 +705,7 @@ static rt_err_t gd32_uart_configure (struct rt_serial_device *serial, struct ser
uart = rt_container_of(serial, struct gd32_uart, serial);
#ifdef RT_SERIAL_USING_DMA
uart->dma.last_index = serial->config.rx_bufsz;
uart->dma.last_index = serial->config.dma_ping_bufsz;
#endif
gd32_uart_gpio_init(uart);
@@ -818,7 +814,6 @@ static void _uart_dma_transmit (struct gd32_uart *uart, rt_uint8_t *buffer, rt_u
static void gd32_dma_config (struct rt_serial_device *serial, rt_ubase_t flag)
{
struct gd32_uart *uart;
struct rt_serial_rx_fifo *rx_fifo;
dma_single_data_parameter_struct dma_init_struct = { 0 };
RT_ASSERT(serial != RT_NULL);
@@ -862,9 +857,11 @@ static void gd32_dma_config (struct rt_serial_device *serial, rt_ubase_t flag)
/* enable rx dma */
if (flag == RT_DEVICE_FLAG_DMA_RX)
{
rx_fifo = (struct rt_serial_rx_fifo *)serial->serial_rx;
rt_uint8_t *ptr = NULL;
rt_hw_serial_control_isr(serial, RT_HW_SERIAL_CTRL_GET_DMA_PING_BUF, &ptr);
/* start dma transfer */
_uart_dma_receive(uart, rx_fifo->buffer, serial->config.rx_bufsz);
_uart_dma_receive(uart, ptr, serial->config.dma_ping_bufsz);
}
}
@@ -1055,6 +1052,7 @@ static void gd32_uart_get_config (void)
uart_obj[UART0_INDEX].serial.config.rx_bufsz = BSP_UART0_RX_BUFSIZE;
uart_obj[UART0_INDEX].serial.config.tx_bufsz = BSP_UART0_TX_BUFSIZE;
#ifdef BSP_UART0_RX_USING_DMA
uart_obj[UART0_INDEX].serial.config.dma_ping_bufsz = BSP_UART0_DMA_PING_BUFSIZE;
uart_obj[UART0_INDEX].uart_dma_flag |= RT_DEVICE_FLAG_DMA_RX;
#endif
#ifdef BSP_UART0_TX_USING_DMA
@@ -1068,6 +1066,7 @@ static void gd32_uart_get_config (void)
uart_obj[UART1_INDEX].serial.config.rx_bufsz = BSP_UART1_RX_BUFSIZE;
uart_obj[UART1_INDEX].serial.config.tx_bufsz = BSP_UART1_TX_BUFSIZE;
#ifdef BSP_UART1_RX_USING_DMA
uart_obj[UART1_INDEX].serial.config.dma_ping_bufsz = BSP_UART1_DMA_PING_BUFSIZE;
uart_obj[UART1_INDEX].uart_dma_flag |= RT_DEVICE_FLAG_DMA_RX;
#endif
#ifdef BSP_UART1_TX_USING_DMA
@@ -1081,6 +1080,7 @@ static void gd32_uart_get_config (void)
uart_obj[UART2_INDEX].serial.config.rx_bufsz = BSP_UART2_RX_BUFSIZE;
uart_obj[UART2_INDEX].serial.config.tx_bufsz = BSP_UART2_TX_BUFSIZE;
#ifdef BSP_UART2_RX_USING_DMA
uart_obj[UART2_INDEX].serial.config.dma_ping_bufsz = BSP_UART2_DMA_PING_BUFSIZE;
uart_obj[UART2_INDEX].uart_dma_flag |= RT_DEVICE_FLAG_DMA_RX;
#endif
#ifdef BSP_UART2_TX_USING_DMA
@@ -1094,6 +1094,7 @@ static void gd32_uart_get_config (void)
uart_obj[UART3_INDEX].serial.config.rx_bufsz = BSP_UART3_RX_BUFSIZE;
uart_obj[UART3_INDEX].serial.config.tx_bufsz = BSP_UART3_TX_BUFSIZE;
#ifdef BSP_UART3_RX_USING_DMA
uart_obj[UART3_INDEX].serial.config.dma_ping_bufsz = BSP_UART3_DMA_PING_BUFSIZE;
uart_obj[UART3_INDEX].uart_dma_flag |= RT_DEVICE_FLAG_DMA_RX;
#endif
#ifdef BSP_UART3_TX_USING_DMA
@@ -1107,6 +1108,7 @@ static void gd32_uart_get_config (void)
uart_obj[UART4_INDEX].serial.config.rx_bufsz = BSP_UART4_RX_BUFSIZE;
uart_obj[UART4_INDEX].serial.config.tx_bufsz = BSP_UART4_TX_BUFSIZE;
#ifdef BSP_UART4_RX_USING_DMA
uart_obj[UART4_INDEX].serial.config.dma_ping_bufsz = BSP_UART4_DMA_PING_BUFSIZE;
uart_obj[UART4_INDEX].uart_dma_flag |= RT_DEVICE_FLAG_DMA_RX;
#endif
#ifdef BSP_UART4_TX_USING_DMA
@@ -1120,6 +1122,7 @@ static void gd32_uart_get_config (void)
uart_obj[UART5_INDEX].serial.config.rx_bufsz = BSP_UART5_RX_BUFSIZE;
uart_obj[UART5_INDEX].serial.config.tx_bufsz = BSP_UART5_TX_BUFSIZE;
#ifdef BSP_UART5_RX_USING_DMA
uart_obj[UART5_INDEX].serial.config.dma_ping_bufsz = BSP_UART5_DMA_PING_BUFSIZE;
uart_obj[UART5_INDEX].uart_dma_flag |= RT_DEVICE_FLAG_DMA_RX;
#endif
#ifdef BSP_UART5_TX_USING_DMA
@@ -1133,6 +1136,7 @@ static void gd32_uart_get_config (void)
uart_obj[UART6_INDEX].serial.config.rx_bufsz = BSP_UART6_RX_BUFSIZE;
uart_obj[UART6_INDEX].serial.config.tx_bufsz = BSP_UART6_TX_BUFSIZE;
#ifdef BSP_UART6_RX_USING_DMA
uart_obj[UART6_INDEX].serial.config.dma_ping_bufsz = BSP_UART6_DMA_PING_BUFSIZE;
uart_obj[UART6_INDEX].uart_dma_flag |= RT_DEVICE_FLAG_DMA_RX;
#endif
#ifdef BSP_UART6_TX_USING_DMA
@@ -1146,6 +1150,7 @@ static void gd32_uart_get_config (void)
uart_obj[UART7_INDEX].serial.config.rx_bufsz = BSP_UART7_RX_BUFSIZE;
uart_obj[UART7_INDEX].serial.config.tx_bufsz = BSP_UART7_TX_BUFSIZE;
#ifdef BSP_UART7_RX_USING_DMA
uart_obj[UART7_INDEX].serial.config.dma_ping_bufsz = BSP_UART7_DMA_PING_BUFSIZE;
uart_obj[UART7_INDEX].uart_dma_flag |= RT_DEVICE_FLAG_DMA_RX;
#endif
#ifdef BSP_UART7_TX_USING_DMA
+24
View File
@@ -85,6 +85,12 @@ menu "On-chip Peripheral Drivers"
range 0 65535
depends on RT_USING_SERIAL_V2
default 256
config BSP_UART1_DMA_PING_BUFSIZE
int "Set UART1 RX DMA ping-pong buffer size"
range 32 65535
depends on RT_USING_SERIAL_V2 && BSP_UART1_RX_USING_DMA
default 64
endif
menuconfig BSP_USING_UART2
@@ -112,6 +118,12 @@ menu "On-chip Peripheral Drivers"
range 0 65535
depends on RT_USING_SERIAL_V2
default 0
config BSP_UART2_DMA_PING_BUFSIZE
int "Set UART2 RX DMA ping-pong buffer size"
range 32 65535
depends on RT_USING_SERIAL_V2 && BSP_UART2_RX_USING_DMA
default 64
endif
menuconfig BSP_USING_UART3
@@ -156,6 +168,12 @@ menu "On-chip Peripheral Drivers"
range 0 65535
depends on RT_USING_SERIAL_V2
default 256
config BSP_UART4_DMA_PING_BUFSIZE
int "Set UART4 RX DMA ping-pong buffer size"
range 32 65535
depends on RT_USING_SERIAL_V2 && BSP_UART4_RX_USING_DMA
default 64
endif
menuconfig BSP_USING_UART5
@@ -183,6 +201,12 @@ menu "On-chip Peripheral Drivers"
range 0 65535
depends on RT_USING_SERIAL_V2
default 256
config BSP_UART5_DMA_PING_BUFSIZE
int "Set UART5 RX DMA ping-pong buffer size"
range 32 65535
depends on RT_USING_SERIAL_V2 && BSP_UART5_RX_USING_DMA
default 64
endif
menuconfig BSP_USING_UART6
@@ -63,6 +63,12 @@ menu "On-chip Peripheral Drivers"
range 0 65535
depends on RT_USING_SERIAL_V2
default 0
config BSP_UART1_DMA_PING_BUFSIZE
int "Set UART1 RX DMA ping-pong buffer size"
range 32 65535
depends on RT_USING_SERIAL_V2 && BSP_UART1_RX_USING_DMA
default 64
endif
menuconfig BSP_USING_UART2
@@ -90,6 +96,12 @@ menu "On-chip Peripheral Drivers"
range 0 65535
depends on RT_USING_SERIAL_V2
default 256
config BSP_UART2_DMA_PING_BUFSIZE
int "Set UART2 RX DMA ping-pong buffer size"
range 32 65535
depends on RT_USING_SERIAL_V2 && BSP_UART2_RX_USING_DMA
default 64
endif
menuconfig BSP_USING_UART3
@@ -117,6 +129,12 @@ menu "On-chip Peripheral Drivers"
range 0 65535
depends on RT_USING_SERIAL_V2
default 256
config BSP_UART3_DMA_PING_BUFSIZE
int "Set UART3 RX DMA ping-pong buffer size"
range 32 65535
depends on RT_USING_SERIAL_V2 && BSP_UART3_RX_USING_DMA
default 64
endif
menuconfig BSP_USING_UART4
@@ -144,6 +162,12 @@ menu "On-chip Peripheral Drivers"
range 0 65535
depends on RT_USING_SERIAL_V2
default 256
config BSP_UART4_DMA_PING_BUFSIZE
int "Set UART4 RX DMA ping-pong buffer size"
range 32 65535
depends on RT_USING_SERIAL_V2 && BSP_UART4_RX_USING_DMA
default 64
endif
endif
@@ -85,6 +85,12 @@ menu "On-chip Peripheral Drivers"
range 0 65535
depends on RT_USING_SERIAL_V2
default 256
config BSP_UART1_DMA_PING_BUFSIZE
int "Set UART1 RX DMA ping-pong buffer size"
range 32 65535
depends on RT_USING_SERIAL_V2 && BSP_UART1_RX_USING_DMA
default 64
endif
menuconfig BSP_USING_UART2
@@ -112,6 +118,12 @@ menu "On-chip Peripheral Drivers"
range 0 65535
depends on RT_USING_SERIAL_V2
default 0
config BSP_UART2_DMA_PING_BUFSIZE
int "Set UART2 RX DMA ping-pong buffer size"
range 32 65535
depends on RT_USING_SERIAL_V2 && BSP_UART2_RX_USING_DMA
default 64
endif
menuconfig BSP_USING_UART3
@@ -156,6 +168,12 @@ menu "On-chip Peripheral Drivers"
range 0 65535
depends on RT_USING_SERIAL_V2
default 256
config BSP_UART4_DMA_PING_BUFSIZE
int "Set UART4 RX DMA ping-pong buffer size"
range 32 65535
depends on RT_USING_SERIAL_V2 && BSP_UART4_RX_USING_DMA
default 64
endif
menuconfig BSP_USING_UART5
@@ -183,6 +201,12 @@ menu "On-chip Peripheral Drivers"
range 0 65535
depends on RT_USING_SERIAL_V2
default 256
config BSP_UART5_DMA_PING_BUFSIZE
int "Set UART5 RX DMA ping-pong buffer size"
range 32 65535
depends on RT_USING_SERIAL_V2 && BSP_UART5_RX_USING_DMA
default 64
endif
menuconfig BSP_USING_UART6
@@ -141,6 +141,12 @@ menu "On-chip Peripheral Drivers"
range 0 65535
depends on RT_USING_SERIAL_V2
default 0
config BSP_UART1_DMA_PING_BUFSIZE
int "Set UART1 RX DMA ping-pong buffer size"
range 32 65535
depends on RT_USING_SERIAL_V2 && BSP_UART1_RX_USING_DMA
default 64
endif
menuconfig BSP_USING_UART2
@@ -168,6 +174,12 @@ menu "On-chip Peripheral Drivers"
range 0 65535
depends on RT_USING_SERIAL_V2
default 256
config BSP_UART2_DMA_PING_BUFSIZE
int "Set UART2 RX DMA ping-pong buffer size"
range 32 65535
depends on RT_USING_SERIAL_V2 && BSP_UART2_RX_USING_DMA
default 64
endif
menuconfig BSP_USING_UART3
@@ -246,6 +258,12 @@ menu "On-chip Peripheral Drivers"
range 0 65535
depends on RT_USING_SERIAL_V2
default 256
config BSP_UART6_DMA_PING_BUFSIZE
int "Set UART6 RX DMA ping-pong buffer size"
range 32 65535
depends on RT_USING_SERIAL_V2 && BSP_UART6_RX_USING_DMA
default 64
endif
menuconfig BSP_USING_UART7
@@ -273,6 +291,12 @@ menu "On-chip Peripheral Drivers"
range 0 65535
depends on RT_USING_SERIAL_V2
default 256
config BSP_UART7_DMA_PING_BUFSIZE
int "Set UART7 RX DMA ping-pong buffer size"
range 32 65535
depends on RT_USING_SERIAL_V2 && BSP_UART7_RX_USING_DMA
default 64
endif
@@ -137,6 +137,12 @@ menu "On-chip Peripheral Drivers"
range 0 65535
depends on RT_USING_SERIAL_V2
default 0
config BSP_UART1_DMA_PING_BUFSIZE
int "Set UART1 RX DMA ping-pong buffer size"
range 32 65535
depends on RT_USING_SERIAL_V2 && BSP_UART1_RX_USING_DMA
default 64
endif
menuconfig BSP_USING_UART2
@@ -164,6 +170,12 @@ menu "On-chip Peripheral Drivers"
range 0 65535
depends on RT_USING_SERIAL_V2
default 256
config BSP_UART2_DMA_PING_BUFSIZE
int "Set UART2 RX DMA ping-pong buffer size"
range 32 65535
depends on RT_USING_SERIAL_V2 && BSP_UART2_RX_USING_DMA
default 64
endif
menuconfig BSP_USING_UART3
@@ -242,6 +254,12 @@ menu "On-chip Peripheral Drivers"
range 0 65535
depends on RT_USING_SERIAL_V2
default 256
config BSP_UART6_DMA_PING_BUFSIZE
int "Set UART6 RX DMA ping-pong buffer size"
range 32 65535
depends on RT_USING_SERIAL_V2 && BSP_UART6_RX_USING_DMA
default 64
endif
menuconfig BSP_USING_UART7
@@ -269,6 +287,12 @@ menu "On-chip Peripheral Drivers"
range 0 65535
depends on RT_USING_SERIAL_V2
default 256
config BSP_UART7_DMA_PING_BUFSIZE
int "Set UART2 RX DMA ping-pong buffer size"
range 32 65535
depends on RT_USING_SERIAL_V2 && BSP_UART7_RX_USING_DMA
default 64
endif
+24 -18
View File
@@ -242,7 +242,7 @@ static rt_err_t hc32_configure(struct rt_serial_device *serial, struct serial_co
#endif
#ifdef RT_SERIAL_USING_DMA
uart->dma_rx_remaining_cnt = (serial->config.rx_bufsz <= 1UL) ? serial->config.rx_bufsz : serial->config.rx_bufsz / 2UL;
uart->dma_rx_remaining_cnt = (serial->config.dma_ping_bufsz <= 1UL) ? serial->config.dma_ping_bufsz : serial->config.dma_ping_bufsz / 2UL;
#endif
/* Enable USART clock */
FCG_USART_CLK(uart->config->clock, ENABLE);
@@ -501,22 +501,20 @@ static rt_ssize_t hc32_transmit(struct rt_serial_device *serial,
static void hc32_uart_rx_irq_handler(struct hc32_uart *uart)
{
RT_ASSERT(RT_NULL != uart);
struct rt_serial_rx_fifo *rx_fifo;
rx_fifo = (struct rt_serial_rx_fifo *)uart->serial.serial_rx;
RT_ASSERT(rx_fifo != RT_NULL);
rt_ringbuffer_putchar(&(rx_fifo->rb), (rt_uint8_t)USART_ReadData(uart->config->Instance));
struct rt_serial_device *serial = &uart->serial;
char chr = USART_ReadData(uart->config->Instance);
rt_hw_serial_control_isr(serial, RT_HW_SERIAL_CTRL_PUTC, &chr);
rt_hw_serial_isr(&uart->serial, RT_SERIAL_EVENT_RX_IND);
}
static void hc32_uart_tx_irq_handler(struct hc32_uart *uart)
{
RT_ASSERT(RT_NULL != uart);
struct rt_serial_tx_fifo *tx_fifo;
tx_fifo = (struct rt_serial_tx_fifo *)uart->serial.serial_tx;
RT_ASSERT(tx_fifo != RT_NULL);
struct rt_serial_device *serial = &uart->serial;
rt_uint8_t put_char = 0;
if (rt_ringbuffer_getchar(&(tx_fifo->rb), &put_char))
if (rt_hw_serial_control_isr(serial, RT_HW_SERIAL_CTRL_GETC, &put_char) == RT_EOK)
{
USART_WriteData(uart->config->Instance, put_char);
}
@@ -673,24 +671,25 @@ static void hc32_uart_rx_timeout(struct rt_serial_device *serial)
static void hc32_dma_config(struct rt_serial_device *serial, rt_ubase_t flag)
{
rt_uint32_t trans_count = (serial->config.rx_bufsz <= 1UL) ? serial->config.rx_bufsz : serial->config.rx_bufsz / 2UL;
rt_uint32_t trans_count = (serial->config.dma_ping_bufsz <= 1UL) ? serial->config.dma_ping_bufsz : serial->config.dma_ping_bufsz / 2UL;
struct hc32_uart *uart;
stc_dma_init_t dma_init;
struct dma_config *uart_dma;
RT_ASSERT(RT_NULL != serial);
RT_ASSERT(RT_NULL == ((serial->config.rx_bufsz) & ((RT_ALIGN_SIZE) - 1)));
RT_ASSERT(RT_NULL == ((serial->config.dma_ping_bufsz) & ((RT_ALIGN_SIZE) - 1)));
uart = rt_container_of(serial, struct hc32_uart, serial);
RT_ASSERT(RT_NULL != uart->config->Instance);
if (RT_DEVICE_FLAG_DMA_RX == flag)
{
stc_dma_llp_init_t llp_init;
struct rt_serial_rx_fifo *rx_fifo = (struct rt_serial_rx_fifo *)serial->serial_rx;
rt_uint8_t *ptr = NULL;
rt_hw_serial_control_isr(serial, RT_HW_SERIAL_CTRL_GET_DMA_PING_BUF, &ptr);
RT_ASSERT(RT_NULL != uart->config->rx_timeout->TMR0_Instance);
RT_ASSERT(RT_NULL != uart->config->dma_rx->Instance);
RT_ASSERT(RT_NULL != rx_fifo);
RT_ASSERT(RT_NULL != ptr);
#if defined (HC32F448) || defined (HC32F472)
INTC_IntSrcCmd(uart->config->rx_int_src, DISABLE);
@@ -707,7 +706,7 @@ static void hc32_dma_config(struct rt_serial_device *serial, rt_ubase_t flag)
DMA_StructInit(&dma_init);
dma_init.u32IntEn = DMA_INT_ENABLE;
dma_init.u32SrcAddr = (uint32_t)(&uart->config->Instance->RDR);
dma_init.u32DestAddr = (uint32_t)rx_fifo->buffer;
dma_init.u32DestAddr = (uint32_t)ptr;
dma_init.u32DataWidth = DMA_DATAWIDTH_8BIT;
dma_init.u32BlockSize = 1UL;
dma_init.u32TransCount = trans_count;
@@ -723,14 +722,14 @@ static void hc32_dma_config(struct rt_serial_device *serial, rt_ubase_t flag)
/* Configure LLP descriptor */
uart->config->llp_desc[0U].SARx = dma_init.u32SrcAddr;
uart->config->llp_desc[0U].DARx = dma_init.u32DestAddr + ((serial->config.rx_bufsz <= 1UL) ? 0UL : dma_init.u32TransCount);
uart->config->llp_desc[0U].DTCTLx = (((serial->config.rx_bufsz <= 1U) ? dma_init.u32TransCount : (serial->config.rx_bufsz - dma_init.u32TransCount)) << DMA_DTCTL_CNT_POS) | \
uart->config->llp_desc[0U].DARx = dma_init.u32DestAddr + ((serial->config.dma_ping_bufsz <= 1UL) ? 0UL : dma_init.u32TransCount);
uart->config->llp_desc[0U].DTCTLx = (((serial->config.dma_ping_bufsz <= 1U) ? dma_init.u32TransCount : (serial->config.dma_ping_bufsz - dma_init.u32TransCount)) << DMA_DTCTL_CNT_POS) | \
(dma_init.u32BlockSize << DMA_DTCTL_BLKSIZE_POS);
uart->config->llp_desc[0U].LLPx = (serial->config.rx_bufsz <= 1U) ? (uint32_t)&uart->config->llp_desc[0U] : (uint32_t)&uart->config->llp_desc[1U];
uart->config->llp_desc[0U].LLPx = (serial->config.dma_ping_bufsz <= 1U) ? (uint32_t)&uart->config->llp_desc[0U] : (uint32_t)&uart->config->llp_desc[1U];
uart->config->llp_desc[0U].CHCTLx = (dma_init.u32SrcAddrInc | dma_init.u32DestAddrInc | dma_init.u32DataWidth | \
llp_init.u32State | llp_init.u32Mode | dma_init.u32IntEn);
if (serial->config.rx_bufsz > 1UL)
if (serial->config.dma_ping_bufsz > 1UL)
{
uart->config->llp_desc[1U].SARx = dma_init.u32SrcAddr;
uart->config->llp_desc[1U].DARx = dma_init.u32DestAddr;
@@ -1705,6 +1704,7 @@ static void hc32_uart_get_info(void)
uart_obj[UART1_INDEX].serial.config.rx_bufsz = BSP_UART1_RX_BUFSIZE;
uart_obj[UART1_INDEX].serial.config.tx_bufsz = BSP_UART1_TX_BUFSIZE;
#ifdef BSP_UART1_RX_USING_DMA
uart_obj[UART1_INDEX].serial.config.dma_ping_bufsz = BSP_UART1_DMA_PING_BUFSIZE;
uart_obj[UART1_INDEX].uart_dma_flag |= RT_DEVICE_FLAG_DMA_RX;
static struct dma_config uart1_dma_rx = UART1_DMA_RX_CONFIG;
static struct hc32_uart_rxto uart1_rx_timeout = UART1_RXTO_CONFIG;
@@ -1728,6 +1728,7 @@ static void hc32_uart_get_info(void)
uart_obj[UART2_INDEX].serial.config.rx_bufsz = BSP_UART2_RX_BUFSIZE;
uart_obj[UART2_INDEX].serial.config.tx_bufsz = BSP_UART2_TX_BUFSIZE;
#ifdef BSP_UART2_RX_USING_DMA
uart_obj[UART2_INDEX].serial.config.dma_ping_bufsz = BSP_UART2_DMA_PING_BUFSIZE;
uart_obj[UART2_INDEX].uart_dma_flag |= RT_DEVICE_FLAG_DMA_RX;
static struct dma_config uart2_dma_rx = UART2_DMA_RX_CONFIG;
static struct hc32_uart_rxto uart2_rx_timeout = UART2_RXTO_CONFIG;
@@ -1752,6 +1753,7 @@ static void hc32_uart_get_info(void)
uart_obj[UART3_INDEX].serial.config.tx_bufsz = BSP_UART3_TX_BUFSIZE;
#if defined (HC32F460) || defined (HC32F4A8)
#ifdef BSP_UART3_RX_USING_DMA
uart_obj[UART3_INDEX].serial.config.dma_ping_bufsz = BSP_UART3_DMA_PING_BUFSIZE;
uart_obj[UART3_INDEX].uart_dma_flag |= RT_DEVICE_FLAG_DMA_RX;
static struct dma_config uart3_dma_rx = UART3_DMA_RX_CONFIG;
static struct hc32_uart_rxto uart3_rx_timeout = UART3_RXTO_CONFIG;
@@ -1775,6 +1777,7 @@ static void hc32_uart_get_info(void)
uart_obj[UART4_INDEX].serial.config.tx_bufsz = BSP_UART4_TX_BUFSIZE;
#if defined (HC32F460) || defined (HC32F448) || defined (HC32F472)
#ifdef BSP_UART4_RX_USING_DMA
uart_obj[UART4_INDEX].serial.config.dma_ping_bufsz = BSP_UART4_DMA_PING_BUFSIZE;
uart_obj[UART4_INDEX].uart_dma_flag |= RT_DEVICE_FLAG_DMA_RX;
static struct dma_config uart4_dma_rx = UART4_DMA_RX_CONFIG;
static struct hc32_uart_rxto uart4_rx_timeout = UART4_RXTO_CONFIG;
@@ -1800,6 +1803,7 @@ static void hc32_uart_get_info(void)
uart_obj[UART5_INDEX].serial.config.tx_bufsz = BSP_UART5_TX_BUFSIZE;
#if defined (HC32F448) || defined (HC32F472)
#ifdef BSP_UART5_RX_USING_DMA
uart_obj[UART5_INDEX].serial.config.dma_ping_bufsz = BSP_UART5_DMA_PING_BUFSIZE;
uart_obj[UART5_INDEX].uart_dma_flag |= RT_DEVICE_FLAG_DMA_RX;
static struct dma_config uart5_dma_rx = UART5_DMA_RX_CONFIG;
static struct hc32_uart_rxto uart5_rx_timeout = UART5_RXTO_CONFIG;
@@ -1825,6 +1829,7 @@ static void hc32_uart_get_info(void)
uart_obj[UART6_INDEX].serial.config.tx_bufsz = BSP_UART6_TX_BUFSIZE;
#if defined (HC32F4A0)
#ifdef BSP_UART6_RX_USING_DMA
uart_obj[UART6_INDEX].serial.config.dma_ping_bufsz = BSP_UART6_DMA_PING_BUFSIZE;
uart_obj[UART6_INDEX].uart_dma_flag |= RT_DEVICE_FLAG_DMA_RX;
static struct dma_config uart6_dma_rx = UART6_DMA_RX_CONFIG;
static struct hc32_uart_rxto uart6_rx_timeout = UART6_RXTO_CONFIG;
@@ -1848,6 +1853,7 @@ static void hc32_uart_get_info(void)
uart_obj[UART7_INDEX].serial.config.tx_bufsz = BSP_UART7_TX_BUFSIZE;
#if defined (HC32F4A0)
#ifdef BSP_UART7_RX_USING_DMA
uart_obj[UART7_INDEX].serial.config.dma_ping_bufsz = BSP_UART7_DMA_PING_BUFSIZE;
uart_obj[UART7_INDEX].uart_dma_flag |= RT_DEVICE_FLAG_DMA_RX;
static struct dma_config uart7_dma_rx = UART7_DMA_RX_CONFIG;
static struct hc32_uart_rxto uart7_rx_timeout = UART7_RXTO_CONFIG;
+4 -4
View File
@@ -644,8 +644,8 @@ static void hpm_uart_isr(struct rt_serial_device *serial)
if (irq_id == uart_intr_id_rx_data_avail) {
while (uart_check_status(uart->uart_base, uart_stat_data_ready)) {
count++;
put_char = uart_read_byte(uart->uart_base);
rt_ringbuffer_putchar(&(rx_fifo->rb), put_char);
char chr = uart_read_byte(uart->uart_base);
rt_hw_serial_control_isr(serial, RT_HW_SERIAL_CTRL_PUTC, &chr);
/*in order to ensure rx fifo there are remaining bytes*/
if (count > 12) {
break;
@@ -655,8 +655,8 @@ static void hpm_uart_isr(struct rt_serial_device *serial)
if (irq_id == uart_intr_id_rx_timeout) {
while ((uart_check_status(uart->uart_base, uart_stat_data_ready)) || (uart_check_status(uart->uart_base, uart_stat_overrun_error))) {
put_char= uart_read_byte(uart->uart_base);
rt_ringbuffer_putchar(&(rx_fifo->rb), put_char);
char chr = uart_read_byte(uart->uart_base);
rt_hw_serial_control_isr(serial, RT_HW_SERIAL_CTRL_PUTC, &chr);
}
rt_hw_serial_isr(serial, RT_SERIAL_EVENT_RX_IND);
}
+1 -1
View File
@@ -34,7 +34,7 @@ static void serial_rxcallback(const struct usart_async_descriptor *const io_desc
do {
ringbuffer_get((struct ringbuffer *const)&io_descr->rx, &data);
rt_ringbuffer_putchar(&(rx_fifo->rb), data);
rt_ringbuffer_putchar_force(&rx_fifo->rb, data);
} while (0); // maybe not only one byte
#endif
+17 -17
View File
@@ -777,7 +777,7 @@ static rt_err_t n32_configure(struct rt_serial_device *serial, struct serial_con
USART_Init(uart->handle.Instance, &uart->handle.Init);
USART_Enable(uart->handle.Instance, ENABLE);
#ifdef RT_SERIAL_USING_DMA
uart->dma_rx.remaining_cnt = serial->config.rx_bufsz;
uart->dma_rx.remaining_cnt = serial->config.dma_ping_bufsz;
#endif
return RT_EOK;
@@ -964,7 +964,7 @@ static void dma_recv_isr(struct rt_serial_device *serial, rt_uint8_t isr_flag)
if (counter <= uart->dma_rx.remaining_cnt)
recv_len = uart->dma_rx.remaining_cnt - counter;
else
recv_len = serial->config.rx_bufsz + uart->dma_rx.remaining_cnt - counter;
recv_len = serial->config.dma_ping_bufsz + uart->dma_rx.remaining_cnt - counter;
break;
case UART_RX_DMA_IT_HT_FLAG:
@@ -974,7 +974,7 @@ static void dma_recv_isr(struct rt_serial_device *serial, rt_uint8_t isr_flag)
case UART_RX_DMA_IT_TC_FLAG:
if (counter >= uart->dma_rx.remaining_cnt)
recv_len = serial->config.rx_bufsz + uart->dma_rx.remaining_cnt - counter;
recv_len = serial->config.dma_ping_bufsz + uart->dma_rx.remaining_cnt - counter;
default:
break;
@@ -1003,22 +1003,15 @@ static void uart_isr(struct rt_serial_device *serial)
/* If the Read data register is not empty and the RXNE interrupt is enabled RDR */
if (USART_GetIntStatus(uart->handle.Instance, USART_INT_RXDNE) != RESET && USART_GetFlagStatus(uart->handle.Instance, USART_FLAG_RXDNE) != RESET)
{
struct rt_serial_rx_fifo *rx_fifo;
rx_fifo = (struct rt_serial_rx_fifo *)serial->serial_rx;
RT_ASSERT(rx_fifo != RT_NULL);
rt_ringbuffer_putchar(&(rx_fifo->rb), (rt_uint8_t)(uart->handle.Instance->DAT & (rt_uint16_t)0x01FF));
char chr = uart->handle.Instance->DAT & (rt_uint16_t)0x01FF;
rt_hw_serial_control_isr(serial, RT_HW_SERIAL_CTRL_PUTC, &chr);
rt_hw_serial_isr(serial, RT_SERIAL_EVENT_RX_IND);
}
/* If the Transmit data register is empty and the TXE interrupt enable is enabled TDR*/
else if (USART_GetIntStatus(uart->handle.Instance, USART_INT_TXDE) != RESET && USART_GetFlagStatus(uart->handle.Instance, USART_FLAG_TXDE) != RESET)
{
struct rt_serial_tx_fifo *tx_fifo;
tx_fifo = (struct rt_serial_tx_fifo *)serial->serial_tx;
RT_ASSERT(tx_fifo != RT_NULL);
rt_uint8_t put_char = 0;
if (rt_ringbuffer_getchar(&(tx_fifo->rb), &put_char))
if (rt_hw_serial_control_isr(serial, RT_HW_SERIAL_CTRL_GETC, &put_char) == RT_EOK)
{
USART_SendData(uart->handle.Instance, put_char);
}
@@ -1380,6 +1373,7 @@ static void n32_uart_get_config(void)
uart_obj[UART1_INDEX].uart_dma_flag = 0;
#ifdef BSP_UART1_RX_USING_DMA
uart_obj[UART1_INDEX].handle.HDMA_Rx = &uart_obj[UART1_INDEX].dma_rx.handle;
uart_obj[UART1_INDEX].serial.config.dma_ping_bufsz = BSP_UART1_DMA_PING_BUFSIZE;
uart_obj[UART1_INDEX].uart_dma_flag |= RT_DEVICE_FLAG_DMA_RX;
uart_obj[UART1_INDEX].dma_rx.handle.Parent = &uart_obj[UART1_INDEX].handle;
uart_obj[UART1_INDEX].dma_rx.handle.Instance = DMA1_CH5;
@@ -1404,6 +1398,7 @@ static void n32_uart_get_config(void)
uart_obj[UART2_INDEX].uart_dma_flag = 0;
#ifdef BSP_UART2_RX_USING_DMA
uart_obj[UART2_INDEX].handle.HDMA_Rx = &uart_obj[UART2_INDEX].dma_rx.handle;
uart_obj[UART2_INDEX].serial.config.dma_ping_bufsz = BSP_UART2_DMA_PING_BUFSIZE;
uart_obj[UART2_INDEX].uart_dma_flag |= RT_DEVICE_FLAG_DMA_RX;
uart_obj[UART2_INDEX].dma_rx.handle.Parent = &uart_obj[UART2_INDEX].handle;
uart_obj[UART2_INDEX].dma_rx.handle.Instance = DMA1_CH6;
@@ -1428,6 +1423,7 @@ static void n32_uart_get_config(void)
uart_obj[UART3_INDEX].uart_dma_flag = 0;
#ifdef BSP_UART3_RX_USING_DMA
uart_obj[UART3_INDEX].handle.HDMA_Rx = &uart_obj[UART3_INDEX].dma_rx.handle;
uart_obj[UART3_INDEX].serial.config.dma_ping_bufsz = BSP_UART3_DMA_PING_BUFSIZE;
uart_obj[UART3_INDEX].uart_dma_flag |= RT_DEVICE_FLAG_DMA_RX;
uart_obj[UART3_INDEX].dma_rx.handle.Parent = &uart_obj[UART3_INDEX].handle;
uart_obj[UART3_INDEX].dma_rx.handle.Instance = DMA1_CH3;
@@ -1452,6 +1448,7 @@ static void n32_uart_get_config(void)
uart_obj[UART4_INDEX].uart_dma_flag = 0;
#ifdef BSP_UART4_RX_USING_DMA
uart_obj[UART4_INDEX].handle.HDMA_Rx = &uart_obj[UART4_INDEX].dma_rx.handle;
uart_obj[UART4_INDEX].serial.config.dma_ping_bufsz = BSP_UART4_DMA_PING_BUFSIZE;
uart_obj[UART4_INDEX].uart_dma_flag |= RT_DEVICE_FLAG_DMA_RX;
uart_obj[UART4_INDEX].dma_rx.handle.Parent = &uart_obj[UART4_INDEX].handle;
uart_obj[UART4_INDEX].dma_rx.handle.Instance = DMA2_CH3;
@@ -1476,6 +1473,7 @@ static void n32_uart_get_config(void)
uart_obj[UART5_INDEX].uart_dma_flag = 0;
#ifdef BSP_UART5_RX_USING_DMA
uart_obj[UART5_INDEX].handle.HDMA_Rx = &uart_obj[UART5_INDEX].dma_rx.handle;
uart_obj[UART5_INDEX].serial.config.dma_ping_bufsz = BSP_UART5_DMA_PING_BUFSIZE;
uart_obj[UART5_INDEX].uart_dma_flag |= RT_DEVICE_FLAG_DMA_RX;
uart_obj[UART5_INDEX].dma_rx.handle.Parent = &uart_obj[UART5_INDEX].handle;
uart_obj[UART5_INDEX].dma_rx.handle.Instance = DMA1_CH8;
@@ -1500,6 +1498,7 @@ static void n32_uart_get_config(void)
uart_obj[UART6_INDEX].uart_dma_flag = 0;
#ifdef BSP_UART6_RX_USING_DMA
uart_obj[UART6_INDEX].handle.HDMA_Rx = &uart_obj[UART6_INDEX].dma_rx.handle;
uart_obj[UART6_INDEX].serial.config.dma_ping_bufsz = BSP_UART6_DMA_PING_BUFSIZE;
uart_obj[UART6_INDEX].uart_dma_flag |= RT_DEVICE_FLAG_DMA_RX;
uart_obj[UART6_INDEX].dma_rx.handle.Parent = &uart_obj[UART6_INDEX].handle;
uart_obj[UART6_INDEX].dma_rx.handle.Instance = DMA2_CH1;
@@ -1524,6 +1523,7 @@ static void n32_uart_get_config(void)
uart_obj[UART7_INDEX].uart_dma_flag = 0;
#ifdef BSP_UART7_RX_USING_DMA
uart_obj[UART7_INDEX].handle.HDMA_Rx = &uart_obj[UART7_INDEX].dma_rx.handle;
uart_obj[UART7_INDEX].serial.config.dma_ping_bufsz = BSP_UART7_DMA_PING_BUFSIZE;
uart_obj[UART7_INDEX].uart_dma_flag |= RT_DEVICE_FLAG_DMA_RX;
uart_obj[UART7_INDEX].dma_rx.handle.Parent = &uart_obj[UART7_INDEX].handle;
uart_obj[UART7_INDEX].dma_rx.handle.Instance = DMA2_CH6;
@@ -1544,7 +1544,6 @@ static void n32_uart_get_config(void)
#ifdef RT_SERIAL_USING_DMA
static void n32_uart_dma_config(struct rt_serial_device *serial, rt_ubase_t flag)
{
struct rt_serial_rx_fifo *rx_fifo;
struct DMA_HandleTypeDef *DMA_Handle;
struct n32_uart *uart;
@@ -1555,7 +1554,6 @@ static void n32_uart_dma_config(struct rt_serial_device *serial, rt_ubase_t flag
if (RT_DEVICE_FLAG_DMA_RX == flag)
{
DMA_Handle = &uart->dma_rx.handle;
rx_fifo = (struct rt_serial_rx_fifo *)serial->serial_rx;
}
else /* RT_DEVICE_FLAG_DMA_TX == flag */
{
@@ -1572,9 +1570,11 @@ static void n32_uart_dma_config(struct rt_serial_device *serial, rt_ubase_t flag
DMA_Handle->Init.Mem2Mem = DMA_M2M_DISABLE;
if (RT_DEVICE_FLAG_DMA_RX == flag)
{
rt_uint8_t *ptr = NULL;
rt_hw_serial_control_isr(serial, RT_HW_SERIAL_CTRL_GET_DMA_PING_BUF, &ptr);
DMA_Handle->Init.Direction = DMA_DIR_PERIPH_SRC;
DMA_Handle->Init.MemAddr = (unsigned int)rx_fifo->buffer;
DMA_Handle->Init.BufSize = serial->config.rx_bufsz;
DMA_Handle->Init.MemAddr = (unsigned int)ptr;
DMA_Handle->Init.BufSize = serial->config.dma_ping_bufsz;
DMA_Handle->Init.CircularMode = DMA_MODE_CIRCULAR;
DMA_Handle->Init.Priority = DMA_PRIORITY_VERY_HIGH;
}
+42
View File
@@ -54,6 +54,12 @@ menu "On-chip Peripheral Drivers"
depends on BSP_USING_USART1 && RT_SERIAL_USING_DMA
default n
config BSP_UART1_DMA_PING_BUFSIZE
int "Set UART1 RX DMA ping-pong buffer size"
range 16 65535
depends on RT_USING_SERIAL_V2 && BSP_UART1_RX_USING_DMA
default 32
config BSP_UART1_RX_BUFSIZE
int "Set rx buffer size"
range 0 16384
@@ -102,6 +108,12 @@ menu "On-chip Peripheral Drivers"
depends on BSP_USING_USART2 && RT_SERIAL_USING_DMA
default n
config BSP_UART2_DMA_PING_BUFSIZE
int "Set UART2 RX DMA ping-pong buffer size"
range 16 65535
depends on RT_USING_SERIAL_V2 && BSP_UART2_RX_USING_DMA
default 32
config BSP_UART2_RX_BUFSIZE
int "Set rx buffer size"
range 256 16384
@@ -146,6 +158,12 @@ menu "On-chip Peripheral Drivers"
depends on BSP_USING_USART3 && RT_SERIAL_USING_DMA
default n
config BSP_UART3_DMA_PING_BUFSIZE
int "Set UART3 RX DMA ping-pong buffer size"
range 16 65535
depends on RT_USING_SERIAL_V2 && BSP_UART3_RX_USING_DMA
default 32
config BSP_UART3_RX_BUFSIZE
int "Set rx buffer size"
range 256 16384
@@ -194,6 +212,12 @@ menu "On-chip Peripheral Drivers"
depends on BSP_USING_UART4 && RT_SERIAL_USING_DMA
default n
config BSP_UART4_DMA_PING_BUFSIZE
int "Set UART4 RX DMA ping-pong buffer size"
range 16 65535
depends on RT_USING_SERIAL_V2 && BSP_UART4_RX_USING_DMA
default 32
config BSP_UART4_RX_BUFSIZE
int "Set rx buffer size"
range 256 16384
@@ -242,6 +266,12 @@ menu "On-chip Peripheral Drivers"
depends on BSP_USING_UART5 && RT_SERIAL_USING_DMA
default n
config BSP_UART5_DMA_PING_BUFSIZE
int "Set UART5 RX DMA ping-pong buffer size"
range 16 65535
depends on RT_USING_SERIAL_V2 && BSP_UART5_RX_USING_DMA
default 32
config BSP_UART5_RX_BUFSIZE
int "Set rx buffer size"
range 256 16384
@@ -286,6 +316,12 @@ menu "On-chip Peripheral Drivers"
depends on BSP_USING_UART6 && RT_SERIAL_USING_DMA
default n
config BSP_UART6_DMA_PING_BUFSIZE
int "Set UART6 RX DMA ping-pong buffer size"
range 16 65535
depends on RT_USING_SERIAL_V2 && BSP_UART6_RX_USING_DMA
default 32
config BSP_UART6_RX_BUFSIZE
int "Set rx buffer size"
range 256 16384
@@ -330,6 +366,12 @@ menu "On-chip Peripheral Drivers"
depends on BSP_USING_UART7 && RT_SERIAL_USING_DMA
default n
config BSP_UART7_DMA_PING_BUFSIZE
int "Set UART7 RX DMA ping-pong buffer size"
range 16 65535
depends on RT_USING_SERIAL_V2 && BSP_UART7_RX_USING_DMA
default 32
config BSP_UART7_RX_BUFSIZE
int "Set rx buffer size"
range 256 16384
+4 -4
View File
@@ -24,7 +24,7 @@ menu "Onboard Peripheral Drivers"
int "Set UART0 RX buffer size"
range 64 65535
depends on RT_USING_SERIAL_V2
default 10240
default 1024
config BSP_UART0_TX_BUFSIZE
int "Set UART0 TX buffer size"
@@ -41,7 +41,7 @@ menu "Onboard Peripheral Drivers"
int "Set UART1 RX buffer size"
range 64 65535
depends on RT_USING_SERIAL_V2
default 10240
default 1024
config BSP_UART1_TX_BUFSIZE
int "Set UART1 TX buffer size"
@@ -58,7 +58,7 @@ menu "Onboard Peripheral Drivers"
int "Set UART2 RX buffer size"
range 64 65535
depends on RT_USING_SERIAL_V2
default 10240
default 1024
config BSP_UART2_TX_BUFSIZE
int "Set UART2 TX buffer size"
@@ -75,7 +75,7 @@ menu "Onboard Peripheral Drivers"
int "Set UART3 RX buffer size"
range 64 65535
depends on RT_USING_SERIAL_V2
default 10240
default 1024
config BSP_UART3_TX_BUFSIZE
int "Set UART3 TX buffer size"
+32 -4
View File
@@ -134,7 +134,7 @@ static void rt_hw_uart_isr(int irqno, void *param)
RT_ASSERT(uart != RT_NULL);
if(!(UART_FR(uart->hw_base) & UARTFR_RXFE) && (UART_IMSC(uart->hw_base) & UARTIMSC_RXIM))
if((UART_FR(uart->hw_base) & UARTFR_RXFF) && (UART_IMSC(uart->hw_base) & UARTIMSC_RXIM))
{
struct rt_serial_rx_fifo *rx_fifo;
@@ -143,10 +143,32 @@ static void rt_hw_uart_isr(int irqno, void *param)
RT_ASSERT(rx_fifo != RT_NULL);
char rec_ch = UART_DR(uart->hw_base) & 0xff;
char rec_ch;
while (!(UART_FR(uart->hw_base) & UARTFR_RXFE))
{
rec_ch = UART_DR(uart->hw_base) & 0xff;
rt_hw_serial_control_isr(serial, RT_HW_SERIAL_CTRL_PUTC, &rec_ch);
rt_ringbuffer_putchar(&(rx_fifo->rb),rec_ch);
}
rt_hw_serial_isr(serial,RT_SERIAL_EVENT_RX_IND);
}
else if(UART_IMSC(uart->hw_base) & UARTIMSC_RTIM)
{
struct rt_serial_rx_fifo *rx_fifo;
rx_fifo = (struct rt_serial_rx_fifo *)serial->serial_rx;
RT_ASSERT(rx_fifo != RT_NULL);
char rec_ch;
while (!(UART_FR(uart->hw_base) & UARTFR_RXFE))
{
rec_ch = UART_DR(uart->hw_base) & 0xff;
rt_hw_serial_control_isr(serial, RT_HW_SERIAL_CTRL_PUTC, &rec_ch);
}
rt_hw_serial_isr(serial,RT_SERIAL_EVENT_RX_IND);
}
else if((UART_IMSC(uart->hw_base) & UARTIMSC_TXIM))
@@ -188,6 +210,7 @@ static rt_err_t uart_control(struct rt_serial_device *serial, int cmd, void *arg
{
/* disable rx irq */
UART_IMSC(uart->hw_base) &= ~UARTIMSC_RXIM;
UART_IMSC(uart->hw_base) &= ~UARTIMSC_RTIM;
}
else if (ctrl_arg == RT_DEVICE_FLAG_INT_TX)
{
@@ -201,6 +224,7 @@ static rt_err_t uart_control(struct rt_serial_device *serial, int cmd, void *arg
{
/* enable rx irq */
UART_IMSC(uart->hw_base) |= UARTIMSC_RXIM;
UART_IMSC(uart->hw_base) |= UARTIMSC_RTIM;
rt_hw_interrupt_umask(uart->irqno);
} else if (ctrl_arg == RT_DEVICE_FLAG_INT_TX)
@@ -256,7 +280,6 @@ static rt_ssize_t uart_transmit(struct rt_serial_device *serial,
RT_ASSERT(serial != RT_NULL);
RT_ASSERT(buf != RT_NULL);
RT_ASSERT(size);
uint32_t fifo_size = 0, tx_size = 0;
struct hw_uart_device *uart = (struct hw_uart_device *)serial->parent.user_data;
struct rt_serial_tx_fifo *tx_fifo;
tx_fifo = (struct rt_serial_tx_fifo *) serial->serial_tx;
@@ -342,7 +365,12 @@ int rt_hw_uart_init(void)
rt_hw_interrupt_install(_uart_device[i].irqno, rt_hw_uart_isr, _uart_device[i].serial, _uart_device[i].device_name);
/* enable Rx and Tx of UART */
UART_CR(_uart_device[i].hw_base) = (1 << 0) | (1 << 8) | (1 << 9);
UART_LCR_H(_uart_device[i].hw_base) =(1 << 4);
UART_IFLS(_uart_device[i].hw_base) =0;
UART_IFLS(_uart_device[i].hw_base) =(1 << 3);
}
return err;
@@ -286,11 +286,8 @@ void user_uart0_callback(uart_callback_args_t *p_args)
if (UART_EVENT_RX_CHAR == p_args->event)
{
struct rt_serial_rx_fifo *rx_fifo;
rx_fifo = (struct rt_serial_rx_fifo *) serial->serial_rx;
RT_ASSERT(rx_fifo != RT_NULL);
rt_ringbuffer_putchar(&(rx_fifo->rb), (rt_uint8_t)p_args->data);
char chr = p_args->data;
rt_hw_serial_control_isr(serial, RT_HW_SERIAL_CTRL_PUTC, &chr);
rt_hw_serial_isr(serial, RT_SERIAL_EVENT_RX_IND);
}
@@ -309,12 +306,8 @@ void user_uart1_callback(uart_callback_args_t *p_args)
if (UART_EVENT_RX_CHAR == p_args->event)
{
struct rt_serial_rx_fifo *rx_fifo;
rx_fifo = (struct rt_serial_rx_fifo *) serial->serial_rx;
RT_ASSERT(rx_fifo != RT_NULL);
rt_ringbuffer_putchar(&(rx_fifo->rb), (rt_uint8_t)p_args->data);
char chr = p_args->data;
rt_hw_serial_control_isr(serial, RT_HW_SERIAL_CTRL_PUTC, &chr);
rt_hw_serial_isr(serial, RT_SERIAL_EVENT_RX_IND);
}
@@ -332,12 +325,8 @@ void user_uart2_callback(uart_callback_args_t *p_args)
if (UART_EVENT_RX_CHAR == p_args->event)
{
struct rt_serial_rx_fifo *rx_fifo;
rx_fifo = (struct rt_serial_rx_fifo *) serial->serial_rx;
RT_ASSERT(rx_fifo != RT_NULL);
rt_ringbuffer_putchar(&(rx_fifo->rb), (rt_uint8_t)p_args->data);
char chr = p_args->data;
rt_hw_serial_control_isr(serial, RT_HW_SERIAL_CTRL_PUTC, &chr);
rt_hw_serial_isr(serial, RT_SERIAL_EVENT_RX_IND);
}
@@ -355,12 +344,8 @@ void user_uart3_callback(uart_callback_args_t *p_args)
if (UART_EVENT_RX_CHAR == p_args->event)
{
struct rt_serial_rx_fifo *rx_fifo;
rx_fifo = (struct rt_serial_rx_fifo *) serial->serial_rx;
RT_ASSERT(rx_fifo != RT_NULL);
rt_ringbuffer_putchar(&(rx_fifo->rb), (rt_uint8_t)p_args->data);
char chr = p_args->data;
rt_hw_serial_control_isr(serial, RT_HW_SERIAL_CTRL_PUTC, &chr);
rt_hw_serial_isr(serial, RT_SERIAL_EVENT_RX_IND);
}
@@ -378,12 +363,8 @@ void user_uart4_callback(uart_callback_args_t *p_args)
if (UART_EVENT_RX_CHAR == p_args->event)
{
struct rt_serial_rx_fifo *rx_fifo;
rx_fifo = (struct rt_serial_rx_fifo *) serial->serial_rx;
RT_ASSERT(rx_fifo != RT_NULL);
rt_ringbuffer_putchar(&(rx_fifo->rb), (rt_uint8_t)p_args->data);
char chr = p_args->data;
rt_hw_serial_control_isr(serial, RT_HW_SERIAL_CTRL_PUTC, &chr);
rt_hw_serial_isr(serial, RT_SERIAL_EVENT_RX_IND);
}
@@ -401,12 +382,8 @@ void user_uart5_callback(uart_callback_args_t *p_args)
if (UART_EVENT_RX_CHAR == p_args->event)
{
struct rt_serial_rx_fifo *rx_fifo;
rx_fifo = (struct rt_serial_rx_fifo *) serial->serial_rx;
RT_ASSERT(rx_fifo != RT_NULL);
rt_ringbuffer_putchar(&(rx_fifo->rb), (rt_uint8_t)p_args->data);
char chr = p_args->data;
rt_hw_serial_control_isr(serial, RT_HW_SERIAL_CTRL_PUTC, &chr);
rt_hw_serial_isr(serial, RT_SERIAL_EVENT_RX_IND);
}
@@ -424,12 +401,8 @@ void user_uart6_callback(uart_callback_args_t *p_args)
if (UART_EVENT_RX_CHAR == p_args->event)
{
struct rt_serial_rx_fifo *rx_fifo;
rx_fifo = (struct rt_serial_rx_fifo *) serial->serial_rx;
RT_ASSERT(rx_fifo != RT_NULL);
rt_ringbuffer_putchar(&(rx_fifo->rb), (rt_uint8_t)p_args->data);
char chr = p_args->data;
rt_hw_serial_control_isr(serial, RT_HW_SERIAL_CTRL_PUTC, &chr);
rt_hw_serial_isr(serial, RT_SERIAL_EVENT_RX_IND);
}
@@ -447,12 +420,8 @@ void user_uart7_callback(uart_callback_args_t *p_args)
if (UART_EVENT_RX_CHAR == p_args->event)
{
struct rt_serial_rx_fifo *rx_fifo;
rx_fifo = (struct rt_serial_rx_fifo *) serial->serial_rx;
RT_ASSERT(rx_fifo != RT_NULL);
rt_ringbuffer_putchar(&(rx_fifo->rb), (rt_uint8_t)p_args->data);
char chr = p_args->data;
rt_hw_serial_control_isr(serial, RT_HW_SERIAL_CTRL_PUTC, &chr);
rt_hw_serial_isr(serial, RT_SERIAL_EVENT_RX_IND);
}
@@ -470,12 +439,8 @@ void user_uart8_callback(uart_callback_args_t *p_args)
if (UART_EVENT_RX_CHAR == p_args->event)
{
struct rt_serial_rx_fifo *rx_fifo;
rx_fifo = (struct rt_serial_rx_fifo *) serial->serial_rx;
RT_ASSERT(rx_fifo != RT_NULL);
rt_ringbuffer_putchar(&(rx_fifo->rb), (rt_uint8_t)p_args->data);
char chr = p_args->data;
rt_hw_serial_control_isr(serial, RT_HW_SERIAL_CTRL_PUTC, &chr);
rt_hw_serial_isr(serial, RT_SERIAL_EVENT_RX_IND);
}
@@ -493,12 +458,8 @@ void user_uart9_callback(uart_callback_args_t *p_args)
if (UART_EVENT_RX_CHAR == p_args->event)
{
struct rt_serial_rx_fifo *rx_fifo;
rx_fifo = (struct rt_serial_rx_fifo *) serial->serial_rx;
RT_ASSERT(rx_fifo != RT_NULL);
rt_ringbuffer_putchar(&(rx_fifo->rb), (rt_uint8_t)p_args->data);
char chr = p_args->data;
rt_hw_serial_control_isr(serial, RT_HW_SERIAL_CTRL_PUTC, &chr);
rt_hw_serial_isr(serial, RT_SERIAL_EVENT_RX_IND);
}
@@ -1,5 +1,5 @@
/*
* Copyright (c) 2006-2023, RT-Thread Development Team
* Copyright (c) 2006-2024 RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
@@ -13,7 +13,7 @@
#ifdef RT_USING_SERIAL_V2
//#define DRV_DEBUG
// #define DRV_DEBUG
#define DBG_TAG "drv.usart"
#ifdef DRV_DEBUG
#define DBG_LVL DBG_LOG
@@ -189,7 +189,7 @@ static rt_err_t stm32_configure(struct rt_serial_device *serial, struct serial_c
}
#ifdef RT_SERIAL_USING_DMA
uart->dma_rx.remaining_cnt = serial->config.rx_bufsz;
uart->dma_rx.remaining_cnt = serial->config.dma_ping_bufsz;
#endif
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
__HAL_UART_DISABLE_IT(&(uart->handle), UART_IT_TC);
HAL_NVIC_DisableIRQ(uart->config->dma_tx->dma_irq);
HAL_DMA_Abort(&(uart->dma_tx.handle));
if (HAL_DMA_DeInit(&(uart->dma_tx.handle)) != HAL_OK)
{
RT_ASSERT(0);
@@ -414,12 +417,13 @@ static void dma_recv_isr(struct rt_serial_device *serial, rt_uint8_t isr_flag)
if (counter <= uart->dma_rx.remaining_cnt)
recv_len = uart->dma_rx.remaining_cnt - counter;
else
recv_len = serial->config.rx_bufsz + uart->dma_rx.remaining_cnt - counter;
recv_len = serial->config.dma_ping_bufsz + uart->dma_rx.remaining_cnt - counter;
if (recv_len)
{
#if defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U)
struct rt_serial_rx_fifo *rx_fifo = (struct rt_serial_rx_fifo *) serial->serial_rx;
SCB_InvalidateDCache_by_Addr((uint32_t *)rx_fifo->buffer, serial->config.rx_bufsz);
rt_uint8_t *ptr = NULL;
rt_hw_serial_control_isr(serial, RT_HW_SERIAL_CTRL_GET_DMA_PING_BUF, &ptr);
SCB_InvalidateDCache_by_Addr((uint32_t *)ptr, serial->config.dma_ping_bufsz);
#endif
uart->dma_rx.remaining_cnt = counter;
rt_hw_serial_isr(serial, RT_SERIAL_EVENT_RX_DMADONE | (recv_len << 8));
@@ -442,24 +446,16 @@ static void uart_isr(struct rt_serial_device *serial)
if ((__HAL_UART_GET_FLAG(&(uart->handle), UART_FLAG_RXNE) != RESET) &&
(__HAL_UART_GET_IT_SOURCE(&(uart->handle), UART_IT_RXNE) != RESET))
{
struct rt_serial_rx_fifo *rx_fifo;
rx_fifo = (struct rt_serial_rx_fifo *) serial->serial_rx;
RT_ASSERT(rx_fifo != RT_NULL);
rt_ringbuffer_putchar(&(rx_fifo->rb), UART_GET_RDR(&uart->handle, stm32_uart_get_mask(uart->handle.Init.WordLength, uart->handle.Init.Parity)));
char chr = UART_GET_RDR(&uart->handle, stm32_uart_get_mask(uart->handle.Init.WordLength, uart->handle.Init.Parity));
rt_hw_serial_control_isr(serial, RT_HW_SERIAL_CTRL_PUTC, &chr);
rt_hw_serial_isr(serial, RT_SERIAL_EVENT_RX_IND);
}
/* If the Transmit data register is empty and the TXE interrupt enable is enabled (TDR) */
else if ((__HAL_UART_GET_FLAG(&(uart->handle), UART_FLAG_TXE) != RESET) &&
(__HAL_UART_GET_IT_SOURCE(&(uart->handle), UART_IT_TXE)) != RESET)
{
struct rt_serial_tx_fifo *tx_fifo;
tx_fifo = (struct rt_serial_tx_fifo *) serial->serial_tx;
RT_ASSERT(tx_fifo != RT_NULL);
rt_uint8_t put_char = 0;
if (rt_ringbuffer_getchar(&(tx_fifo->rb), &put_char))
if (rt_hw_serial_control_isr(serial, RT_HW_SERIAL_CTRL_GETC, &put_char) == RT_EOK)
{
UART_SET_TDR(&uart->handle, put_char);
}
@@ -931,6 +927,7 @@ static void stm32_uart_get_config(void)
uart_obj[UART1_INDEX].serial.config.tx_bufsz = BSP_UART1_TX_BUFSIZE;
#ifdef BSP_UART1_RX_USING_DMA
uart_obj[UART1_INDEX].serial.config.dma_ping_bufsz = BSP_UART1_DMA_PING_BUFSIZE;
uart_obj[UART1_INDEX].uart_dma_flag |= RT_DEVICE_FLAG_DMA_RX;
static struct dma_config uart1_dma_rx = UART1_DMA_RX_CONFIG;
uart_config[UART1_INDEX].dma_rx = &uart1_dma_rx;
@@ -951,6 +948,7 @@ static void stm32_uart_get_config(void)
uart_obj[UART2_INDEX].serial.config.tx_bufsz = BSP_UART2_TX_BUFSIZE;
#ifdef BSP_UART2_RX_USING_DMA
uart_obj[UART2_INDEX].serial.config.dma_ping_bufsz = BSP_UART2_DMA_PING_BUFSIZE;
uart_obj[UART2_INDEX].uart_dma_flag |= RT_DEVICE_FLAG_DMA_RX;
static struct dma_config uart2_dma_rx = UART2_DMA_RX_CONFIG;
uart_config[UART2_INDEX].dma_rx = &uart2_dma_rx;
@@ -971,6 +969,7 @@ static void stm32_uart_get_config(void)
uart_obj[UART3_INDEX].serial.config.tx_bufsz = BSP_UART3_TX_BUFSIZE;
#ifdef BSP_UART3_RX_USING_DMA
uart_obj[UART3_INDEX].serial.config.dma_ping_bufsz = BSP_UART3_DMA_PING_BUFSIZE;
uart_obj[UART3_INDEX].uart_dma_flag |= RT_DEVICE_FLAG_DMA_RX;
static struct dma_config uart3_dma_rx = UART3_DMA_RX_CONFIG;
uart_config[UART3_INDEX].dma_rx = &uart3_dma_rx;
@@ -991,6 +990,7 @@ static void stm32_uart_get_config(void)
uart_obj[UART4_INDEX].serial.config.tx_bufsz = BSP_UART4_TX_BUFSIZE;
#ifdef BSP_UART4_RX_USING_DMA
uart_obj[UART4_INDEX].serial.config.dma_ping_bufsz = BSP_UART4_DMA_PING_BUFSIZE;
uart_obj[UART4_INDEX].uart_dma_flag |= RT_DEVICE_FLAG_DMA_RX;
static struct dma_config uart4_dma_rx = UART4_DMA_RX_CONFIG;
uart_config[UART4_INDEX].dma_rx = &uart4_dma_rx;
@@ -1011,6 +1011,7 @@ static void stm32_uart_get_config(void)
uart_obj[UART5_INDEX].serial.config.tx_bufsz = BSP_UART5_TX_BUFSIZE;
#ifdef BSP_UART5_RX_USING_DMA
uart_obj[UART5_INDEX].serial.config.dma_ping_bufsz = BSP_UART5_DMA_PING_BUFSIZE;
uart_obj[UART5_INDEX].uart_dma_flag |= RT_DEVICE_FLAG_DMA_RX;
static struct dma_config uart5_dma_rx = UART5_DMA_RX_CONFIG;
uart_config[UART5_INDEX].dma_rx = &uart5_dma_rx;
@@ -1031,6 +1032,7 @@ static void stm32_uart_get_config(void)
uart_obj[UART6_INDEX].serial.config.tx_bufsz = BSP_UART6_TX_BUFSIZE;
#ifdef BSP_UART6_RX_USING_DMA
uart_obj[UART6_INDEX].serial.config.dma_ping_bufsz = BSP_UART6_DMA_PING_BUFSIZE;
uart_obj[UART6_INDEX].uart_dma_flag |= RT_DEVICE_FLAG_DMA_RX;
static struct dma_config uart6_dma_rx = UART6_DMA_RX_CONFIG;
uart_config[UART6_INDEX].dma_rx = &uart6_dma_rx;
@@ -1051,6 +1053,7 @@ static void stm32_uart_get_config(void)
uart_obj[UART7_INDEX].serial.config.tx_bufsz = BSP_UART7_TX_BUFSIZE;
#ifdef BSP_UART7_RX_USING_DMA
uart_obj[UART7_INDEX].serial.config.dma_ping_bufsz = BSP_UART7_DMA_PING_BUFSIZE;
uart_obj[UART7_INDEX].uart_dma_flag |= RT_DEVICE_FLAG_DMA_RX;
static struct dma_config uart7_dma_rx = UART7_DMA_RX_CONFIG;
uart_config[UART7_INDEX].dma_rx = &uart7_dma_rx;
@@ -1077,6 +1080,7 @@ static void stm32_uart_get_config(void)
#endif
#ifdef BSP_UART8_TX_USING_DMA
uart_obj[UART8_INDEX].serial.config.dma_ping_bufsz = BSP_UART8_DMA_PING_BUFSIZE;
uart_obj[UART8_INDEX].uart_dma_flag |= RT_DEVICE_FLAG_DMA_TX;
static struct dma_config uart8_dma_tx = UART8_DMA_TX_CONFIG;
uart_config[UART8_INDEX].dma_tx = &uart8_dma_tx;
@@ -1091,6 +1095,7 @@ static void stm32_uart_get_config(void)
uart_obj[LPUART1_INDEX].serial.config.tx_bufsz = BSP_LPUART1_TX_BUFSIZE;
#ifdef BSP_LPUART1_RX_USING_DMA
uart_obj[LPUART1_INDEX].serial.config.dma_ping_bufsz = BSP_LPUART1_DMA_PING_BUFSIZE;
uart_obj[LPUART1_INDEX].uart_dma_flag |= RT_DEVICE_FLAG_DMA_RX;
static struct dma_config lpuart1_dma_rx = LPUART1_DMA_CONFIG;
uart_config[LPUART1_INDEX].dma_rx = &lpuart1_dma_rx;
@@ -1101,7 +1106,6 @@ static void stm32_uart_get_config(void)
#ifdef RT_SERIAL_USING_DMA
static void stm32_dma_config(struct rt_serial_device *serial, rt_ubase_t flag)
{
struct rt_serial_rx_fifo *rx_fifo;
DMA_HandleTypeDef *DMA_Handle;
struct dma_config *dma_config;
struct stm32_uart *uart;
@@ -1202,10 +1206,11 @@ static void stm32_dma_config(struct rt_serial_device *serial, rt_ubase_t flag)
/* enable interrupt */
if (flag == RT_DEVICE_FLAG_DMA_RX)
{
rx_fifo = (struct rt_serial_rx_fifo *)serial->serial_rx;
RT_ASSERT(rx_fifo != RT_NULL);
rt_uint8_t *ptr = NULL;
rt_hw_serial_control_isr(serial, RT_HW_SERIAL_CTRL_GET_DMA_PING_BUF, &ptr);
/* Start DMA transfer */
if (HAL_UART_Receive_DMA(&(uart->handle), rx_fifo->buffer, serial->config.rx_bufsz) != HAL_OK)
if (HAL_UART_Receive_DMA(&(uart->handle), ptr, serial->config.dma_ping_bufsz) != HAL_OK)
{
/* Transfer error in reception process */
RT_ASSERT(0);
@@ -47,6 +47,12 @@ menu "On-chip Peripheral Drivers"
depends on RT_USING_SERIAL_V2
default 256
config BSP_LPUART1_DMA_PING_BUFSIZE
int "Set LPUART1 RX DMA ping-pong buffer size"
range 32 65535
depends on RT_USING_SERIAL_V2 && BSP_LPUART1_RX_USING_DMA
default 64
config BSP_USING_UART1
bool "Enable UART1"
default n
@@ -73,6 +79,12 @@ menu "On-chip Peripheral Drivers"
depends on RT_USING_SERIAL_V2
default 256
config BSP_UART1_DMA_PING_BUFSIZE
int "Set UART1 RX DMA ping-pong buffer size"
range 32 65535
depends on RT_USING_SERIAL_V2 && BSP_UART1_RX_USING_DMA
default 64
config BSP_USING_UART2
bool "Enable UART2"
default n
@@ -98,6 +110,12 @@ menu "On-chip Peripheral Drivers"
range 0 65535
depends on RT_USING_SERIAL_V2
default 256
config BSP_UART2_DMA_PING_BUFSIZE
int "Set UART2 RX DMA ping-pong buffer size"
range 32 65535
depends on RT_USING_SERIAL_V2 && BSP_UART2_RX_USING_DMA
default 64
endif
menuconfig BSP_USING_TIM
+6
View File
@@ -177,6 +177,12 @@ menu "On-chip Peripheral Drivers"
depends on BSP_USING_UART1
default 0
config BSP_UART1_DMA_PING_BUFSIZE
int "Set UART1 RX DMA ping-pong buffer size"
range 32 65535
depends on RT_USING_SERIAL_V2 && BSP_UART1_RX_USING_DMA
default 64
endif
menuconfig BSP_USING_UART3
@@ -73,6 +73,11 @@ menu "On-chip Peripheral Drivers"
depends on BSP_USING_UART1
default 0
config BSP_UART1_DMA_PING_BUFSIZE
int "Set UART1 RX DMA ping-pong buffer size"
range 32 65535
depends on RT_USING_SERIAL_V2 && BSP_UART1_RX_USING_DMA
default 64
endif
menuconfig BSP_USING_UART3
@@ -117,6 +122,12 @@ menu "On-chip Peripheral Drivers"
range 0 65535
depends on BSP_USING_UART4
default 0
config BSP_UART4_DMA_PING_BUFSIZE
int "Set UART4 RX DMA ping-pong buffer size"
range 32 65535
depends on RT_USING_SERIAL_V2 && BSP_UART4_RX_USING_DMA
default 64
endif
menuconfig BSP_USING_UART6
@@ -317,6 +317,12 @@ menu "On-chip Peripheral Drivers"
range 0 65535
depends on RT_USING_SERIAL_V2
default 0
config BSP_UART1_DMA_PING_BUFSIZE
int "Set UART1 RX DMA ping-pong buffer size"
range 32 65535
depends on RT_USING_SERIAL_V2 && BSP_UART1_RX_USING_DMA
default 64
endif
menuconfig BSP_USING_UART2
@@ -344,6 +350,12 @@ menu "On-chip Peripheral Drivers"
range 0 65535
depends on RT_USING_SERIAL_V2
default 256
config BSP_UART2_DMA_PING_BUFSIZE
int "Set UART2 RX DMA ping-pong buffer size"
range 32 65535
depends on RT_USING_SERIAL_V2 && BSP_UART2_RX_USING_DMA
default 64
endif
endif
@@ -1,5 +1,5 @@
/*
* Copyright (c) 2006-2023, RT-Thread Development Team
* Copyright (c) 2006-2024 RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
@@ -12,8 +12,7 @@
#define __DEV_SERIAL_V2_H__
#include <rtthread.h>
#include <rtdevice.h>
/**
* @addtogroup group_Drivers RTTHREAD Driver
* @defgroup group_Serial_v2 Serial v2
@@ -169,6 +168,9 @@
#define NRZ_NORMAL 0 /* Non Return to Zero : normal mode */
#define NRZ_INVERTED 1 /* Non Return to Zero : inverted mode */
/**
* device flag
*/
#define RT_DEVICE_FLAG_RX_BLOCKING 0x1000
#define RT_DEVICE_FLAG_RX_NON_BLOCKING 0x2000
@@ -180,21 +182,42 @@
#define RT_SERIAL_TX_BLOCKING RT_DEVICE_FLAG_TX_BLOCKING
#define RT_SERIAL_TX_NON_BLOCKING RT_DEVICE_FLAG_TX_NON_BLOCKING
/**
* hw device control commands
*/
#define RT_DEVICE_CHECK_OPTMODE 0x20
/**
* hw serial control commands
*/
#define RT_HW_SERIAL_CTRL_GETC 0x01 /* Tx irq get char */
#define RT_HW_SERIAL_CTRL_PUTC 0x02 /* Rx irq put char */
#define RT_HW_SERIAL_CTRL_GET_DMA_PING_BUF 0x03 /* Get DMA ping-pong buffer */
/**
* hw isr event
*/
#define RT_SERIAL_EVENT_RX_IND 0x01 /* Rx indication */
#define RT_SERIAL_EVENT_TX_DONE 0x02 /* Tx complete */
#define RT_SERIAL_EVENT_RX_DMADONE 0x03 /* Rx DMA transfer done */
#define RT_SERIAL_EVENT_TX_DMADONE 0x04 /* Tx DMA transfer done */
#define RT_SERIAL_EVENT_RX_TIMEOUT 0x05 /* Rx timeout */
/**
* device commands
* 0x40 - special device control commands
*/
#define RT_SERIAL_CTRL_SET_RX_TIMEOUT 0x41 /* set Rx timeout. Call before rt_device_read. not supported in poll mode */
#define RT_SERIAL_CTRL_SET_TX_TIMEOUT 0x42 /* set Tx timeout. Call before rt_device_write. not supported in poll mode */
#define RT_SERIAL_CTRL_GET_RX_TIMEOUT 0x43 /* get Rx timeout. not supported in poll mode */
#define RT_SERIAL_CTRL_GET_TX_TIMEOUT 0x44 /* get Tx timeout. not supported in poll mode */
#define RT_SERIAL_CTRL_RX_FLUSH 0x45 /* clear rx buffer. Discard all data */
#define RT_SERIAL_CTRL_TX_FLUSH 0x46 /* clear tx buffer. Blocking and wait for the send buffer data to be sent. not supported in poll mode */
#define RT_SERIAL_CTRL_GET_UNREAD_BYTES_COUNT 0x47 /* get unread bytes count. not supported in poll mode */
#define RT_SERIAL_ERR_OVERRUN 0x01
#define RT_SERIAL_ERR_FRAMING 0x02
#define RT_SERIAL_ERR_PARITY 0x03
#define RT_SERIAL_TX_DATAQUEUE_SIZE 2048
#define RT_SERIAL_TX_DATAQUEUE_LWM 30
#define RT_SERIAL_RX_MINBUFSZ 64
#define RT_SERIAL_TX_MINBUFSZ 64
@@ -216,7 +239,8 @@
RT_SERIAL_RX_MINBUFSZ, /* rxBuf size */ \
RT_SERIAL_TX_MINBUFSZ, /* txBuf size */ \
RT_SERIAL_FLOWCONTROL_NONE, /* Off flowcontrol */ \
0 \
0, /* reserved */ \
0, /* dma_ping_bufsz */ \
}
/**
@@ -239,6 +263,10 @@ struct serial_configure
rt_uint32_t tx_bufsz :16;
rt_uint32_t flowcontrol :1;
rt_uint32_t reserved :5;
#ifdef RT_SERIAL_USING_DMA
rt_uint32_t dma_ping_bufsz :16;
#endif
};
/**
@@ -248,12 +276,15 @@ struct rt_serial_rx_fifo
{
struct rt_ringbuffer rb;
#ifdef RT_SERIAL_USING_DMA
struct rt_ringbuffer dma_ping_rb;
#endif
struct rt_completion rx_cpt;
rt_uint16_t rx_cpt_index;
rt_size_t rx_cpt_index;
/* software fifo */
rt_uint8_t buffer[];
rt_atomic_t rx_timeout;
};
/**
@@ -264,14 +295,13 @@ struct rt_serial_tx_fifo
{
struct rt_ringbuffer rb;
rt_size_t put_size;
rt_bool_t activated;
struct rt_completion tx_cpt;
/* software fifo */
rt_uint8_t buffer[];
rt_size_t put_size;
rt_atomic_t tx_timeout;
rt_atomic_t activated;
};
/**
@@ -288,6 +318,8 @@ struct rt_serial_device
void *serial_rx;
void *serial_tx;
struct rt_spinlock spinlock;
struct rt_device_notify rx_notify;
};
@@ -321,6 +353,7 @@ struct rt_uart_ops
*/
void rt_hw_serial_isr(struct rt_serial_device *serial, int event);
rt_err_t rt_hw_serial_control_isr(struct rt_serial_device *serial, int cmd, void *args);
/**
* @brief Register a serial device to device list
+11
View File
@@ -13,6 +13,17 @@ menuconfig RT_USING_SERIAL
config RT_USING_SERIAL_V2
bool "RT_USING_SERIAL_V2"
endchoice
choice
prompt "Choice Serial version"
depends on RT_USING_SERIAL_V2
default RT_SERIAL_BUF_STRATEGY_OVERWRITE
config RT_SERIAL_BUF_STRATEGY_DROP
bool "drop new incoming data when the buffer is full"
config RT_SERIAL_BUF_STRATEGY_OVERWRITE
bool "overwrite old data when the buffer is full"
endchoice
config RT_SERIAL_USING_DMA
bool "Enable serial DMA mode"
default y
File diff suppressed because it is too large Load Diff
+8 -1
View File
@@ -1,5 +1,5 @@
/*
* Copyright (c) 2006-2025 RT-Thread Development Team
* Copyright (c) 2006-2024 RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
@@ -90,7 +90,10 @@ struct at_server
char send_buffer[AT_SERVER_SEND_BUFF_LEN];
char recv_buffer[AT_SERVER_RECV_BUFF_LEN];
rt_size_t cur_recv_len;
#if (!defined(RT_USING_SERIAL_V2))
rt_sem_t rx_notice;
#endif
rt_thread_t parser;
void (*parser_entry)(struct at_server *server);
@@ -165,7 +168,11 @@ struct at_client
rt_size_t recv_line_len;
/* The maximum supported receive data length */
rt_size_t recv_bufsz;
#if (!defined(RT_USING_SERIAL_V2))
rt_sem_t rx_notice;
#endif
rt_mutex_t lock;
at_response_t resp;
+46 -17
View File
@@ -11,6 +11,7 @@
* 2021-03-17 Meco Man fix a buf of leaking memory
* 2021-07-14 Sszl fix a buf of leaking memory
* 2025-01-02 dongly support SERIAL_V2
* 2025-04-18 RyanCw support New SERIAL_V2
*/
#include <at.h>
@@ -225,7 +226,8 @@ int at_resp_parse_line_args(at_response_t resp, rt_size_t resp_line, const char
RT_ASSERT(resp);
RT_ASSERT(resp_expr);
if ((resp_line_buf = at_resp_get_line(resp, resp_line)) == RT_NULL)
resp_line_buf = at_resp_get_line(resp, resp_line);
if (resp_line_buf == RT_NULL)
{
return -1;
}
@@ -259,7 +261,8 @@ int at_resp_parse_line_args_by_kw(at_response_t resp, const char *keyword, const
RT_ASSERT(resp);
RT_ASSERT(resp_expr);
if ((resp_line_buf = at_resp_get_line_by_kw(resp, keyword)) == RT_NULL)
resp_line_buf = at_resp_get_line_by_kw(resp, keyword);
if (resp_line_buf == RT_NULL)
{
return -1;
}
@@ -541,6 +544,7 @@ static rt_err_t at_client_getchar(at_client_t client, char *ch, rt_int32_t timeo
{
rt_err_t result = RT_EOK;
#if (!defined(RT_USING_SERIAL_V2))
while (rt_device_read(client->device, 0, ch, 1) == 0)
{
result = rt_sem_take(client->rx_notice, rt_tick_from_millisecond(timeout));
@@ -551,8 +555,19 @@ static rt_err_t at_client_getchar(at_client_t client, char *ch, rt_int32_t timeo
rt_sem_control(client->rx_notice, RT_IPC_CMD_RESET, RT_NULL);
}
#else
rt_int32_t rx_timeout = rt_tick_from_millisecond(timeout);
rt_device_control(client->device, RT_SERIAL_CTRL_SET_RX_TIMEOUT, (void *)&rx_timeout);
result = rt_device_read(client->device, 0, ch, 1);
if(result <= 0)
{
result = -RT_ERROR;
}
rx_timeout = RT_WAITING_FOREVER;
rt_device_control(client->device, RT_SERIAL_CTRL_SET_RX_TIMEOUT, (void*)&rx_timeout);
#endif
return RT_EOK;
return result;
}
/**
@@ -570,7 +585,7 @@ static rt_err_t at_client_getchar(at_client_t client, char *ch, rt_int32_t timeo
*/
rt_size_t at_client_obj_recv(at_client_t client, char *buf, rt_size_t size, rt_int32_t timeout)
{
rt_size_t len = 0;
rt_size_t read_idx = 0;
RT_ASSERT(buf);
@@ -580,16 +595,17 @@ rt_size_t at_client_obj_recv(at_client_t client, char *buf, rt_size_t size, rt_i
return 0;
}
#if (!defined(RT_USING_SERIAL_V2))
while (size)
{
rt_size_t read_len;
rt_sem_control(client->rx_notice, RT_IPC_CMD_RESET, RT_NULL);
read_len = rt_device_read(client->device, 0, buf + len, size);
read_len = rt_device_read(client->device, 0, buf + read_idx, size);
if (read_len > 0)
{
len += read_len;
read_idx += read_len;
size -= read_len;
}
else
@@ -598,12 +614,19 @@ rt_size_t at_client_obj_recv(at_client_t client, char *buf, rt_size_t size, rt_i
break;
}
}
#ifdef AT_PRINT_RAW_CMD
at_print_raw_cmd("urc_recv", buf, len);
#else
rt_int32_t rx_timeout = rt_tick_from_millisecond(timeout);
rt_device_control(client->device, RT_SERIAL_CTRL_SET_RX_TIMEOUT, (void *)&rx_timeout);
read_idx = rt_device_read(client->device, 0, buf, size);
rx_timeout = RT_WAITING_FOREVER;
rt_device_control(client->device, RT_SERIAL_CTRL_SET_RX_TIMEOUT, (void*)&rx_timeout);
#endif
return len;
#ifdef AT_PRINT_RAW_CMD
at_print_raw_cmd("urc_recv", buf, read_idx);
#endif
return read_idx;
}
/**
@@ -780,7 +803,8 @@ static int at_recv_readline(at_client_t client)
}
/* is newline or URC data */
if ((client->urc = get_urc_obj(client)) != RT_NULL || (ch == '\n' && last_ch == '\r')
client->urc = get_urc_obj(client);
if (client->urc != RT_NULL || (ch == '\n' && last_ch == '\r')
|| (client->end_sign != 0 && ch == client->end_sign))
{
if (is_full)
@@ -877,6 +901,7 @@ static void client_parser(at_client_t client)
}
}
#if (!defined(RT_USING_SERIAL_V2))
static rt_err_t at_client_rx_ind(rt_device_t dev, rt_size_t size)
{
int idx = 0;
@@ -891,6 +916,7 @@ static rt_err_t at_client_rx_ind(rt_device_t dev, rt_size_t size)
return RT_EOK;
}
#endif
/* initialize the client object parameters */
static int at_client_para_init(at_client_t client)
@@ -933,6 +959,7 @@ static int at_client_para_init(at_client_t client)
goto __exit;
}
#if (!defined(RT_USING_SERIAL_V2))
rt_snprintf(name, RT_NAME_MAX, "%s%d", AT_CLIENT_SEM_NAME, at_client_num);
client->rx_notice = rt_sem_create(name, 0, RT_IPC_FLAG_FIFO);
if (client->rx_notice == RT_NULL)
@@ -941,6 +968,7 @@ static int at_client_para_init(at_client_t client)
result = -RT_ENOMEM;
goto __exit;
}
#endif
rt_snprintf(name, RT_NAME_MAX, "%s%d", AT_CLIENT_RESP_NAME, at_client_num);
client->resp_notice = rt_sem_create(name, 0, RT_IPC_FLAG_FIFO);
@@ -974,10 +1002,12 @@ __exit:
rt_mutex_delete(client->lock);
}
#if (!defined(RT_USING_SERIAL_V2))
if (client->rx_notice)
{
rt_sem_delete(client->rx_notice);
}
#endif
if (client->resp_notice)
{
@@ -1055,12 +1085,8 @@ int at_client_init(const char *dev_name, rt_size_t recv_bufsz, rt_size_t send_bu
if (client->device)
{
RT_ASSERT(client->device->type == RT_Device_Class_Char);
#if (!defined(RT_USING_SERIAL_V2))
rt_device_set_rx_indicate(client->device, at_client_rx_ind);
#ifdef RT_USING_SERIAL_V2
open_result = rt_device_open(client->device, RT_DEVICE_OFLAG_RDWR | RT_DEVICE_FLAG_RX_NON_BLOCKING);
#else
/* using DMA mode first */
open_result = rt_device_open(client->device, RT_DEVICE_OFLAG_RDWR | RT_DEVICE_FLAG_DMA_RX);
/* using interrupt mode when DMA mode not supported */
@@ -1068,8 +1094,11 @@ int at_client_init(const char *dev_name, rt_size_t recv_bufsz, rt_size_t send_bu
{
open_result = rt_device_open(client->device, RT_DEVICE_OFLAG_RDWR | RT_DEVICE_FLAG_INT_RX);
}
#endif /* RT_USING_SERIAL_V2 */
RT_ASSERT(open_result == RT_EOK);
#else
open_result = rt_device_open(client->device, RT_DEVICE_OFLAG_RDWR | RT_DEVICE_FLAG_RX_BLOCKING | RT_DEVICE_FLAG_TX_BLOCKING);
RT_ASSERT(open_result == RT_EOK);
#endif
}
else
{
+35 -7
View File
@@ -8,6 +8,7 @@
* 2018-03-30 chenyong first version
* 2018-04-14 chenyong modify parse arguments
* 2025-01-02 dongly support SERIAL_V2
* 2025-04-18 RyanCw support New SERIAL_V2
*/
#include <at.h>
@@ -223,6 +224,7 @@ rt_size_t at_server_recv(at_server_t server, char *buf, rt_size_t size, rt_int32
return 0;
}
#if (!defined(RT_USING_SERIAL_V2))
while (1)
{
if (read_idx < size)
@@ -242,6 +244,13 @@ rt_size_t at_server_recv(at_server_t server, char *buf, rt_size_t size, rt_int32
break;
}
}
#else
rt_int32_t rx_timout = rt_tick_from_millisecond(timeout);
rt_device_control(server->device, RT_SERIAL_CTRL_SET_RX_TIMEOUT, (void*)&rx_timout);
read_idx = rt_device_read(server->device, 0, buf, size);
rx_timeout = RT_WAITING_FOREVER;
rt_device_control(server->device, RT_SERIAL_CTRL_SET_RX_TIMEOUT, (void*)&rx_timeout);
#endif
return read_idx;
}
@@ -411,15 +420,27 @@ static rt_err_t at_server_getchar(at_server_t server, char *ch, rt_int32_t timeo
{
rt_err_t result = RT_EOK;
#if (!defined(RT_USING_SERIAL_V2))
while (rt_device_read(at_server_local->device, 0, ch, 1) == 0)
{
rt_sem_control(at_server_local->rx_notice, RT_IPC_CMD_RESET, RT_NULL);
result = rt_sem_take(at_server_local->rx_notice, rt_tick_from_millisecond(timeout));
if (result != RT_EOK)
{
return result;
}
rt_sem_control(at_server_local->rx_notice, RT_IPC_CMD_RESET, RT_NULL);
}
#else
rt_int32_t rx_timout = rt_tick_from_millisecond(timeout);
rt_device_control(server->device, RT_SERIAL_CTRL_SET_RX_TIMEOUT, (void*)&rx_timout);
result = rt_device_read(server->device, 0, ch, 1);
if(result <= 0)
{
result = -RT_ERROR;
}
rx_timeout = RT_WAITING_FOREVER;
rt_device_control(server->device, RT_SERIAL_CTRL_SET_RX_TIMEOUT, (void*)&rx_timeout);
#endif
return result;
}
@@ -497,6 +518,7 @@ static void server_parser(at_server_t server)
}
}
#if (!defined(RT_USING_SERIAL_V2))
static rt_err_t at_rx_ind(rt_device_t dev, rt_size_t size)
{
if (size > 0)
@@ -506,6 +528,7 @@ static rt_err_t at_rx_ind(rt_device_t dev, rt_size_t size)
return RT_EOK;
}
#endif
#if defined(__ICCARM__) || defined(__ICCRX__) /* for IAR compiler */
#pragma section="RtAtCmdTab"
@@ -551,6 +574,7 @@ int at_server_init(void)
rt_memset(at_server_local->recv_buffer, 0x00, AT_SERVER_RECV_BUFF_LEN);
at_server_local->cur_recv_len = 0;
#if (!defined(RT_USING_SERIAL_V2))
at_server_local->rx_notice = rt_sem_create("at_svr", 0, RT_IPC_FLAG_FIFO);
if (!at_server_local->rx_notice)
{
@@ -558,18 +582,15 @@ int at_server_init(void)
result = -RT_ENOMEM;
goto __exit;
}
#endif
/* Find and open command device */
at_server_local->device = rt_device_find(AT_SERVER_DEVICE);
if (at_server_local->device)
{
RT_ASSERT(at_server_local->device->type == RT_Device_Class_Char);
#if (!defined(RT_USING_SERIAL_V2))
rt_device_set_rx_indicate(at_server_local->device, at_rx_ind);
#ifdef RT_USING_SERIAL_V2
open_result = rt_device_open(client->device, RT_DEVICE_OFLAG_RDWR | RT_DEVICE_FLAG_RX_NON_BLOCKING);
#else
/* using DMA mode first */
open_result = rt_device_open(at_server_local->device, RT_DEVICE_OFLAG_RDWR | RT_DEVICE_FLAG_DMA_RX);
/* using interrupt mode when DMA mode not supported */
@@ -577,8 +598,11 @@ int at_server_init(void)
{
open_result = rt_device_open(at_server_local->device, RT_DEVICE_OFLAG_RDWR | RT_DEVICE_FLAG_INT_RX);
}
#endif /* RT_USING_SERIAL_V2 */
RT_ASSERT(open_result == RT_EOK);
#else
open_result = rt_device_open(at_server_local->device, RT_DEVICE_OFLAG_RDWR | RT_DEVICE_FLAG_RX_BLOCKING | RT_DEVICE_FLAG_TX_BLOCKING);
RT_ASSERT(open_result == RT_EOK);
#endif
}
else
{
@@ -614,10 +638,14 @@ __exit:
{
if (at_server_local)
{
#if (!defined(RT_USING_SERIAL_V2))
if (at_server_local->rx_notice)
{
rt_sem_delete(at_server_local->rx_notice);
}
#endif
if (at_server_local->device)
{
rt_device_close(at_server_local->device);
@@ -1,7 +1,50 @@
menu "Utest Serial Testcase"
config UTEST_SERIAL_TC
bool "Serial testcase"
default n
config UTEST_SERIAL_TC
bool "Serial testcase"
default n
if UTEST_SERIAL_TC
config RT_SERIAL_TC_DEVICE_NAME
string "the device name for serial test"
default "uart2"
config RT_SERIAL_TC_RXBUF_SIZE
int "the rx buffer size for serial test"
default 128
config RT_SERIAL_TC_TXBUF_SIZE
int "the tx buffer size for serial test"
default 128
config RT_SERIAL_TC_SEND_ITERATIONS
int "the number of iterations for the test routine."
default 100
config UTEST_SERIAL_QEMU_TC
bool "qemu dedicated tests"
default n
config UTEST_SERIAL_POSIX_TC
bool "Serial posix testcase"
default n
select RT_USING_DFS
select RT_USING_POSIX_FS
select RT_USING_POSIX_TERMIOS
if UTEST_SERIAL_POSIX_TC
config RT_SERIAL_POSIX_TC_DEVICE_NAME
string "the device name for serial posix test"
default "dev/uart2"
config RT_SERIAL_POSIX_TC_SEND_ITERATIONS
int "the number of iterations for the posix test routine."
default 100
endif
endif
endmenu
@@ -14,6 +14,14 @@
| uart_blocking_rx.c| 串口阻塞接收模式 的测试 |
| uart_nonblocking_tx.c| 串口非阻塞发送模式 的测试 |
| uart_nonblocking_rx.c | 串口非阻塞接收模式 的测试 |
| uart_flush_rx | 刷新接收缓冲区的测试 |
| uart_flush_txb | 阻塞模式下刷新发送缓冲区的测试 |
| uart_flush_txnb | 非阻塞模式下刷新发送缓冲区的测试 |
| uart_timeout_rxb_txb | 串口 发送 / 接收 超时的测试 |
| uart_overflow_rxb_txb | 串口溢出处理的测试 |
| uart_get_unread_bytes_count | 获取串口接收缓冲区中的数据长度的测试 |
| uart_posix_nonblock | posix非阻塞测试 |
| uart_posix_echo_block | posix阻塞echo测试 |
## 3、软硬件环境
@@ -77,37 +85,20 @@
需要解释的是,为什么会存在无意义的组合模式,举个例子,非阻塞模式下,肯定是不会出现POLL(轮询)方式的,因为POLL方式已经表明是阻塞方式了。
该测试用例在测试多种组合时,需要通过更改`rtconfig.h`文件对硬件模式进行静态配置。
### 4.2 测试思路
### 4.2 测试条件
前四个测试用例的测试思路:
**短接串口的发送TX引脚和接收RX引脚,完成自发自收的回路**。
>硬件上:**短接串口的发送TX引脚和接收RX引脚,完成自发自收的回路**。
>
>软件上:创建两个线程A和B,A为接收线程,B为发送线程,设置A线程优先级比B线程优先级高。发送线程发送随机长度(长度范围是 0 到 1000)的数据,接收线程接收到数据进行校验,数据正确则测试通过,默认测试100次。
大致的测试思路:
后四个测试用例的测试思路:
>硬件上: **不需要将TX,RX引脚进行短接**,每次只针对发送或接收中的一种进行测试,更为简单与直接
>
>软件上: 四个样例每次仅测试TX/RX中的一种引脚与一种对应的阻塞/非阻塞模式
>四种测试模式具体分为:
>>阻塞接收模式----(硬件工作模式可选: 轮询, 中断, DMA)
>>阻塞发送模式----(硬件工作模式可选: 轮询, 中断, DMA)
>>非阻塞接收模式--(硬件工作模式可选: 中断, DMA)
>>非阻塞发送模式--(硬件工作模式可选: 中断, DMA)
>
>其中阻塞或非阻塞背后的具体硬件工作模式选择(如 轮询, 中断, DMA)需要对`rtconfig.h`文件做出配置,具体配置流程可见文章中关于
[seril_v2硬件工作模式的选择](https://club.rt-thread.org/ask/article/b4c536303c8e2335.html "serial_v2源码分析")一节.
>
>发送测试流程 :
>>1. 先关闭串口,再以需要测试的模式打开.
>>2. 然后依次发送 UART_SEND_TIMES(默认为400) * 1024, 8, 32, 128, 512, 1024个数据.
>>3. 发送的同时记录每次发送所耗费的时钟周期与成功发送的数据数量.
>>3. 打印记录的数据,通过时钟周期来反应发送效率, 通过成功发送的数据量来反应是否产生丢包问题.
>>2. 然后依次发送 UART_SEND_TIMES * 1000以内的随机数)个数据.
>>3. 打印记录的数据,通过LOG日志的时钟周期来反应发送效率, 通过成功发送的数据量来反应是否产生丢包问题.
>
>接收测试流程 :
>>1. 先关闭串口,再以需要测试的模式打开.
>>2. 然后以此接收 256, 256, 256, 128, 128, 共计1024个数据
>>2. 然后以此接收 同发送测试流程一致的 UART_SEND_TIMES *1000以内随机数)个数据
>>3. 接收的同时记录成功接收的数据数量
>>4. 打印记录的数据, 通过现实成功接收的数据量与串口发送的数据量做对比,来验证是否出现丢包问题
@@ -119,7 +110,14 @@
RT-Thread Utestcases --->
[*] RT-Thread Utestcases --->
Utest Serial Testcase --->
[*] Serial testcase
[*] Serial testcase --->
the device name for serial test: uart2 (选择测试的串口)
(128)the rx buffer size for serial test (测试串口rx缓冲区大小)
(128)the tx buffer size for serial test (测试串口tx缓冲区大小)
(100)the number of iterations for the test routine. (测试例程的迭代次数)
[*] Serial posix testcase --->
the device name for serial posix test: dev/uart2 (posix测试的串口)
(100)the number of iterations for the posix test routine. (posix测试例程的迭代次数)
```
## 6、使用
@@ -140,9 +138,9 @@ RT-Thread Utestcases --->
\- 在 MSH 中输入 `utest_run testcases.drivers.uart_nonblocking_tx` 运行串口非阻塞发送测试
\- 在 MSH 中输入 `utest_run testcases.drivers.uart_nonblocking_rx` 运行串口非阻塞接收测试
其余同理,可在函数内部查看命令。
如果仅仅配置了 `Serial testcase` 相关的测试用例,则直接输入 `utest_run` 运行即可将上述测试用例按序测试。
如果仅仅配置了 `Serial testcase` 相关的测试用例,则直接输入 `utest_run *` 运行即可将上述测试用例按序测试。
## 7、注意事项
@@ -152,7 +150,5 @@ RT-Thread Utestcases --->
\- 需在 MSH 中输入正确的命令行。
\- 测试用例默认的测试数据长度范围最大为1000字节,如果接收端的缓冲区大小配置为小于1000字节时,那么在测试接收阻塞模式时,将会由于获取不了1000字节长度导致线程持续阻塞(因为测试用例是按 `recv_len` 长度去接收的,而不是按照单字节去接收的),因此建议接收端的缓冲区大小 (对应宏例如为 `BSP_UART2_RX_BUFSIZE`)设置为1024即可;当然也可按需减小测试的最大数据长度。
\- 该测试用例需要结合硬件具体的工作模式(POLL 、INT、DMA)进行测试,而硬件工作模式只能选择一种,因此需要在 `rtconfig.h` 中对串口相应的宏进行配置,来选择不同的工作模式去进行测试。
@@ -2,19 +2,17 @@ Import('rtconfig')
from building import *
cwd = GetCurrentDir()
src = Split('''
uart_rxb_txnb.c
uart_rxb_txb.c
uart_rxnb_txb.c
uart_rxnb_txnb.c
uart_blocking_rx.c
uart_blocking_tx.c
uart_nonblocking_rx.c
uart_nonblocking_tx.c
''')
src = Glob('*.c')
CPPPATH = [cwd]
path = [cwd]
group = DefineGroup('utestcases', src, depend = ['UTEST_SERIAL_TC'], CPPPATH = CPPPATH)
if GetDepend(['UTEST_SERIAL_POSIX_TC']):
src += Glob('posix/*.c')
if GetDepend(['UTEST_SERIAL_QEMU_TC']):
src += Glob('qemu/*.c')
group = DefineGroup('utestcases', src, depend = ['UTEST_SERIAL_TC'], CPPPATH = path)
Return('group')
@@ -0,0 +1,281 @@
/*
* Copyright (c) 2006-2024 RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
* Change Logs:
* Date Author Notes
* 2021-06-16 KyleChan the first version
*/
#include <rtthread.h>
#include "utest.h"
#include <rtdevice.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <termios.h>
#include <fcntl.h>
#include <unistd.h>
#ifdef UTEST_SERIAL_TC
static int32_t serial_fd;
static rt_uint8_t uart_over_flag;
static rt_bool_t uart_result = RT_TRUE;
static rt_err_t uart_find(void)
{
serial_fd = open(RT_SERIAL_POSIX_TC_DEVICE_NAME, O_RDWR);
if (serial_fd == -1)
{
LOG_E("find %s device failed!\n", RT_SERIAL_TC_DEVICE_NAME);
return -RT_ERROR;
}
return RT_EOK;
}
static rt_err_t configureSerial(int fd, int baud)
{
int32_t result = 0;
struct termios options;
result = tcgetattr(fd, &options); // 获取当前端口的属性
if (result == -1)
return -RT_ERROR;
// 设置波特率
result = cfsetispeed(&options, baud); // 设置输入波特率
if (result == -1)
return -RT_ERROR;
result = cfsetospeed(&options, baud); // 设置输出波特率
if (result == -1)
return -RT_ERROR;
// 设置数据位
options.c_cflag &= ~PARENB; // 清除校验位,无校验
options.c_cflag &= ~CSTOPB; // 仅一个停止位
options.c_cflag &= ~CSIZE; // 清除掩码
options.c_cflag |= CS8; // 8位数据
// 设置无流控
options.c_cflag &= ~CRTSCTS; // 不使用硬件流控制
options.c_iflag &= ~(IXON | IXOFF | IXANY); // 不使用软件流控制
// 使能接收器和发送器
options.c_cflag |= CLOCAL | CREAD;
// 设置行终止符
options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);
// 应用属性
result = tcsetattr(fd, TCSANOW, &options);
if (result == -1)
return -RT_ERROR;
return RT_EOK;
}
static void uart_send_entry(void *parameter)
{
rt_uint8_t *uart_write_buffer;
rt_uint16_t send_len;
rt_uint32_t i = 0;
send_len = *(rt_uint16_t *)parameter;
/* assign send buffer */
uart_write_buffer = (rt_uint8_t *)rt_malloc(send_len);
if (uart_write_buffer == RT_NULL)
{
LOG_E("Without spare memory for uart dma!");
uart_result = RT_FALSE;
return;
}
rt_memset(uart_write_buffer, 0, send_len);
for (i = 0; i < send_len; i++)
{
uart_write_buffer[i] = (rt_uint8_t)i;
}
/* send buffer */
if (write(serial_fd, uart_write_buffer, send_len) != send_len)
{
LOG_E("device write failed\r\n");
}
rt_free(uart_write_buffer);
}
static void uart_rec_entry(void *parameter)
{
rt_uint16_t rev_len;
rev_len = *(rt_uint16_t *)parameter;
rt_uint8_t *uart_write_buffer;
uart_write_buffer = (rt_uint8_t *)rt_calloc(1, sizeof(rt_uint8_t) * (rev_len + 1));
rt_int32_t cnt, i;
rt_uint8_t last_old_data;
rt_bool_t fisrt_flag = RT_TRUE;
rt_uint32_t all_receive_length = 0;
while (1)
{
cnt = read(serial_fd, (void *)uart_write_buffer, rev_len);
if (cnt == 0)
{
continue;
}
if (fisrt_flag != RT_TRUE)
{
if ((rt_uint8_t)(last_old_data + 1) != uart_write_buffer[0])
{
LOG_E("_Read Different data -> former data: %x, current data: %x.", last_old_data, uart_write_buffer[0]);
uart_result = RT_FALSE;
rt_free(uart_write_buffer);
return;
}
}
else
{
fisrt_flag = RT_FALSE;
}
for (i = 0; i < cnt - 1; i++)
{
if ((rt_uint8_t)(uart_write_buffer[i] + 1) != uart_write_buffer[i + 1])
{
LOG_E("Read Different data -> former data: %x, current data: %x.", uart_write_buffer[i], uart_write_buffer[i + 1]);
uart_result = RT_FALSE;
rt_free(uart_write_buffer);
return;
}
}
all_receive_length += cnt;
if (all_receive_length >= rev_len)
break;
else
last_old_data = uart_write_buffer[cnt - 1];
}
rt_free(uart_write_buffer);
uart_over_flag = RT_TRUE;
}
static rt_err_t uart_api(rt_uint16_t length)
{
rt_thread_t thread_send = RT_NULL;
rt_thread_t thread_recv = RT_NULL;
rt_err_t result = RT_EOK;
int flags = 0;
uart_over_flag = RT_FALSE;
result = uart_find();
if (result != RT_EOK)
{
return -RT_ERROR;
}
result = configureSerial(serial_fd, B115200);
if (result == -1)
{
goto __exit;
}
flags = fcntl(serial_fd, F_GETFL, 0);
if (flags == -1)
{
goto __exit;
}
result = fcntl(serial_fd, F_SETFL, flags & ~O_NONBLOCK);
if (result == -1)
{
goto __exit;
}
thread_send = rt_thread_create("uart_send", uart_send_entry, &length, 1024, RT_THREAD_PRIORITY_MAX - 4, 10);
thread_recv = rt_thread_create("uart_recv", uart_rec_entry, &length, 1024, RT_THREAD_PRIORITY_MAX - 5, 10);
if ((thread_send != RT_NULL) && (thread_recv != RT_NULL))
{
rt_thread_startup(thread_send);
rt_thread_startup(thread_recv);
}
else
{
result = -RT_ERROR;
goto __exit;
}
while (1)
{
if (uart_result != RT_TRUE)
{
LOG_E("The test for uart dma is failure.");
result = -RT_ERROR;
goto __exit;
}
if (uart_over_flag == RT_TRUE)
{
goto __exit;
}
/* waiting for test over */
rt_thread_mdelay(5);
}
__exit:
rt_thread_mdelay(5);
close(serial_fd);
uart_over_flag = RT_FALSE;
return result;
}
static void tc_uart_api(void)
{
rt_uint32_t times = 0;
rt_uint16_t num = 0;
rt_uint32_t i = 0;
while (RT_SERIAL_POSIX_TC_SEND_ITERATIONS - times)
{
num = (rand() % 1000) + 1;
if (uart_api(num) == RT_EOK)
LOG_I("data_lens [%4d], it is correct to read and write data. [%d] times testing.", num, ++times);
else
{
LOG_E("uart test error");
break;
}
}
__exit:
uassert_true(uart_result == RT_TRUE);
}
static rt_err_t utest_tc_init(void)
{
LOG_I("UART TEST: Please connect Tx and Rx directly for self testing.");
return RT_EOK;
}
static rt_err_t utest_tc_cleanup(void)
{
uart_result = RT_TRUE;
uart_over_flag = RT_FALSE;
close(serial_fd);
return RT_EOK;
}
static void testcase(void)
{
UTEST_UNIT_RUN(tc_uart_api);
}
UTEST_TC_EXPORT(testcase, "testcases.drivers.uart_posix_echo_block", utest_tc_init, utest_tc_cleanup, 30);
#endif /* TC_UART_USING_TC */
@@ -0,0 +1,182 @@
/*
* Copyright (c) 2006-2024 RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
* Change Logs:
* Date Author Notes
* 2021-06-16 KyleChan the first version
*/
#include <rtthread.h>
#include "utest.h"
#include <rtdevice.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <termios.h>
#include <fcntl.h>
#include <unistd.h>
#ifdef UTEST_SERIAL_TC
static int32_t serial_fd;
static rt_err_t uart_find(void)
{
serial_fd = open(RT_SERIAL_POSIX_TC_DEVICE_NAME, O_RDWR);
if (serial_fd == -1)
{
LOG_E("find %s device failed!\n", RT_SERIAL_TC_DEVICE_NAME);
return -RT_ERROR;
}
return RT_EOK;
}
static rt_err_t configureSerial(int fd, int baud)
{
int32_t result = 0;
struct termios options;
result = tcgetattr(fd, &options); // 获取当前端口的属性
if (result == -1)
return -RT_ERROR;
// 设置波特率
result = cfsetispeed(&options, baud); // 设置输入波特率
if (result == -1)
return -RT_ERROR;
result = cfsetospeed(&options, baud); // 设置输出波特率
if (result == -1)
return -RT_ERROR;
// 设置数据位
options.c_cflag &= ~PARENB; // 清除校验位,无校验
options.c_cflag &= ~CSTOPB; // 仅一个停止位
options.c_cflag &= ~CSIZE; // 清除掩码
options.c_cflag |= CS8; // 8位数据
// 设置无流控
options.c_cflag &= ~CRTSCTS; // 不使用硬件流控制
options.c_iflag &= ~(IXON | IXOFF | IXANY); // 不使用软件流控制
// 使能接收器和发送器
options.c_cflag |= CLOCAL | CREAD;
// 设置行终止符
options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);
// 应用属性
result = tcsetattr(fd, TCSANOW, &options);
if (result == -1)
return -RT_ERROR;
return RT_EOK;
}
static rt_err_t uart_api()
{
rt_err_t result = RT_EOK;
rt_uint8_t *uart_write_buffer;
rt_int32_t cnt, i, send_size;
int flags = 0;
result = uart_find();
if (result != RT_EOK)
{
return -RT_ERROR;
}
result = configureSerial(serial_fd, B115200);
if (result == -1)
{
goto __exit;
}
flags = fcntl(serial_fd, F_GETFL, 0);
if (flags == -1)
{
goto __exit;
}
result = fcntl(serial_fd, F_SETFL, flags | O_NONBLOCK);
if (result == -1)
{
goto __exit;
}
uart_write_buffer = (rt_uint8_t *)rt_malloc(sizeof(rt_uint8_t) * 100);
for (i = 0; i < RT_SERIAL_TC_SEND_ITERATIONS; i++)
{
send_size = 1;
cnt = write(serial_fd, uart_write_buffer, send_size);
if (cnt != send_size)
{
result = -RT_ERROR;
goto __exit;
}
rt_thread_mdelay(2);
cnt = read(serial_fd, (void *)uart_write_buffer, send_size);
if (cnt != send_size)
{
result = -RT_ERROR;
goto __exit;
}
send_size = rand() % 30 + 1;
cnt = write(serial_fd, uart_write_buffer, send_size);
if (cnt != send_size)
{
LOG_E("uart write failed %d %d", cnt, send_size);
result = -RT_ERROR;
goto __exit;
}
rt_thread_mdelay(send_size * 0.0868 + 5);
cnt = read(serial_fd, (void *)uart_write_buffer, send_size + 1);
if (cnt != send_size)
{
LOG_E("uart read failed %d %d", cnt, send_size);
result = -RT_ERROR;
goto __exit;
}
}
__exit:
rt_thread_mdelay(5);
if (uart_write_buffer)
rt_free(uart_write_buffer);
close(serial_fd);
return result == RT_EOK ? RT_TRUE : RT_FALSE;
}
static void tc_uart_api(void)
{
uassert_true(uart_api() == RT_TRUE);
}
static rt_err_t utest_tc_init(void)
{
LOG_I("UART TEST: Please connect Tx and Rx directly for self testing.");
return RT_EOK;
}
static rt_err_t utest_tc_cleanup(void)
{
close(serial_fd);
return RT_EOK;
}
static void testcase(void)
{
UTEST_UNIT_RUN(tc_uart_api);
}
UTEST_TC_EXPORT(testcase, "testcases.drivers.uart_posix_nonblock", utest_tc_init, utest_tc_cleanup, 30);
#endif /* TC_UART_USING_TC */

Some files were not shown because too many files have changed in this diff Show More