uart_rxb_txb.c 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260
  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. * 2021-06-16 KyleChan the first version
  9. */
  10. #include <rtthread.h>
  11. #include "utest.h"
  12. #include <rtdevice.h>
  13. #include <stdlib.h>
  14. #ifdef UTEST_SERIAL_TC
  15. static struct rt_serial_device *serial;
  16. static rt_uint8_t uart_over_flag;
  17. static rt_bool_t uart_result = RT_TRUE;
  18. static rt_err_t uart_find(void)
  19. {
  20. serial = (struct rt_serial_device *)rt_device_find(RT_SERIAL_TC_DEVICE_NAME);
  21. if (serial == RT_NULL)
  22. {
  23. LOG_E("find %s device failed!\n", RT_SERIAL_TC_DEVICE_NAME);
  24. return -RT_ERROR;
  25. }
  26. return RT_EOK;
  27. }
  28. static void uart_send_entry(void *parameter)
  29. {
  30. rt_uint8_t *uart_write_buffer;
  31. rt_uint16_t send_len;
  32. rt_uint32_t i = 0;
  33. send_len = *(rt_uint16_t *)parameter;
  34. /* assign send buffer */
  35. uart_write_buffer = (rt_uint8_t *)rt_malloc(send_len);
  36. if (uart_write_buffer == RT_NULL)
  37. {
  38. LOG_E("Without spare memory for uart dma!");
  39. uart_result = RT_FALSE;
  40. return;
  41. }
  42. rt_memset(uart_write_buffer, 0, send_len);
  43. for (i = 0; i < send_len; i++)
  44. {
  45. uart_write_buffer[i] = (rt_uint8_t)i;
  46. }
  47. /* send buffer */
  48. if (rt_device_write(&serial->parent, 0, uart_write_buffer, send_len) != send_len)
  49. {
  50. LOG_E("device write failed\r\n");
  51. }
  52. rt_free(uart_write_buffer);
  53. }
  54. static void uart_rec_entry(void *parameter)
  55. {
  56. rt_uint16_t rev_len;
  57. rev_len = *(rt_uint16_t *)parameter;
  58. rt_uint8_t *uart_write_buffer;
  59. uart_write_buffer = (rt_uint8_t *)rt_calloc(1, sizeof(rt_uint8_t) * (rev_len + 1));
  60. rt_int32_t cnt, i;
  61. rt_uint8_t last_old_data;
  62. rt_bool_t fisrt_flag = RT_TRUE;
  63. rt_uint32_t all_receive_length = 0;
  64. while (1)
  65. {
  66. cnt = rt_device_read(&serial->parent, 0, (void *)uart_write_buffer, rev_len);
  67. if (cnt == 0)
  68. {
  69. continue;
  70. }
  71. if (fisrt_flag != RT_TRUE)
  72. {
  73. if ((rt_uint8_t)(last_old_data + 1) != uart_write_buffer[0])
  74. {
  75. LOG_E("_Read Different data -> former data: %x, current data: %x.", last_old_data, uart_write_buffer[0]);
  76. uart_result = RT_FALSE;
  77. rt_free(uart_write_buffer);
  78. return;
  79. }
  80. }
  81. else
  82. {
  83. fisrt_flag = RT_FALSE;
  84. }
  85. for (i = 0; i < cnt - 1; i++)
  86. {
  87. if ((rt_uint8_t)(uart_write_buffer[i] + 1) != uart_write_buffer[i + 1])
  88. {
  89. LOG_E("Read Different data -> former data: %x, current data: %x.", uart_write_buffer[i], uart_write_buffer[i + 1]);
  90. uart_result = RT_FALSE;
  91. rt_free(uart_write_buffer);
  92. return;
  93. }
  94. }
  95. all_receive_length += cnt;
  96. if (all_receive_length >= rev_len)
  97. break;
  98. else
  99. last_old_data = uart_write_buffer[cnt - 1];
  100. }
  101. rt_free(uart_write_buffer);
  102. uart_over_flag = RT_TRUE;
  103. }
  104. static rt_err_t uart_api(rt_uint16_t length)
  105. {
  106. rt_thread_t thread_send = RT_NULL;
  107. rt_thread_t thread_recv = RT_NULL;
  108. rt_err_t result = RT_EOK;
  109. uart_over_flag = RT_FALSE;
  110. result = uart_find();
  111. if (result != RT_EOK)
  112. {
  113. return -RT_ERROR;
  114. }
  115. /* Reinitialize */
  116. struct serial_configure config = RT_SERIAL_CONFIG_DEFAULT;
  117. config.baud_rate = BAUD_RATE_115200;
  118. config.rx_bufsz = RT_SERIAL_TC_RXBUF_SIZE;
  119. config.tx_bufsz = RT_SERIAL_TC_TXBUF_SIZE;
  120. #ifdef RT_SERIAL_USING_DMA
  121. config.dma_ping_bufsz = RT_SERIAL_TC_RXBUF_SIZE / 2;
  122. #endif
  123. rt_device_control(&serial->parent, RT_DEVICE_CTRL_CONFIG, &config);
  124. result = rt_device_open(&serial->parent, RT_DEVICE_FLAG_RX_BLOCKING | RT_DEVICE_FLAG_TX_BLOCKING);
  125. if (result != RT_EOK)
  126. {
  127. LOG_E("Open uart device failed.");
  128. uart_result = RT_FALSE;
  129. return -RT_ERROR;
  130. }
  131. rt_int32_t timeout = 5000;
  132. rt_device_control(&serial->parent, RT_SERIAL_CTRL_SET_RX_TIMEOUT, (void *)&timeout);
  133. thread_send = rt_thread_create("uart_send", uart_send_entry, &length, 1024, RT_THREAD_PRIORITY_MAX - 4, 10);
  134. thread_recv = rt_thread_create("uart_recv", uart_rec_entry, &length, 1024, RT_THREAD_PRIORITY_MAX - 5, 10);
  135. if ((thread_send != RT_NULL) && (thread_recv != RT_NULL))
  136. {
  137. rt_thread_startup(thread_send);
  138. rt_thread_startup(thread_recv);
  139. }
  140. else
  141. {
  142. result = -RT_ERROR;
  143. goto __exit;
  144. }
  145. while (1)
  146. {
  147. if (uart_result != RT_TRUE)
  148. {
  149. LOG_E("The test for uart dma is failure.");
  150. result = -RT_ERROR;
  151. goto __exit;
  152. }
  153. if (uart_over_flag == RT_TRUE)
  154. {
  155. goto __exit;
  156. }
  157. /* waiting for test over */
  158. rt_thread_mdelay(5);
  159. }
  160. __exit:
  161. rt_device_close(&serial->parent);
  162. rt_thread_mdelay(5);
  163. uart_over_flag = RT_FALSE;
  164. return result;
  165. }
  166. static void tc_uart_api(void)
  167. {
  168. rt_uint32_t count = 0;
  169. rt_uint16_t num = 0;
  170. rt_uint32_t i = 0;
  171. for (i = 1; i < 10; i++)
  172. {
  173. if (uart_api(RT_SERIAL_TC_TXBUF_SIZE * i + i % 2) == RT_EOK)
  174. LOG_I("data_lens [%4d], it is correct to read and write data. [%d] count testing.", RT_SERIAL_TC_TXBUF_SIZE * i + i % 2, ++count);
  175. else
  176. {
  177. LOG_E("uart test error");
  178. goto __exit;
  179. }
  180. }
  181. for (i = 1; i < 10; i++)
  182. {
  183. if (uart_api(RT_SERIAL_TC_RXBUF_SIZE * i + i % 2) == RT_EOK)
  184. LOG_I("data_lens [%4d], it is correct to read and write data. [%d] count testing.", RT_SERIAL_TC_RXBUF_SIZE * i + i % 2, ++count);
  185. else
  186. {
  187. LOG_E("uart test error");
  188. goto __exit;
  189. }
  190. }
  191. srand(rt_tick_get());
  192. while (RT_SERIAL_TC_SEND_ITERATIONS - count)
  193. {
  194. num = (rand() % 1000) + 1;
  195. if (uart_api(num) == RT_EOK)
  196. LOG_I("data_lens [%4d], it is correct to read and write data. [%d] count testing.", num, ++count);
  197. else
  198. {
  199. LOG_E("uart test error");
  200. break;
  201. }
  202. }
  203. __exit:
  204. uassert_true(uart_result == RT_TRUE);
  205. }
  206. static rt_err_t utest_tc_init(void)
  207. {
  208. LOG_I("UART TEST: Please connect Tx and Rx directly for self testing.");
  209. return RT_EOK;
  210. }
  211. static rt_err_t utest_tc_cleanup(void)
  212. {
  213. uart_result = RT_TRUE;
  214. uart_over_flag = RT_FALSE;
  215. rt_device_t uart_dev = rt_device_find(RT_SERIAL_TC_DEVICE_NAME);
  216. while (rt_device_close(uart_dev) != -RT_ERROR);
  217. return RT_EOK;
  218. }
  219. static void testcase(void)
  220. {
  221. UTEST_UNIT_RUN(tc_uart_api);
  222. }
  223. UTEST_TC_EXPORT(testcase, "testcases.drivers.uart_rxb_txb", utest_tc_init, utest_tc_cleanup, 30);
  224. #endif /* TC_UART_USING_TC */