uart_rxb_txb.c 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230
  1. /*
  2. * Copyright (c) 2006-2019, 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. #define TC_UART_DEVICE_NAME "uart2"
  15. #define TC_UART_SEND_TIMES 100
  16. #ifdef UTEST_SERIAL_TC
  17. #define TEST_UART_NAME TC_UART_DEVICE_NAME
  18. static struct rt_serial_device *serial;
  19. static rt_uint8_t uart_over_flag;
  20. static rt_bool_t uart_result = RT_TRUE;
  21. static rt_err_t uart_find(void)
  22. {
  23. serial = (struct rt_serial_device *)rt_device_find(TEST_UART_NAME);
  24. if (serial == RT_NULL)
  25. {
  26. LOG_E("find %s device failed!\n", TEST_UART_NAME);
  27. return -RT_ERROR;
  28. }
  29. return RT_EOK;
  30. }
  31. static void uart_send_entry(void *parameter)
  32. {
  33. rt_uint8_t *uart_write_buffer;
  34. rt_uint16_t send_len;
  35. rt_uint32_t i = 0;
  36. send_len = *(rt_uint16_t *)parameter;
  37. /* assign send buffer */
  38. uart_write_buffer = (rt_uint8_t *)rt_malloc(send_len);
  39. if (uart_write_buffer == RT_NULL)
  40. {
  41. LOG_E("Without spare memory for uart dma!");
  42. uart_result = RT_FALSE;
  43. return;
  44. }
  45. rt_memset(uart_write_buffer, 0, send_len);
  46. for (i = 0; i < send_len; i++)
  47. {
  48. uart_write_buffer[i] = (rt_uint8_t)i;
  49. }
  50. /* send buffer */
  51. if (rt_device_write(&serial->parent, 0, uart_write_buffer, send_len) != send_len)
  52. {
  53. LOG_E("device write failed\r\n");
  54. }
  55. rt_free(uart_write_buffer);
  56. }
  57. static void uart_rec_entry(void *parameter)
  58. {
  59. rt_uint16_t rev_len;
  60. rev_len = *(rt_uint16_t *)parameter;
  61. rt_uint8_t *ch;
  62. ch = (rt_uint8_t *)rt_calloc(1, sizeof(rt_uint8_t) * (rev_len + 1));
  63. rt_int32_t cnt, i;
  64. rt_uint8_t last_old_data;
  65. rt_bool_t fisrt_flag = RT_TRUE;
  66. rt_uint32_t all_receive_length = 0;
  67. while (1)
  68. {
  69. cnt = rt_device_read(&serial->parent, 0, (void *)ch, rev_len);
  70. if (cnt == 0)
  71. {
  72. continue;
  73. }
  74. if (fisrt_flag != RT_TRUE)
  75. {
  76. if ((rt_uint8_t)(last_old_data + 1) != ch[0])
  77. {
  78. LOG_E("_Read Different data -> former data: %x, current data: %x.", last_old_data, ch[0]);
  79. uart_result = RT_FALSE;
  80. rt_free(ch);
  81. return;
  82. }
  83. }
  84. else
  85. {
  86. fisrt_flag = RT_FALSE;
  87. }
  88. for (i = 0; i < cnt - 1; i++)
  89. {
  90. if ((rt_uint8_t)(ch[i] + 1) != ch[i + 1])
  91. {
  92. LOG_E("Read Different data -> former data: %x, current data: %x.", ch[i], ch[i + 1]);
  93. uart_result = RT_FALSE;
  94. rt_free(ch);
  95. return;
  96. }
  97. }
  98. all_receive_length += cnt;
  99. if (all_receive_length >= rev_len)
  100. break;
  101. else
  102. last_old_data = ch[cnt - 1];
  103. }
  104. rt_free(ch);
  105. uart_over_flag = RT_TRUE;
  106. }
  107. static rt_err_t uart_api(rt_uint16_t length)
  108. {
  109. rt_thread_t thread_send = RT_NULL;
  110. rt_thread_t thread_recv = RT_NULL;
  111. rt_err_t result = RT_EOK;
  112. uart_over_flag = RT_FALSE;
  113. result = uart_find();
  114. if (result != RT_EOK)
  115. {
  116. return -RT_ERROR;
  117. }
  118. /* Reinitialize */
  119. struct serial_configure config = RT_SERIAL_CONFIG_DEFAULT;
  120. config.baud_rate = BAUD_RATE_115200;
  121. config.rx_bufsz = BSP_UART2_RX_BUFSIZE;
  122. config.tx_bufsz = BSP_UART2_TX_BUFSIZE;
  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. thread_send = rt_thread_create("uart_send", uart_send_entry, &length, 1024, RT_THREAD_PRIORITY_MAX - 4, 10);
  132. thread_recv = rt_thread_create("uart_recv", uart_rec_entry, &length, 1024, RT_THREAD_PRIORITY_MAX - 5, 10);
  133. if ((thread_send != RT_NULL) && (thread_recv != RT_NULL))
  134. {
  135. rt_thread_startup(thread_send);
  136. rt_thread_startup(thread_recv);
  137. }
  138. else
  139. {
  140. result = -RT_ERROR;
  141. goto __exit;
  142. }
  143. while (1)
  144. {
  145. if (uart_result != RT_TRUE)
  146. {
  147. LOG_E("The test for uart dma is failure.");
  148. result = -RT_ERROR;
  149. goto __exit;
  150. }
  151. if (uart_over_flag == RT_TRUE)
  152. {
  153. goto __exit;
  154. }
  155. /* waiting for test over */
  156. rt_thread_mdelay(5);
  157. }
  158. __exit:
  159. rt_device_close(&serial->parent);
  160. return result;
  161. }
  162. static void tc_uart_api(void)
  163. {
  164. rt_uint32_t times = 0;
  165. rt_uint16_t num = 0;
  166. while (TC_UART_SEND_TIMES - times)
  167. {
  168. num = (rand() % 1000) + 1;
  169. if(uart_api(num) == RT_EOK)
  170. LOG_I("data_lens [%3d], it is correct to read and write data. [%d] times testing.", num, ++times);
  171. else
  172. {
  173. LOG_E("uart test error");
  174. break;
  175. }
  176. }
  177. uassert_true(uart_over_flag == RT_TRUE);
  178. }
  179. static rt_err_t utest_tc_init(void)
  180. {
  181. LOG_I("UART TEST: Please connect Tx and Rx directly for self testing.");
  182. return RT_EOK;
  183. }
  184. static rt_err_t utest_tc_cleanup(void)
  185. {
  186. uart_result = RT_TRUE;
  187. uart_over_flag = RT_FALSE;
  188. return RT_EOK;
  189. }
  190. static void testcase(void)
  191. {
  192. UTEST_UNIT_RUN(tc_uart_api);
  193. }
  194. UTEST_TC_EXPORT(testcase, "testcases.drivers.uart_rxb_txb", utest_tc_init, utest_tc_cleanup, 30);
  195. #endif /* TC_UART_USING_TC */