[T106][ZXW-22]7520V3SCV2.01.01.02P42U09_VEC_V0.8_AP_VEC origin source commit

Change-Id: Ic6e05d89ecd62fc34f82b23dcf306c93764aec4b
diff --git a/ap/lib/libatext/ext_dev_func.c b/ap/lib/libatext/ext_dev_func.c
new file mode 100755
index 0000000..24cbc83
--- /dev/null
+++ b/ap/lib/libatext/ext_dev_func.c
@@ -0,0 +1,566 @@
+/************************************************************************

+*¹¦ÄܽéÉÜ£ºÓÃÓÚ¹¦ÄÜ»úap²à´¦ÀíµÄAP\CPºË¼äUSB\TcardÀ©Õ¹at£¬ÓÉat_ctlÔÚÆô¶¯Ê±µ÷ÓÃ

+*¸ºÔðÈË£º

+*±¸·ÝÈË£º

+*ÐÞ¸ÄÈÕ£º

+*ÐÞ¸ÄÄÚÈÝ£º

+*°æ±¾ºÅ£º

+************************************************************************/

+#if (APP_OS_TYPE == APP_OS_LINUX)

+#include "at_msg.h"

+#include "at_com.h"

+#include "at_context.h"

+#include "ext_dev_func.h"

+#include "ext_cmux_func.h"

+

+//add for cmux

+#include <sys/socket.h>

+#include <linux/if.h>

+#include <linux/gsmmux.h>

+#include <poll.h>

+#include <termios.h>

+#include <limits.h>

+

+#define OPENECHO  1  //´ò¿ª»ØÏÔ¹¦ÄÜ

+#define CLOSEECHO 0  //¹Ø±Õ»ØÏÔ¹¦ÄÜ

+#define USB_GPIO_DETECT_ENABLE_EXT          "/sys/dwc_usb/usbconfig/gpio_detect"

+

+static int writefile(char*path, char*buf, unsigned len)

+{

+    FILE *fp;

+    int rtv;

+    if((fp=fopen(path,"w"))==NULL)

+    {

+        slog(USBCFGMNG_PRINT,SLOG_ERR, "[ext_dev_fun] open file %s error.\n",path);

+        return -1;

+    }

+    rtv = fwrite(buf,len,1, fp);

+    fclose(fp);

+    return rtv;

+}

+

+

+// USB¶Ë¿ÚÐÅÏ¢

+T_PCS_USB_INFO s_tUsbInfo =

+{

+    '0',     // print prompt after receiving

+     0,      // baudrate: 0

+    '8',     // databit: 8

+    '0',     // debug: off

+    '0',     // echo: off

+    '0',     // flow control: software

+    '0',     // default tty: COM1

+    '0',     // parity: none

+    '1',     // stopbit: 1

+     0       // reserved

+};

+

+

+// ²¨ÌØÂÊת»¯×ª»»º¯Êý

+static int32_t iFnConvbaud(int32_t iBaudrate)

+{

+    //PC_SERVER_LOG();

+

+    switch(iBaudrate)

+    {

+        case 2400:

+            return B2400;

+        case 4800:

+            return B4800;

+        case 9600:

+            return B9600;

+        case 19200:

+            return B19200;

+        case 38400:

+            return B38400;

+        case 57600:

+            return B57600;

+        case 115200:

+            return B115200;

+        default:

+            return B9600;

+    }

+}

+

+// ²¨ÌØÂÊ·´×ª»¯×ª»»º¯Êý

+static int32_t iFnBaudconv(int32_t Baudrate)

+{

+    switch(Baudrate)

+    {

+        case B2400:

+            return 2400;

+        case B4800:

+            return 4800;

+        case B9600:

+            return 9600;

+        case B19200:

+            return 19200;

+        case B38400:

+            return 38400;

+        case B57600:

+            return 57600;

+        case B115200:

+            return 115200;

+        default:

+            return 9600;

+    }

+}

+

+// ÉèÖö˿ÚÐÅÏ¢¡£iFdCom: ´®¿ÚÎļþÃèÊö·û, ptPortInfo: ´ýÉèÖõĶ˿ÚÐÅÏ¢¡£

