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