[feature]at of sleep

Change-Id: I89811f7c7284a6d058ec1c8febbd6c03ebd2a775
diff --git a/src/lynq/framework/lynq-ril-service/src/lynq_at_transfer_table.h b/src/lynq/framework/lynq-ril-service/src/lynq_at_transfer_table.h
index 0ee18b9..1b1308d 100755
--- a/src/lynq/framework/lynq-ril-service/src/lynq_at_transfer_table.h
+++ b/src/lynq/framework/lynq-ril-service/src/lynq_at_transfer_table.h
@@ -15,4 +15,9 @@
 {LYNQ_REQUEST_FACTORY,"LYNQFACTORY",7},

 {LYNQ_REQUEST_LINFO,"LINFO",7},

 {LYNQ_REQUEST_FOTA,"LYNQFOTA",7},

+/*lei add*/

+{LYNQ_REQUEST_CSCLK,"CSCLK",7},

+{LYNQ_REQUEST_MPWRSM,"MPWRSM",7},

+{LYNQ_REQUEST_MWAKEUPCFG,"MWAKEUPCFG",7},

+/*lei add*/

 {-1,NULL,0},
\ No newline at end of file
diff --git a/src/lynq/framework/lynq-ril-service/src/lynq_common.cpp b/src/lynq/framework/lynq-ril-service/src/lynq_common.cpp
index a850d03..9f302c4 100755
--- a/src/lynq/framework/lynq-ril-service/src/lynq_common.cpp
+++ b/src/lynq/framework/lynq-ril-service/src/lynq_common.cpp
@@ -35,6 +35,12 @@
 pthread_mutex_t lynq_at_mutex= PTHREAD_MUTEX_INITIALIZER;
 
 