+void vFnSetUsbInfo(int32_t iFdCom, const PT_PCS_USB_INFO ptPortInfo, USB_PORT_MODE usbPortMode)

+{

+    struct termios tOldTermios = {0}, tNewTermios = {0};

+    int32_t iBaudrate = 0;

+    char cDatabit = 0, cStopbit = 0, cParity = 0, cFctl = 0;

+

+    //PC_SERVER_LOG();

+

+    bzero(&tOldTermios, sizeof(tOldTermios));

+    bzero(&tNewTermios, sizeof(tNewTermios));

+    cfmakeraw(&tNewTermios);

+    tcgetattr(iFdCom, &tOldTermios); // get the serial port attributions

+    /*------------ÉèÖö˿ÚÊôÐÔ----------------*/

+	if(usbPortMode == AUTO_MODE)

+	{

+	    iBaudrate = cfgetispeed(&tOldTermios);

+	}

+	else

+	{

+        iBaudrate = iFnConvbaud(ptPortInfo->iBaudrate);

+        tcflush(iFdCom, TCIOFLUSH);

+        cfsetispeed(&tOldTermios, iBaudrate); //ÌîÈë´®¿ÚÊäÈë¶Ë²¨ÌØÂÊ

+        cfsetospeed(&tOldTermios, iBaudrate); //ÌîÈë´®¿ÚÊä³ö¶Ë²¨ÌØÂÊ

+        if(tcsetattr(iFdCom, TCSANOW, &tOldTermios) != 0)  //ÉèÖÃÐÂÊôÐÔ, TCSANOW: ËùÓɸıäÁ¢¼´ÉúЧ

+        {

+            return;

+        }

+        tcflush(iFdCom, TCIOFLUSH);

+        return;

+	}

+    cfsetispeed(&tNewTermios, iBaudrate); //ÌîÈë´®¿ÚÊäÈë¶Ë²¨ÌØÂÊ

+    cfsetospeed(&tNewTermios, iBaudrate); //ÌîÈë´®¿ÚÊä³ö¶Ë²¨ÌØÂÊ

+    tNewTermios.c_cflag |= CLOCAL;       //¿ØÖÆÄ£Ê½, ±£Ö¤³ÌÐò²»»á³ÉΪ¶Ë¿ÚµÄÕ¼ÓÐÕß

+    tNewTermios.c_cflag |= CREAD;        //¿ØÖÆÄ£Ê½, ʹÄܶ˿ڶÁÈ¡ÊäÈëµÄÊý¾Ý

+    // ¿ØÖÆÄ£Ê½, flow control

+    cFctl = ptPortInfo->cFctl;

+    switch(cFctl)

+    {

+        case '0':

+            {

+                tNewTermios.c_cflag &= ~CRTSCTS;        //no flow control

+            }break;

+        case '1':

+            {

+                tNewTermios.c_cflag |= CRTSCTS;         //hardware flow control

+            }break;

+        case '2':

+            {

+                tNewTermios.c_iflag |= IXON | IXOFF | IXANY;    //software flow control

+            }break;

+        default:

+            {

+                break;

+            }

+    }

+    // ¿ØÖÆÄ£Ê½, data bits

+    tNewTermios.c_cflag &= ~CSIZE; //¿ØÖÆÄ£Ê½, ÆÁ±Î×Ö·û´óСλ

+    cDatabit = ptPortInfo->cDatabit;

+    switch(cDatabit)

+    {

+        case '5':

+            tNewTermios.c_cflag |= CS5;

+            // lint -fallthrough

+        case '6':

+            tNewTermios.c_cflag |= CS6;

+            // lint -fallthrough

+        case '7':

+            tNewTermios.c_cflag |= CS7;

+            // lint -fallthrough

+        default:

+            tNewTermios.c_cflag |= CS8;

+    }

+    // ¿ØÖÆÄ£Ê½ parity check

+    cParity = ptPortInfo->cParity;

+    switch(cParity)

+    {

+        case '0':

+            {

+                tNewTermios.c_cflag &= ~PARENB; //no parity check

+            }break;

+        case '1':

+            {

+                tNewTermios.c_cflag |= PARENB;  //odd check

+                tNewTermios.c_cflag &= ~PARODD;

+            }break;

+        case '2':

+            {

+                tNewTermios.c_cflag |= PARENB;  //even check

+                tNewTermios.c_cflag |= PARODD;

+            }break;

+        default:

+            {

+                break;

+            }

+    }

+    // ¿ØÖÆÄ£Ê½, stop bits

+    cStopbit = ptPortInfo->cStopbit;

+    if('2' == cStopbit)

+    {

+        tNewTermios.c_cflag |= CSTOPB;

+    }

+    else

+    {

+        tNewTermios.c_cflag &= ~CSTOPB;

+    }

+    // other attributions default

+    tNewTermios.c_oflag &= ~OPOST;            //Êä³öģʽ, ԭʼÊý¾ÝÊä³ö

+    tNewTermios.c_cc[VMIN] = 1;               //¿ØÖÆ×Ö·û, ËùÒª¶ÁÈ¡×Ö·ûµÄ×îСÊýÁ¿

+    tNewTermios.c_cc[VTIME] = 1;              //¿ØÖÆ×Ö·û, ¶ÁÈ¡µÚÒ»¸ö×Ö·ûµÄµÈ´ýʱ¼ä£¬unit: (1/10)second

+    tcflush(iFdCom, TCIFLUSH);                //Òç³öµÄÊý¾Ý¿ÉÒÔ½ÓÊÕ,µ«²»¶Á

+    tcsetattr(iFdCom, TCSANOW, &tNewTermios); //ÉèÖÃÐÂÊôÐÔ, TCSANOW: ËùÓɸıäÁ¢¼´ÉúЧ

+    tcgetattr(iFdCom, &tOldTermios);

+}

