blob: 24cbc836c968dc0ffe692d2637a22821e6c81d05 [file] [log] [blame]
lh9ed821d2023-04-07 01:36:19 -07001/************************************************************************
2*¹¦ÄܽéÉÜ£ºÓÃÓÚ¹¦ÄÜ»úap²à´¦ÀíµÄAP\CPºË¼äUSB\TcardÀ©Õ¹at£¬ÓÉat_ctlÔÚÆô¶¯Ê±µ÷ÓÃ
3*¸ºÔðÈË£º
4*±¸·ÝÈË£º
5*ÐÞ¸ÄÈÕ£º
6*ÐÞ¸ÄÄÚÈÝ£º
7*°æ±¾ºÅ£º
8************************************************************************/
9#if (APP_OS_TYPE == APP_OS_LINUX)
10#include "at_msg.h"
11#include "at_com.h"
12#include "at_context.h"
13#include "ext_dev_func.h"
14#include "ext_cmux_func.h"
15
16//add for cmux
17#include <sys/socket.h>
18#include <linux/if.h>
19#include <linux/gsmmux.h>
20#include <poll.h>
21#include <termios.h>
22#include <limits.h>
23
24#define OPENECHO 1 //´ò¿ª»ØÏÔ¹¦ÄÜ
25#define CLOSEECHO 0 //¹Ø±Õ»ØÏÔ¹¦ÄÜ
26#define USB_GPIO_DETECT_ENABLE_EXT "/sys/dwc_usb/usbconfig/gpio_detect"
27
28static int writefile(char*path, char*buf, unsigned len)
29{
30 FILE *fp;
31 int rtv;
32 if((fp=fopen(path,"w"))==NULL)
33 {
34 slog(USBCFGMNG_PRINT,SLOG_ERR, "[ext_dev_fun] open file %s error.\n",path);
35 return -1;
36 }
37 rtv = fwrite(buf,len,1, fp);
38 fclose(fp);
39 return rtv;
40}
41
42
43// USB¶Ë¿ÚÐÅÏ¢
44T_PCS_USB_INFO s_tUsbInfo =
45{
46 '0', // print prompt after receiving
47 0, // baudrate: 0
48 '8', // databit: 8
49 '0', // debug: off
50 '0', // echo: off
51 '0', // flow control: software
52 '0', // default tty: COM1
53 '0', // parity: none
54 '1', // stopbit: 1
55 0 // reserved
56};
57
58
59// ²¨ÌØÂÊת»¯×ª»»º¯Êý
60static int32_t iFnConvbaud(int32_t iBaudrate)
61{
62 //PC_SERVER_LOG();
63
64 switch(iBaudrate)
65 {
66 case 2400:
67 return B2400;
68 case 4800:
69 return B4800;
70 case 9600:
71 return B9600;
72 case 19200:
73 return B19200;
74 case 38400:
75 return B38400;
76 case 57600:
77 return B57600;
78 case 115200:
79 return B115200;
80 default:
81 return B9600;
82 }
83}
84
85// ²¨ÌØÂÊ·´×ª»¯×ª»»º¯Êý
86static int32_t iFnBaudconv(int32_t Baudrate)
87{
88 switch(Baudrate)
89 {
90 case B2400:
91 return 2400;
92 case B4800:
93 return 4800;
94 case B9600:
95 return 9600;
96 case B19200:
97 return 19200;
98 case B38400:
99 return 38400;
100 case B57600:
101 return 57600;
102 case B115200:
103 return 115200;
104 default:
105 return 9600;
106 }
107}
108
109// ÉèÖö˿ÚÐÅÏ¢¡£iFdCom: ´®¿ÚÎļþÃèÊö·û, ptPortInfo: ´ýÉèÖõĶ˿ÚÐÅÏ¢¡£
110void vFnSetUsbInfo(int32_t iFdCom, const PT_PCS_USB_INFO ptPortInfo, USB_PORT_MODE usbPortMode)
111{
112 struct termios tOldTermios = {0}, tNewTermios = {0};
113 int32_t iBaudrate = 0;
114 char cDatabit = 0, cStopbit = 0, cParity = 0, cFctl = 0;
115
116 //PC_SERVER_LOG();
117
118 bzero(&tOldTermios, sizeof(tOldTermios));
119 bzero(&tNewTermios, sizeof(tNewTermios));
120 cfmakeraw(&tNewTermios);
121 tcgetattr(iFdCom, &tOldTermios); // get the serial port attributions
122 /*------------ÉèÖö˿ÚÊôÐÔ----------------*/
123 if(usbPortMode == AUTO_MODE)
124 {
125 iBaudrate = cfgetispeed(&tOldTermios);
126 }
127 else
128 {
129 iBaudrate = iFnConvbaud(ptPortInfo->iBaudrate);
130 tcflush(iFdCom, TCIOFLUSH);
131 cfsetispeed(&tOldTermios, iBaudrate); //ÌîÈë´®¿ÚÊäÈë¶Ë²¨ÌØÂÊ
132 cfsetospeed(&tOldTermios, iBaudrate); //ÌîÈë´®¿ÚÊä³ö¶Ë²¨ÌØÂÊ
133 if(tcsetattr(iFdCom, TCSANOW, &tOldTermios) != 0) //ÉèÖÃÐÂÊôÐÔ, TCSANOW: ËùÓɸıäÁ¢¼´ÉúЧ
134 {
135 return;
136 }
137 tcflush(iFdCom, TCIOFLUSH);
138 return;
139 }
140 cfsetispeed(&tNewTermios, iBaudrate); //ÌîÈë´®¿ÚÊäÈë¶Ë²¨ÌØÂÊ
141 cfsetospeed(&tNewTermios, iBaudrate); //ÌîÈë´®¿ÚÊä³ö¶Ë²¨ÌØÂÊ
142 tNewTermios.c_cflag |= CLOCAL; //¿ØÖÆÄ£Ê½, ±£Ö¤³ÌÐò²»»á³ÉΪ¶Ë¿ÚµÄÕ¼ÓÐÕß
143 tNewTermios.c_cflag |= CREAD; //¿ØÖÆÄ£Ê½, ʹÄܶ˿ڶÁÈ¡ÊäÈëµÄÊý¾Ý
144 // ¿ØÖÆÄ£Ê½, flow control
145 cFctl = ptPortInfo->cFctl;
146 switch(cFctl)
147 {
148 case '0':
149 {
150 tNewTermios.c_cflag &= ~CRTSCTS; //no flow control
151 }break;
152 case '1':
153 {
154 tNewTermios.c_cflag |= CRTSCTS; //hardware flow control
155 }break;
156 case '2':
157 {
158 tNewTermios.c_iflag |= IXON | IXOFF | IXANY; //software flow control
159 }break;
160 default:
161 {
162 break;
163 }
164 }
165 // ¿ØÖÆÄ£Ê½, data bits
166 tNewTermios.c_cflag &= ~CSIZE; //¿ØÖÆÄ£Ê½, ÆÁ±Î×Ö·û´óСλ
167 cDatabit = ptPortInfo->cDatabit;
168 switch(cDatabit)
169 {
170 case '5':
171 tNewTermios.c_cflag |= CS5;
172 // lint -fallthrough
173 case '6':
174 tNewTermios.c_cflag |= CS6;
175 // lint -fallthrough
176 case '7':
177 tNewTermios.c_cflag |= CS7;
178 // lint -fallthrough
179 default:
180 tNewTermios.c_cflag |= CS8;
181 }
182 // ¿ØÖÆÄ£Ê½ parity check
183 cParity = ptPortInfo->cParity;
184 switch(cParity)
185 {
186 case '0':
187 {
188 tNewTermios.c_cflag &= ~PARENB; //no parity check
189 }break;
190 case '1':
191 {
192 tNewTermios.c_cflag |= PARENB; //odd check
193 tNewTermios.c_cflag &= ~PARODD;
194 }break;
195 case '2':
196 {
197 tNewTermios.c_cflag |= PARENB; //even check
198 tNewTermios.c_cflag |= PARODD;
199 }break;
200 default:
201 {
202 break;
203 }
204 }
205 // ¿ØÖÆÄ£Ê½, stop bits
206 cStopbit = ptPortInfo->cStopbit;
207 if('2' == cStopbit)
208 {
209 tNewTermios.c_cflag |= CSTOPB;
210 }
211 else
212 {
213 tNewTermios.c_cflag &= ~CSTOPB;
214 }
215 // other attributions default
216 tNewTermios.c_oflag &= ~OPOST; //Êä³öģʽ, ԭʼÊý¾ÝÊä³ö
217 tNewTermios.c_cc[VMIN] = 1; //¿ØÖÆ×Ö·û, ËùÒª¶ÁÈ¡×Ö·ûµÄ×îСÊýÁ¿
218 tNewTermios.c_cc[VTIME] = 1; //¿ØÖÆ×Ö·û, ¶ÁÈ¡µÚÒ»¸ö×Ö·ûµÄµÈ´ýʱ¼ä£¬unit: (1/10)second
219 tcflush(iFdCom, TCIFLUSH); //Òç³öµÄÊý¾Ý¿ÉÒÔ½ÓÊÕ,µ«²»¶Á
220 tcsetattr(iFdCom, TCSANOW, &tNewTermios); //ÉèÖÃÐÂÊôÐÔ, TCSANOW: ËùÓɸıäÁ¢¼´ÉúЧ
221 tcgetattr(iFdCom, &tOldTermios);
222}
223
224static int32_t vFnPortEchoType(int32_t fdcom, int32_t echoType)
225{
226 struct termios termios_old;
227 int32_t setResult = 0;
228
229 bzero(&termios_old, sizeof(termios_old));
230 tcgetattr(fdcom, &termios_old); //get the serial port attributions
231 /*------------ÉèÖö˿ÚÊôÐÔ----------------*/
232 if(echoType == OPENECHO)
233 {
234 termios_old.c_lflag |= ECHO; //±¾µØÄ£Ê½ÉèÖûØÏÔ
235 //termios_old.c_lflag |= ECHONL;
236 }
237 else
238 {
239 termios_old.c_lflag &= ~ECHO; //±¾µØÄ£Ê½¹Ø±Õ»ØÏÔ
240 //termios_old.c_lflag &= ~ECHONL;
241 }
242
243 tcflush(fdcom, TCIFLUSH); //Òç³öµÄÊý¾Ý¿ÉÒÔ½ÓÊÕ,µ«²»¶Á
244 setResult = tcsetattr(fdcom, TCSANOW, &termios_old); //ÉèÖÃÐÂÊôÐÔ, TCSANOW: ËùÓɸıäÁ¢¼´ÉúЧ
245 return setResult;
246}
247
248int ziprSet_req(int at_fd, char *at_paras,void ** res_msg, int *res_msglen)
249{
250 char* at_str = NULL;
251 int32_t iBaudrate = 0;
252 char strAtReplyCmd[AT_CMD_MAX] = {0};
253
254 if(at_paras==NULL)
255 softap_assert("ziprSet_req:at_paras is null");
256
257 at_str = at_paras;
258 get_at_cmd_param_int(at_str, &iBaudrate, &at_str);
259 at_print(AT_DEBUG,"ziprSet_rsq:iBaudrate == %d\n", iBaudrate);
260 if (iBaudrate < 0 || iBaudrate > INT_MAX-1) //kw 3
261 iBaudrate = 0;
262 s_tUsbInfo.iBaudrate = iBaudrate;
263 sleep(0.002);
264 vFnSetUsbInfo(at_fd, &s_tUsbInfo, SET_MODE);
265 sprintf(strAtReplyCmd,"%d", iBaudrate);
266 *res_msg = at_query_result_build("IPR",strAtReplyCmd);
267 *res_msglen = strlen(*res_msg);
268
269 return AT_END;
270}
271
272int ziprGet_req(int at_fd, char *at_paras,void ** res_msg, int *res_msglen)
273{
274 struct termios tOldTermios = {0};
275 int32_t iBaudrate = 0;
276 char strAtReplyCmd[AT_CMD_MAX] = {0};
277
278 tcgetattr(at_fd, &tOldTermios); // get the serial port attributions
279 iBaudrate = iFnBaudconv(cfgetispeed(&tOldTermios));
280
281 sprintf(strAtReplyCmd,"%d", iBaudrate);
282 *res_msg = at_query_result_build("IPR",strAtReplyCmd);
283 *res_msglen = strlen(*res_msg);
284
285 return AT_END;
286}
287
288int zsetUsb_req(int at_fd, char *at_paras,void ** res_msg, int *res_msglen)
289{
290 int32_t usbMode = -1;
291 char msgBuf[10] = { 0 };
292 char* at_str = NULL;
293
294 if(at_paras==NULL)
295 softap_assert("zsetUsb_req:at_paras is null");
296 at_str = at_paras;
297 get_at_cmd_param_int(at_str, &usbMode, &at_str);
298 at_print(AT_DEBUG,"zsetUsb_req:usbMode == %d\n", usbMode);
299
300 if(!is_at_cmd_end(at_str))
301 {
302 *res_msg = at_err_build(ATERR_PARAM_INVALID);
303 *res_msglen = strlen(*res_msg);
304 return AT_END;
305 }
306
307 if(usbMode != 0 && usbMode != 1)
308 {
309 *res_msg = at_err_build(ATERR_PARAM_INVALID);
310 *res_msglen = strlen(*res_msg);
311 return AT_END;
312 }
313
314 snprintf(msgBuf,sizeof(msgBuf)-1,"%d",usbMode);
315 int result = ipc_send_message(MODULE_ID_AT_CTL, MODULE_ID_USBCFGMNG, MSG_CMD_USBMOD_SETREQ, sizeof(msgBuf), msgBuf,0);
316 at_print(AT_DEBUG,"result == %d\n", result);
317 if(result != 0)
318 {
319 *res_msg = at_err_build(ATERR_PROC_FAILED);
320 *res_msglen = strlen(*res_msg);
321 return AT_END;
322 }
323
324 *res_msg = at_ok_build();
325 *res_msglen = strlen(*res_msg);
326 return AT_END;
327}
328
329int ate_req_rcv_act(char *at_paras,int at_fd,struct at_context *context)
330{
331 int32_t setResult = 0;
332 char strAtReplyCmd[AT_CMD_MAX] = {0};
333
334 if(atoi(at_paras) == 0 || atoi(at_paras) == 1)
335 {
336//#ifdef GUODIAN
337 if(g_customer_type == CUSTOMER_GUODIAN || g_customer_type == CUSTOMER_NANDIAN)
338 {
339 at_write(at_fd, "\r\nOK\r\n", strlen("\r\nOK\r\n"));
340 }
341 else
342 {
343//#else
344 if(atoi(at_paras) == 0)
345 setResult = vFnPortEchoType(at_fd, CLOSEECHO);
346 else
347 setResult = vFnPortEchoType(at_fd, OPENECHO);
348
349 if(setResult != 0)
350 {
351 sprintf(strAtReplyCmd,"\r\nERROR: %d\r\n", setResult);
352 at_write(at_fd, strAtReplyCmd, strlen(strAtReplyCmd));
353 }
354 else
355 {
356 at_write(at_fd, "\r\nOK\r\n", strlen("\r\nOK\r\n"));
357 }
358 }
359//#endif
360 return AT_END;
361 }
362 return AT_CONTINUE;
363}
364
365
366int zudiskstat_req(int at_fd, char *at_paras,void ** res_msg, int *res_msglen)
367{
368 at_print(AT_ERR, "Enter zudiskstat_req\n");
369 *res_msg = malloc(AT_CMD_PREFIX);
370 assert(*res_msg!=NULL);
371 memset(*res_msg, 0, AT_CMD_PREFIX);
372 sprintf(*res_msg, "AT+ZUDISKSTAT=%s\r", at_paras);
373 at_print(AT_ERR, "*res_msg:%s, len: %d\n", (char *)(*res_msg), strlen(*res_msg));
374 *res_msglen = strlen(*res_msg);
375 return AT_CONTINUE;
376}
377
378int zudiskstat_rsp( void *rsp_msg, void **ret, int *retlen)
379{
380 *ret = malloc(strlen(rsp_msg)+1);
381 assert(*ret!=NULL);
382 memset(*ret,0,strlen(rsp_msg)+1);
383 memcpy(*ret,rsp_msg,strlen(rsp_msg));
384 *retlen = strlen(*ret);
385 return AT_END;
386}
387
388char *zusbStat_req(void *msg,struct at_context *context)
389{
390 char *at_next=malloc(AT_CMD_PREFIX);
391 assert(at_next!=NULL);
392 memset(at_next,0, AT_CMD_PREFIX);
393
394 snprintf(at_next, AT_CMD_PREFIX, "AT+USBINQ=%s\r\n", ((MSG_BUF *)msg)->aucDataBuf);
395 return at_next;
396}
397
398//AP²àNVÇå³ý
399int zaprest_req(int at_fd, char *at_paras,void ** res_msg, int *res_msglen)
400{
401 int32_t restMode = 0;
402 char* at_str = NULL;
403
404 if(at_paras==NULL)
405 softap_assert("zaprest_req:at_paras is null");
406 at_str = at_paras;
407 get_at_cmd_param_int(at_str, &restMode, &at_str);
408 at_print(AT_DEBUG,"zaprest_req:restMode == %d\n", restMode);
409
410 if(!is_at_cmd_end(at_str))
411 {
412 *res_msg = at_err_build(ATERR_PARAM_INVALID);
413 *res_msglen = strlen(*res_msg);
414 return AT_END;
415 }
416
417 //µ÷WiFiÌṩµÄ½Ó¿Ú,Çå³ýapËùÓÐnv
418 if(restMode==1)
419 {
420 //nv_clear(NV_RT2860);
421 sc_cfg_reset();
422 }
423
424 *res_msg = at_ok_build();
425 *res_msglen = strlen(*res_msg);
426
427 return AT_END;
428}
429
430int zflowcontrolset_req(int at_fd,char * at_paras,void * *res_msg,int * res_msglen)
431{
432 int cFctl = -1;
433 void *p[1] = {&cFctl};
434
435 parse_param2("%d", at_paras, p);
436 at_print(AT_NORMAL,"zflowcontrolset_req:cFctl = %d\n", cFctl);
437
438 switch(cFctl)
439 {
440 case 0://¹Ø±ÕÁ÷¿Ø
441 {
442 //sc_cfg_set("uart_control","1");
443 sc_cfg_set("uart_ctstrs_enable","");
444 sc_cfg_set("uart_softcontrol_enable","");
445 *res_msg = at_ok_build();
446 *res_msglen = strlen(*res_msg);
447 sc_cfg_save();
448 ipc_send_message(MODULE_ID_AT_CTL,MODULE_ID_MAIN_CTRL, MSG_CMD_RESTART_REQUEST, 0, NULL,0);
449 break;
450 }
451 case 1://¿ªÆôÓ²¼þÁ÷¿Ø
452 {
453 //sc_cfg_set("uart_control","1");
454 sc_cfg_set("uart_ctstrs_enable","1");
455 sc_cfg_set("uart_softcontrol_enable","");
456 *res_msg = at_ok_build();
457 *res_msglen = strlen(*res_msg);
458 sc_cfg_save();
459 ipc_send_message(MODULE_ID_AT_CTL,MODULE_ID_MAIN_CTRL, MSG_CMD_RESTART_REQUEST, 0, NULL,0);
460 break;
461 }
462 case 2://¿ªÆôÈí¼þÁ÷¿Ø
463 {
464 sc_cfg_set("uart_ctstrs_enable","");
465 sc_cfg_set("uart_softcontrol_enable","1");
466 *res_msg = at_ok_build();
467 *res_msglen = strlen(*res_msg);
468 sc_cfg_save();
469 ipc_send_message(MODULE_ID_AT_CTL,MODULE_ID_MAIN_CTRL, MSG_CMD_RESTART_REQUEST, 0, NULL,0);
470 break;
471 }
472 default:
473 {
474 *res_msg = at_err_build(ATERR_PARAM_INVALID);
475 *res_msglen = strlen(*res_msg);
476 break;
477 }
478 }
479 return AT_END;
480}
481
482int zSetgpio_detect_req(int at_fd, char *at_paras,void ** res_msg, int *res_msglen)
483{
484 char* at_str = NULL;
485 int32_t set_value = 0;
486 int ret = 0;
487 if(at_paras==NULL)
488 softap_assert("zSetgpio_detect_req:at_paras is null");
489
490 at_str = at_paras;
491 get_at_cmd_param_int(at_str, &set_value, &at_str);
492 at_print(AT_DEBUG,"zSetgpio_detect_req:set_value = %d\n", set_value);
493
494 if(!is_at_cmd_end(at_str))
495 {
496 *res_msg = at_err_build(ATERR_PARAM_INVALID);
497 *res_msglen = strlen(*res_msg);
498 return AT_END;
499 }
500
501 if(set_value < 0 || set_value > 1)
502 {
503 *res_msg = at_err_build(ATERR_PARAM_INVALID);
504 *res_msglen = strlen(*res_msg);
505 return AT_END;
506 }
507 sc_cfg_set("usb_gpio_detect", (set_value == 1) ? "1" : "0");
508
509 sc_cfg_save();
510 //write this attr,
511 ret = writefile(USB_GPIO_DETECT_ENABLE_EXT, (set_value == 1) ? "1" : "0", 1);
512 if(ret < 0)
513 at_print(AT_DEBUG,"zSetgpio_detect_req:set attr fail \n");
514 *res_msg = at_ok_build();
515 *res_msglen = strlen(*res_msg);
516
517 return AT_END;
518}
519
520int zGetgpio_detect_req(int at_fd, char *at_paras,void ** res_msg, int *res_msglen)
521{
522 char gpio_detect[4] = {0};
523
524 sc_cfg_get("usb_gpio_detect",gpio_detect,sizeof(gpio_detect));
525
526 *res_msg = at_query_result_build("gpio_detect",gpio_detect);
527
528 *res_msglen = strlen(*res_msg);
529
530 return AT_END;
531}
532
533int ext_dev_ser_regist()
534{
535 register_serv_func2("ZAPRESET=",0,0,0,zaprest_req,NULL);
536
537 //ATE»ØÏÔ£¬¶ÔÓÚATE0ºÍATE1£¬ÔÚ¼à¿Øº¯ÊýÖÐÖ±½Ó´¦Àíºó·µ»Ø½á¹û£¬ÆäËûÇé¿öÏÂ͸´«¸øÐ­ÒéÕ»
538 register_fwd_func("ate",ate_req_rcv_act,NULL,NULL);
539
540 //¹Ì¶¨²¨ÌØÂÊÉèÖúͲéѯÃüÁî
541 register_serv_func2("ipr=",0,0,0,ziprSet_req,NULL);
542 register_serv_func2("ipr?",0,0,0,ziprGet_req,NULL);
543
544 //Ä£ÄâUSB²å°Î
545 register_serv_func2("zsetusb=",MODULE_ID_USBCFGMNG,MSG_CMD_USBMOD_SETREQ,0,zsetUsb_req,NULL);
546
547 //CMUXģʽÇл»
548 register_serv_func2("cmux=",MODULE_ID_DRVCOMMNG,MSG_CMD_CMUX_SET_REQ,MSG_CMD_CMUX_SET_RSP,zcmuxSet_req,zcmuxSet_rsp);
549
550 //
551 register_serv_func2("ifc=",0,0,0,zflowcontrolset_req,NULL);
552
553 //GPIO¼ì²âusb²å°ÎÉèÖÃ
554 register_serv_func2("gpio_detect=",0,0,0,zSetgpio_detect_req,NULL);
555 register_serv_func2("gpio_detect?",0,0,0,zGetgpio_detect_req,NULL);
556 return 0;
557}
558
559void ext_dev_regist_init()
560{
561 //intercore_ext_clt_regist();
562 ext_dev_ser_regist();
563
564}
565#endif
566