luat_uart_idf5.c 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237
  1. #include "luat_base.h"
  2. #include "luat_uart.h"
  3. #include "luat_shell.h"
  4. #include "freertos/FreeRTOS.h"
  5. #include "freertos/task.h"
  6. #include "freertos/queue.h"
  7. #include "driver/uart.h"
  8. #include "luat_msgbus.h"
  9. #include "idf5_io_def.h"
  10. #include "luat_log.h"
  11. #define LUAT_LOG_TAG "uart"
  12. #if defined(LUAT_USE_SHELL) || defined(LUAT_USE_REPL)
  13. static uint8_t shell_state = 0;
  14. static char shell_buffer[1024] = {0};
  15. #endif
  16. #define LUAT_UART_QUEUE_SIZE 40
  17. typedef struct ifd_uart_port{
  18. TaskHandle_t xHandle;
  19. QueueHandle_t xQueue;
  20. uint8_t send;
  21. uint8_t recv;
  22. }ifd_uart_port_t;
  23. ifd_uart_port_t uart_port[SOC_UART_NUM] = {0};
  24. #define UART_CHECK(uartid) ((uartid<0||uartid>=SOC_UART_NUM)?-1:0)
  25. int luat_uart_exist(int uartid){
  26. return (UART_CHECK(uartid)==0);
  27. }
  28. static void uart0_irq_task(void *arg){
  29. uart_event_t event = {0};
  30. rtos_msg_t msg = {0};
  31. for (;;){
  32. if (xQueueReceive(uart_port[0].xQueue, (void *)&event, (TickType_t)portMAX_DELAY)){
  33. if (event.timeout_flag || event.size > (1024 * 2 - 200)){
  34. if (uart_port[0].recv){
  35. msg.handler = l_uart_handler;
  36. msg.ptr = NULL;
  37. msg.arg1 = 0;
  38. msg.arg2 = event.size;
  39. luat_msgbus_put(&msg, 0);
  40. }
  41. #if defined(LUAT_USE_SHELL) || defined(LUAT_USE_REPL)
  42. if (shell_state){
  43. int len = luat_uart_read(0, shell_buffer, 1024);
  44. if (len < 1)
  45. continue;
  46. shell_buffer[len] = 0x00;
  47. luat_shell_push(shell_buffer, len);
  48. }
  49. #endif
  50. xQueueReset(uart_port[0].xQueue);
  51. }
  52. }
  53. }
  54. vTaskDelete(NULL);
  55. }
  56. static void uart1_irq_task(void *arg){
  57. uart_event_t event = {0};
  58. rtos_msg_t msg = {0};
  59. for (;;){
  60. if (xQueueReceive(uart_port[1].xQueue, (void *)&event, (TickType_t)portMAX_DELAY)){
  61. if (event.timeout_flag || event.size > (1024 * 2 - 200)){
  62. if (uart_port[1].recv){
  63. msg.handler = l_uart_handler;
  64. msg.ptr = NULL;
  65. msg.arg1 = 1;
  66. msg.arg2 = event.size;
  67. luat_msgbus_put(&msg, 0);
  68. }
  69. xQueueReset(uart_port[1].xQueue);
  70. }
  71. }
  72. }
  73. vTaskDelete(NULL);
  74. }
  75. #if SOC_UART_NUM > 2
  76. static void uart2_irq_task(void *arg){
  77. uart_event_t event = {0};
  78. rtos_msg_t msg = {0};
  79. for (;;){
  80. if (xQueueReceive(uart_port[2].xQueue, (void *)&event, (TickType_t)portMAX_DELAY)){
  81. if (event.timeout_flag || event.size > (1024 * 2 - 200)){
  82. if (uart_port[2].recv){
  83. msg.handler = l_uart_handler;
  84. msg.ptr = NULL;
  85. msg.arg1 = 2;
  86. msg.arg2 = event.size;
  87. luat_msgbus_put(&msg, 0);
  88. }
  89. xQueueReset(uart_port[2].xQueue);
  90. }
  91. }
  92. }
  93. vTaskDelete(NULL);
  94. }
  95. #endif
  96. int luat_uart_setup(luat_uart_t *uart){
  97. int id = uart->id;
  98. if (UART_CHECK(id)){
  99. return -1;
  100. }
  101. uart_config_t uart_config = {0};
  102. uart_config.baud_rate = uart->baud_rate;
  103. switch (uart->data_bits){
  104. case 8:
  105. uart_config.data_bits = UART_DATA_8_BITS;
  106. break;
  107. case 7:
  108. uart_config.data_bits = UART_DATA_7_BITS;
  109. break;
  110. default:
  111. uart_config.data_bits = UART_DATA_8_BITS;
  112. break;
  113. }
  114. switch (uart->parity){
  115. case LUAT_PARITY_NONE:
  116. uart_config.parity = UART_PARITY_DISABLE;
  117. break;
  118. case LUAT_PARITY_ODD:
  119. uart_config.parity = UART_PARITY_ODD;
  120. break;
  121. case LUAT_PARITY_EVEN:
  122. uart_config.parity = UART_PARITY_EVEN;
  123. break;
  124. default:
  125. uart_config.parity = UART_PARITY_DISABLE;
  126. break;
  127. }
  128. uart_config.stop_bits = uart->stop_bits;
  129. uart_config.flow_ctrl = UART_HW_FLOWCTRL_DISABLE;
  130. uart_config.source_clk = UART_SCLK_DEFAULT;
  131. uart_set_rx_timeout(id, 3);
  132. switch (id){
  133. case 0:
  134. #if defined(LUAT_USE_SHELL) || defined(LUAT_USE_REPL)
  135. if (shell_state){
  136. shell_state = 0;
  137. luat_uart_close(0);
  138. }
  139. #endif
  140. if (uart_port[id].xHandle==NULL){
  141. uart_driver_install(0, uart->bufsz * 2, uart->bufsz * 2, LUAT_UART_QUEUE_SIZE, &(uart_port[0].xQueue), 0);
  142. uart_set_pin(0, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE);
  143. uart_pattern_queue_reset(id, LUAT_UART_QUEUE_SIZE);
  144. xTaskCreate(uart0_irq_task, "uart0_irq_task", 4096, NULL, 12, &uart_port[id].xHandle);
  145. }
  146. uart_param_config(id, &uart_config);
  147. break;
  148. case 1:
  149. if (uart_port[id].xHandle==NULL){
  150. uart_driver_install(1, uart->bufsz * 2, uart->bufsz * 2, LUAT_UART_QUEUE_SIZE, &(uart_port[1].xQueue), 0);
  151. uart_set_pin(1, UART1_TX_IO_NUM, UART1_RX_IO_NUM, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE);
  152. uart_pattern_queue_reset(id, LUAT_UART_QUEUE_SIZE);
  153. xTaskCreate(uart1_irq_task, "uart1_irq_task", 4096, NULL, 12, &uart_port[id].xHandle);
  154. }
  155. uart_param_config(id, &uart_config);
  156. break;
  157. #if SOC_UART_NUM > 2
  158. case 2:
  159. if (uart_port[id].xHandle==NULL){
  160. uart_driver_install(2, uart->bufsz * 2, uart->bufsz * 2, LUAT_UART_QUEUE_SIZE, &(uart_port[2].xQueue), 0);
  161. uart_set_pin(2, UART2_TX_IO_NUM, UART2_RX_IO_NUM, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE);
  162. uart_pattern_queue_reset(id, LUAT_UART_QUEUE_SIZE);
  163. xTaskCreate(uart2_irq_task, "uart2_irq_task", 2048, NULL, 12, &uart_port[id].xHandle);
  164. }
  165. uart_param_config(id, &uart_config);
  166. break;
  167. #endif
  168. default:
  169. return -1;
  170. break;
  171. }
  172. return 0;
  173. }
  174. int luat_uart_write(int uartid, void *data, size_t length){
  175. if (UART_CHECK(uartid)){
  176. return -1;
  177. }
  178. return uart_write_bytes(uartid, (const char *)data, length);
  179. }
  180. int luat_uart_read(int uartid, void *buffer, size_t length){
  181. if (UART_CHECK(uartid)){
  182. return -1;
  183. }
  184. return uart_read_bytes(uartid, buffer, length, 100 / portTICK_PERIOD_MS);
  185. }
  186. int luat_uart_close(int uartid){
  187. if (UART_CHECK(uartid)){
  188. return -1;
  189. }
  190. if (uart_port[uartid].xHandle){
  191. vTaskDelete(uart_port[uartid].xHandle);
  192. uart_port[uartid].xHandle = NULL;
  193. }
  194. return uart_driver_delete(uartid)? -1 : 0;
  195. }
  196. int luat_setup_cb(int uartid, int received, int sent){
  197. if (UART_CHECK(uartid)){
  198. return -1;
  199. }
  200. if (received){
  201. uart_port[uartid].recv = 1;
  202. }
  203. return 0;
  204. }
  205. #if defined(LUAT_USE_SHELL) || defined(LUAT_USE_REPL)
  206. void luat_shell_poweron(int _drv) {
  207. shell_state = 1;
  208. uart_driver_install(0, 2048, 2048, LUAT_UART_QUEUE_SIZE, &(uart_port[0].xQueue), 0);
  209. uart_set_pin(0, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE);
  210. uart_set_baudrate(0, 921600);
  211. // uart_param_config(0, &uart_config);
  212. uart_pattern_queue_reset(0, LUAT_UART_QUEUE_SIZE);
  213. xTaskCreate(uart0_irq_task, "uart0_irq_task", 4096, NULL, 12, &uart_port[0].xHandle);
  214. }
  215. #endif