+

+static int32_t vFnPortEchoType(int32_t fdcom, int32_t echoType)

+{

+	struct termios termios_old;

+	int32_t setResult = 0;

+    

+	bzero(&termios_old, sizeof(termios_old));

+	tcgetattr(fdcom, &termios_old);         //get the serial port attributions

+	/*------------ÉèÖö˿ÚÊôÐÔ----------------*/

+    if(echoType == OPENECHO)

+    {

+        termios_old.c_lflag |= ECHO;          //±¾µØÄ£Ê½ÉèÖûØÏÔ

+        //termios_old.c_lflag |= ECHONL;

+    }

+    else

+    {

+        termios_old.c_lflag &= ~ECHO;          //±¾µØÄ£Ê½¹Ø±Õ»ØÏÔ

+        //termios_old.c_lflag &= ~ECHONL;

+    }

+	

+	tcflush(fdcom, TCIFLUSH);           //Òç³öµÄÊý¾Ý¿ÉÒÔ½ÓÊÕ,µ«²»¶Á

+	setResult = tcsetattr(fdcom, TCSANOW, &termios_old);  //ÉèÖÃÐÂÊôÐÔ, TCSANOW: ËùÓɸıäÁ¢¼´ÉúЧ

+	return setResult;

+}

+

+int ziprSet_req(int at_fd, char *at_paras,void ** res_msg, int *res_msglen)

+{

+    char*  at_str = NULL;

+    int32_t iBaudrate = 0;

+    char strAtReplyCmd[AT_CMD_MAX] = {0};

+	

+	if(at_paras==NULL)

+   		softap_assert("ziprSet_req:at_paras is null");

+		

+	at_str = at_paras;

+    get_at_cmd_param_int(at_str, &iBaudrate, &at_str);

+    at_print(AT_DEBUG,"ziprSet_rsq:iBaudrate == %d\n", iBaudrate);

+	if (iBaudrate < 0 || iBaudrate > INT_MAX-1) //kw 3

+		iBaudrate = 0;

+	s_tUsbInfo.iBaudrate = iBaudrate;

+	sleep(0.002);

+    vFnSetUsbInfo(at_fd, &s_tUsbInfo, SET_MODE);

+    sprintf(strAtReplyCmd,"%d", iBaudrate);

+	*res_msg = at_query_result_build("IPR",strAtReplyCmd);

+	*res_msglen = strlen(*res_msg);

+

+    return AT_END;

+}

+

+int ziprGet_req(int at_fd, char *at_paras,void ** res_msg, int *res_msglen)

