1 /*
2 * Copyright (c) 2006-2024 RT-Thread Development Team
3 *
4 * SPDX-License-Identifier: Apache-2.0
5 *
6 * Change Logs:
7 * Date Author Notes
8 *
9 */
10
11 #include <rtthread.h>
12 #include "utest.h"
13 #include <rtdevice.h>
14 #include <stdlib.h>
15
16 #ifdef UTEST_SERIAL_TC
17 #ifndef BSP_UART2_TX_USING_DMA
18
19 static struct rt_serial_device *serial;
20
uart_find(void)21 static rt_err_t uart_find(void)
22 {
23 serial = (struct rt_serial_device *)rt_device_find(RT_SERIAL_TC_DEVICE_NAME);
24
25 if (serial == RT_NULL)
26 {
27 LOG_E("find %s device failed!\n", RT_SERIAL_TC_DEVICE_NAME);
28 return -RT_ERROR;
29 }
30
31 return RT_EOK;
32 }
33
tx_timeout_test_item(rt_uint8_t * uart_write_buffer,rt_uint32_t send_size)34 static rt_err_t tx_timeout_test_item(rt_uint8_t *uart_write_buffer, rt_uint32_t send_size)
35 {
36 rt_uint32_t readSize = 0;
37 rt_int32_t tx_timeout_send_size = send_size - send_size / 3;
38 rt_int32_t tx_timeout = rt_tick_from_millisecond(0.0868 * tx_timeout_send_size + 1);
39 rt_device_control(&serial->parent, RT_SERIAL_CTRL_SET_TX_TIMEOUT, (void *)&tx_timeout);
40
41 rt_ssize_t size = rt_device_write(&serial->parent, 0, uart_write_buffer, send_size);
42 if (size < (tx_timeout_send_size - 70) || size > (send_size - 80))
43 {
44 LOG_E("size [%4d], send_size [%4d]", size, tx_timeout_send_size);
45 return -RT_ERROR;
46 }
47
48 rt_device_control(&serial->parent, RT_SERIAL_CTRL_TX_FLUSH, RT_NULL);
49 /* Waiting for rx to complete reception */
50 rt_thread_mdelay(0.0868 * (send_size / 3));
51
52 LOG_I("tx timeout send_size [%4d]", send_size);
53
54 return RT_EOK;
55 }
56
uart_api()57 static rt_bool_t uart_api()
58 {
59 rt_err_t result = RT_EOK;
60
61 result = uart_find();
62 if (result != RT_EOK)
63 {
64 return RT_FALSE;
65 }
66
67 /* Reinitialize */
68 struct serial_configure config = RT_SERIAL_CONFIG_DEFAULT;
69 config.baud_rate = BAUD_RATE_115200;
70 config.rx_bufsz = RT_SERIAL_TC_RXBUF_SIZE;
71 config.tx_bufsz = RT_SERIAL_TC_TXBUF_SIZE;
72
73 rt_device_control(&serial->parent, RT_DEVICE_CTRL_CONFIG, &config);
74
75 result = rt_device_open(&serial->parent, RT_DEVICE_FLAG_RX_NON_BLOCKING | RT_DEVICE_FLAG_TX_BLOCKING);
76 if (result != RT_EOK)
77 {
78 LOG_E("Open uart device failed.");
79 return RT_FALSE;
80 }
81
82 rt_uint8_t *uart_write_buffer;
83 rt_uint32_t i;
84 uart_write_buffer = (rt_uint8_t *)rt_malloc(2048);
85 for (i = 0; i < RT_SERIAL_TC_SEND_ITERATIONS; i++)
86 {
87 srand(rt_tick_get());
88 if (RT_EOK != tx_timeout_test_item(uart_write_buffer, 1024 + (rand() % 1024)))
89 {
90 LOG_E("test_item failed.");
91 result = -RT_ERROR;
92 goto __exit;
93 }
94 }
95
96 __exit:
97 rt_free(uart_write_buffer);
98 rt_device_close(&serial->parent);
99 rt_thread_mdelay(5);
100 return result == RT_EOK ? RT_TRUE : RT_FALSE;
101 }
102
tc_uart_api(void)103 static void tc_uart_api(void)
104 {
105 uassert_true(uart_api() == RT_TRUE);
106 }
107
utest_tc_init(void)108 static rt_err_t utest_tc_init(void)
109 {
110 LOG_I("UART TEST: Please connect Tx and Rx directly for self testing.");
111 return RT_EOK;
112 }
113
utest_tc_cleanup(void)114 static rt_err_t utest_tc_cleanup(void)
115 {
116 rt_device_t uart_dev = rt_device_find(RT_SERIAL_TC_DEVICE_NAME);
117 while (rt_device_close(uart_dev) != -RT_ERROR);
118 return RT_EOK;
119 }
120
testcase(void)121 static void testcase(void)
122 {
123 UTEST_UNIT_RUN(tc_uart_api);
124 }
125
126 UTEST_TC_EXPORT(testcase, "testcases.drivers.uart_timeout_txb", utest_tc_init, utest_tc_cleanup, 30);
127
128 #endif /* BSP_UART2_TX_USING_DMA */
129 #endif /* TC_UART_USING_TC */
130