+/*lei add for PMS szzt*/
+int g_lynq_csclk = 0;
+int g_lynq_mpwrsm = 0;//at+mpwrsm need
+int g_lynq_mwakeupcfg = 0;//at+mwakeupcfg need
+/*lei add for PMS szzt*/
+
 //int lynqSendToRil(int argc,char *argv[],int uToken);
 usb_at_transfer_t *lynqFindId(char *cmd)
 {
@@ -78,6 +84,14 @@
         {
              return LYNQ_GOTO_AT;
         }
+        /*lei add szzt*/
+        case LYNQ_REQUEST_CSCLK:
+        case LYNQ_REQUEST_MPWRSM:
+        case LYNQ_REQUEST_MWAKEUPCFG:
+        {
+            return LYNQ_GOTO_PMS;
+        }
+        /*lei add szzt*/
         case LYNQ_REQUEST_ATD:
         case LYNQ_REQUEST_LAPNACT:
         case LYNQ_REQUEST_ELAPNACT:
@@ -236,41 +250,41 @@
         else
         {
             RLOGD("sp test 01");
-            if(!strcmp(cmd, "ATA")){               
-                lynqSetArgv(&(argv[0]),&Point,"ATA");                      
+            if(!strcmp(cmd, "ATA")){
+                lynqSetArgv(&(argv[0]),&Point,"ATA");
                 return 3;
             }
             if(!strcmp(cmd, "AT")){
-                lynqSetArgv(&(argv[0]),&Point,"AT");               
+                lynqSetArgv(&(argv[0]),&Point,"AT");
                 return 3;
             }
             /*UNKNOW*/
             else if(!strncmp(cmd, "ATD", 3)){
-                lynqSetArgv(&(argv[0]),&Point,"ATD");                
+                lynqSetArgv(&(argv[0]),&Point,"ATD");
                 argv[3] = test+3;
                 return 4;
             }
             else if(!strncmp(cmd, "ATE", 3)){
-                lynqSetArgv(&(argv[0]),&Point,"ATE");               
+                lynqSetArgv(&(argv[0]),&Point,"ATE");
                 argv[3] = test+3;
                 return 4;
             }
             else if(!strcmp(cmd, "ATH")){
-                lynqSetArgv(&(argv[0]),&Point,"ATH");               
+                lynqSetArgv(&(argv[0]),&Point,"ATH");
                 return 3;
             }
             else if(!strncmp(cmd, "ATI", 3)){
-                lynqSetArgv(&(argv[0]),&Point,"ATI");               
+                lynqSetArgv(&(argv[0]),&Point,"ATI");
                 argv[3] = test+3;
                 return 4;
             }
             else if(!strncmp(cmd, "ATL", 3)){
-                lynqSetArgv(&(argv[0]),&Point,"ATL");               
+                lynqSetArgv(&(argv[0]),&Point,"ATL");
                 argv[3] = test+3;
                 return 4;
             }
             else if(!strncmp(cmd, "ATO", 3)){
-                lynqSetArgv(&(argv[0]),&Point,"ATO");                
+                lynqSetArgv(&(argv[0]),&Point,"ATO");
                 argv[3] = test+3;
                 return 3;
             }
@@ -278,22 +292,22 @@
             /*
             */
             else if(!strncmp(cmd, "ATQ", 3)){
-                lynqSetArgv(&(argv[0]),&Point,"ATQ");               
+                lynqSetArgv(&(argv[0]),&Point,"ATQ");
                 argv[3] = test+3;
                 return 4;
             }
             else if(!strncmp(cmd, "ATS3", 4)){
-                lynqSetArgv(&(argv[0]),&Point,"ATS3");              
+                lynqSetArgv(&(argv[0]),&Point,"ATS3");
                 argv[3] = test+4;
                 return 4;
             }
             else if(!strncmp(cmd, "ATS4", 4)){
-                lynqSetArgv(&(argv[0]),&Point,"ATS4");              
+                lynqSetArgv(&(argv[0]),&Point,"ATS4");
                 argv[3] = test+4;
                 return 4;
             }
             else if(!strncmp(cmd, "ATS5", 4)){
-                lynqSetArgv(&(argv[0]),&Point,"ATS5");          
+                lynqSetArgv(&(argv[0]),&Point,"ATS5");
                 argv[3] = test+4;
                 return 4;
             }
@@ -301,17 +315,17 @@
             /*
             */
             else if(!strncmp(cmd, "ATS7", 4)){
-                lynqSetArgv(&(argv[0]),&Point,"ATS7");              
+                lynqSetArgv(&(argv[0]),&Point,"ATS7");
                 argv[3] = test+4;
                 return 4;
             }
             else if(!strncmp(cmd, "ATS8", 4)){
-                lynqSetArgv(&(argv[0]),&Point,"ATS8");       
+                lynqSetArgv(&(argv[0]),&Point,"ATS8");
                 argv[3] = test+4;
                 return 4;
             }
             else if(!strncmp(cmd, "ATS10", 5)){
-                lynqSetArgv(&(argv[0]),&Point,"ATS10");      
+                lynqSetArgv(&(argv[0]),&Point,"ATS10");
                 argv[3] = test+5;
                 return 4;
             }
@@ -601,28 +615,300 @@
 {
     int type = atoi(argv[2]);
    
-    if(type==2){                            
-        lynq_output_LINFO_all();     
+    if(type==2){
+        lynq_output_LINFO_all();
         syncRespToUsb(0);
     }
-    else if(type==0){                           
+    else if(type==0){
         int status = atoi(argv[3]);
         if(status==1 || status==0){
             lynq_output_LINFO_enable=status;
-            lynq_output_info("+LINFO: Report switch when key information changed is set: %d\n",lynq_output_LINFO_enable);    
+            lynq_output_info("+LINFO: Report switch when key information changed is set: %d\n",lynq_output_LINFO_enable);
             syncRespToUsb(0);
-        }   
+        }
         else {
-            lynq_output_info("parameter error\n"); 
-            syncRespToUsb(100);    
+            lynq_output_info("parameter error\n");
+            syncRespToUsb(100);
         }
     }
-    else if(type==1){        
-        lynq_output_info("+LINFO: (0-1)\n");         
+    else if(type==1){
+        lynq_output_info("+LINFO: (0-1)\n");   
         syncRespToUsb(0);
     }
-    else {   
-        lynq_output_info("parameter error\n"); 
+    else {
+        lynq_output_info("parameter error\n");
         syncRespToUsb(100);
     }
 }
+
+/**
+ * @brief auto_suspend
+ * @param  argv        [Type]:in     My Param doc
+ */
+static void auto_suspend(char *argv)
+{
+    if(NULL == argv)
+    {
+        return;
+    }
+    char buf[128] = {0};
+    char cmd[64] = {0};
+    sprintf(buf, "%s%s%s", "uci set lynq_uci.lynq_autosuspend.auto_enable=\'", argv, "\'");
+    system(buf);
+    system("commit");
+    system("systemctl stop autosuspend.service");
+    system("systemctl start autosuspend.service");
+    usleep(1000*100);
+    sprintf(cmd, "%s %s", "autosuspend-client-demo", argv);
+    system(cmd);
+    return;
+}
+
+/**
+ * @brief check_pin_level
+ * @param  buf              Type:[in]
+ * @param  flag             Type:[in]
+ * @return int 
+ */
+static int check_pin_level(char *buf, int flag)
+{
+    if(NULL == buf)
+    {
+        return -1;
+    }
+    if(flag > strlen(buf))
+    {
+        return -1;
+    }
+    char *p = buf;
+    int tmp = 0;
+    while(*p != '\0')
+    {
+        if(tmp != flag)
+        {
+            tmp++;
+            *p ++;
+        }
+        else
+        {
+            if(*p == '1')
+            {
+                return 0;
+            }
+            else
+            {
+                return 1;
+            }
+        }
+    }
+}
+
+/**
+ * @brief check_dtr_level 0 is low, 1 is high
+ * @return int 
+ */
+static int cat_pin_level(char *pin)
+{
+    FILE *fp;
+    char buf[32] = {0};
+    char cmd[64] = {0};
+    sprintf(cmd,"%s %s %s", "cat  /sys/devices/platform/10005000.pinctrl/mt_gpio  |grep", pin, "2>&1");
+    fp = popen(cmd, "r");
+    if(NULL == fp)
+    {
+        return -1;
+    }
+    fgets(buf, sizeof(buf), fp);
+    if(!check_pin_level(buf, 7))//mean high level
+    {
+        pclose(fp);
+        return 1;
+    }
+    pclose(fp);
+    return 0;//mean 
+}
+
+/**
+ * @brief display_get_mode
+ * @param  argv      [Type]:in       My Param doc
+ */
+static void display_get_mode(char *argv[])
+{
+    RLOGD("display_get_mode");
+    if(!strcmp(argv[0], "CSCLK"))
+    {
+        lynq_output_info("+CSCLK: %d\n", g_lynq_csclk);
+    }
+    else if(!strcmp(argv[0], "MPWRSM"))
+    {
+        lynq_output_info("+MPWRSM: %d\n", g_lynq_mpwrsm);
+    }
+    else if(!strcmp(argv[0], "MWAKEUPCFG"))
+    {
+        lynq_output_info("+MWAKEUPCFG: %d\n", g_lynq_mwakeupcfg);
+    }
+    syncRespToUsb(0);
+    return;
+}
+
+/**
+ * @brief display_list_modeget_mode
+ * @param  argv      [Type]:in       My Param doc
+ */
+static void display_list_mode(char *argv[])
+{
+    RLOGD("display_list_mode\n");
+    if(!strcmp(argv[0], "CSCLK"))
+    {
+        RLOGD("CSCLK list mode\n");
+        lynq_output_info("+CSCLK: (0-1)\n");
+    }
+    else if(!strcmp(argv[0], "MPWRSM"))
+    {
+        RLOGD("MPWRSM list mode\n");
+        lynq_output_info("+MPWRSM: (0-1)\n");
+    }
+    else if(!strcmp(argv[0], "MWAKEUPCFG"))
+    {
+        RLOGD("MWAKEUPCFG list mode\n");
+        lynq_output_info("+MWAKEUPCFG: (0-1)\n");
+    }
+    RLOGD("get list mode\n");
+    syncRespToUsb(0);
+    return;
+}
+
+/**
+ * @brief display_set_mode
+ * @param  argv      [Type]:in       My Param doc
+ */
+static void display_set_mode(char *argv[])
+{
+    RLOGD("display_set_mode\n");
+    if(!strcmp(argv[0], "CSCLK"))
+    {
+        g_lynq_csclk = atoi(argv[3]);
+        if(g_lynq_csclk == 1)
+        {
+            /*if dtr is 1, at+mpwrsm will check dtr pin level*/
+            RLOGD("dtr is 1, at+mpwrsm will check dtr pin level\n");
+        }
+        else if(g_lynq_csclk == 0)
+        {
+            /*if dtr is 1, at+mpwrsm will't check dtr pin level*/
+            RLOGD("dtr is 0, at+mpwrsm will't check dtr pin level\n");
+        }
+        #if 0
+        else if(g_lynq_csclk == 2)
+        {
+            /*g_lynq_wakeup_in*/
+            g_lynq_wakeup_in = 1;
+        }
+        #endif
+    }
+    else if(!strcmp(argv[0], "MPWRSM"))
+    {
+        RLOGD("at+MPWRSM begin\n");
+        g_lynq_mpwrsm = atoi(argv[3]);
+        /*AT+MPWRSM disable*/
+        if(!strcmp(argv[3], "0"))
+        {
+            auto_suspend(argv[3]);
+        }
+        /*AT+MPWRSM enable*/
+        else if(!strcmp(argv[3], "1"))
+        {
+            RLOGD("at+MPWRSM begin and value is 1\n");
+            if(g_lynq_csclk == 0)
+            {
+                /*if module entry sleep mode, need to pull ring pin high level*/
+                system("echo out 4 1 >/sys/devices/platform/10005000.pinctrl/mt_gpio");
+                RLOGD("g_lynq_csclk = 0, entry sleep mode, dont't check dtr pin level\n");
+                auto_suspend(argv[3]);
+            }
+            /*DTR pin*/
+            else if(g_lynq_csclk == 1)
+            {
+                RLOGD("g_lynq_csclk = 1, entry sleep mode, check dtr pin level\n");
+                /*check dtr level*/
+               
+                if(cat_pin_level("006"))//cat dtr pin level
+                {
+                    /*if module entry sleep mode, need to pull ring pin high level*/
+                    system("echo out 4 1 >/sys/devices/platform/10005000.pinctrl/mt_gpio");
+                    auto_suspend(argv[3]);
+                }
+                else
+                {
+                    syncRespToUsb(10);//dtr pin is low level, so can't entry sleep mode
+                    return; 
+                }
+                
+            }
+            #if 0
+            /*WAKEUP_IN pin*/
+            else if(g_lynq_csclk == 2)
+            {
+                if(g_lynq_wakeup_in == 0)
+                {
+                    /*don't check WAKEUP_IN level*/
+                    auto_suspend(argv[3]);
+                    /*if module entry sleep mode, need to pull ring pin high level*/
+                    system("echo out 4 1 >/sys/devices/platform/10005000.pinctrl/mt_gpio");
+                }
+                /*check WAKEUP_IN level*/
+                else if (g_lynq_wakeup_in == 1)
+                {
+                    if(cat_pin_level("xxx"))
+                    {
+                        auto_suspend(argv[3]);
+                        /*if module entry sleep mode, need to pull ring pin high level*/
+                        system("echo out 4 1 >/sys/devices/platform/10005000.pinctrl/mt_gpio");
+                    }
+                    else
+                    {
+                        syncRespToUsb(10);//WAKEUP_IN pin is low level, so can't entry sleep mode
+                        return;
+                    }
+                }
+            }
+            #endif
+        }
+        else
+        {
+            syncRespToUsb(100);
+            return;
+        }
+    }
+    else if(!strcmp(argv[0], "MWAKEUPCFG"))
+    {
+        g_lynq_mwakeupcfg = atoi(argv[3]);
+    }
+    syncRespToUsb(0);
+}
+
+/**
+ * @brief when user input at of sleep,it will work
+ * @param  argv             My Param doc
+ */
+void lynq_pms(char *argv[])
+{
+    RLOGD("lynq_pms works\n");
+    int type = atoi(argv[2]);
+    if(type == 2)//get mode
+    {
+        RLOGD("get mode\n");
+        display_get_mode(argv);
+    }
+    else if(type == 0)//set mode
+    {
+        RLOGD("set mode\n");
+        display_set_mode(argv);
+    }
+    else if(type == 1)//get list mode
+    {
+        RLOGD("get list mode\n");
+        display_list_mode(argv);
+    }
+    return;
+}
diff --git a/src/lynq/framework/lynq-ril-service/src/lynq_common.h b/src/lynq/framework/lynq-ril-service/src/lynq_common.h
index 513431b..5c988ad 100755
--- a/src/lynq/framework/lynq-ril-service/src/lynq_common.h
+++ b/src/lynq/framework/lynq-ril-service/src/lynq_common.h
@@ -33,6 +33,8 @@
 #define LYNQ_GOTO_LINFO_REQ 7
 /*fota*/
 #define LYNQ_GOTO_FOTA 8
+/*PMS*/
+#define LYNQ_GOTO_PMS 9
 
 #define LYNQ_APN_LEN_MAX 100
 #define LYNQ_APNTPYE_LEN_MAX 50
@@ -60,6 +62,11 @@
 #define LYNQ_REQUEST_LINFO (LYNQ_VERSION +17)
 #define LYNQ_REQUEST_SCREEN_STATE (LYNQ_VERSION +18)
 #define LYNQ_REQUEST_FOTA (LYNQ_VERSION +19)
+/*lei add*/
+#define LYNQ_REQUEST_CSCLK (LYNQ_VERSION +20)
+#define LYNQ_REQUEST_MPWRSM (LYNQ_VERSION +21)
+#define LYNQ_REQUEST_MWAKEUPCFG (LYNQ_VERSION +22)
+/*lei add*/
 #define LYNQ_USER_REQUEST_GNSS (LYNQ_VERSION +100)
 #define LYNQ_USER_REQUEST_OTHRE (LYNQ_VERSION +101)
 
@@ -90,6 +97,23 @@
 extern apn_table_t apn_table[LYNQ_APN_CHANNEL_MAX];
 extern int apn_count;
 extern char lynq_at[LYNQ_AT_LEN_MAX];
+/*lei add for PMS*/
+typedef enum
+{
+    call_event = 1,
+    sms_event = 2
+}lynq_urc_event;
+
+extern int g_lynq_csclk;
+extern int g_lynq_mpwrsm;//at+mpwrsm need
+/* g_lynq_mwakeupcfg explain: 
+0(00):close wakeup external MCU function(default value) 
+1(01):call event wakeup external MCU function
+2(10):sms event wakeup external MCU function
+3(11):call and sms event wakeup external MCU function
+*/
+extern int g_lynq_mwakeupcfg;//at+mwakeupcfg need
+/*lei add for PMS*/
 usb_at_transfer_t *lynqFindId(char *cmd);
 usb_cmd_t * lynqFindUsbEvent(char *cmd);
 int transferAtToRequest(char *cmd);
@@ -109,4 +133,7 @@
 void lynqAtRespWatingEvent();
 int syncRespToUsb(int error_code);
 void lynqInfo(char*argv[]);
+/*lei add for PMS*/
+void lynq_pms(char *argv[]);
+/*lei add for PMS*/
 #endif
diff --git a/src/lynq/framework/lynq-ril-service/src/ril.cpp b/src/lynq/framework/lynq-ril-service/src/ril.cpp
index 0b468c3..74de6c2 100755
--- a/src/lynq/framework/lynq-ril-service/src/ril.cpp
+++ b/src/lynq/framework/lynq-ril-service/src/ril.cpp
@@ -4437,7 +4437,11 @@
     }
 #endif
     appendPrintBuf("[UNSL][SIM%d]< %s", soc_id, requestToString(unsolResponse));
-
+    /*lei add for at+mwakeupcfg*/
+    int call_active = 1;
+    int sms_active = 2;
+    int wakeup_result = 0;
+    /*lei add for at+mwakeupcfg*/
     Parcel p;
     p.writeInt32 (RESPONSE_UNSOLICITED);
     p.writeInt32 (unsolResponse);
@@ -4488,9 +4492,32 @@
 
 //unsol trigger other things.
     switch(unsolResponse) {
-    //case RIL_UNSOL_RESPONSE_CALL_STATE_CHANGED:
+   
+    case RIL_UNSOL_RESPONSE_CALL_STATE_CHANGED:
+        /*warren modify for t800 service start 2021/12/12*/
         //ARspRequest(RIL_REQUEST_GET_CURRENT_CALLS, soc_id);
-        //break;
+        /*warren modify for t800 service start 2021/12/12*/
+        /*lei add for at+mwakeupcfg szzt
+
+        explain:
+        wakeup_result = 0:Mask the reporting of URC events              wakeup_result != 0:Mask URC based on the configuration
+        when g_lynq_mwakeupcfg is 2(binary system is 00000010) ,and sms_event is 2(00000010 bit)
+        00000010 & 00000010 = 00000010(b) = 2
+        2 != 0,so ring pin pull low level to wake up host,otherwise do nothing
+
+        When the g_lynq_mwakeupcfg is set to 1, only phone calls can wake up the host,The sample is as follows
+        00000001 & 00000001 = 00000001
+        00000001 & 00000010 = 00000000
+        */
+        wakeup_result = g_lynq_mwakeupcfg & call_event;
+        if(wakeup_result)
+        {
+            /*RING pin pull low level to wake up host*/
+            system("echo out 4 0 >/sys/devices/platform/10005000.pinctrl/mt_gpio");
+        }
+        /*lei add for at+mwakeupcfg szzt*/
+        break;
+    
     case RIL_UNSOL_CALL_RING:
         callRing(soc_id);
         break;
@@ -4504,6 +4531,14 @@
         responseNewSMS((const char*)data, datalen,soc_id,unsolResponse,p);
         unreadStatusWriteSMSToSim((const char*)data, datalen, soc_id);
         sendSMSACK(soc_id);
+        /*lei add for at+mwakeupcfg szzt*/
+        wakeup_result = g_lynq_mwakeupcfg & sms_event;
+        if(wakeup_result)
+        {
+            /*RING pin pull low level to wake up host*/
+            system("echo out 4 0 >/sys/devices/platform/10005000.pinctrl/mt_gpio");
+        }
+        /*lei add for at+mwakeupcfg szzt*/
         break;
     case RIL_UNSOL_RESPONSE_NEW_BROADCAST_SMS:
     {
@@ -6301,16 +6336,16 @@
             {
                 argc = lynqParseUsbCommand(buffer,argv,tempbuf,buf_parser,MAX_ARGS);
                 if(argc<0)
-                {  
-                bzero(eBuf, 1024);
-                sprintf(eBuf,"LYNQ:%s not support!!!\n",buffer);
-                int n = write(ttyGS3_fd,eBuf,strlen(eBuf));
-                if(n<0)
                 {
-                    perror("lynq resp write:");
-                }
-                RLOGD("n = %d\n",n);
-                continue;
+                    bzero(eBuf, 1024);
+                    sprintf(eBuf,"LYNQ:%s not support!!!\n",buffer);
+                    int n = write(ttyGS3_fd,eBuf,strlen(eBuf));
+                    if(n<0)
+                    {
+                        perror("lynq resp write:");
+                    }
+                    RLOGD("n = %d\n",n);
+                    continue;
                 }
                 usb_at_transfer_t *atCmd = lynqFindId(argv[0]);
                 if(atCmd==NULL)
@@ -6386,11 +6421,17 @@
                     //     lynq_atfota_test(argv);
                     //     break;
                     // }
+                    /*lei add*/
+                    case LYNQ_GOTO_PMS:
+                    {
+                        lynq_pms(argv);
+                        break;
+                    }
+                    /*lei add*/
                     default:
                         break;
                 }
             }
-            
         }
     }
     close(ttyGS3_fd);