+{

+    struct termios tOldTermios = {0};

+    int32_t iBaudrate = 0;

+    char strAtReplyCmd[AT_CMD_MAX] = {0};

+

+    tcgetattr(at_fd, &tOldTermios); // get the serial port attributions

+    iBaudrate = iFnBaudconv(cfgetispeed(&tOldTermios));

+

+    sprintf(strAtReplyCmd,"%d", iBaudrate);	

+	*res_msg = at_query_result_build("IPR",strAtReplyCmd);

+	*res_msglen = strlen(*res_msg);

+	

+    return AT_END;

+}

+

+int zsetUsb_req(int at_fd, char *at_paras,void ** res_msg, int *res_msglen)

+{

+	int32_t usbMode = -1;

+    char	msgBuf[10] = { 0 };

+    char*  	at_str = NULL;

+	

+    if(at_paras==NULL)

+		softap_assert("zsetUsb_req:at_paras is null");

+	at_str = at_paras;

+    get_at_cmd_param_int(at_str, &usbMode, &at_str);

+    at_print(AT_DEBUG,"zsetUsb_req:usbMode == %d\n", usbMode);

+

+    if(!is_at_cmd_end(at_str))

+    {

+        *res_msg = at_err_build(ATERR_PARAM_INVALID); 

+		*res_msglen = strlen(*res_msg);

+		return AT_END;

+    }

+	

+	if(usbMode != 0 && usbMode != 1)

+	{

+        *res_msg = at_err_build(ATERR_PARAM_INVALID); 

+		*res_msglen = strlen(*res_msg);

+		return AT_END;

+	}

+    

+	snprintf(msgBuf,sizeof(msgBuf)-1,"%d",usbMode); 

+    int result = ipc_send_message(MODULE_ID_AT_CTL, MODULE_ID_USBCFGMNG, MSG_CMD_USBMOD_SETREQ, sizeof(msgBuf), msgBuf,0);

+    at_print(AT_DEBUG,"result == %d\n", result);

+	if(result != 0)

+	{

+        *res_msg = at_err_build(ATERR_PROC_FAILED); 

+		*res_msglen = strlen(*res_msg);

+		return AT_END;	

+	}

+	

+	*res_msg = at_ok_build();

+	*res_msglen = strlen(*res_msg);

+	return AT_END;	

+}

+

+int ate_req_rcv_act(char *at_paras,int at_fd,struct at_context *context)

+{

+    int32_t setResult = 0;

+    char strAtReplyCmd[AT_CMD_MAX] = {0};

+

+    if(atoi(at_paras) == 0 || atoi(at_paras) == 1)

+    {

+//#ifdef GUODIAN

+        if(g_customer_type == CUSTOMER_GUODIAN || g_customer_type == CUSTOMER_NANDIAN)

+        {

+		    at_write(at_fd, "\r\nOK\r\n", strlen("\r\nOK\r\n"));

+        }

+        else

+        {

+//#else

+            if(atoi(at_paras) == 0)

+                setResult = vFnPortEchoType(at_fd, CLOSEECHO);

+            else

+                setResult = vFnPortEchoType(at_fd, OPENECHO);

+            

+            if(setResult != 0)

+            {    	

+                sprintf(strAtReplyCmd,"\r\nERROR: %d\r\n", setResult); 

+                at_write(at_fd, strAtReplyCmd, strlen(strAtReplyCmd));

+            }

+            else

+            {

+                at_write(at_fd, "\r\nOK\r\n", strlen("\r\nOK\r\n"));

+            }

+        }

+//#endif

+        return AT_END;

+    }

+    return AT_CONTINUE;

+}

+

+

+int zudiskstat_req(int at_fd, char *at_paras,void ** res_msg, int *res_msglen)

+{	

+    at_print(AT_ERR, "Enter zudiskstat_req\n");

+	*res_msg = malloc(AT_CMD_PREFIX);

+    assert(*res_msg!=NULL);

+    memset(*res_msg, 0, AT_CMD_PREFIX);

+    sprintf(*res_msg, "AT+ZUDISKSTAT=%s\r", at_paras);

+    at_print(AT_ERR, "*res_msg:%s, len: %d\n", (char *)(*res_msg), strlen(*res_msg));

+	*res_msglen = strlen(*res_msg);

+	return AT_CONTINUE;	

+}

