• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2022 Winner Microelectronics Co., Ltd. All rights reserved.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include "wm_debug.h"
17 #include "wm_regs.h"
18 #include "wm_params.h"
19 #include "wm_fwup.h"
20 #include "wm_uart_task.h"
21 #if (GCC_COMPILE==1)
22 #include "wm_cmdp_hostif_gcc.h"
23 #else
24 #endif
25 #include "wm_irq.h"
26 #include "utils.h"
27 #include "wm_config.h"
28 #include "wm_socket.h"
29 #include "wm_mem.h"
30 #include "wm_wl_task.h"
31 #include "wm_io.h"
32 
33 #define ONE 1
34 #define TWO 2
35 #define THREE 3
36 #define FOUR 4
37 #define FIVE 5
38 #define EIGHT 8
39 #define TEN 10
40 #define TWELVE 12
41 #define SIXTEEN 16
42 #define FIFTY 50
43 #define ONE_HUNDRED 100
44 #define FIVE_HUNDRED_AND_TWELVE 512
45 #define ONE_THOUSAND 1000
46 #define ONE_MILLION 1000000
47 
48 #if (TLS_CONFIG_HOSTIF && TLS_CONFIG_UART)
49 
50 extern struct tls_uart_port uart_port[TWO];
51 struct tls_uart uart_st[TWO];
52 #if TLS_CONFIG_SOCKET_RAW || TLS_CONFIG_SOCKET_STD
53 static u32 uart1_delaytime = 0;
54 #endif
55 
56 #define UART_NET_SEND_DATA_SIZE      256  // 512
57 
58 struct uart_tx_msg {
59     struct tls_uart *uart;
60     struct tls_hostif_tx_msg *tx_msg;
61 };
62 
63 extern void tls_uart_set_fc_status(int uart_no,
64     TLS_UART_FLOW_CTRL_MODE_T status);
65 extern void tls_uart_free_tx_sent_data(struct tls_uart_port *port);
66 extern void tls_uart_tx_callback_register(u16 uart_no,
67     s16(*tx_callback) (struct tls_uart_port *port));
68 
69 void uart_rx_timeout_handler(void *arg);
70 void uart_rx(struct tls_uart *uart);
71 void uart_tx(struct uart_tx_msg *tx_data);
uart_tx_event_finish_callback(void * arg)72 static void uart_tx_event_finish_callback(void *arg)
73 {
74     if (arg)
75         tls_mem_free(arg);
76 }
77 
78 #if TLS_CONFIG_SOCKET_RAW || TLS_CONFIG_SOCKET_STD
uart_tx_socket_finish_callback(void * arg)79 static void uart_tx_socket_finish_callback(void *arg)
80 {
81     if (arg) {
82         struct pbuf *p = (struct pbuf *) arg;
83         pbuf_free(p);
84     }
85 }
86 #endif
87 
88 extern struct task_parameter wl_task_param_hostif;
uart_send_tx_msg(u8 hostif_mode,struct tls_hostif_tx_msg * tx_msg,bool is_event)89 static void uart_send_tx_msg(u8 hostif_mode, struct tls_hostif_tx_msg *tx_msg,
90     bool is_event)
91 {
92     struct uart_tx_msg *tx_data = NULL;
93     if (tx_msg == NULL)
94         return;
95     switch (hostif_mode) {
96         case HOSTIF_MODE_UART0:
97             if (uart_st[0].uart_port == NULL) {
98                 free_tx_msg_buffer(tx_msg);
99                 tls_mem_free(tx_msg);
100                 return;
101             }
102             tx_data = tls_mem_alloc(sizeof(struct uart_tx_msg));
103             if (tx_data == NULL) {
104                 free_tx_msg_buffer(tx_msg);
105                 tls_mem_free(tx_msg);
106                 return;
107             }
108             tx_data->tx_msg = tx_msg;
109             tx_data->uart = &uart_st[0];
110             if (tls_wl_task_callback(&wl_task_param_hostif, (start_routine) uart_tx, tx_data, 0)) {
111                 TLS_DBGPRT_INFO("send tx msg error.\n");
112                 free_tx_msg_buffer(tx_msg);
113                 tls_mem_free(tx_msg);
114                 tls_mem_free(tx_data);
115                 return;
116             }
117             break;
118         case HOSTIF_MODE_UART1_LS:
119         case HOSTIF_MODE_UART1_HS:
120             if (uart_st[1].uart_port == NULL) {
121                 free_tx_msg_buffer(tx_msg);
122                 tls_mem_free(tx_msg);
123                 return;
124             }
125             if (is_event && (hostif_mode != HOSTIF_MODE_UART1_HS || uart_st[1].cmd_mode != UART_RICMD_MODE)) {
126                 free_tx_msg_buffer(tx_msg);
127                 tls_mem_free(tx_msg);
128                 return;
129             }
130             tx_data = tls_mem_alloc(sizeof(struct uart_tx_msg));
131             if (tx_data == NULL) {
132                 free_tx_msg_buffer(tx_msg);
133                 tls_mem_free(tx_msg);
134                 return;
135             }
136             tx_data->tx_msg = tx_msg;
137             tx_data->uart = &uart_st[1];
138             if (tls_wl_task_callback(&wl_task_param_hostif, (start_routine) uart_tx, tx_data, 0)) {
139                 TLS_DBGPRT_INFO("send tx msg error.\n");
140                 free_tx_msg_buffer(tx_msg);
141                 tls_mem_free(tx_msg);
142                 tls_mem_free(tx_data);
143                 return;
144             }
145             break;
146         default:
147             break;
148     }
149 }
150 
uart_get_uart1_port(struct tls_uart_port ** uart1_port)151 static void uart_get_uart1_port(struct tls_uart_port **uart1_port)
152 {
153     *uart1_port = uart_st[1].uart_port;
154 }
155 
uart_set_uart1_mode(u32 cmd_mode)156 static void uart_set_uart1_mode(u32 cmd_mode)
157 {
158     uart_st[1].cmd_mode = cmd_mode;
159     if (UART_TRANS_MODE == cmd_mode) {
160         tls_uart_set_fc_status(uart_st[1].uart_port->uart_no,
161                                TLS_UART_FLOW_CTRL_HARDWARE);
162     } else {
163         tls_uart_set_fc_status(uart_st[1].uart_port->uart_no,
164                                TLS_UART_FLOW_CTRL_NONE);
165     }
166 }
167 
uart_set_uart0_mode(u32 cmd_mode)168 static void uart_set_uart0_mode(u32 cmd_mode)
169 {
170     uart_st[0].cmd_mode = cmd_mode;
171     if (UART_TRANS_MODE == cmd_mode) {
172         tls_uart_set_fc_status(uart_st[0].uart_port->uart_no,
173                                TLS_UART_FLOW_CTRL_HARDWARE);
174     } else {
175         tls_uart_set_fc_status(uart_st[0].uart_port->uart_no,
176                                TLS_UART_FLOW_CTRL_NONE);
177     }
178 }
179 
uart_set_uart1_sock_param(u16 sksnd_cnt,bool rx_idle)180 static void uart_set_uart1_sock_param(u16 sksnd_cnt, bool rx_idle)
181 {
182     uart_st[1].sksnd_cnt = sksnd_cnt;
183 }
184 
uart_tx_sent_callback(struct tls_uart_port * port)185 s16 uart_tx_sent_callback(struct tls_uart_port *port)
186 {
187     return tls_wl_task_callback_static(&wl_task_param_hostif,
188                                        (start_routine)
189                                        tls_uart_free_tx_sent_data, port, 0,
190                                        TLS_MSG_ID_UART_SENT_FREE);
191 }
192 
tls_uart_init(void)193 void tls_uart_init(void)
194 {
195     struct tls_uart_options uart_opts;
196     struct tls_uart *uart;
197     struct tls_hostif *hif = tls_get_hostif();
198     struct tls_param_uart uart_cfg;
199 
200     memset(uart_st, 0, TWO * sizeof(struct tls_uart));
201 
202     /* init socket config */
203     tls_cmd_init_socket_cfg();
204     tls_cmd_register_set_uart0_mode(uart_set_uart0_mode);
205 
206     /* setting uart0 */
207     if (WM_SUCCESS != tls_uart_port_init(TLS_UART_0, NULL, 0))
208         return;
209     tls_uart_tx_callback_register(TLS_UART_0, uart_tx_sent_callback);
210     uart = tls_uart_open(TLS_UART_0, TLS_UART_MODE_INT);
211     if (uart == NULL)
212         return;
213 
214     uart->cmd_mode = UART_ATCMD_MODE;
215     hif->uart_send_tx_msg_callback = uart_send_tx_msg;
216     tls_param_get(TLS_PARAM_ID_UART, (void *) &uart_cfg, 0);
217 #if TLS_CONFIG_SOCKET_RAW || TLS_CONFIG_SOCKET_STD
218     if (uart_cfg.baudrate) {
219         uart1_delaytime =
220             (UART_NET_SEND_DATA_SIZE * (TEN * ONE_MILLION / uart_cfg.baudrate) /
221              ONE_THOUSAND + FIVE);
222     } else {
223         uart1_delaytime = ONE_HUNDRED;
224     }
225 #endif
226     tls_cmd_register_get_uart1_port(uart_get_uart1_port);
227     tls_cmd_register_set_uart1_mode(uart_set_uart1_mode);
228     tls_cmd_register_set_uart1_sock_param(uart_set_uart1_sock_param);
229     if (hif->hostif_mode == HOSTIF_MODE_UART1_HS) {
230         /* 根据flash读取的参数配置串口寄存器 */
231         uart_opts.baudrate = uart_cfg.baudrate;
232         uart_opts.charlength = TLS_UART_CHSIZE_8BIT;
233         uart_opts.flow_ctrl = (enum TLS_UART_FLOW_CTRL_MODE) uart_cfg.flow;
234         uart_opts.paritytype = (enum TLS_UART_PMODE) uart_cfg.parity;
235         uart_opts.stopbits = (enum TLS_UART_STOPBITS) uart_cfg.stop_bits;
236 
237         if (WM_SUCCESS != tls_uart_port_init(TLS_UART_1, &uart_opts, 0))
238             return;
239         tls_uart_tx_callback_register(TLS_UART_1, uart_tx_sent_callback);
240         uart = tls_uart_open(TLS_UART_1, TLS_UART_MODE_INT);
241         if (uart == NULL)
242             return;
243 
244         uart->cmd_mode = UART_RICMD_MODE;
245     } else if (hif->hostif_mode == HOSTIF_MODE_UART1_LS) {
246         uart_opts.baudrate = uart_cfg.baudrate;
247         if (uart_cfg.charsize == 0) {
248             uart_opts.charlength = TLS_UART_CHSIZE_8BIT;
249         } else {
250             uart_opts.charlength = (TLS_UART_CHSIZE_T) uart_cfg.charsize;
251         }
252         uart_opts.flow_ctrl = (enum TLS_UART_FLOW_CTRL_MODE) uart_cfg.flow;
253         uart_opts.paritytype = (enum TLS_UART_PMODE) uart_cfg.parity;
254         uart_opts.stopbits = (enum TLS_UART_STOPBITS) uart_cfg.stop_bits;
255         if (WM_SUCCESS != tls_uart_port_init(TLS_UART_1, &uart_opts, 0))
256             return;
257         tls_uart_tx_callback_register(TLS_UART_1, uart_tx_sent_callback);
258         uart = tls_uart_open(TLS_UART_1, TLS_UART_MODE_INT);
259         if (uart == NULL)
260             return;
261 #if TLS_CONFIG_SOCKET_RAW || TLS_CONFIG_SOCKET_STD
262         if (tls_cmd_get_auto_mode()) {
263             uart->cmd_mode = UART_TRANS_MODE;
264             tls_uart_set_fc_status(uart->uart_port->uart_no,
265                                    TLS_UART_FLOW_CTRL_HARDWARE);
266         } else
267 #endif /* TLS_CONFIG_SOCKET_RAW */
268         {
269             uart->cmd_mode = UART_ATCMD_MODE;   // 指令模式关闭流控
270             tls_uart_set_fc_status(uart->uart_port->uart_no,
271                                    TLS_UART_FLOW_CTRL_NONE);
272         }
273     } else {
274         ;
275     }
276 
277 #if TLS_CONFIG_SOCKET_RAW || TLS_CONFIG_SOCKET_STD
278     tls_hostif_set_net_status_callback();
279 #endif
280 }
281 
tls_uart0_task_rx_cb(u16 len,void * p)282 static s16 tls_uart0_task_rx_cb(u16 len, void *p)
283 {
284     struct tls_uart *uart = &uart_st[0];
285 
286     if ((UART_TRANS_MODE == uart->cmd_mode)
287         && (uart->uart_port->plus_char_cnt == THREE)) {
288         uart->cmd_mode = UART_ATCMD_MODE;
289         tls_uart_set_fc_status(uart->uart_port->uart_no,
290                                TLS_UART_FLOW_CTRL_NONE);
291     }
292 
293     if (tls_wl_task_callback_static(&wl_task_param_hostif,
294                                     (start_routine) uart_rx,
295                                     uart,
296                                     0,
297                                     TLS_MSG_ID_UART0_RX)) {
298         return WM_FAILED;
299     }
300     return WM_SUCCESS;
301 }
302 
tls_uart1_task_rx_cb(u16 len,void * p)303 s16 tls_uart1_task_rx_cb(u16 len, void *p)
304 {
305     struct tls_uart *uart = &uart_st[1];
306 
307     if ((UART_TRANS_MODE == uart->cmd_mode)
308         && (uart->uart_port->plus_char_cnt == THREE)) {
309         uart->cmd_mode = UART_ATCMD_MODE;
310         tls_uart_set_fc_status(uart->uart_port->uart_no,
311                                TLS_UART_FLOW_CTRL_NONE);
312     }
313 
314     if (tls_wl_task_callback_static(&wl_task_param_hostif, (start_routine) uart_rx,
315                                     uart, 0, TLS_MSG_ID_UART1_RX)) {
316         return WM_FAILED;
317     }
318     return WM_SUCCESS;
319 }
320 
tls_uart_open(u32 uart_no,TLS_UART_MODE_T uart_mode)321 struct tls_uart *tls_uart_open(u32 uart_no, TLS_UART_MODE_T uart_mode)
322 {
323     struct tls_uart *uart;
324     if (uart_no == TLS_UART_0) {
325         uart = &uart_st[0];
326         memset(uart, 0, sizeof(struct tls_uart));
327         uart->uart_port = &uart_port[0];
328         tls_uart_rx_callback_register(uart_no, tls_uart0_task_rx_cb, NULL);
329     } else if (uart_no == TLS_UART_1) {
330         uart = &uart_st[1];
331         memset(uart, 0, sizeof(struct tls_uart));
332         uart->uart_port = &uart_port[1];
333         tls_uart_rx_callback_register(uart_no, tls_uart1_task_rx_cb, NULL);
334     } else
335         return NULL;
336 
337     uart->uart_port->uart_mode = uart_mode;
338     return uart;
339 }
340 
tls_uart_close(struct tls_uart * uart)341 int tls_uart_close(struct tls_uart *uart)
342 {
343     return WM_FAILED;
344 }
345 
find_atcmd_eol(u8 * src,u32 len)346 static u8 *find_atcmd_eol(u8 * src, u32 len)
347 {
348     u8 *p = NULL;
349     u8 *q = NULL;
350     p = memchr(src, '\r', len);
351     q = memchr(src, '\n', len);
352     if (p && q) {
353         if ((p - q) > 1) {
354             return q;
355         }
356         if ((q - p) > 1) {
357             return p;
358         }
359         if ((p - q) == 1) {
360             return p;
361         }
362         if ((q - p) == 1) {
363             return q;
364         }
365         return NULL;
366     }
367     if (p) {
368         return p;
369     }
370     if (q) {
371         return q;
372     }
373     return NULL;
374 }
375 
modify_atcmd_tail(struct tls_uart_circ_buf * recv,u8 ** p)376 static void modify_atcmd_tail(struct tls_uart_circ_buf *recv, u8 ** p)
377 {
378     u32 cmd_len;
379 
380     if (*p >= &recv->buf[recv->tail]) {
381         cmd_len = *p - &recv->buf[recv->tail];
382     } else {
383         cmd_len = *p + TLS_UART_RX_BUF_SIZE  - &recv->buf[recv->tail];
384     }
385 
386     if (cmd_len > FIVE_HUNDRED_AND_TWELVE) {
387         recv->tail = recv->head;
388         *p = NULL;
389         TLS_DBGPRT_INFO("EOF char find > 512 \r\n");
390     } else {
391         recv->tail = (recv->tail + cmd_len) & (TLS_UART_RX_BUF_SIZE - 1);
392     }
393 }
394 
parse_atcmd_eol(struct tls_uart * uart)395 static u8 *parse_atcmd_eol(struct tls_uart *uart)
396 {
397     struct tls_uart_circ_buf *recv = &uart->uart_port->recv;
398     u8 *p = NULL;
399 
400     /* jump to end of line */
401     if (recv->head > recv->tail) {
402         p = find_atcmd_eol((u8 *)&recv->buf[recv->tail], (u32)(recv->head - recv->tail));
403         if (p) {
404             modify_atcmd_tail(recv, &p);
405         }
406     } else {
407         p = find_atcmd_eol((u8 *)&recv->buf[recv->tail],
408                            TLS_UART_RX_BUF_SIZE - recv->tail);
409         if (!p) {
410             p = find_atcmd_eol((u8 *)&recv->buf[0], recv->head);
411             if (p) {
412                 modify_atcmd_tail(recv, &p);
413             }
414         } else {
415             modify_atcmd_tail(recv, &p);
416         }
417     }
418 
419     /* jump over EOF char */
420     if ((recv->buf[recv->tail] == '\r') || (recv->buf[recv->tail] == '\n')) {
421         recv->tail = (recv->tail + 1) & (TLS_UART_RX_BUF_SIZE - 1);
422     }
423     return p;
424 }
425 
parse_atcmd_line(struct tls_uart * uart)426 static void parse_atcmd_line(struct tls_uart *uart)
427 {
428     struct tls_uart_circ_buf *recv = &uart->uart_port->recv;
429     u8 *ptr_eol;
430     u32 cmd_len, tail_len = 0;
431     u8 *atcmd_start = NULL;
432     char *buf;
433     u8 hostif_uart_type;
434 
435     while ((CIRC_CNT(recv->head, recv->tail, TLS_UART_RX_BUF_SIZE) >= FOUR)
436            && (atcmd_start == NULL)) {  /* check "at+" char */
437         if (((recv->buf[recv->tail] == 'A') || (recv->buf[recv->tail] == 'a'))
438             &&
439             ((recv->buf[(recv->tail + 1) & (TLS_UART_RX_BUF_SIZE - 1)] == 'T')
440              || (recv->buf[(recv->tail + 1) & (TLS_UART_RX_BUF_SIZE - 1)] ==
441                  't'))
442             && (recv->buf[(recv->tail + TWO) & (TLS_UART_RX_BUF_SIZE - 1)] ==
443                 '+')) {
444             atcmd_start = (u8 *)&recv->buf[recv->tail];
445             recv->tail = (recv->tail + THREE) & (TLS_UART_RX_BUF_SIZE - 1);
446             ptr_eol = parse_atcmd_eol(uart);
447             if (!ptr_eol) {  /* no terminator, may receive only half a command */
448                 if (CIRC_CNT(recv->head, recv->tail, TLS_UART_RX_BUF_SIZE) > FIVE_HUNDRED_AND_TWELVE) {
449                     recv->tail = recv->head;
450                 } else {
451                     recv->tail = (recv->tail - THREE) & (TLS_UART_RX_BUF_SIZE - 1);
452                 }
453                 break;
454             }
455 
456             if (ptr_eol >= atcmd_start) {         /* Getting the command length */
457                 cmd_len = ptr_eol - atcmd_start;
458             } else {
459                 tail_len = (u32) (&recv->buf[TLS_UART_RX_BUF_SIZE - 1] - atcmd_start + 1);
460                 cmd_len = tail_len + (ptr_eol - &recv->buf[0]);
461             }
462 
463             buf = tls_mem_alloc(cmd_len + TWO);
464             if (!buf) {
465                 return;
466             }
467 
468             if (ptr_eol >= atcmd_start) {
469                 MEMCPY(buf, atcmd_start, cmd_len);
470             } else {
471                 MEMCPY(buf, atcmd_start, tail_len);
472                 MEMCPY(buf + tail_len, (void *)&recv->buf[0], ptr_eol - (u8 *)&recv->buf[0]);
473             }
474 
475             if (buf[cmd_len - TWO] == '\r' || buf[cmd_len - TWO] == '\n') {
476                 buf[cmd_len - TWO] = '\n';
477                 buf[cmd_len - 1] = '\0';
478                 cmd_len = cmd_len - 1;
479             } else if (buf[cmd_len - 1] == '\r' || buf[cmd_len - 1] == '\n') {
480                 buf[cmd_len - 1] = '\n';
481                 buf[cmd_len] = '\0';
482                 cmd_len = cmd_len;
483             } else {
484                 buf[cmd_len] = '\n';
485                 buf[cmd_len + 1] = '\0';
486                 cmd_len = cmd_len + 1;
487             }
488 
489             if (uart->uart_port->uart_no == TLS_UART_0) {
490                 hostif_uart_type = HOSTIF_UART0_AT_CMD;
491             } else {
492                 hostif_uart_type = HOSTIF_UART1_AT_CMD;
493             }
494             tls_hostif_cmd_handler(hostif_uart_type, buf, cmd_len);
495             tls_mem_free(buf);
496             atcmd_start = NULL;
497             if (CIRC_CNT(recv->head, recv->tail, TLS_UART_RX_BUF_SIZE) > 0) {
498                 if (uart->uart_port->uart_no == TLS_UART_0) {
499                     tls_uart0_task_rx_cb(CIRC_CNT(recv->head, recv->tail, TLS_UART_RX_BUF_SIZE),
500                                          NULL);
501                 } else {
502                     tls_uart1_task_rx_cb(CIRC_CNT(recv->head, recv->tail, TLS_UART_RX_BUF_SIZE),
503                                          NULL);
504                 }
505                 break;
506             }
507         } else {
508             recv->tail = (recv->tail + 1)%TLS_UART_RX_BUF_SIZE;
509         }
510     }
511 }
512 
cache_tcp_recv(struct tls_hostif_tx_msg * tx_msg)513 static int cache_tcp_recv(struct tls_hostif_tx_msg *tx_msg)
514 {
515     struct tls_uart_circ_buf *precvmit =
516         tls_hostif_get_recvmit(tx_msg->u.msg_tcp.sock);
517     struct pbuf *p;
518     u16 buflen;
519     u16 copylen;
520     u32 tail = 0;
521     bool overflow = 0;
522 
523     p = (struct pbuf *) tx_msg->u.msg_tcp.p;
524     if (p->tot_len >= TLS_SOCKET_RECV_BUF_SIZE) {
525         tx_msg->offset = p->tot_len - TLS_SOCKET_RECV_BUF_SIZE + 1;
526     }
527     TLS_DBGPRT_INFO("p->tot_len=%d\n", p->tot_len);
528     TLS_DBGPRT_INFO("precvmit->head=%d, precvmit->tail=%d\n", precvmit->head,
529                     precvmit->tail);
530     buflen = p->tot_len - tx_msg->offset;
531     tail = precvmit->tail;
532     while (1) {
533         copylen = CIRC_SPACE_TO_END_FULL(precvmit->head,
534                                          tail, TLS_SOCKET_RECV_BUF_SIZE);
535         if (copylen == 0) {
536             tail = 0;
537             overflow = 1;
538             continue;
539         }
540         if (buflen < copylen)
541             copylen = buflen;
542         pbuf_copy_partial(p,
543                           (u8 *)precvmit->buf + precvmit->head,
544                           copylen, tx_msg->offset);
545         precvmit->head =
546             (precvmit->head + copylen) & (TLS_SOCKET_RECV_BUF_SIZE - 1);
547         TLS_DBGPRT_INFO("precvmit->head=%d, precvmit->tail=%d\n",
548                         precvmit->head, precvmit->tail);
549         tx_msg->offset += copylen;
550         buflen -= copylen;
551         if (tx_msg->offset >= p->tot_len)
552             break;
553     };
554     if (overflow)
555         precvmit->tail = precvmit->head + 1;
556 
557      /* Check whether the pbuf data is copied to the uart cache */
558     if (tx_msg->offset >= p->tot_len) {
559         pbuf_free(p);
560     }
561 
562     return copylen;
563 }
564 
565  /*
566  * 处理流程说明:
567  * 首先判断上次的同步帧是否已经处理完成,如果已经处理结束,
568  *          则检查缓存head指向的字节,判断是否是0xAA(SYN_FLAG),
569  *          如果是,则检查缓存的长度是否大于等于8,如果不是
570  *          则返回,如果是,则提取字节标记和长度信息,校验信息,
571  *          计算校验和,检查校验值是否匹配,
572  */
ricmd_handle_sync(struct tls_uart * uart,struct tls_uart_circ_buf * recv)573 static int ricmd_handle_sync(struct tls_uart *uart, struct tls_uart_circ_buf *recv)
574 {
575     return 0;
576 }
577 
data_loop(struct tls_uart * uart,int numbytes,struct tls_uart_circ_buf * recv)578 static int data_loop(struct tls_uart *uart,
579                      int numbytes, struct tls_uart_circ_buf *recv)
580 {
581     return 0;
582 }
583 
584 #define MAX_RICMD_LENGTH      200
585 u8 ricmd_buffer[MAX_RICMD_LENGTH + EIGHT];
586 
cmd_loop(struct tls_uart * uart,int numbytes,struct tls_uart_circ_buf * recv)587 static int cmd_loop(struct tls_uart *uart,
588                     int numbytes, struct tls_uart_circ_buf *recv)
589 {
590     unsigned cbytes = uart->ricmd_info.cbytes;
591     unsigned procbytes = 0;
592     unsigned char c;
593 
594     while (procbytes < numbytes) {
595         c = recv->head;
596         procbytes++;
597 
598         /* append to line buffer if possible */
599         if (cbytes < MAX_RICMD_LENGTH)
600             ricmd_buffer[EIGHT + cbytes] = c;
601         uart->ricmd_info.cbytes++;
602 
603         if (uart->ricmd_info.cbytes == uart->ricmd_info.length) {
604             tls_hostif_cmd_handler(HOSTIF_UART1_RI_CMD,
605                                    (char *) ricmd_buffer,
606                                    uart->ricmd_info.length + EIGHT);
607             uart->ricmd_info.cbytes = 0;
608             uart->inputstate = 0;
609             break;
610         }
611     }
612     return procbytes;
613 }
614 
parse_ricmd_line(struct tls_uart * uart)615 void parse_ricmd_line(struct tls_uart *uart)
616 {
617     struct tls_uart_circ_buf *recv = &uart->uart_port->recv;
618     int skip_count;
619     int numbytes;
620     int procbytes;
621 
622     while (!uart_circ_empty(recv)) {
623         /* check for frame header */
624         skip_count = ricmd_handle_sync(uart, recv);
625         if ((skip_count == 0) && !(uart->inputstate & INS_SYNC_CHAR))
626             break;
627 
628         if (uart->inputstate & INS_SYNC_CHAR) {
629             /* process a contiguous block of bytes */
630             numbytes = CIRC_CNT(recv->head, recv->tail, TLS_UART_RX_BUF_SIZE);
631 
632             if (uart->inputstate & INS_RICMD)
633                 procbytes = cmd_loop(uart, numbytes, recv);
634             else if (uart->inputstate & INS_DATA)
635                 procbytes = data_loop(uart, numbytes, recv);
636             else
637                 procbytes = numbytes;
638         } else {
639             /* 没有需要处理的数据(第一个字符不是SYNC_FLAG),而且以前的包已经处理完成 */
640             procbytes = skip_count;
641         }
642         recv->head = (recv->head + procbytes) & (TLS_UART_RX_BUF_SIZE - 1);
643     }
644 
645     return;
646 }
647 
648 #define UART_UPFW_DATA_SIZE sizeof(struct tls_fwup_block)
649 
uart_fwup_rsp(u8 portno,int status)650 static int uart_fwup_rsp(u8 portno, int status)
651 {
652     char *cmd_rsp = NULL;
653     u32 len;
654     u8 hostif_type;
655 
656     cmd_rsp = tls_mem_alloc(SIXTEEN);
657     if (cmd_rsp == NULL) {
658         return -1;
659     }
660     if (status) {
661         len = sprintf(cmd_rsp, "+OK=%d\r\n\r\n", status);
662     } else {
663         len = sprintf(cmd_rsp, "+ERR=%d\r\n\r\n", status);
664     }
665 
666     if (TLS_UART_0 == portno) {
667         hostif_type = HOSTIF_MODE_UART0;
668     } else {
669         hostif_type = HOSTIF_MODE_UART1_LS;
670     }
671 
672     if (tls_hostif_process_cmdrsp(hostif_type, cmd_rsp, len)) {
673         tls_mem_free(cmd_rsp);
674     }
675     return 0;
676 }
677 
uart_fwup_send(struct tls_uart * uart)678 void uart_fwup_send(struct tls_uart *uart)
679 {
680     struct tls_uart_circ_buf *recv = &uart->uart_port->recv;
681     u32 data_cnt = CIRC_CNT(recv->head, recv->tail, TLS_UART_RX_BUF_SIZE);
682     struct tls_fwup_block *pfwup = NULL;
683     u8 *p;
684     u32 i, session_id, status;
685 
686     if (data_cnt >= UART_UPFW_DATA_SIZE) {
687         uart->cmd_mode = UART_ATCMD_MODE;
688         pfwup = (struct tls_fwup_block *) tls_mem_alloc(UART_UPFW_DATA_SIZE);
689         if (!pfwup) {
690             recv->tail = (recv->tail + UART_UPFW_DATA_SIZE) & (TLS_UART_RX_BUF_SIZE - 1);
691             return;
692         }
693         p = (u8 *) pfwup;
694         for (i = 0; i < UART_UPFW_DATA_SIZE; i++) {
695             *p++ = recv->buf[recv->tail++];
696             recv->tail &= TLS_UART_RX_BUF_SIZE - 1;
697         }
698         session_id = tls_fwup_get_current_session_id();
699         if (session_id) {
700             if (get_crc32((u8 *) pfwup, UART_UPFW_DATA_SIZE - TWELVE) == pfwup->crc32) {
701                 if (tls_fwup_set_update_numer(pfwup->number) == TLS_FWUP_STATUS_OK) {
702                     struct tls_fwup_block *blk;
703                     u8 *buffer;
704                     blk = (struct tls_fwup_block *)pfwup;
705                     buffer = blk->data;
706                     status = 1;
707                     uart_fwup_rsp(uart->uart_port->uart_no, status);
708                     tls_fwup_request_sync(session_id, buffer, TLS_FWUP_BLK_SIZE);
709                 } else {
710                     TLS_DBGPRT_INFO("tls_fwup_set_update_numer err!!!\r\n");
711                     status = 0;
712                     uart_fwup_rsp(uart->uart_port->uart_no, status);
713                 }
714             } else {
715                 TLS_DBGPRT_INFO("err crc32 !!!\r\n");
716                 status = 0;
717                 uart_fwup_rsp(uart->uart_port->uart_no, status);
718             }
719         }
720         tls_mem_free(pfwup);
721     }
722 }
723 
724 #if TLS_CONFIG_SOCKET_RAW || TLS_CONFIG_SOCKET_STD
uart_rx_timeout_handler(void * arg)725 void uart_rx_timeout_handler(void * arg)
726 {
727     int data_cnt;
728     struct tls_uart *uart = (struct tls_uart *)arg;
729     struct tls_uart_circ_buf *recv = &uart->uart_port->recv;
730 
731     if (uart->cmd_mode == UART_TRANS_MODE) {
732         data_cnt = CIRC_CNT(recv->head, recv->tail, TLS_UART_RX_BUF_SIZE);
733         if (data_cnt) {
734             uart_net_send(uart, recv->head, recv->tail, data_cnt);
735         }
736     }
737 }
738 #endif
739 
uart_rx(struct tls_uart * uart)740 void uart_rx(struct tls_uart *uart)
741 {
742 #if TLS_CONFIG_SOCKET_RAW || TLS_CONFIG_SOCKET_STD
743     struct tls_uart_circ_buf *recv = &uart->uart_port->recv;
744     int data_cnt;
745     u8 send_data = 0;
746 #endif
747     int err = 0;
748     u8 len = 0;
749     char *cmd_rsp = NULL;
750 
751     if (uart->cmd_mode == UART_ATCMD_MODE) {
752         if (uart->uart_port->plus_char_cnt == THREE) {
753             cmd_rsp = tls_mem_alloc(strlen("+OK!!\r\n\r\n") + 1);
754             if (!cmd_rsp) {
755                 return;
756             }
757             len = sprintf(cmd_rsp, "+OK!!\r\n\r\n");
758             uart->uart_port->plus_char_cnt = 0;
759             err = tls_hostif_process_cmdrsp(HOSTIF_MODE_UART1_LS, cmd_rsp, len);
760             if (err) {
761                 tls_mem_free(cmd_rsp);
762             }
763         }
764         parse_atcmd_line(uart);
765     } else if (uart->cmd_mode == UART_ATDATA_MODE) {
766         uart_fwup_send(uart);
767     } else if (uart->cmd_mode == UART_RICMD_MODE) {
768         parse_ricmd_line(uart);
769     } else {
770     }
771 }
772 
uart_tx(struct uart_tx_msg * tx_data)773 void uart_tx(struct uart_tx_msg *tx_data)
774 {
775     struct tls_uart *uart = tx_data->uart;
776     struct tls_hostif *hif = tls_get_hostif();
777     struct tls_hostif_tx_msg *tx_msg = tx_data->tx_msg;
778     u32 cpu_sr;
779     tls_uart_tx_msg_t *uart_tx_msg;
780     struct pbuf *p;
781 
782     switch (tx_msg->type) {
783         case HOSTIF_TX_MSG_TYPE_EVENT:
784         case HOSTIF_TX_MSG_TYPE_CMDRSP:
785             tls_uart_fill_buf(uart->uart_port, tx_msg->u.msg_event.buf,
786                               tx_msg->u.msg_event.buflen);
787             uart_tx_event_finish_callback(tx_msg->u.msg_event.buf);
788             tls_uart_tx_chars_start(uart->uart_port);
789             break;
790 #if TLS_CONFIG_SOCKET_RAW || TLS_CONFIG_SOCKET_STD
791         /* Tcp and Udp both use the below case. */
792         case HOSTIF_TX_MSG_TYPE_UDP:
793         case HOSTIF_TX_MSG_TYPE_TCP:
794             if (uart->cmd_mode == UART_TRANS_MODE || hif->rptmode) {
795                 p = (struct pbuf *) tx_msg->u.msg_tcp.p;
796                 uart_tx_msg = tls_mem_alloc(sizeof(tls_uart_tx_msg_t));
797                 if (uart_tx_msg == NULL) {
798                     uart_tx_socket_finish_callback(p);
799                     goto out;
800                 }
801                 dl_list_init(&uart_tx_msg->list);
802                 uart_tx_msg->buf = p->payload;
803                 uart_tx_msg->buflen = p->tot_len;
804                 uart_tx_msg->offset = 0;
805                 uart_tx_msg->finish_callback = uart_tx_socket_finish_callback;
806                 uart_tx_msg->callback_arg = p;
807 
808                 cpu_sr = tls_os_set_critical();
809                 dl_list_add_tail(&uart->uart_port->tx_msg_pending_list,
810                                  &uart_tx_msg->list);
811                 tls_os_release_critical(cpu_sr);
812                 tls_uart_tx_chars_start(uart->uart_port);
813             } else {
814                 cache_tcp_recv(tx_msg);
815             }
816             break;
817 #endif
818         default:
819             break;
820     }
821   out:
822     if (tx_msg)
823         tls_mem_free(tx_msg);
824     if (tx_data)
825         tls_mem_free(tx_data);
826 }
827 #endif /* CONFIG_UART */
828