• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2020 HiSilicon (Shanghai) Technologies CO., LIMITED.
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 "at_general.h"
17 
18 #include <stdio.h>
19 #include <string.h>
20 #include <stdlib.h>
21 
22 #include <at_cmd.h>
23 #include <cpup_diag_dfx.h>
24 #include <hi_at.h>
25 #include <hi_cpu.h>
26 #include <hi_crash.h>
27 #include <hi_flash.h>
28 #include <hi_mem.h>
29 #include <hi_mux.h>
30 #include <hi_nv.h>
31 #include <hi_os_stat.h>
32 #include <hi_reset.h>
33 #include <hi_sal_nv.h>
34 #include <hi_stdlib.h>
35 #include <hi_task.h>
36 #include <hi_time.h>
37 #include <hi_tsensor.h>
38 #include <hi_uart.h>
39 #include <hi_watchdog.h>
40 #include <hi_upg_api.h>
41 #include <hi_ver.h>
42 #include <hi_wifi_api.h>
43 
44 #ifndef CONFIG_FACTORY_TEST_MODE
45 #include "lwip/netifapi.h"
46 #include "lwip/api_shell.h"
47 #include "lwip/sockets.h"
48 #ifdef CONFIG_IPERF_SUPPORT
49 #include "iperf.h"
50 #endif
51 #endif
52 #ifdef CONFIG_SIGMA_SUPPORT
53 #include "hi_wifitest.h"
54 #endif
55 #include "hi_config.h"
56 #include "sal_common.h"
57 
58 #include "at.h"
59 
60 #ifdef __cplusplus
61 #if __cplusplus
62 extern "C" {
63 #endif
64 #endif
65 
66 #define HI_AT_VER_FULL_PRODUCT_NAME_MAX_SIZE 100
67 
68 
69 #ifdef CONFIG_IPERF_SUPPORT
70 HI_EXTERN hi_u32 cmd_iperf(hi_s32 argc, const hi_char **argv);
71 #endif
72 
73 #define IP_LINK_ID_MAX            8
74 #define IP_TCP_SERVER_LISTEN_NUM  4           /* TCP Maximum number of clients that can be received by the server */
75 #define IP_RESV_BUF_LEN           1024        /* IP packet receiving buffer */
76 #define IP_SEND_BUF_LEN           1024        /* IP packet sending buffer, which must be the same as the value of
77                                                  AT_DATA_MAX_LEN. */
78 #define IP_MUX_WAIT_TIME          HI_SYS_WAIT_FOREVER
79 #define PRINT_SIZE_MAX            128
80 #define IP_UDP_LINK_MAX           4           /* Maximum number of manually created UDP links */
81 
82 typedef struct {
83     hi_s32 sfd;
84     hi_u8 link_stats;
85     hi_u8 link_res;
86     hi_u8 ip_protocol;
87     hi_u8 res;
88 } ip_conn_ctl_stru;
89 
90 typedef struct {
91     hi_s32 sfd;
92     hi_u8 link_stats;
93     hi_u8 res[3]; /* 3 bytes reserved */
94 } ip_listen_socket_stru;
95 
96 typedef enum {
97     IP_NULL = 0,
98     IP_TCP  = 1,
99     IP_UDP  = 2,
100 
101     IP_PROTOCAL_BUTT
102 } ip_protocol;
103 typedef hi_u8 ip_protocol_uint8;
104 
105 typedef enum {
106     IP_LINK_RES_INIT = 0, /* Initial Value */
107     IP_LINK_MANUAL  = 1,  /* Creating a Link manually */
108     IP_LINK_AUTO  = 2,    /* Creating Links automatically */
109 
110     IP_LINK_RES_BUTT
111 } ip_link_res;
112 typedef hi_u8 ip_link_res_uint8;
113 
114 typedef enum {
115     IP_LINK_ID_IDLE = 0,      /* Idle state */
116     IP_LINK_WAIT_RESV,
117     IP_LINK_WAIT_CLOSE,
118     IP_LINK_USER_CLOSE,
119     IP_LINK_SERVER_LISTEN,    /* SERVER Listening state */
120 
121     IP_LINK_STAUS_BUTT
122 } ip_link_stats;
123 typedef hi_u8 ip_link_stats_uint8;
124 
125 #ifndef CONFIG_FACTORY_TEST_MODE
126 static ip_conn_ctl_stru g_ip_link_ctl[IP_LINK_ID_MAX];
127 static hi_s8 g_ip_task_exit;
128 static ip_listen_socket_stru g_listen_fd;
129 static hi_s32 g_ip_taskid = -1;
130 static hi_s8 g_link_id = -1;
131 static in_addr_t g_peer_ipaddr;
132 static hi_u16 g_peer_port;
133 static hi_u32 g_ip_mux_id;
134 #endif
135 
136 extern int DumpFaultLog(void);
DumpFaultLog(void)137 WEAK int DumpFaultLog(void)
138 {
139     return -1;
140 }
141 
at_exe_at_cmd(void)142 hi_u32 at_exe_at_cmd(void)
143 {
144     AT_RESPONSE_OK;
145     return HI_ERR_SUCCESS;
146 }
147 
at_task_show(void)148 hi_u32 at_task_show(void)
149 {
150 #ifndef CONFIG_FACTORY_TEST_MODE
151     TSK_INFO_S* ptask_info = HI_NULL;
152 
153     hi_u32 i;
154 
155     ptask_info = (TSK_INFO_S*)hi_malloc(HI_MOD_ID_SAL_DFX, sizeof(TSK_INFO_S));
156     if (ptask_info == HI_NULL) {
157         return HI_ERR_MALLOC_FAILUE;
158     }
159 
160     hi_at_printf("task_info:\r\n");
161     for (i = 0; i < g_taskMaxNum; i++) {
162         memset_s(ptask_info, sizeof(TSK_INFO_S), 0, sizeof(TSK_INFO_S));
163         hi_u32 ret = LOS_TaskInfoGet(i, ptask_info);
164         if (ret == HI_ERR_SUCCESS) {
165             hi_at_printf("%s,id=%d,status=%hd,pri=%hd,size=0x%x,cur_size=0x%x,peak_size=0x%x\r\n",
166                          ptask_info->acName, ptask_info->uwTaskID, ptask_info->usTaskStatus, ptask_info->usTaskPrio,
167                          ptask_info->uwStackSize, ptask_info->uwCurrUsed, ptask_info->uwPeakUsed);
168         }
169     }
170 
171     hi_free(HI_MOD_ID_SAL_DFX, ptask_info);
172 #endif
173     return HI_ERR_SUCCESS;
174 }
175 
176 #ifndef CONFIG_FACTORY_TEST_MODE
at_query_sysinfo_cmd(hi_void)177 hi_u32 at_query_sysinfo_cmd(hi_void)
178 {
179     hi_os_resource_use_stat os_resource_stat = {0};
180     hi_mdm_mem_info mem_inf = {0};
181 
182     (hi_void)hi_os_get_resource_status(&os_resource_stat);
183     (hi_void)hi_mem_get_sys_info(&mem_inf);
184 
185     hi_at_printf("+SYSINFO:\r\n");
186     hi_at_printf("mem:\r\n");
187     hi_at_printf("total=%d,", (mem_inf.total + mem_inf.total_lmp));
188     hi_at_printf("used=%d,", (mem_inf.used + mem_inf.used_lmp));
189     hi_at_printf("free=%d,", (mem_inf.free + mem_inf.free_lmp));
190     hi_at_printf("peek_size=%d\r\n", mem_inf.peek_size);
191     hi_at_printf("os_resource:\r\n");
192     hi_at_printf("timer_usage=%d,", os_resource_stat.timer_usage);
193     hi_at_printf("task_usage=%d,", os_resource_stat.task_usage);
194     hi_at_printf("sem_usage=%d,", os_resource_stat.sem_usage);
195     hi_at_printf("queue_usage=%d,", os_resource_stat.queue_usage);
196     hi_at_printf("mux_usage=%d,", os_resource_stat.mux_usage);
197     hi_at_printf("event_usage=%d\r\n", os_resource_stat.event_usage);
198 
199     hi_u32 ret = at_task_show();
200     if (ret != HI_ERR_SUCCESS) {
201         return ret;
202     }
203     hi_at_printf("cpup:\r\n");
204     cmd_get_cpup(0, HI_NULL);
205     sal_show_run_time();
206 
207     AT_RESPONSE_OK;
208 
209     return HI_ERR_SUCCESS;
210 }
211 #endif
212 
at_query_ver_cmd(hi_void)213 hi_u32 at_query_ver_cmd(hi_void)
214 {
215     hi_char soft_ver[HI_AT_VER_FULL_PRODUCT_NAME_MAX_SIZE];
216     if (sprintf_s(soft_ver, HI_AT_VER_FULL_PRODUCT_NAME_MAX_SIZE, "+CSV:%s\r\n",
217         hi_get_sdk_version()) == -1) {
218         return HI_ERR_FAILURE;
219     }
220 
221     hi_at_printf("%s", soft_ver);
222     AT_RESPONSE_OK;
223 
224     return HI_ERR_SUCCESS;
225 }
226 
factory_check_common_head(const hi_upg_common_head * head,hi_u32 bin_len)227 hi_u32 factory_check_common_head(const hi_upg_common_head *head, hi_u32 bin_len)
228 {
229     if (head->image_id != HI_UPG_FILE_IMAGE_ID) {
230         return HI_ERR_UPG_IMAGE_ID;
231     }
232 
233     if (head->file_type != HI_UPG_FILE_KERNEL) {
234         return HI_ERR_UPG_FILE_TYPE;
235     }
236 
237     if (head->file_len > bin_len) {
238         return HI_ERR_UPG_FILE_LEN_OVER;
239     }
240 
241     if ((head->file_len != (head->section_offset + head->section_len)) ||
242         (head->section_offset != (sizeof(hi_upg_common_head) + sizeof(hi_upg_key) + sizeof(hi_upg_sign))) ||
243         (head->section_len < (sizeof(hi_upg_section_head) + sizeof(upg_rsa_sign)))) {
244         return HI_ERR_UPG_FILE_LEN;
245     }
246 
247     return HI_ERR_SUCCESS;
248 }
249 
factory_check_file(hi_u32 flash_addr,hi_u32 bin_len)250 hi_u32 factory_check_file(hi_u32 flash_addr, hi_u32 bin_len)
251 {
252     hi_u32 ret;
253     hi_upg_head *upg_head = (hi_upg_head *)hi_malloc(HI_MOD_ID_SAL_DFX, sizeof(hi_upg_head));
254     if (upg_head == HI_NULL) {
255         return HI_ERR_FAILURE;
256     }
257 
258     ret = hi_flash_read(flash_addr, sizeof(hi_upg_head), (hi_u8 *)upg_head);
259     if (ret != HI_ERR_SUCCESS) {
260         hi_free(HI_MOD_ID_SAL_DFX, upg_head);
261         return HI_ERR_FAILURE;
262     }
263 
264     hi_upg_common_head *common_head = &(upg_head->common);
265     ret = factory_check_common_head(common_head, bin_len);
266 
267     hi_free(HI_MOD_ID_SAL_DFX, upg_head);
268 
269     return ret;
270 }
271 
at_factory_mode_switch(hi_s32 argc,const hi_char * argv[])272 static hi_u32 at_factory_mode_switch(hi_s32 argc, const hi_char *argv[])
273 {
274     if ((argc != 1) || (argv[0] == HI_NULL)) {
275         return HI_ERR_FAILURE;
276     }
277 
278     if (integer_check(argv[0]) != HI_ERR_SUCCESS) {
279         return HI_ERR_FAILURE;
280     }
281 
282     /* switch_mode:0 normal_mode;  switch_mode:1 factory_test_mode */
283     hi_u32 switch_mode = strtoul((const hi_char*)argv[0], NULL, 10); /* 10: convert to integer */
284     if (switch_mode != 0x0 && switch_mode != 0x1) {
285         return HI_ERR_FAILURE;
286     }
287 
288     hi_nv_ftm_factory_mode factory_mode_cfg = {0};
289     hi_u32 ret = hi_factory_nv_read(HI_NV_FTM_FACTORY_MODE, &factory_mode_cfg, sizeof(hi_nv_ftm_factory_mode), 0);
290     if (ret != HI_ERR_SUCCESS) {
291         return ret;
292     }
293 
294     if (switch_mode == 0x0) { /* switch to normal mode */
295         if (factory_mode_cfg.factory_mode != 0x0) {
296             factory_mode_cfg.factory_mode = 0x0;
297             ret = hi_factory_nv_write(HI_NV_FTM_FACTORY_MODE, &factory_mode_cfg, sizeof(factory_mode_cfg), 0);
298             if (ret != HI_ERR_SUCCESS) {
299                 return ret;
300             }
301 
302             /* refresh bachup nv after factory test finish. */
303             ret = hi_nv_refresh_backup();
304             if (ret != HI_ERR_SUCCESS) {
305                 hi_at_printf("refresh backup nv fail.\r\n");
306                 return ret;
307             }
308         }
309     } else { /* switch to factory mode */
310         if (factory_mode_cfg.factory_valid == 0x0 ||
311             factory_check_file(factory_mode_cfg.factory_addr_start, factory_mode_cfg.factory_size) != HI_ERR_SUCCESS) {
312             hi_at_printf("invalid factory_bin\r\n");
313             return HI_ERR_FAILURE;
314         }
315 
316         if (factory_mode_cfg.factory_mode == 0x0) {
317             factory_mode_cfg.factory_mode = 0x1;
318             ret = hi_factory_nv_write(HI_NV_FTM_FACTORY_MODE, &factory_mode_cfg, sizeof(factory_mode_cfg), 0);
319             if (ret != HI_ERR_SUCCESS) {
320                 return ret;
321             }
322         }
323     }
324 
325     AT_RESPONSE_OK;
326 
327     return HI_ERR_SUCCESS;
328 }
329 
at_factory_mode_query(hi_void)330 static hi_u32 at_factory_mode_query(hi_void)
331 {
332 #ifndef CONFIG_FACTORY_TEST_MODE
333     hi_at_printf("non_factory mode\r\n");
334 #else
335     hi_at_printf("factory mode\r\n");
336 #endif
337 
338     AT_RESPONSE_OK;
339 
340     return HI_ERR_SUCCESS;
341 }
342 
343 #ifndef CONFIG_FACTORY_TEST_MODE
at_factory_erase(hi_void)344 static hi_u32 at_factory_erase(hi_void)
345 {
346     hi_nv_ftm_factory_mode factory_mode_cfg = {0};
347     hi_u32 ret = hi_factory_nv_read(HI_NV_FTM_FACTORY_MODE, &factory_mode_cfg, sizeof(hi_nv_ftm_factory_mode), 0);
348     if (ret != HI_ERR_SUCCESS) {
349         return ret;
350     }
351 
352     hi_at_printf("erase addr:0x%x, size:0x%x.\r\n", factory_mode_cfg.factory_addr_start, factory_mode_cfg.factory_size);
353     ret = hi_flash_erase(factory_mode_cfg.factory_addr_start, factory_mode_cfg.factory_size);
354     if (ret != HI_ERR_SUCCESS) {
355         return ret;
356     }
357 
358     /* set normal mode after erase factory. inorder to let start success after reboot. */
359     if (factory_mode_cfg.factory_mode != 0) {
360         factory_mode_cfg.factory_mode = 0x0;
361         ret = hi_factory_nv_write(HI_NV_FTM_FACTORY_MODE, &factory_mode_cfg, sizeof(factory_mode_cfg), 0);
362         if (ret != HI_ERR_SUCCESS) {
363             return ret;
364         }
365     }
366 
367     AT_RESPONSE_OK;
368 
369     return HI_ERR_SUCCESS;
370 }
371 #endif
372 
at_exe_reset_cmd(hi_void)373 hi_void at_exe_reset_cmd(hi_void)
374 {
375     AT_RESPONSE_OK;
376     hi_watchdog_disable();
377     /* Wait for 3000 μs until the AT_RESPONSE_OK print is complete.CNcomment:延时3000us, 待AT_RESPONSE_OK打印结束 */
378     hi_udelay(3000);
379     hi_soft_reboot(HI_SYS_REBOOT_CAUSE_CMD);
380 }
381 
at_setup_reset_cmd(hi_s32 argc,const hi_char * argv[])382 hi_u32 at_setup_reset_cmd(hi_s32 argc, const hi_char *argv[])
383 {
384     hi_u32 delay;
385     if ((argc != 1) || (argv[0] == HI_NULL)) {
386         return HI_ERR_FAILURE;
387     }
388 
389     if (integer_check(argv[0]) != HI_ERR_SUCCESS) {
390         return HI_ERR_FAILURE;
391     }
392 
393     hi_watchdog_disable();
394     delay = strtoul((const hi_char*)argv[0], NULL, 10); /* 10:Decimal */
395     hi_at_printf("+RST:%u\r\n", delay);
396     hi_udelay(delay);
397 
398     AT_RESPONSE_OK;
399     hi_udelay(3000); /* Wait for 3000 μs until the AT_RESPONSE_OK message is displayed. */
400     hi_soft_reboot(HI_SYS_REBOOT_CAUSE_CMD);
401 
402     return HI_ERR_SUCCESS;
403 }
404 
at_exe_help_cmd(void)405 hi_u32 at_exe_help_cmd(void)
406 {
407     at_cmd_func_list *cmd_list = at_get_list();
408     hi_u32 i;
409     hi_u32 cnt = 0;
410 
411     hi_at_printf("+HELP:\r\n");
412     for (i = 0; i < AT_CMD_LIST_NUM; i++) {
413         hi_u16 j;
414 
415         for (j = 0; j < cmd_list->at_cmd_num[i]; j++) {
416             at_cmd_func *cmd_func = (at_cmd_func *) ((cmd_list->at_cmd_list[i] + j));
417 
418             hi_at_printf("AT%-16s ", cmd_func->at_cmd_name);
419             cnt++;
420             if (cnt % 4 == 0) {  /* 每4个换行 */
421                 hi_at_printf("\r\n");
422             }
423         }
424     }
425 
426     AT_ENTER;
427     AT_RESPONSE_OK;
428     return HI_ERR_SUCCESS;
429 }
430 
431 /*****************************************************************************
432  Description: Sets the MAC address.
433 *****************************************************************************/
cmd_set_macaddr(hi_s32 argc,const hi_char * argv[])434 hi_u32 cmd_set_macaddr(hi_s32 argc, const hi_char* argv[])
435 {
436     hi_uchar mac_addr[6]; /* 6 mac len */
437 
438     if (argc != 1) {
439         return HI_ERR_FAILURE;
440     }
441     if (at_param_null_check(argc, argv) == HI_ERR_FAILURE) {
442         return HI_ERR_FAILURE;
443     }
444 
445     if (strlen(argv[0]) != 17) { /* 17 mac string len */
446         return HI_ERR_FAILURE;
447     }
448 
449     hi_u32 ret = cmd_strtoaddr(argv[0], mac_addr, 6); /* 6 mac len */
450     if (ret != HI_ERR_SUCCESS) {
451         return HI_ERR_FAILURE;
452     }
453 
454     if (hi_wifi_set_macaddr((hi_char*)mac_addr, 6) != 0) { /* 6 mac len */
455         return HI_ERR_FAILURE;
456     }
457     hi_at_printf("OK\r\n");
458     return HI_ERR_SUCCESS;
459 }
460 
461 /*****************************************************************************
462  Description: Gets the MAC address.
463 *****************************************************************************/
cmd_get_macaddr(hi_s32 argc,const hi_char * argv[])464 hi_u32 cmd_get_macaddr(hi_s32 argc, const hi_char* argv[])
465 {
466     hi_uchar mac_addr[6] = {0}; /* 6 mac len */
467     hi_unref_param(argc);
468     hi_unref_param(argv);
469 
470     if (hi_wifi_get_macaddr((hi_char*)mac_addr, 6) != HI_ERR_SUCCESS) { /* 6 mac len */
471         return HI_ERR_FAILURE;
472     }
473     hi_at_printf("+MAC:" AT_MACSTR "\r\n", at_mac2str(mac_addr));
474     hi_at_printf("OK\r\n");
475 
476     return HI_ERR_SUCCESS;
477 }
478 
479 #ifndef CONFIG_FACTORY_TEST_MODE
480 #ifdef CONFIG_IPERF_SUPPORT
at_iperf(hi_s32 argc,const hi_char ** argv)481 hi_u32 at_iperf(hi_s32 argc, const hi_char **argv)
482 {
483     if (at_param_null_check(argc, argv) == HI_ERR_FAILURE) {
484         return HI_ERR_FAILURE;
485     }
486     if (cmd_iperf(argc, argv) == 0) {
487         return HI_ERR_SUCCESS;
488     }
489 
490     return HI_ERR_FAILURE;
491 }
492 #endif
493 
at_ping(hi_s32 argc,const hi_char ** argv)494 hi_u32 at_ping(hi_s32 argc, const hi_char **argv)
495 {
496     if (at_param_null_check(argc, argv) == HI_ERR_FAILURE) {
497             return HI_ERR_FAILURE;
498     }
499     if (os_shell_ping(argc, argv) == LOS_OK) {
500         return HI_ERR_SUCCESS;
501     }
502 
503     return HI_ERR_FAILURE;
504 }
505 
at_ping6(hi_s32 argc,const hi_char ** argv)506 hi_u32 at_ping6(hi_s32 argc, const hi_char **argv)
507 {
508     if (at_param_null_check(argc, argv) == HI_ERR_FAILURE) {
509         return HI_ERR_FAILURE;
510     }
511     if (os_shell_ping6(argc, argv) == LOS_OK) {
512         return HI_ERR_SUCCESS;
513     }
514 
515     return HI_ERR_FAILURE;
516 }
517 
at_dns(hi_s32 argc,const hi_char ** argv)518 hi_u32 at_dns(hi_s32 argc, const hi_char **argv)
519 {
520     if (at_param_null_check(argc, argv) == HI_ERR_FAILURE) {
521             return HI_ERR_FAILURE;
522     }
523     if (os_shell_dns(argc, argv) == LOS_OK) {
524         return HI_ERR_SUCCESS;
525     }
526 
527     return HI_ERR_FAILURE;
528 }
529 
at_show_dns(hi_s32 argc,hi_char ** argv)530 hi_u32 at_show_dns(hi_s32 argc, hi_char **argv)
531 {
532     hi_unref_param(argc);
533     hi_unref_param(argv);
534     if (os_shell_show_dns() == LOS_OK) {
535         return HI_ERR_SUCCESS;
536     }
537 
538     return HI_ERR_FAILURE;
539 }
540 
at_netstat(hi_s32 argc,hi_char ** argv)541 hi_u32 at_netstat(hi_s32 argc, hi_char **argv)
542 {
543     if (os_shell_netstat(argc, argv) == LOS_OK) {
544         return HI_ERR_SUCCESS;
545     }
546 
547     return HI_ERR_FAILURE;
548 }
549 
at_setup_dhcp(hi_s32 argc,const hi_char ** argv)550 hi_u32 at_setup_dhcp(hi_s32 argc, const hi_char **argv)
551 {
552     hi_s32 ret = 0;
553 
554     if (at_param_null_check(argc, argv) == HI_ERR_FAILURE) {
555         return HI_ERR_FAILURE;
556     }
557 
558     if (argc != 2) { /* at+dhcp cmd length equl 2 */
559         return HI_ERR_FAILURE;
560     }
561 #ifndef CONFIG_FACTORY_TEST_MODE
562     struct netif *netif_p = netifapi_netif_find(argv[0]);
563     if (netif_p == NULL) {
564         return HI_ERR_FAILURE;
565     }
566 
567     if (strcmp(argv[1], "1") == 0) {
568         ret = netifapi_dhcp_start(netif_p);
569     } else if (strcmp(argv[1], "0") == 0) {
570         ret = netifapi_dhcp_stop(netif_p);
571     } else if (strcmp(argv[1], "2") == 0) {
572         ret = netifapi_netif_common(netif_p, dhcp_clients_info_show, NULL);
573     } else {
574         return HI_ERR_FAILURE;
575     }
576 #endif
577     if (ret == LOS_OK) {
578         hi_at_printf("OK\r\n");
579     }
580 
581     return ret;
582 }
583 
at_setup_dhcps(hi_s32 argc,const hi_char ** argv)584 hi_u32 at_setup_dhcps(hi_s32 argc, const hi_char **argv)
585 {
586     hi_s32 ret = 0;
587 
588     if (at_param_null_check(argc, argv) == HI_ERR_FAILURE) {
589         return HI_ERR_FAILURE;
590     }
591 
592     if (argc != 2) { /* at+dhcps cmd length equl 2 */
593         return HI_ERR_FAILURE;
594     }
595 #ifndef CONFIG_FACTORY_TEST_MODE
596     struct netif *netif_p = netifapi_netif_find(argv[0]);
597     if (netif_p == NULL) {
598         return HI_ERR_FAILURE;
599     }
600     if (ip_addr_isany_val(netif_p->ip_addr)) {
601         hi_at_printf("Please set ip address for dhcp server\r\n");
602         return HI_ERR_FAILURE;
603     }
604     if (strcmp(argv[1], "1") == 0) {
605         ret = netifapi_dhcps_start(netif_p, NULL, 0);
606     } else if (strcmp(argv[1], "0") == 0) {
607         ret = netifapi_dhcps_stop(netif_p);
608     } else {
609         return HI_ERR_FAILURE;
610     }
611 #endif
612     if (ret == LOS_OK) {
613         hi_at_printf("OK\r\n");
614     }
615 
616     return ret;
617 }
618 
at_get_dump(hi_s32 argc,const hi_char ** argv)619 hi_u32 at_get_dump(hi_s32 argc, const hi_char **argv)
620 {
621     hi_unref_param(argc);
622     hi_unref_param(argv);
623     hi_u32 ret;
624 
625     hi_u16 err_id = 0;
626     hi_u32 rid = 0;
627     ret = hi_syserr_get_reboot_reason(&err_id, &rid);
628     if (ret == HI_ERR_SUCCESS) {
629         hi_at_printf("latest reboot reason:\r\n");
630         hi_at_printf("eid:%d, rid:%d:\r\n", err_id, rid);
631     }
632     hi_at_printf("\r\nlatest crash info:\r\n");
633 
634     if (DumpFaultLog() == 0) {
635         hi_at_printf("OK\r\n");
636         return ret;
637     }
638 
639     hi_syserr_info* info = hi_malloc(HI_MOD_ID_SAL_DFX, sizeof(hi_syserr_info));
640     if (info == HI_NULL) {
641         return HI_ERR_MALLOC_FAILUE;
642     }
643 
644     ret = hi_syserr_get_at_printf(info);
645     if (ret == HI_ERR_SYSERROR_NOT_FOUND) {
646         hi_at_printf("No crash dump found!\r\n");
647         hi_at_printf("OK\r\n");
648         ret = HI_ERR_SUCCESS;
649     } else if (ret == HI_ERR_SUCCESS) {
650         hi_at_printf("OK\r\n");
651         ret = HI_ERR_SUCCESS;
652     }
653     hi_free(HI_MOD_ID_SAL_DFX, info);
654 
655     return ret;
656 }
657 #endif
658 
lwip_ifconfig_check(hi_s32 argc,const hi_char ** argv)659 hi_u32 lwip_ifconfig_check(hi_s32 argc, const hi_char **argv)
660 {
661     if ((argc == 0) || (argc == 1)) {
662         return HI_ERR_SUCCESS;
663     } else if (argc == 2) { /* 2 Parameters */
664         if ((strcmp("up", argv[1]) == 0) || (strcmp("down", argv[1]) == 0)) {
665             return HI_ERR_SUCCESS;
666         } else {
667             return HI_ERR_FAILURE;
668         }
669     } else if (argc == 6) { /* 6 Parameter */
670         if ((strcmp("netmask", argv[2]) == 0) && (strcmp("gateway", argv[4]) == 0) && /* 2/4:Members of parameters */
671             (strcmp("inet", argv[1]) != 0) && (strcmp("inet6", argv[1]) != 0)) {
672             return HI_ERR_SUCCESS;
673         } else {
674             return HI_ERR_FAILURE;
675         }
676     } else {
677         return HI_ERR_FAILURE;
678     }
679 }
680 
at_lwip_ifconfig(hi_s32 argc,const hi_char ** argv)681 hi_u32 at_lwip_ifconfig(hi_s32 argc, const hi_char **argv)
682 {
683     if (at_param_null_check(argc, argv) == HI_ERR_FAILURE) {
684         return HI_ERR_FAILURE;
685     }
686 
687     hi_u32 ret = lwip_ifconfig_check(argc, argv);
688     if (ret != HI_ERR_SUCCESS) {
689         return HI_ERR_FAILURE;
690     }
691 #ifndef CONFIG_FACTORY_TEST_MODE
692     if (argc == 2) { /* 2:Number of parameters */
693         struct netif *netif = netifapi_netif_find(argv[0]);
694         if (netif == HI_NULL) {
695             return HI_ERR_FAILURE;
696         }
697         ip4_addr_t loop_ipaddr, loop_netmask, loop_gw;
698         if (strcmp(argv[1], "down") == 0) {
699             (void)netifapi_netif_set_link_down(netif);
700             (void)netifapi_netif_set_down(netif);
701             (void)netif_l2_netdev_status_callback(netif);
702             (void)netifapi_netif_set_addr(netif, HI_NULL, HI_NULL, HI_NULL);
703             for (hi_u8 index = 0; index < LWIP_IPV6_NUM_ADDRESSES; index++) {
704                 (void)netifapi_netif_rmv_ip6_address(netif, &netif->ip6_addr[index]);
705             }
706         } else if (strcmp(argv[1], "up") == 0) {
707             (void)netifapi_netif_set_up(netif);
708             (void)netif_l2_netdev_status_callback(netif);
709             if ((strcmp(argv[0], DEFAULT_IFNAME_AP) == 0) || (strcmp(argv[0], DEFAULT_IFNAME_MESH) == 0)) {
710                 (void)netifapi_netif_set_link_up(netif);
711                 (hi_void)netifapi_netif_add_ip6_linklocal_address(netif, HI_TRUE);
712             } else if (strcmp(argv[0], DEFAULT_IFNAME_LOCALHOST) == 0) {
713                 (void)netifapi_netif_set_link_up(netif);
714                 IP4_ADDR(&loop_gw, 127, 0, 0, 1);       /* gateway 127.0.0.1 */
715                 IP4_ADDR(&loop_ipaddr, 127, 0, 0, 1);   /* ipaddr 127.0.0.1 */
716                 IP4_ADDR(&loop_netmask, 255, 0, 0, 0);  /* netmask 255.0.0.0 */
717                 (void)netifapi_netif_set_addr(netif, &loop_ipaddr, &loop_netmask, &loop_gw);
718                 (void)netifapi_netif_set_up(netif);
719             }
720         }
721     } else {
722         ret = lwip_ifconfig(argc, argv);
723         if (ret == 0) {
724             return HI_ERR_SUCCESS;
725         } else if (ret == 3) { /* 3:up down execution succeeded. */
726             hi_at_printf("OK\r\n");
727             return HI_ERR_SUCCESS;
728         }
729         return HI_ERR_FAILURE;
730     }
731 #endif
732     hi_at_printf("OK\r\n");
733     return HI_ERR_SUCCESS;
734 }
735 
736 #ifndef CONFIG_FACTORY_TEST_MODE
737 
ip_link_release(hi_u8 link_id)738 static hi_void ip_link_release(hi_u8 link_id)
739 {
740     closesocket(g_ip_link_ctl[link_id].sfd);
741     g_ip_link_ctl[link_id].sfd = -1;
742     g_ip_link_ctl[link_id].link_stats = IP_LINK_ID_IDLE;
743     g_ip_link_ctl[link_id].link_res = IP_LINK_RES_INIT;
744     g_ip_link_ctl[link_id].ip_protocol = IP_NULL;
745 }
746 
ip_is_all_link_idle(hi_void)747 static hi_u32 ip_is_all_link_idle(hi_void)
748 {
749     int i;
750     hi_mux_pend(g_ip_mux_id, IP_MUX_WAIT_TIME);
751     for (i = 0; i < IP_LINK_ID_MAX; i++) {
752         if (g_ip_link_ctl[i].link_stats != IP_LINK_ID_IDLE) {
753             hi_mux_post(g_ip_mux_id);
754             return HI_ERR_FAILURE;
755         }
756     }
757     hi_mux_post(g_ip_mux_id);
758     return HI_ERR_SUCCESS;
759 }
760 
ip_monitor_link_close(hi_void)761 static hi_void ip_monitor_link_close(hi_void)
762 {
763     hi_u8 i;
764     hi_mux_pend(g_ip_mux_id, IP_MUX_WAIT_TIME);
765     for (i = 0; i < IP_LINK_ID_MAX; i++) {
766         if (g_ip_link_ctl[i].link_stats == IP_LINK_WAIT_CLOSE) {
767             hi_at_printf("link %d CLOSED\r\n", i);
768             ip_link_release(i);
769         } else if (g_ip_link_ctl[i].link_stats == IP_LINK_USER_CLOSE) {
770             hi_at_printf("link %d CLOSED\r\n", i);
771             ip_link_release(i);
772             hi_at_printf("OK\r\n");
773         }
774     }
775 
776     if (g_listen_fd.link_stats == IP_LINK_WAIT_CLOSE) {
777         closesocket(g_listen_fd.sfd);
778         g_listen_fd.sfd = -1;
779         g_listen_fd.link_stats = IP_LINK_ID_IDLE;
780     } else if (g_listen_fd.link_stats == IP_LINK_USER_CLOSE) {
781         closesocket(g_listen_fd.sfd);
782         g_listen_fd.sfd = -1;
783         g_listen_fd.link_stats = IP_LINK_ID_IDLE;
784         hi_at_printf("OK\r\n");
785     }
786     hi_mux_post(g_ip_mux_id);
787 }
788 
ip_set_monitor_socket(fd_set * read_set,hi_s32 * sfd_max)789 static hi_void ip_set_monitor_socket(fd_set *read_set, hi_s32 *sfd_max)
790 {
791     hi_s32 sfd_max_inter = 0;
792     hi_u8 i;
793     hi_mux_pend(g_ip_mux_id, IP_MUX_WAIT_TIME);
794     for (i = 0; i < IP_LINK_ID_MAX; i++) {
795         if (g_ip_link_ctl[i].link_stats == IP_LINK_WAIT_RESV) {
796             FD_SET(g_ip_link_ctl[i].sfd, read_set);
797             if (g_ip_link_ctl[i].sfd > sfd_max_inter) {
798                 sfd_max_inter = g_ip_link_ctl[i].sfd;
799             }
800         }
801     }
802     if (g_listen_fd.link_stats == IP_LINK_SERVER_LISTEN) {
803         FD_SET(g_listen_fd.sfd, read_set);
804         if (g_listen_fd.sfd > sfd_max_inter) {
805             sfd_max_inter = g_listen_fd.sfd;
806         }
807     }
808     *sfd_max = sfd_max_inter;
809     hi_mux_post(g_ip_mux_id);
810 
811     return;
812 }
813 
ip_ip_resv_show_msg(hi_u8 link_id)814 static hi_u32 ip_ip_resv_show_msg(hi_u8 link_id)
815 {
816     struct sockaddr_in cln_addr = {0};
817     socklen_t cln_addr_len = (socklen_t)sizeof(cln_addr);
818     hi_u32 print_len = 0;
819     hi_s32 ret;
820 
821     hi_char *ip_buffer = (hi_char*)malloc(IP_RESV_BUF_LEN + 1);
822     if (ip_buffer == HI_NULL) {
823         printf("{ip_ip_resv_output:ip buffer malloc fail}\r\n");
824         return HI_ERR_FAILURE;
825     }
826 
827     memset_s(ip_buffer, IP_RESV_BUF_LEN + 1, 0, IP_RESV_BUF_LEN + 1);
828     errno = 0;
829     ret = recvfrom(g_ip_link_ctl[link_id].sfd, ip_buffer, IP_RESV_BUF_LEN, 0,
830         (struct sockaddr *)&cln_addr, (socklen_t *)&cln_addr_len);
831     if (ret < 0) {
832         hi_at_printf("link %d RESV FAIL\r\n", link_id);
833         if ((errno != EINTR) && (errno != EAGAIN)) {
834             g_ip_link_ctl[link_id].link_stats = IP_LINK_WAIT_CLOSE;
835         }
836         free(ip_buffer);
837         return HI_ERR_FAILURE;
838     } else if (ret == 0) {
839         g_ip_link_ctl[link_id].link_stats = IP_LINK_WAIT_CLOSE;
840         free(ip_buffer);
841         return HI_ERR_FAILURE;
842     }
843 
844     if (ret < PRINT_SIZE_MAX) {
845         hi_at_printf("\r\n+IPD,%d,%d,%s,%d:%s", link_id, ret, inet_ntoa(cln_addr.sin_addr), htons(cln_addr.sin_port),
846             ip_buffer);
847     } else if ((ret >= PRINT_SIZE_MAX) && (ret <= IP_RESV_BUF_LEN)) {
848         hi_at_printf("\r\n+IPD,%d,%d,%s,%d:", link_id, ret, inet_ntoa(cln_addr.sin_addr), htons(cln_addr.sin_port));
849         do {
850             char print_out_buff[PRINT_SIZE_MAX] = {0};
851             if ((memset_s(print_out_buff, sizeof(print_out_buff), 0x0, sizeof(print_out_buff)) != EOK) ||
852                 (memcpy_s(print_out_buff, sizeof(print_out_buff) - 1, ip_buffer + print_len,
853                           sizeof(print_out_buff)-1) != EOK)) {
854                 printf("{ip_ip_resv_output: print_out_buff memset_s/memcpy_s fail\r\n}");
855             }
856             hi_at_printf("%s", print_out_buff);
857 
858             ret -= sizeof(print_out_buff) - 1;
859             print_len += sizeof(print_out_buff) - 1;
860         } while (ret >= (PRINT_SIZE_MAX - 1));
861 
862         if (ret > 0) {
863             hi_at_printf("%s", ip_buffer + print_len);
864         }
865     }
866     free(ip_buffer);
867     return HI_ERR_SUCCESS;
868 }
869 
ip_ip_resv_output(const fd_set * read_set)870 static hi_void ip_ip_resv_output(const fd_set *read_set)
871 {
872     hi_u8 link_id;
873 
874     hi_mux_pend(g_ip_mux_id, IP_MUX_WAIT_TIME);
875     for (link_id = 0; link_id < IP_LINK_ID_MAX; link_id++) {
876         if ((g_ip_link_ctl[link_id].link_stats == IP_LINK_WAIT_RESV) && (FD_ISSET(g_ip_link_ctl[link_id].sfd,
877             read_set))) {
878             if (ip_ip_resv_show_msg(link_id) != HI_ERR_SUCCESS) {
879                 continue;
880             }
881         }
882     }
883     hi_mux_post(g_ip_mux_id);
884     return;
885 }
886 
ip_tcp_accept(hi_void)887 static hi_void ip_tcp_accept(hi_void)
888 {
889     struct sockaddr_in cln_addr = {0};
890     socklen_t cln_addr_len = (socklen_t)sizeof(cln_addr);
891     hi_s32 resv_fd;
892     hi_s8 link_id = -1;
893     hi_s8 i;
894     hi_u32 opt = 1;
895 
896     hi_mux_pend(g_ip_mux_id, IP_MUX_WAIT_TIME);
897     resv_fd = accept(g_listen_fd.sfd, (struct sockaddr *)&cln_addr, (socklen_t *)&cln_addr_len);
898     if (resv_fd < 0) {
899         printf("{accept failed, return is %d}\r\n", resv_fd);
900         hi_mux_post(g_ip_mux_id);
901         return;
902     }
903 
904     /* An unused link ID is found.CNcomment:找到一个没有被使用的link id */
905     for (i = 0; i < IP_LINK_ID_MAX; i++) {
906         if (g_ip_link_ctl[i].link_stats == IP_LINK_ID_IDLE) {
907             link_id = i;
908             break;
909         }
910     }
911     if ((i >= IP_LINK_ID_MAX) || (link_id == -1)) {
912         hi_at_printf("no link id to use now\r\n");
913         closesocket(resv_fd);
914         hi_mux_post(g_ip_mux_id);
915         return;
916     }
917     setsockopt(g_ip_link_ctl[link_id].sfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));
918     /* Updating Connection Information */
919     g_ip_link_ctl[link_id].sfd = resv_fd;
920     g_ip_link_ctl[link_id].link_stats = IP_LINK_WAIT_RESV;
921     g_ip_link_ctl[link_id].link_res = IP_LINK_AUTO;
922     g_ip_link_ctl[link_id].ip_protocol = IP_TCP;
923     hi_at_printf("%d,CONNECT\r\n", link_id);
924     hi_mux_post(g_ip_mux_id);
925 
926     return;
927 }
928 
ip_monitor(hi_void)929 static hi_void ip_monitor(hi_void)
930 {
931     hi_s32 sfd_max;
932     fd_set read_set;
933     struct timeval time_val;
934     hi_s32 ret;
935     int i;
936 
937     hi_mux_create(&g_ip_mux_id);
938     g_ip_task_exit = 0;
939     while (!g_ip_task_exit) {
940         hi_cpup_load_check_proc(hi_task_get_current_id(), LOAD_SLEEP_TIME_DEFAULT);
941         /* When all links are in the idle state and no socket is listened on, exit ip_monitor. */
942         if ((ip_is_all_link_idle() == HI_ERR_SUCCESS) && (g_listen_fd.link_stats == IP_LINK_ID_IDLE)) {
943             hi_mux_delete(g_ip_mux_id);
944             g_ip_task_exit = 1;
945             continue;
946         }
947 
948         ip_monitor_link_close();
949 
950         FD_ZERO(&read_set);
951         sfd_max = 0;
952         ip_set_monitor_socket(&read_set, &sfd_max);
953         time_val.tv_sec = 0;
954         time_val.tv_usec = 500000; /* 500000 Timeout interval is 500ms */
955         ret = lwip_select(sfd_max + 1, &read_set, 0, 0, &time_val);
956         if (ret < 0) {
957             printf("{ip_monitor : socket select failure\r\n");
958             goto failure;
959         } else if (ret == 0) {
960             continue;
961         }
962         ip_ip_resv_output(&read_set);
963 
964         if ((g_listen_fd.link_stats == IP_LINK_SERVER_LISTEN) && (FD_ISSET(g_listen_fd.sfd, &read_set))) {
965             ip_tcp_accept();
966         }
967     }
968     g_ip_taskid = -1;
969     return;
970 
971 failure:
972     for (i = 0; i < IP_LINK_ID_MAX; i++) {
973         if (g_ip_link_ctl[i].link_stats != IP_LINK_ID_IDLE) {
974             ip_link_release(i);
975         }
976     }
977     if (g_listen_fd.link_stats != IP_LINK_ID_IDLE) {
978         closesocket(g_listen_fd.sfd);
979         g_listen_fd.sfd = -1;
980         g_listen_fd.link_stats = IP_LINK_ID_IDLE;
981     }
982     g_ip_taskid = -1;
983     printf("{ip_monitor : ip monitor exit}\r\n");
984 }
985 
ip_creat_ip_task(hi_void)986 static hi_u32 ip_creat_ip_task(hi_void)
987 {
988 #if LWIP_LITEOS_TASK
989     TSK_INIT_PARAM_S start_ip_task;
990     if (g_ip_taskid > 0) {
991         return HI_ERR_SUCCESS;
992     }
993     start_ip_task.pfnTaskEntry = (TSK_ENTRY_FUNC)ip_monitor;
994     start_ip_task.uwStackSize  = LOSCFG_BASE_CORE_TSK_DEFAULT_STACK_SIZE;
995     start_ip_task.pcName = "at_ip_monitor_task";
996     start_ip_task.usTaskPrio = 28; /* 28:Task Priority */
997     start_ip_task.uwResved = LOS_TASK_STATUS_DETACHED;
998     hi_u32 ret = LOS_TaskCreate((UINT32 *)(&g_ip_taskid), &start_ip_task);
999     if (ret != HI_ERR_SUCCESS) {
1000         printf("{ip_creat_ip_task:task create failed 0x%08x.}\r\n", ret);
1001         return HI_ERR_FAILURE;
1002     }
1003 #endif
1004     return HI_ERR_SUCCESS;
1005 }
1006 
ip_set_tcp_link_info(hi_u8 link_id,hi_s32 sfd)1007 static void ip_set_tcp_link_info(hi_u8 link_id, hi_s32 sfd)
1008 {
1009     hi_mux_pend(g_ip_mux_id, IP_MUX_WAIT_TIME);
1010     g_ip_link_ctl[link_id].sfd = sfd;
1011     g_ip_link_ctl[link_id].link_stats = IP_LINK_WAIT_RESV;
1012     g_ip_link_ctl[link_id].link_res = IP_LINK_MANUAL;
1013     g_ip_link_ctl[link_id].ip_protocol = IP_TCP;
1014     hi_mux_post(g_ip_mux_id);
1015 }
1016 
ip_start_tcp_client(hi_u8 link_id,const hi_char * peer_ipaddr,hi_u16 peer_port)1017 static hi_u32 ip_start_tcp_client(hi_u8 link_id, const hi_char *peer_ipaddr, hi_u16 peer_port)
1018 {
1019     hi_s32 ret;
1020     hi_u32 opt = 0;
1021     hi_s32 tos;
1022     struct sockaddr_in srv_addr = {0};
1023 
1024     if (link_id >= IP_LINK_ID_MAX) {
1025         return HI_ERR_FAILURE;
1026     }
1027     hi_mux_pend(g_ip_mux_id, IP_MUX_WAIT_TIME);
1028     if (g_ip_link_ctl[link_id].link_stats != IP_LINK_ID_IDLE) {
1029         hi_at_printf("invalid link\r\n");
1030         hi_mux_post(g_ip_mux_id);
1031         return HI_ERR_FAILURE;
1032     }
1033     hi_mux_post(g_ip_mux_id);
1034 
1035     hi_s32 sfd = socket(AF_INET, SOCK_STREAM, 0);
1036     if (sfd == -1) {
1037         printf("{ip_start_tcp_client: socket fail}\r\n");
1038         return HI_ERR_FAILURE;
1039     }
1040 
1041     setsockopt(sfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));
1042     tos = 128; /* 128:TOS设定为128,对应tid = 4,WLAN_WME_AC_VI */
1043     ret = setsockopt(sfd, IPPROTO_IP, IP_TOS, &tos, sizeof(tos));
1044     if (ret) {
1045         printf("{ip_start_tcp_client: setsockopt TOPS fail, return is %d}\r\n", ret);
1046         closesocket(sfd);
1047         return HI_ERR_FAILURE;
1048     }
1049     srv_addr.sin_family = AF_INET;
1050     srv_addr.sin_addr.s_addr = inet_addr(peer_ipaddr);
1051     srv_addr.sin_port = htons (peer_port);
1052     ret = connect(sfd, (struct sockaddr *)&srv_addr, sizeof(srv_addr));
1053     if (ret != 0) {
1054         printf("{ip_start_tcp_client: connect fail, return is %d}\r\n", ret);
1055         closesocket(sfd);
1056         return HI_ERR_FAILURE;
1057     }
1058 
1059     ip_set_tcp_link_info(link_id, sfd);
1060     if (ip_creat_ip_task() != HI_ERR_SUCCESS) {
1061         printf("{ip_start_tcp_client: creat ip task fail}\r\n");
1062         hi_mux_pend(g_ip_mux_id, IP_MUX_WAIT_TIME);
1063         ip_link_release(link_id);
1064         hi_mux_post(g_ip_mux_id);
1065         return HI_ERR_FAILURE;
1066     }
1067 
1068     return HI_ERR_SUCCESS;
1069 }
1070 
ip_has_idle_udp_link(hi_void)1071 static hi_u32 ip_has_idle_udp_link(hi_void)
1072 {
1073     hi_u8 udp_link_count = 0;
1074     hi_u8 link_id;
1075 
1076     hi_mux_pend(g_ip_mux_id, IP_MUX_WAIT_TIME);
1077     for (link_id = 0; link_id < IP_LINK_ID_MAX; link_id++) {
1078         if (g_ip_link_ctl[link_id].ip_protocol == IP_UDP) {
1079             udp_link_count++;
1080         }
1081     }
1082     hi_mux_post(g_ip_mux_id);
1083     if (udp_link_count >= IP_UDP_LINK_MAX) {
1084         return HI_ERR_FAILURE;
1085     }
1086     return HI_ERR_SUCCESS;
1087 }
1088 
ip_set_udp_link_info(hi_u8 link_id,hi_s32 sfd)1089 static hi_void ip_set_udp_link_info(hi_u8 link_id, hi_s32 sfd)
1090 {
1091     hi_mux_pend(g_ip_mux_id, IP_MUX_WAIT_TIME);
1092     g_ip_link_ctl[link_id].sfd = sfd;
1093     g_ip_link_ctl[link_id].link_stats = IP_LINK_WAIT_RESV;
1094     g_ip_link_ctl[link_id].link_res = IP_LINK_MANUAL;
1095     g_ip_link_ctl[link_id].ip_protocol = IP_UDP;
1096     hi_mux_post(g_ip_mux_id);
1097 }
1098 
ip_start_udp(hi_u8 link_id,hi_u16 local_port)1099 static hi_u32 ip_start_udp(hi_u8 link_id, hi_u16 local_port)
1100 {
1101     struct sockaddr_in srv_addr = {0};
1102     hi_s32 ret;
1103     hi_u32 opt = 0;
1104     hi_u32 tos;
1105 
1106     if ((link_id >= IP_LINK_ID_MAX) || (ip_has_idle_udp_link() != HI_ERR_SUCCESS)) {
1107         return HI_ERR_FAILURE;
1108     }
1109     hi_mux_pend(g_ip_mux_id, IP_MUX_WAIT_TIME);
1110     if (g_ip_link_ctl[link_id].link_stats != IP_LINK_ID_IDLE) {
1111         hi_at_printf("invalid link\r\n");
1112         hi_mux_post(g_ip_mux_id);
1113         return HI_ERR_FAILURE;
1114     }
1115     hi_mux_post(g_ip_mux_id);
1116 
1117     hi_s32 sfd = socket(AF_INET, SOCK_DGRAM, 0);
1118     if (sfd == -1) {
1119         printf("{ip_start_udp: socket fail}\r\n");
1120         return HI_ERR_FAILURE;
1121     }
1122 
1123     srv_addr.sin_family = AF_INET;
1124     srv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
1125     srv_addr.sin_port = htons(local_port);
1126     ret = bind(sfd, (struct sockaddr*)&srv_addr, sizeof(srv_addr));
1127     if (ret != 0) {
1128         printf("{ip_start_udp:bind failed, return is %d}\r\n", ret);
1129         closesocket(sfd);
1130         return HI_ERR_FAILURE;
1131     }
1132     setsockopt(sfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));
1133     tos = 128; /* 128:TOS is set to 128, corresponding to tid = 4,WLAN_WME_AC_VI */
1134     ret = setsockopt(sfd, IPPROTO_IP, IP_TOS, &tos, sizeof(tos));
1135     if (ret) {
1136         printf("{ip_start_udp: setsockopt TOPS fail, return is %d}\r\n", ret);
1137         closesocket(sfd);
1138         return HI_ERR_FAILURE;
1139     }
1140 
1141     ip_set_udp_link_info(link_id, sfd);
1142     if (ip_creat_ip_task() != HI_ERR_SUCCESS) {
1143         printf("{ip_start_tcp_client: creat ip task fail}\r\n");
1144         hi_mux_pend(g_ip_mux_id, IP_MUX_WAIT_TIME);
1145         ip_link_release(link_id);
1146         hi_mux_post(g_ip_mux_id);
1147         return HI_ERR_FAILURE;
1148     }
1149 
1150     return HI_ERR_SUCCESS;
1151 }
1152 
at_start_ip(hi_s32 argc,const hi_char ** argv)1153 static hi_u32 at_start_ip(hi_s32 argc, const hi_char **argv)
1154 {
1155     hi_u8 link_id;
1156     hi_u16 peer_port;
1157     hi_u16 local_port;
1158 
1159     if (((argc != 3) && (argc != 4)) || (at_param_null_check(argc, argv) == HI_ERR_FAILURE)) { /* 3 4 */
1160         return HI_ERR_FAILURE;
1161     }
1162 
1163     if (integer_check(argv[0]) == HI_ERR_FAILURE) {
1164         return HI_ERR_FAILURE;
1165     }
1166     link_id = (hi_u8)atoi(argv[0]);
1167     const hi_char *protocol = argv[1];
1168 
1169     if (strcmp(protocol, "tcp") == 0) {
1170         if ((argc != 4) || (integer_check(argv[3]) == HI_ERR_FAILURE)) { /* 4 3 Parameter verification */
1171             return HI_ERR_FAILURE;
1172         }
1173         const hi_char *peer_ipaddr = argv[2];  /* 2 Parameter verification */
1174         peer_port = (hi_u16)atoi(argv[3]); /* 3 Parameter verification */
1175         if (ip_start_tcp_client(link_id, peer_ipaddr, peer_port) != HI_ERR_SUCCESS) {
1176             return HI_ERR_FAILURE;
1177         }
1178     } else if (strcmp(protocol, "udp") == 0) {
1179         if ((argc != 3) || (integer_check(argv[2]) == HI_ERR_FAILURE)) { /* 3 2 Parameter verification */
1180             return HI_ERR_FAILURE;
1181         }
1182         local_port = (hi_u16)atoi(argv[2]); /* 2 Parameter verification */
1183         if (ip_start_udp(link_id, local_port) != HI_ERR_SUCCESS) {
1184             return HI_ERR_FAILURE;
1185         }
1186     } else {
1187         return HI_ERR_FAILURE;
1188     }
1189     hi_at_printf("OK\r\n");
1190     return HI_ERR_SUCCESS;
1191 }
1192 
ip_tcp_send(hi_u8 link_id,const hi_char * send_msg)1193 static hi_void ip_tcp_send(hi_u8 link_id, const hi_char *send_msg)
1194 {
1195     hi_s32 ret;
1196     hi_u32 send_len;
1197     send_len = strlen(send_msg);
1198     hi_mux_pend(g_ip_mux_id, IP_MUX_WAIT_TIME);
1199     ret = send(g_ip_link_ctl[link_id].sfd, send_msg, send_len, 0);
1200     hi_mux_post(g_ip_mux_id);
1201     if (ret <= 0) {
1202         hi_at_printf("ERROR\r\n");
1203         return;
1204     }
1205     hi_at_printf("SEND %d bytes\r\nOK\r\n", ret);
1206     return;
1207 }
1208 
ip_udp_send(hi_u8 link_id,in_addr_t peer_ipaddr,hi_u16 peer_port,const hi_char * send_msg)1209 static hi_void ip_udp_send(hi_u8 link_id, in_addr_t peer_ipaddr, hi_u16 peer_port, const hi_char *send_msg)
1210 {
1211     hi_s32 ret;
1212     struct sockaddr_in cln_addr = {0};
1213     hi_u32 send_len;
1214     send_len = strlen(send_msg);
1215     cln_addr.sin_family = AF_INET;
1216     cln_addr.sin_addr.s_addr = peer_ipaddr;
1217     cln_addr.sin_port = htons(peer_port);
1218     hi_mux_pend(g_ip_mux_id, IP_MUX_WAIT_TIME);
1219     ret = sendto(g_ip_link_ctl[link_id].sfd, send_msg, send_len, 0,
1220         (struct sockaddr *)&cln_addr, (socklen_t)sizeof(cln_addr));
1221     hi_mux_post(g_ip_mux_id);
1222     if (ret <= 0) {
1223         hi_at_printf("ERROR\r\n");
1224         return;
1225     }
1226     hi_at_printf("SEND %d bytes\r\nOK\r\n", ret);
1227     return;
1228 }
1229 
at_ip_send(hi_s32 argc,const hi_char ** argv)1230 static hi_u32 at_ip_send(hi_s32 argc, const hi_char **argv)
1231 {
1232     if ((at_param_null_check(argc, argv) == HI_ERR_FAILURE) || ((argc != 2) && (argc != 4)) || /* 2 4 */
1233         ((integer_check(argv[0]) == HI_ERR_FAILURE) || (integer_check(argv[1]) == HI_ERR_FAILURE))) {
1234         return HI_ERR_FAILURE;
1235     }
1236 
1237     g_link_id = (hi_u16)atoi(argv[0]);
1238     if ((g_link_id < 0) || (g_link_id >= IP_LINK_ID_MAX)) {
1239         hi_at_printf("invalid link\r\n");
1240         return HI_ERR_FAILURE;
1241     }
1242 
1243     hi_mux_pend(g_ip_mux_id, IP_MUX_WAIT_TIME);
1244     if (g_ip_link_ctl[g_link_id].link_stats == IP_LINK_ID_IDLE) {
1245         hi_at_printf("invalid link\r\n");
1246         hi_mux_post(g_ip_mux_id);
1247         return HI_ERR_FAILURE;
1248     }
1249     hi_mux_post(g_ip_mux_id);
1250 
1251     if ((atoi(argv[1]) <= 0) || (atoi(argv[1]) > IP_SEND_BUF_LEN)) {
1252         return HI_ERR_FAILURE;
1253     }
1254 
1255     g_at_ctrl.send_len = (hi_u16)atoi(argv[1]);
1256 
1257     hi_mux_pend(g_ip_mux_id, IP_MUX_WAIT_TIME);
1258     if (g_ip_link_ctl[g_link_id].ip_protocol == IP_TCP) {
1259         if (argc != 2) { /* 2 Parameter verification */
1260             hi_at_printf("invalid link\r\n");
1261             hi_mux_post(g_ip_mux_id);
1262             return HI_ERR_FAILURE;
1263         }
1264     } else if (g_ip_link_ctl[g_link_id].ip_protocol == IP_UDP) {
1265         if (argc != 4) { /* 4 Parameter verification */
1266             hi_at_printf("invalid link\r\n");
1267             hi_mux_post(g_ip_mux_id);
1268             return HI_ERR_FAILURE;
1269         }
1270         g_peer_ipaddr = inet_addr(argv[2]);  /* 2 Parameter verification */
1271         if (integer_check(argv[3]) == HI_ERR_FAILURE) { /* 3 Parameter verification */
1272             hi_mux_post(g_ip_mux_id);
1273             return HI_ERR_FAILURE;
1274         }
1275         g_peer_port = (hi_u16)atoi(argv[3]); /* 3 Parameter verification */
1276     } else {
1277         hi_mux_post(g_ip_mux_id);
1278         return HI_ERR_FAILURE;
1279     }
1280     hi_mux_post(g_ip_mux_id);
1281 
1282     g_at_ctrl.at_state = AT_DATA_RECVING;
1283     hi_at_printf(">");
1284     return HI_ERR_RECVING;
1285 }
1286 
at_send_serial_data(hi_char * serial_data)1287 hi_void at_send_serial_data(hi_char *serial_data)
1288 {
1289     hi_char *send_msg = serial_data;
1290     hi_mux_pend(g_ip_mux_id, IP_MUX_WAIT_TIME);
1291     if (g_ip_link_ctl[g_link_id].ip_protocol == IP_TCP) {
1292         ip_tcp_send(g_link_id, send_msg);
1293     } else if (g_ip_link_ctl[g_link_id].ip_protocol == IP_UDP) {
1294         ip_udp_send(g_link_id, g_peer_ipaddr, g_peer_port, send_msg);
1295         g_peer_ipaddr = 0;
1296         g_peer_port = 0;
1297     }
1298     g_link_id = -1;
1299     hi_mux_post(g_ip_mux_id);
1300     return;
1301 }
1302 #endif
1303 
at_set_uart_func_nv(hi_s32 argc,const hi_char * argv[])1304 static hi_u32 at_set_uart_func_nv(hi_s32 argc, const hi_char *argv[])
1305 {
1306     hi_u32 ret;
1307     hi_nv_uart_port_alloc nv;
1308 
1309     if (argc != 3) { /* 3 */
1310         return HI_ERR_FAILURE;
1311     }
1312 
1313     ret = hi_nv_read(HI_NV_SYS_UART_PORT_ID, &nv, sizeof(hi_nv_uart_port_alloc), 0);
1314     if (ret != HI_ERR_SUCCESS) {
1315         hi_at_printf("read nv fail\r\n");
1316         return HI_ERR_FAILURE;
1317     }
1318 
1319     if (argv[0] != HI_NULL) { /* 0:uart_port_at */
1320         if (integer_check(argv[0]) != HI_ERR_SUCCESS) {
1321             return HI_ERR_FAILURE;
1322         }
1323         nv.uart_port_at = strtoul((const char*)argv[0], NULL, 10); /* param 0; 10:hexadecimal */
1324     }
1325 
1326     if (argv[1] != HI_NULL) { /* 1:uart_port_debug */
1327         if (integer_check(argv[1]) != HI_ERR_SUCCESS) {
1328             return HI_ERR_FAILURE;
1329         }
1330         nv.uart_port_debug = strtoul((const char*)argv[1], NULL, 10); /* param 1; 10:hexadecimal */
1331     }
1332 
1333     if (argv[2] != HI_NULL) { /* 2:uart_port_sigma */
1334         if (integer_check(argv[2]) != HI_ERR_SUCCESS) {
1335             return HI_ERR_FAILURE;
1336         }
1337         nv.uart_port_sigma = strtoul((const char*)argv[2], NULL, 10); /* param 2; 10:hexadecimal */
1338     }
1339 
1340     if (nv.uart_port_at > HI_UART_IDX_2 ||
1341         nv.uart_port_debug > HI_UART_IDX_2 ||
1342         nv.uart_port_sigma > HI_UART_IDX_2) {
1343         return HI_ERR_FAILURE;
1344     }
1345 
1346     if (nv.uart_port_at == nv.uart_port_debug ||
1347         nv.uart_port_at == nv.uart_port_sigma ||
1348         nv.uart_port_debug == nv.uart_port_sigma) {
1349         hi_at_printf("reuse of a uart port %d:%d:%d\r\n", nv.uart_port_at, nv.uart_port_debug, nv.uart_port_sigma);
1350         return HI_ERR_FAILURE;
1351     }
1352 
1353     ret = hi_nv_write(HI_NV_SYS_UART_PORT_ID, &nv, sizeof(hi_nv_uart_port_alloc), 0);
1354     if (ret != 0) {
1355         hi_at_printf("write nv fail\r\n");
1356         return HI_ERR_FAILURE;
1357     }
1358     hi_at_printf("OK\r\n");
1359     return HI_ERR_SUCCESS;
1360 }
1361 
1362 #ifndef CONFIG_FACTORY_TEST_MODE
ip_close_link(hi_s32 link_id)1363 static hi_u32 ip_close_link(hi_s32 link_id)
1364 {
1365     if (link_id >= IP_LINK_ID_MAX) {
1366         hi_at_printf("invalid link\r\n");
1367         return HI_ERR_FAILURE;
1368     }
1369 
1370     hi_mux_pend(g_ip_mux_id, IP_MUX_WAIT_TIME);
1371     if (g_ip_link_ctl[link_id].link_stats == IP_LINK_ID_IDLE) {
1372         hi_at_printf("invalid link\r\n");
1373         hi_mux_post(g_ip_mux_id);
1374         return HI_ERR_FAILURE;
1375     }
1376 
1377     g_ip_link_ctl[link_id].link_stats = IP_LINK_USER_CLOSE;
1378     hi_mux_post(g_ip_mux_id);
1379     return HI_ERR_SUCCESS;
1380 }
1381 
at_ip_close_link(hi_s32 argc,const hi_char ** argv)1382 static hi_u32 at_ip_close_link(hi_s32 argc, const hi_char **argv)
1383 {
1384     hi_s32 link_id;
1385     if ((argc != 1) || (integer_check(argv[0]) == HI_ERR_FAILURE)) {
1386         return HI_ERR_FAILURE;
1387     }
1388 
1389     link_id = atoi(argv[0]);
1390     if (ip_close_link(link_id) != HI_ERR_SUCCESS) {
1391         return HI_ERR_FAILURE;
1392     }
1393     return HI_ERR_SUCCESS;
1394 }
1395 
ip_tcp_server_close(hi_void)1396 static hi_u32 ip_tcp_server_close(hi_void)
1397 {
1398     int i;
1399     hi_mux_pend(g_ip_mux_id, IP_MUX_WAIT_TIME);
1400     if (g_listen_fd.link_stats == IP_LINK_ID_IDLE) {
1401         hi_at_printf("no server\r\n");
1402         hi_mux_post(g_ip_mux_id);
1403         return HI_ERR_FAILURE;
1404     }
1405 
1406     g_listen_fd.link_stats = IP_LINK_USER_CLOSE;
1407 
1408     for (i = 0; i < IP_LINK_ID_MAX; i++) {
1409         if (g_ip_link_ctl[i].link_res == IP_LINK_AUTO) {
1410             g_ip_link_ctl[i].link_stats = IP_LINK_WAIT_CLOSE;
1411         }
1412     }
1413     hi_mux_post(g_ip_mux_id);
1414     return HI_ERR_SUCCESS;
1415 }
1416 
ip_tcp_server_start(hi_u16 local_port)1417 static hi_u32 ip_tcp_server_start(hi_u16 local_port)
1418 {
1419     struct sockaddr_in srv_addr = {0};
1420     hi_s32 ret;
1421     hi_u32 opt = 1;
1422 
1423     if (g_listen_fd.link_stats == IP_LINK_SERVER_LISTEN) {
1424         hi_at_printf("server is running\r\n");
1425         return HI_ERR_FAILURE;
1426     }
1427 
1428     g_listen_fd.sfd = socket(AF_INET, SOCK_STREAM, 0);
1429     if (g_listen_fd.sfd == -1) {
1430         printf("{ip_tcp_server_start: creat socket failed}\r\n");
1431         return HI_ERR_FAILURE;
1432     }
1433 
1434     setsockopt(g_listen_fd.sfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));
1435 
1436     srv_addr.sin_family = AF_INET;
1437     srv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
1438     srv_addr.sin_port = htons(local_port);
1439     ret = bind(g_listen_fd.sfd, (struct sockaddr *)&srv_addr, sizeof(srv_addr));
1440     if (ret != 0) {
1441         printf("{ip_tcp_server_start:bind failed, return is %d}\r\n", ret);
1442 
1443         closesocket(g_listen_fd.sfd);
1444         g_listen_fd.sfd = -1;
1445         g_listen_fd.link_stats = IP_LINK_ID_IDLE;
1446         return HI_ERR_FAILURE;
1447     }
1448 
1449     ret = listen(g_listen_fd.sfd, IP_TCP_SERVER_LISTEN_NUM);
1450     if (ret != 0) {
1451         printf("{ip_tcp_server_start:listen failed, return is %d\n}", ret);
1452 
1453         closesocket(g_listen_fd.sfd);
1454         g_listen_fd.sfd = -1;
1455         g_listen_fd.link_stats = IP_LINK_ID_IDLE;
1456         return HI_ERR_FAILURE;
1457     }
1458 
1459     if (ip_creat_ip_task() != HI_ERR_SUCCESS) {
1460         printf("{ip_tcp_server_start:ip_creat_ip_task fail}\r\n");
1461 
1462         closesocket(g_listen_fd.sfd);
1463         g_listen_fd.sfd = -1;
1464         g_listen_fd.link_stats = IP_LINK_ID_IDLE;
1465         return HI_ERR_FAILURE;
1466     }
1467 
1468     g_listen_fd.link_stats = IP_LINK_SERVER_LISTEN;
1469 
1470     return HI_ERR_SUCCESS;
1471 }
1472 
at_ip_tcp_server(hi_s32 argc,const hi_char ** argv)1473 static hi_u32 at_ip_tcp_server(hi_s32 argc, const hi_char **argv)
1474 {
1475     hi_u16 local_port;
1476     hi_s32 server_ctl;
1477 
1478     if (at_param_null_check(argc, argv) == HI_ERR_FAILURE) {
1479         return HI_ERR_FAILURE;
1480     }
1481     if ((argc != 1) && (argc != 2)) { /* 1 2 Parameter verification */
1482         return HI_ERR_FAILURE;
1483     }
1484     if (integer_check(argv[0]) == HI_ERR_FAILURE) {
1485         return HI_ERR_FAILURE;
1486     }
1487 
1488     server_ctl = atoi(argv[0]);
1489     if (server_ctl == 1) {
1490         if ((argv[1] == HI_NULL) || (integer_check(argv[1]) == HI_ERR_FAILURE)) {
1491             return HI_ERR_FAILURE;
1492         }
1493         local_port = (hi_u16)atoi(argv[1]);
1494         if (ip_tcp_server_start(local_port) != HI_ERR_SUCCESS) {
1495             return HI_ERR_FAILURE;
1496         }
1497     } else if (server_ctl == 0) {
1498         if (argc != 1) {
1499             return HI_ERR_FAILURE;
1500         }
1501         if (ip_tcp_server_close() != HI_ERR_SUCCESS) {
1502             return HI_ERR_FAILURE;
1503         }
1504         return HI_ERR_SUCCESS;
1505     } else {
1506         return HI_ERR_FAILURE;
1507     }
1508     hi_at_printf("OK\r\n");
1509 
1510     return HI_ERR_SUCCESS;
1511 }
1512 
at_query_xtal_compesation(hi_void)1513 hi_u32 at_query_xtal_compesation(hi_void)
1514 {
1515     hi_u32 ret;
1516     hi_s16 high_temp_threshold = 0;
1517     hi_s16 low_temp_threshold = 0;
1518     hi_s16 pll_compesation = 0;
1519 
1520     ret = get_rf_cmu_pll_param(&high_temp_threshold, &low_temp_threshold, &pll_compesation);
1521     if (ret != HI_ERR_SUCCESS) {
1522         return ret;
1523     }
1524 
1525     hi_at_printf("+XTALCOM:%d,%d,%d\r\n", high_temp_threshold, low_temp_threshold, pll_compesation);
1526     AT_RESPONSE_OK;
1527 
1528     return HI_ERR_SUCCESS;
1529 }
1530 #endif
1531 
1532 #define TSENSOR_TEMPERATURE_MAX     140       /* Maximum temperature */
1533 #define TSENSOR_TEMPERATURE_MIN     (-40)     /* Minimum temperature */
1534 
at_query_tsensor_temp(hi_void)1535 static hi_u32 at_query_tsensor_temp(hi_void)
1536 {
1537     hi_u32 ret;
1538     hi_u32 i;
1539     hi_s16 temp;
1540 
1541     if (hi_wifi_get_init_status() == 0) {
1542         ret = hi_tsensor_start(HI_TSENSOR_MODE_16_POINTS_SINGLE, 0);
1543         if (ret != HI_ERR_SUCCESS) {
1544             return ret;
1545         }
1546         hi_udelay(10000); /* delay 10000 us */
1547     }
1548 
1549     for (i = 0; i < 3; i++) { /* loop 3 times */
1550         ret = hi_tsensor_read_temperature(&temp);
1551         if (ret == HI_ERR_SUCCESS) {
1552             break;
1553         }
1554         hi_udelay(10000); /* delay 10000 us */
1555     }
1556 
1557     if (ret != HI_ERR_SUCCESS) {
1558         return ret;
1559     }
1560 
1561     if (temp < TSENSOR_TEMPERATURE_MIN || temp > TSENSOR_TEMPERATURE_MAX) {
1562         return HI_ERR_FAILURE;
1563     }
1564 
1565     hi_at_printf("+RDTEMP:%d\r\n", temp);
1566     AT_RESPONSE_OK;
1567 
1568     return HI_ERR_SUCCESS;
1569 }
1570 
1571 #ifdef CONFIG_SIGMA_SUPPORT
at_sigma_start(hi_s32 argc,const hi_char ** argv)1572 hi_u32 at_sigma_start(hi_s32 argc, const hi_char **argv)
1573 {
1574     hi_unref_param(argc);
1575     hi_unref_param(argv);
1576 
1577     if (hi_sigma_init() != HI_ERR_SUCCESS) {
1578         return HI_ERR_FAILURE;
1579     }
1580 
1581     hi_at_printf("OK\r\n");
1582     return HI_ERR_SUCCESS;
1583 }
1584 #endif
1585 
1586 const at_cmd_func g_at_general_func_tbl[] = {
1587     {"", 0, HI_NULL, HI_NULL, HI_NULL, (at_call_back_func)at_exe_at_cmd},
1588     {"+RST", 4, HI_NULL, HI_NULL, (at_call_back_func)at_setup_reset_cmd, (at_call_back_func)at_exe_reset_cmd},
1589     {"+MAC", 4, HI_NULL, (at_call_back_func)cmd_get_macaddr, (at_call_back_func)cmd_set_macaddr, HI_NULL},
1590     {"+HELP", 5, HI_NULL, HI_NULL, HI_NULL, (at_call_back_func)at_exe_help_cmd},
1591 
1592 #ifndef CONFIG_FACTORY_TEST_MODE
1593     {"+SYSINFO", 8, HI_NULL, HI_NULL, HI_NULL, (at_call_back_func)at_query_sysinfo_cmd},
1594     {"+DHCP", 5, HI_NULL, HI_NULL, (at_call_back_func)at_setup_dhcp, HI_NULL},
1595     {"+DHCPS", 6, HI_NULL, HI_NULL, (at_call_back_func)at_setup_dhcps, HI_NULL},
1596     {"+NETSTAT", 8, HI_NULL, HI_NULL, HI_NULL, (at_call_back_func)at_netstat},
1597 #ifdef CONFIG_IPERF_SUPPORT
1598     {"+IPERF", 6, HI_NULL, HI_NULL, (at_call_back_func)at_iperf, HI_NULL},
1599 #endif
1600 #ifdef CONFIG_SIGMA_SUPPORT
1601     {"+SIGMA", 6, HI_NULL, HI_NULL, HI_NULL, (at_call_back_func)at_sigma_start},
1602 #endif
1603     {"+PING", 5, HI_NULL, HI_NULL, (at_call_back_func)at_ping, HI_NULL},
1604     {"+PING6", 6, HI_NULL, HI_NULL, (at_call_back_func)at_ping6, HI_NULL},
1605 #if LWIP_DNS
1606     {"+DNS", 4, HI_NULL, (at_call_back_func)at_show_dns, (at_call_back_func)at_dns, HI_NULL},
1607 #endif
1608     {"+DUMP", 5, HI_NULL, HI_NULL, HI_NULL, (at_call_back_func)at_get_dump},
1609     {"+IPSTART", 8, HI_NULL, HI_NULL, (at_call_back_func)at_start_ip, HI_NULL},
1610     {"+IPLISTEN", 9, HI_NULL, HI_NULL, (at_call_back_func)at_ip_tcp_server, HI_NULL},
1611     {"+IPSEND", 7, HI_NULL, HI_NULL, (at_call_back_func)at_ip_send, HI_NULL},
1612     {"+IPCLOSE", 8, HI_NULL, HI_NULL, (at_call_back_func)at_ip_close_link, HI_NULL},
1613     {"+XTALCOM", 8, HI_NULL, (at_call_back_func)at_query_xtal_compesation, HI_NULL, HI_NULL},
1614 #endif
1615     {"+RDTEMP", 7, HI_NULL, (at_call_back_func)at_query_tsensor_temp, HI_NULL, HI_NULL},
1616 };
1617 
1618 #define AT_GENERAL_FUNC_NUM (sizeof(g_at_general_func_tbl) / sizeof(g_at_general_func_tbl[0]))
1619 
hi_at_general_cmd_register(void)1620 void hi_at_general_cmd_register(void)
1621 {
1622     hi_at_register_cmd(g_at_general_func_tbl, AT_GENERAL_FUNC_NUM);
1623 }
1624 
1625 const at_cmd_func g_at_general_factory_test_func_tbl[] = {
1626     {"+CSV", 4, HI_NULL, HI_NULL, HI_NULL, (at_call_back_func)at_query_ver_cmd},
1627     {"+FTM", 4, (at_call_back_func)at_factory_mode_query, (at_call_back_func)at_factory_mode_query,
1628         (at_call_back_func)at_factory_mode_switch, HI_NULL},
1629 #ifndef CONFIG_FACTORY_TEST_MODE
1630     {"+FTMERASE", 9, HI_NULL, HI_NULL, HI_NULL, (at_call_back_func)at_factory_erase},
1631 #endif
1632     {"+SETUART", 8, HI_NULL, HI_NULL, (at_call_back_func)at_set_uart_func_nv, HI_NULL},
1633     {"+IFCFG", 6, HI_NULL, HI_NULL, (at_call_back_func)at_lwip_ifconfig, (at_call_back_func)at_lwip_ifconfig},
1634 };
1635 #define AT_GENERAL_FACTORY_TEST_FUNC_NUM (sizeof(g_at_general_factory_test_func_tbl) / \
1636     sizeof(g_at_general_factory_test_func_tbl[0]))
1637 
hi_at_general_factory_test_cmd_register(void)1638 void hi_at_general_factory_test_cmd_register(void)
1639 {
1640     hi_at_register_cmd(g_at_general_factory_test_func_tbl, AT_GENERAL_FACTORY_TEST_FUNC_NUM);
1641 }
1642 
1643 #ifdef __cplusplus
1644 #if __cplusplus
1645     }
1646 #endif
1647 #endif
1648