luat_uart_air101.c 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220
  1. #include "luat_base.h"
  2. #include "luat_malloc.h"
  3. #include "luat_msgbus.h"
  4. #include "luat_uart.h"
  5. #define LUAT_LOG_TAG "luat.uart.101"
  6. #include "luat_log.h"
  7. #include "wm_include.h"
  8. #include "wm_uart.h"
  9. #include "wm_gpio_afsel.h"
  10. #include "stdio.h"
  11. #include "wm_timer.h"
  12. //串口数量,编号从0开始
  13. #define MAX_DEVICE_COUNT TLS_UART_MAX
  14. //存放串口设备句柄
  15. static uint8_t serials_buff_len[MAX_DEVICE_COUNT] ={TLS_UART_RX_BUF_SIZE};
  16. extern struct tls_uart_port uart_port[TLS_UART_MAX];
  17. static uint8_t serials_timer[5] ={0};
  18. int luat_uart_exist(int uartid)
  19. {
  20. if (uartid < 0 || uartid >= MAX_DEVICE_COUNT)
  21. {
  22. return 0;
  23. }
  24. return 1;
  25. }
  26. static s16 uart_input_cb(u16 len, void* user_data)
  27. {
  28. int uartid = (int)user_data;
  29. //不是fifo超时回调
  30. if(uartid < 100)
  31. {
  32. //未读取长度够不够?
  33. if(CIRC_CNT(uart_port[uartid].recv.head, uart_port[uartid].recv.tail, TLS_UART_RX_BUF_SIZE)
  34. < (serials_buff_len[uartid] - 200))
  35. return 0;
  36. }
  37. else//是fifo超时回调
  38. {
  39. uartid -= 100;
  40. }
  41. rtos_msg_t msg;
  42. msg.handler = l_uart_handler;
  43. msg.ptr = NULL;
  44. msg.arg1 = uartid;
  45. msg.arg2 = CIRC_CNT(uart_port[uartid].recv.head, uart_port[uartid].recv.tail, TLS_UART_RX_BUF_SIZE);
  46. luat_msgbus_put(&msg, 1);
  47. return 0;
  48. }
  49. //串口发送完成事件回调
  50. static s16 uart_sent_cb(struct tls_uart_port *port)
  51. {
  52. //tls_uart_free_tx_sent_data(port);
  53. rtos_msg_t msg;
  54. msg.handler = l_uart_handler;
  55. msg.arg1 = port->uart_no;
  56. msg.arg2 = 0;
  57. msg.ptr = NULL;
  58. luat_msgbus_put(&msg, 1);
  59. // if (uart_port[port->uart_no].rs480.rs485_param_bit.is_485used){
  60. // luat_timer_us_delay((port->uart_cb_len)*1000-100+uart_port[port->uart_no].rs480.rs485_param_bit.wait_time);
  61. // port->uart_cb_len = 0;
  62. // luat_gpio_set(uart_port[port->uart_no].rs480.rs485_pin, uart_port[port->uart_no].rs480.rs485_param_bit.rx_level);
  63. // }
  64. return 0;
  65. }
  66. int luat_uart_wait_485_tx_done(int uartid){
  67. int cnt = 0;
  68. if (luat_uart_exist(uartid)){
  69. if (uart_port[uartid].rs480.rs485_param_bit.is_485used){
  70. if (uart_port[uartid].rs480.rs485_param_bit.wait_time)
  71. luat_timer_us_delay(uart_port[uartid].rs480.rs485_param_bit.wait_time);
  72. luat_gpio_set(uart_port[uartid].rs480.rs485_pin, uart_port[uartid].rs480.rs485_param_bit.rx_level);
  73. }
  74. }
  75. return cnt;
  76. }
  77. int luat_uart_setup(luat_uart_t *uart)
  78. {
  79. int ret;
  80. tls_uart_options_t opt = {0};
  81. if (!luat_uart_exist(uart->id))
  82. {
  83. return -1;
  84. }
  85. opt.baudrate = uart->baud_rate;
  86. opt.charlength = (uart->data_bits)-5;
  87. opt.paritytype = uart->parity;
  88. opt.flow_ctrl = TLS_UART_FLOW_CTRL_NONE;
  89. opt.stopbits = (uart->stop_bits)-1;
  90. switch (uart->id)
  91. {
  92. case TLS_UART_0:
  93. wm_uart0_rx_config(WM_IO_PB_20);
  94. wm_uart0_tx_config(WM_IO_PB_19);
  95. break;
  96. case TLS_UART_1:
  97. wm_uart1_rx_config(WM_IO_PB_07);
  98. wm_uart1_tx_config(WM_IO_PB_06);
  99. break;
  100. case TLS_UART_2:
  101. wm_uart2_rx_config(WM_IO_PB_03);
  102. wm_uart2_tx_scio_config(WM_IO_PB_02);
  103. break;
  104. case TLS_UART_3:
  105. wm_uart3_rx_config(WM_IO_PB_01);
  106. wm_uart3_tx_config(WM_IO_PB_00);
  107. break;
  108. case TLS_UART_4:
  109. wm_uart4_rx_config(WM_IO_PB_05);
  110. wm_uart4_tx_config(WM_IO_PB_04);
  111. break;
  112. #ifdef AIR103
  113. case TLS_UART_5:
  114. wm_uart5_rx_config(WM_IO_PA_13);
  115. wm_uart5_tx_config(WM_IO_PA_12);
  116. break;
  117. #endif
  118. default:
  119. break;
  120. }
  121. ret = tls_uart_port_init(uart->id, &opt, 0);
  122. if (ret != WM_SUCCESS)
  123. {
  124. return ret; //初始化失败
  125. }
  126. if(uart->bufsz > TLS_UART_RX_BUF_SIZE)
  127. uart->bufsz = TLS_UART_RX_BUF_SIZE;
  128. if(uart->bufsz < 1024)
  129. uart->bufsz = 1024;
  130. serials_buff_len[uart->id] = uart->bufsz;
  131. uart_port[uart->id].rs480.rs485_param_bit.is_485used = (uart->pin485 > WM_IO_PB_31)?0:1;
  132. uart_port[uart->id].rs480.rs485_pin = uart->pin485;
  133. uart_port[uart->id].rs480.rs485_param_bit.rx_level = uart->rx_level;
  134. uart_port[uart->id].rs480.rs485_param_bit.wait_time = uart->delay;
  135. if (uart_port[uart->id].rs480.rs485_param_bit.is_485used){
  136. struct tls_timer_cfg cfg = {0};
  137. cfg.unit = TLS_TIMER_UNIT_US;
  138. cfg.timeout = 100;
  139. cfg.is_repeat = 0;
  140. cfg.callback = luat_uart_wait_485_tx_done;
  141. cfg.arg = uart->id;
  142. uint8_t timerid = tls_timer_create(&cfg);
  143. serials_timer[uart->id] = timerid;
  144. luat_gpio_mode(uart_port[uart->id].rs480.rs485_pin, 0, 0, uart_port[uart->id].rs480.rs485_param_bit.rx_level);
  145. }
  146. return ret;
  147. }
  148. int luat_uart_write(int uartid, void *data, size_t length)
  149. {
  150. int ret = 0;
  151. //printf("uid:%d,data:%s,length = %d\r\n",uartid, (char *)data, length);
  152. if (!luat_uart_exist(uartid))return 0;
  153. if (uart_port[uartid].rs480.rs485_param_bit.is_485used){
  154. luat_hwtimer_change(serials_timer[uartid], length*1000);
  155. luat_hwtimer_start(serials_timer[uartid]);
  156. luat_gpio_set(uart_port[uartid].rs480.rs485_pin, !uart_port[uartid].rs480.rs485_param_bit.rx_level);
  157. }
  158. ret = tls_uart_write(uartid, data,length);
  159. uart_port[uartid].uart_cb_len = length;
  160. ret = (ret == 0) ? length : 0;
  161. return ret;
  162. }
  163. int luat_uart_read(int uartid, void *buffer, size_t length)
  164. {
  165. int ret = 0;
  166. if (!luat_uart_exist(uartid))
  167. {
  168. return 0;
  169. }
  170. ret = tls_uart_read(uartid,(u8 *) buffer,(u16)length);
  171. return ret;
  172. }
  173. int luat_uart_close(int uartid)
  174. {
  175. if (!luat_uart_exist(uartid))return 0;
  176. uart_port[uartid].rs480.rs485_param_bit.is_485used = 0;
  177. // tls_uart_port_init(uartid,NULL,0);
  178. return 0;
  179. }
  180. int luat_setup_cb(int uartid, int received, int sent)
  181. {
  182. if (!luat_uart_exist(uartid))
  183. {
  184. return -1;
  185. }
  186. if (received)
  187. {
  188. tls_uart_rx_callback_register(uartid,(s16(*)(u16, void*))uart_input_cb, (void*)uartid);
  189. }
  190. if (sent)
  191. {
  192. tls_uart_tx_sent_callback_register(uartid, (s16(*)(struct tls_uart_port *))uart_sent_cb);
  193. }
  194. return 0;
  195. }