+

+int zudiskstat_rsp( void *rsp_msg, void **ret, int *retlen)

+{

+    *ret = malloc(strlen(rsp_msg)+1);

+    assert(*ret!=NULL);

+    memset(*ret,0,strlen(rsp_msg)+1);

+    memcpy(*ret,rsp_msg,strlen(rsp_msg));

+	*retlen = strlen(*ret);

+    return AT_END;

+}

+

+char *zusbStat_req(void *msg,struct at_context *context)

+{

+    char *at_next=malloc(AT_CMD_PREFIX);

+    assert(at_next!=NULL);

+    memset(at_next,0, AT_CMD_PREFIX);

+    

+    snprintf(at_next, AT_CMD_PREFIX, "AT+USBINQ=%s\r\n", ((MSG_BUF *)msg)->aucDataBuf);

+    return at_next;

+}

+

+//AP²àNVÇå³ý

+int zaprest_req(int at_fd, char *at_paras,void ** res_msg, int *res_msglen)

+{

+    int32_t restMode = 0;

+    char*  at_str = NULL;

+	

+    if(at_paras==NULL)

+		softap_assert("zaprest_req:at_paras is null");

+	at_str = at_paras;

+    get_at_cmd_param_int(at_str, &restMode, &at_str);

+    at_print(AT_DEBUG,"zaprest_req:restMode == %d\n", restMode);

+

+    if(!is_at_cmd_end(at_str))

+    {

+        *res_msg = at_err_build(ATERR_PARAM_INVALID); 

+		*res_msglen = strlen(*res_msg);

+		return AT_END;

+    }

+

+	//µ÷WiFiÌṩµÄ½Ó¿Ú,Çå³ýapËùÓÐnv

+	if(restMode==1)

+    {   

+        //nv_clear(NV_RT2860);

+		sc_cfg_reset();

+    }

+    

+	*res_msg = at_ok_build();	

+	*res_msglen = strlen(*res_msg);

+

+	return AT_END;

+}

+

+int zflowcontrolset_req(int at_fd,char * at_paras,void * *res_msg,int * res_msglen)

+{

+	int cFctl = -1;

+	void *p[1] = {&cFctl};

+

+    parse_param2("%d", at_paras, p);

+    at_print(AT_NORMAL,"zflowcontrolset_req:cFctl = %d\n", cFctl);

+

+	switch(cFctl)

+	{

+		case 0://¹Ø±ÕÁ÷¿Ø

+		{

+			//sc_cfg_set("uart_control","1");

+			sc_cfg_set("uart_ctstrs_enable","");

+			sc_cfg_set("uart_softcontrol_enable","");

+			*res_msg = at_ok_build();

+			*res_msglen = strlen(*res_msg);

+			sc_cfg_save();

+			ipc_send_message(MODULE_ID_AT_CTL,MODULE_ID_MAIN_CTRL, MSG_CMD_RESTART_REQUEST, 0, NULL,0);

+			break;

+		}

+		case 1://¿ªÆôÓ²¼þÁ÷¿Ø

+		{

+			//sc_cfg_set("uart_control","1");

+			sc_cfg_set("uart_ctstrs_enable","1");

+			sc_cfg_set("uart_softcontrol_enable","");

+			*res_msg = at_ok_build();

+			*res_msglen = strlen(*res_msg);

+			sc_cfg_save();

+			ipc_send_message(MODULE_ID_AT_CTL,MODULE_ID_MAIN_CTRL, MSG_CMD_RESTART_REQUEST, 0, NULL,0);

+			break;

+		}

+		case 2://¿ªÆôÈí¼þÁ÷¿Ø

+		{

+			sc_cfg_set("uart_ctstrs_enable","");

+			sc_cfg_set("uart_softcontrol_enable","1");

+			*res_msg = at_ok_build();

+			*res_msglen = strlen(*res_msg);

+			sc_cfg_save();

+			ipc_send_message(MODULE_ID_AT_CTL,MODULE_ID_MAIN_CTRL, MSG_CMD_RESTART_REQUEST, 0, NULL,0);

+			break;

+		}

+		default:

+		{

+			*res_msg = at_err_build(ATERR_PARAM_INVALID);

+			*res_msglen = strlen(*res_msg);

+			break;

+		}

+	}

+	return AT_END;

+}

+

+int zSetgpio_detect_req(int at_fd, char *at_paras,void ** res_msg, int *res_msglen)

+{

+    char*  at_str = NULL;

+    int32_t set_value = 0;

+	int ret = 0;

+	if(at_paras==NULL)

+   		softap_assert("zSetgpio_detect_req:at_paras is null");

+		

+	at_str = at_paras;

+    get_at_cmd_param_int(at_str, &set_value, &at_str);

+    at_print(AT_DEBUG,"zSetgpio_detect_req:set_value = %d\n", set_value);

+

+    if(!is_at_cmd_end(at_str))

+    {

+        *res_msg = at_err_build(ATERR_PARAM_INVALID); 

+		*res_msglen = strlen(*res_msg);

+		return AT_END;

+    }

+	

+	if(set_value < 0 || set_value > 1)

+	{

+        *res_msg = at_err_build(ATERR_PARAM_INVALID); 

+		*res_msglen = strlen(*res_msg);

+		return AT_END;

+	}

+	sc_cfg_set("usb_gpio_detect", (set_value == 1) ? "1" : "0");

+	

+	sc_cfg_save();

+	//write this attr, 

+	ret = writefile(USB_GPIO_DETECT_ENABLE_EXT, (set_value == 1) ? "1" : "0", 1);

+	if(ret < 0)

+		 at_print(AT_DEBUG,"zSetgpio_detect_req:set attr fail \n");

+	*res_msg = at_ok_build();

+	*res_msglen = strlen(*res_msg);

+

+    return AT_END;

+}

+

+int zGetgpio_detect_req(int at_fd, char *at_paras,void ** res_msg, int *res_msglen)

+{

+	char gpio_detect[4] = {0};

+

+	sc_cfg_get("usb_gpio_detect",gpio_detect,sizeof(gpio_detect));

+	

+	*res_msg = at_query_result_build("gpio_detect",gpio_detect);

+	

+	*res_msglen = strlen(*res_msg);

+	

+    return AT_END;

+}

+

+int  ext_dev_ser_regist()

+{   

+    register_serv_func2("ZAPRESET=",0,0,0,zaprest_req,NULL);

+	

+	//ATE»ØÏÔ£¬¶ÔÓÚATE0ºÍATE1£¬ÔÚ¼à¿Øº¯ÊýÖÐÖ±½Ó´¦Àíºó·µ»Ø½á¹û£¬ÆäËûÇé¿öÏÂ͸´«¸øÐ­ÒéÕ»

+	register_fwd_func("ate",ate_req_rcv_act,NULL,NULL);

+

+	//¹Ì¶¨²¨ÌØÂÊÉèÖúͲéѯÃüÁî

+	register_serv_func2("ipr=",0,0,0,ziprSet_req,NULL);	

+	register_serv_func2("ipr?",0,0,0,ziprGet_req,NULL);

+	

+    //Ä£ÄâUSB²å°Î    

+	register_serv_func2("zsetusb=",MODULE_ID_USBCFGMNG,MSG_CMD_USBMOD_SETREQ,0,zsetUsb_req,NULL);

+

+	//CMUXģʽÇл»

+	register_serv_func2("cmux=",MODULE_ID_DRVCOMMNG,MSG_CMD_CMUX_SET_REQ,MSG_CMD_CMUX_SET_RSP,zcmuxSet_req,zcmuxSet_rsp);

+

+	//

+	register_serv_func2("ifc=",0,0,0,zflowcontrolset_req,NULL);

+

+	//GPIO¼ì²âusb²å°ÎÉèÖÃ

+	register_serv_func2("gpio_detect=",0,0,0,zSetgpio_detect_req,NULL);	

+	register_serv_func2("gpio_detect?",0,0,0,zGetgpio_detect_req,NULL);	

+	return 0;

+}

+

+void ext_dev_regist_init()

+{

+	//intercore_ext_clt_regist();

+	ext_dev_ser_regist();

+	

+}

+#endif

+