[Feature][T8TSK-82][AT]The SZZT branch synchronizes 103 AT instructions

Change-Id: Ia356d13cef32910664ae1bc15c31e4748ac453c8
diff --git a/src/lynq/framework/lynq-ril-service/src/factory/lynq_factory.cpp b/src/lynq/framework/lynq-ril-service/src/factory/lynq_factory.cpp
index 1da486b..b1ed3f9 100755
--- a/src/lynq/framework/lynq-ril-service/src/factory/lynq_factory.cpp
+++ b/src/lynq/framework/lynq-ril-service/src/factory/lynq_factory.cpp
@@ -1,4 +1,59 @@
+#include<sys/types.h>
+#include<sys/socket.h>
+#include<unistd.h>
+#include<netinet/in.h>
+#include<arpa/inet.h>
+#include<netdb.h>
+#include<signal.h>
+#include <log/log.h>
+#include <hardware_legacy/power.h>
+#include <vendor-ril/telephony/ril.h>
+#include <telephony/ril_cdma_sms.h>
+
+#include <telephony/record_stream.h>
+#include <utils/SystemClock.h>
+#include <binder/Parcel.h>
+#include <cutils/jstring.h>
+#include <sys/types.h>
+#include <limits.h>
+#include <pwd.h>
+
+#include <stdlib.h>
+#include <stdarg.h>
+
+#include <unistd.h>
+
+#include <errno.h>
+#include <ctype.h>
+#include <alloca.h>
+#include <sys/un.h>
+#include <assert.h>
+#include <netinet/in.h>
+#include <atomic>
+
+#include "utils/String8.h"
+#include "ss.h"
+
+#include "cc.h"
+#include "network.h"
+#include "stk.h"
+
+
+#include "atci/ATCI.h"
+#include "data/data.h"
+#include "data/data_gdbus.h"
+#include "ecall/eCall.h"
+#include "em/em.h"
+#include "sms/sms.h"
+#include "sms/cdma/sms_pdu_cdma.h"
+#include "stateManager/stateManager.h"
+
+
+#include "Radio_capability_switch_util.h"
+
 #include <stdio.h>
+#include <sys/stat.h>
+#include <fcntl.h>
 #include "common.h"
 #include "utils.h"
 #include "Phone_utils.h"
@@ -16,6 +71,8 @@
 int already_gps = 0;
 int enable_nema = 0;
 int sustain = 1;
+char rgmii[32] = {0};
+//char sgmii[32] = {0};
 pthread_t lynq_gps_tid;
 // static pthread_mutex_t s_gps_state_change_mutex = PTHREAD_MUTEX_INITIALIZER;
 // static pthread_cond_t s_gps_change_cond = PTHREAD_COND_INITIALIZER;
@@ -562,7 +619,68 @@
     return 0;
 }
 
+void lynq_sendRequestToMd(int request, int id) {
+    RequestInfo* info = creatRILInfoAndInit(request, INIT, (RIL_SOCKET_ID) ((id)));
+    info->lynqEvent = 1;
+    switch(request){
+        case RIL_REQUEST_DEVICE_IDENTITY:
+        {
+            getDeviceIdentity(1, NULL, (RIL_SOCKET_ID) ((id)), info);
+            break;
+        }
+        case RIL_REQUEST_GET_PREFERRED_NETWORK_TYPE:
+        {
+            getPreferredNetworkType(1, NULL, (RIL_SOCKET_ID) ((id)), info);
+            break;
+        }
+        case RIL_REQUEST_GET_SIM_STATUS:
+        {
+            getIccCardStatus(1, NULL, (RIL_SOCKET_ID) (id), info);
+            break;
+        }
+        case RIL_REQUEST_DATA_REGISTRATION_STATE:
+        {
+            getDataRegistrationState(1, NULL, (RIL_SOCKET_ID) (id), info);
+            break;
+        }
+        case RIL_REQUEST_VOICE_REGISTRATION_STATE:
+        {
+            getVoiceRegistrationState(1, NULL, (RIL_SOCKET_ID) (id), info);
+            break;
+        }
+        case RIL_REQUEST_VOICE_RADIO_TECH:
+        {
+            getVoiceRadioTechnology(1, NULL, (RIL_SOCKET_ID) (id), info);
+            break;
+        }
+        case RIL_REQUEST_OEM_HOOK_RAW:
+        {
+            char* tmp[2] = {"RIL_REQUEST_OEM_HOOK_RAW", "AT+ECAL"};
+            sendATCMD(2, tmp, (RIL_SOCKET_ID) (id), info);
+            break;
+        }
+        case RIL_REQUEST_GET_RADIO_CAPABILITY:
+        {
+            getRadioCapability(1, NULL, (RIL_SOCKET_ID) ((id)), info);
+            break;
+        }
+        default:
+            RLOGE("don't support  %d in init", id);
+            if(info) {
+                free(info);
+            }
+    }
+}
+
 int lynq_get_factory_data(int num,char *argv[MAX_ARGS]){
+    if(!strcmp(argv[1],"AT+CGSN"))
+    {
+        for(int i = 0; i < 2; i++)
+        {
+            lynq_sendRequestToMd(RIL_REQUEST_DEVICE_IDENTITY,i);
+        }
+        //lynq_get_imei(num, argv);
+    }
     if(num < 4)
         return -1;
     // if(!strcmp(argv[3], "wifi")){
diff --git a/src/lynq/framework/lynq-ril-service/src/lynq_at.cpp b/src/lynq/framework/lynq-ril-service/src/lynq_at.cpp
index 6ff642c..87418fd 100755
--- a/src/lynq/framework/lynq-ril-service/src/lynq_at.cpp
+++ b/src/lynq/framework/lynq-ril-service/src/lynq_at.cpp
@@ -6,6 +6,7 @@
 **     LastChange: 2021-09-28 
 **     History: 
 **=============================================================================*/

+#include <string.h>
 #include "lynq_at.h"

 #include "common.h"

 #include "stateManager/stateManager.h"
@@ -32,7 +33,14 @@
 
     //RLOGD("REQUEST: %s ParamterNum:%d", requestToString(request), argc);
     RequestInfo *pRI  = creatRILInfoAndInit(request, UDP, (RIL_SOCKET_ID)(id));

-    pRI->lynqEvent=1;

+    if(!strcmp(argv[1],"AT+CFSN"))
+    {
+        pRI->lynqEvent=2;
+    }
+    else
+    {
+        pRI->lynqEvent=1;

+    }
     printf("Warren test ====> argv[1]=%s\n",argv[1]);

     sendATCMD(2, argv,id,pRI);

     return 0;

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 1b1308d..a8d09b7 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
@@ -3,6 +3,9 @@
 {LYNQ_REQUEST_CGAUTO,"CGAUTO",0},

 {LYNQ_REQUEST_CGACT,"CGACT",4},

 {LYNQ_REQUEST_CGDCONT,"CGDCONT",4},

+/*lei add for clt*/

+{LYNQ_REQUEST_CFSN,"CFSN",7},

+/*lei add for clt*/

 {LYNQ_USER_REQUEST_GNSS,"LYNQGNSS",7},

 {LYNQ_USER_REQUEST_OTHRE,"LYNQOTHER",7},

 {LYNQ_REQUEST_LAPNACT,"LAPNACT",7},

@@ -11,10 +14,16 @@
 {LYNQ_REQUEST_SCREEN_STATE,"SCREEN",7},

 {LYNQ_REQUEST_SEND_LOG_DATA,"LOGS",7},

 {LYNQ_PLAT_LGMDS,"LGMDS",7},

+/*lei add for clt*/

+{LYNQ_REQUEST_RST,"RST",7},

+/*lei add for clt*/

 {LYNQ_REQUEST_RNDIS,"LRNDISHANDLE",7},

 {LYNQ_REQUEST_FACTORY,"LYNQFACTORY",7},

 {LYNQ_REQUEST_LINFO,"LINFO",7},

 {LYNQ_REQUEST_FOTA,"LYNQFOTA",7},

+{LYNQ_REQUEST_FACTORY,"CGSN",7},

+

+

 /*lei add*/

 {LYNQ_REQUEST_CSCLK,"CSCLK",7},

 {LYNQ_REQUEST_MPWRSM,"MPWRSM",7},

diff --git a/src/lynq/framework/lynq-ril-service/src/lynq_commands.h b/src/lynq/framework/lynq-ril-service/src/lynq_commands.h
index adfda0f..ae1d99e 100755
--- a/src/lynq/framework/lynq-ril-service/src/lynq_commands.h
+++ b/src/lynq/framework/lynq-ril-service/src/lynq_commands.h
@@ -12,7 +12,8 @@
 {LYNQ_REQUEST_ELAPNACT,"RIL_REQUEST_SETUP_DATA_CALL","ELAPNACT",setupData_e,NULL},
 {LYNQ_USER_REQUEST_GNSS,NULL,"LYNQGNSS",NULL,lynqGnss},
 {LYNQ_USER_REQUEST_OTHRE,NULL,"LYNQOTHER",NULL,lynqOther},
-{LYNQ_REQUEST_SWITCH_SIM,"SET_DEFAULT_SIM_ALL","LCSUS",switchSim,NULL},
+{LYNQ_REQUEST_SWITCH_SIM,"SET_DEFAULT_SIM_ALL","LCSUS",lynq_dsds_support,NULL},
 {LYNQ_REQUEST_SCREEN_STATE,"RIL_REQUEST_SCREEN_STATE","SCREEN",lynq_screen,NULL},
 {LYNQ_PLAT_LGMDS,"LYNQ_PLAT_LGMDS","LGMDS",NULL,getMDstate},
+{LYNQ_REQUEST_RST,"LYNQ_REQUEST_RST","RST",NULL,rst},
 {-1,NULL,NULL,NULL,NULL},
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 9f302c4..258f066 100755
--- a/src/lynq/framework/lynq-ril-service/src/lynq_common.cpp
+++ b/src/lynq/framework/lynq-ril-service/src/lynq_common.cpp
@@ -6,10 +6,12 @@
 **     LastChange: 2021-09-27 
 **     History: 
 **=============================================================================*/
-
+#include <sys/types.h>
+#include <signal.h>
 #include <stdio.h>
 #include <string.h>
 #include <log/log.h>
+#include <fcntl.h>
 #include "lynq_common.h"
 #include "lynq_user.h"
 #include "common.h"
@@ -18,6 +20,7 @@
 #include <liblog/lynq_deflog.h>
 #include <sys/time.h>
 #include "Phone_utils.h"
+#include "pms/lynq_pms.h"
 usb_cmd_t Usb_commands[] = {
 #include "lynq_commands.h"
 };
@@ -39,6 +42,9 @@
 int g_lynq_csclk = 0;
 int g_lynq_mpwrsm = 0;//at+mpwrsm need
 int g_lynq_mwakeupcfg = 0;//at+mwakeupcfg need
+int sleep_flag = 0;
+extern pms_manager * g_pmsManagement;
+int sleep_end = 0;
 /*lei add for PMS szzt*/
 
 //int lynqSendToRil(int argc,char *argv[],int uToken);
@@ -81,6 +87,7 @@
         case LYNQ_REQUEST_GMI:
         case LYNQ_REQUEST_CGACT:
         case LYNQ_REQUEST_CGDCONT:
+        case LYNQ_REQUEST_CFSN:
         {
              return LYNQ_GOTO_AT;
         }
@@ -106,6 +113,7 @@
         }
         case LYNQ_USER_REQUEST_GNSS:
         case LYNQ_USER_REQUEST_OTHRE:
+        case LYNQ_REQUEST_RST:
         case LYNQ_PLAT_LGMDS:
         {
             return LYNQ_GOTO_USER_REQ;
@@ -143,7 +151,7 @@
     int len = 0;
     if(error_code==0)
     {
-        len = write(ttyGS3_fd,"OK\n",3);
+        len = write(ttyGS3_fd,"\nOK\n",4);
     }
     else
     {
@@ -495,21 +503,58 @@
     }
     return 0;
 }
-int switchSim(int argc,char*argv[],char *rilReq, int uToken)
+
+static void lynq_get_current_card(void)
+{
+    int id = get_default_sim_all();
+    lynq_output_info("+LCSUS: %d\n", id);
+    lynq_output_info("OK\n");
+    return;
+}
+
+static void lynq_switch_card(char*argv[], char *rilReq, int uToken)
 {
     int slot = 0;
     int ret = -1;
     char *new_argv[10] = {};
+    slot = atoi(argv[3]);
+    new_argv[0] = (char *)rilReq;
+    new_argv[1] = argv[3];
+    android::lynqSendToRil(2,new_argv,uToken);
+    return;
+}
+
+static void lynq_display_dsds_mode(void)
+{
+    lynq_output_info("+LCSUS: (0-1)\n");
+    lynq_output_info("OK\n");
+    return;
+}
+
+
+int lynq_dsds_support(int argc,char*argv[],char *rilReq, int uToken)
+{
     if(argc < 4)
     {
         RLOGD("parameter error!!!");
         return 1;
     }
-    slot = atoi(argv[3]);
-    new_argv[0] = (char *)rilReq;
-    new_argv[1] = argv[3];
-    android::lynqSendToRil(2,new_argv,uToken);
-    syncRespToUsb(0);
+    int type = atoi(argv[2]);
+    if(type == 2)//get mode
+    {
+        RLOGD("lynq_dsds_support get mode\n");
+        lynq_get_current_card();
+    }
+    else if(type == 0)//set mode
+    {
+        RLOGD("lynq_dsds_support set mode\n");
+        lynq_switch_card(argv, rilReq, uToken);
+    }
+    else if(type == 1)//get list mode
+    {
+        RLOGD("lynq_dsds_support get list mode\n");
+        lynq_display_dsds_mode();
+    }
     return 0;
 }
 
@@ -524,7 +569,7 @@
     }
     while(fgets(buf, 4072, fp) != NULL){}
     pclose(fp);
-    return 0;
+    return NULL;
 }
 
 int lynq_screen(int argc,char*argv[],char *rilReq, int uToken){
@@ -583,10 +628,19 @@
         perror("lynq resp write:");
         return 0;
     }
+    pclose(FP);
     syncRespToUsb(0);
     return 0;
 }
 
+void* rst(int argc,char*argv[],int uToken)
+{
+    syncRespToUsb(0);
+    system("reboot");
+    kill(0, SIGKILL);
+    return 0;
+}
+
 int lynqATWaitWithTime(int time)
 {
     int ret = 0;
@@ -641,66 +695,132 @@
     }
 }
 
+
+
+
+void lynq_switch_card(char *card)
+{
+    char *sim_argv[3] = {};
+    sim_argv[0] = "SET_DEFAULT_SIM_ALL";
+    sim_argv[1] = card;
+    sim_argv[2] = "sleep";
+    android::lynqSendToRil(2,sim_argv,8888);
+    //printf("FUNCIONT %s LINE %d\n", __FUNCTION__, __LINE__);
+    sleep(1);
+    //printf("FUNCIONT %s LINE %d\n", __FUNCTION__, __LINE__);
+    return;
+}
+
+/*
+/**
+ * @brief Switch the card and shut down the modem
+ * 
+ * @param card 0 or 1
+ */
+void lynq_shutdown_modem(void)
+{
+    char *new_argv[2] = {};
+    new_argv[0] = "RIL_REQUEST_SCREEN_STATE";
+    new_argv[1] = "0";
+    android::lynqSendToRil(2,new_argv,77777);
+    //printf("FUNCIONT %s LINE %d\n", __FUNCTION__, __LINE__);
+    return;
+}
+
+void lynq_sendRequestToMd(int request, int id)
+{
+    RequestInfo* info = creatRILInfoAndInit(request, INIT, (RIL_SOCKET_ID) ((id)));
+    switch(request){
+        case RIL_REQUEST_SCREEN_STATE:
+        {
+            char *argv[2] = {0};
+            argv[1] = "0";//default value
+            getScreenState(2, argv, (RIL_SOCKET_ID) ((id)), info);
+            break;
+        }
+        default:
+            RLOGE("don't support  %d in init", id);
+            if(info) {
+                free(info);
+            }
+    }
+}
+
+
 /**
  * @brief auto_suspend
  * @param  argv        [Type]:in     My Param doc
  */
-static void auto_suspend(char *argv)
+void auto_suspend(int argv)
 {
-    if(NULL == argv)
+    system("echo 7 | emdlogger_ctrl");
+    int res = system("echo reg_netsys_srcclkena_mask_b 0 > /sys/power/spm/suspend_ctrl");
+    res = system("echo reg_netsys_infra_req_mask_b 0 > /sys/power/spm/suspend_ctrl");
+    res = system("echo reg_netsys_apsrc_req_mask_b 0 > /sys/power/spm/suspend_ctrl");
+    res = system("echo reg_netsys_vrf18_req_mask_b 0 > /sys/power/spm/suspend_ctrl");
+    res = system("echo reg_netsys_ddr_en_mask_b 0 > /sys/power/spm/suspend_ctrl");
+    for(int i = 0; i < 2; i++)
     {
-        return;
+        lynq_sendRequestToMd(RIL_REQUEST_SCREEN_STATE, i);
     }
-    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);
+    if(argv==1)
+    {
+        //autosleep
+        RLOGD("auto_suspend autosleep");
+        res = system("echo mem > /sys/power/autosleep");
+    }
+    else if (argv==0)
+    {
+        //state
+        RLOGD("state autosleep");
+        res = system("echo mem > /sys/power/state");
+    }
     return;
 }
 
-/**
- * @brief check_pin_level
- * @param  buf              Type:[in]
- * @param  flag             Type:[in]
- * @return int 
- */
-static int check_pin_level(char *buf, int flag)
+void check_autosleep(int testnum)
 {
-    if(NULL == buf)
+    if(ttyGS3_fd != -1)
     {
-        return -1;
+        close(ttyGS3_fd);
     }
-    if(flag > strlen(buf))
+    //sleep(1);//for wait g_lynq_mwakeupcfg change
+    if(!sleep_end)//must be config and need wait autosleep
     {
-        return -1;
-    }
-    char *p = buf;
-    int tmp = 0;
-    while(*p != '\0')
-    {
-        if(tmp != flag)
+        if(g_lynq_mwakeupcfg)//means need autosleep,so wait
         {
-            tmp++;
-            *p ++;
-        }
-        else
-        {
-            if(*p == '1')
+            int i = 50;
+            /*wait*/
+            while (i)
             {
-                return 0;
+                if(sleep_end == 1)
+                {
+                    RLOGD("check_autosleep no need wait\n");
+                    break;
+                }
+                RLOGD("check_autosleep need to wait\n");//reason:1.worst:network is not online need wait 10+1(s);2.autosleep not completed
+                sleep(1);
+                i--;
             }
-            else
-            {
-                return 1;
-            }
+            /*wait*/
+            sleep_end = 1;
+            //printf("g_lynq_mwakeupcfg %d no need to wait\n", g_lynq_mwakeupcfg);
         }
+        
     }
+    else
+    {
+        RLOGD("[%s] sleep_end %d!!!\n",__FUNCTION__,sleep_end);
+    }
+    ttyGS3_fd = open("/dev/ttyGS3",O_RDWR);
+    RLOGD("[%s]ttyGS3_fd %d successfully testnum %d!!!\n",__FUNCTION__,ttyGS3_fd, testnum);
+    if(ttyGS3_fd == -1)
+    {
+        return;
+    }
+    //printf("[%s]open successfully!!!\n",__FUNCTION__);
+    //RLOGD("[%s]open successfully!!!\n",__FUNCTION__);
+    return;
 }
 
 /**
@@ -712,18 +832,25 @@
     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");
+    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
+    buf[31] = '\0';
+    if (strlen(buf) <= 8 ) {
+        return -1;
+    }
+    int i = 0;
+    if (buf[8] == '1')
     {
         pclose(fp);
         return 1;
     }
+    //mean low level
     pclose(fp);
     return 0;//mean 
 }
@@ -787,7 +914,18 @@
     RLOGD("display_set_mode\n");
     if(!strcmp(argv[0], "CSCLK"))
     {
+        
+        if(argv[3] == NULL)
+        {
+            RLOGD("argv[3] == NULL __FUNCTION__ %s __LINE__ %d\n", __FUNCTION__, __LINE__);
+            return;
+        }
         g_lynq_csclk = atoi(argv[3]);
+
+        g_pmsManagement->lynq_write_pms_to_memory(argv[0], g_lynq_csclk);
+
+    
+
         if(g_lynq_csclk == 1)
         {
             /*if dtr is 1, at+mpwrsm will check dtr pin level*/
@@ -798,45 +936,36 @@
             /*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");
+        if(argv[3] == NULL)
+        {
+            RLOGD("argv[3] == NULL __FUNCTION__ %s __LINE__ %d\n", __FUNCTION__, __LINE__);
+            return;
+        }
         g_lynq_mpwrsm = atoi(argv[3]);
-        /*AT+MPWRSM disable*/
+        g_pmsManagement->lynq_write_pms_to_memory(argv[0], g_lynq_mpwrsm);
+        /*AT+MPWRSM state*/
         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]);
+                /*quit sleep mode*/
+                syncRespToUsb(0);
+                auto_suspend(g_lynq_mpwrsm);
             }
             /*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]);
+                    syncRespToUsb(0);
+                    auto_suspend(g_lynq_mpwrsm);
+                    return;
                 }
                 else
                 {
@@ -845,35 +974,38 @@
                 }
                 
             }
-            #if 0
-            /*WAKEUP_IN pin*/
-            else if(g_lynq_csclk == 2)
+            return;
+        }
+        /*AT+MPWRSM autosleep*/
+        else if(!strcmp(argv[3], "1"))
+        {
+            RLOGD("at+MPWRSM begin and value is 1\n");
+            if(g_lynq_csclk == 0)
             {
-                if(g_lynq_wakeup_in == 0)
+                RLOGD("g_lynq_csclk = 0, entry sleep mode, dont't check dtr pin level\n");
+                auto_suspend(g_lynq_mpwrsm);
+                syncRespToUsb(0);
+                return;
+            }
+            /*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("061"))//cat dtr pin level
                 {
-                    /*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");
+                    auto_suspend(g_lynq_mpwrsm);
+                    syncRespToUsb(0);
+                    return;
                 }
-                /*check WAKEUP_IN level*/
-                else if (g_lynq_wakeup_in == 1)
+                else
                 {
-                    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;
-                    }
+                    syncRespToUsb(10);//dtr pin is high level, so can't entry sleep mode
+                    return; 
                 }
             }
-            #endif
         }
+        /*invalid value*/
         else
         {
             syncRespToUsb(100);
@@ -882,9 +1014,16 @@
     }
     else if(!strcmp(argv[0], "MWAKEUPCFG"))
     {
+        if(argv[3] == NULL)
+        {
+            RLOGD("argv[3] == NULL __FUNCTION__ %s __LINE__ %d\n", __FUNCTION__, __LINE__);
+            return;
+        }
         g_lynq_mwakeupcfg = atoi(argv[3]);
+        g_pmsManagement->lynq_write_pms_to_memory(argv[0], g_lynq_mwakeupcfg);
     }
     syncRespToUsb(0);
+    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 5c988ad..a5de38a 100755
--- a/src/lynq/framework/lynq-ril-service/src/lynq_common.h
+++ b/src/lynq/framework/lynq-ril-service/src/lynq_common.h
@@ -66,6 +66,8 @@
 #define LYNQ_REQUEST_CSCLK (LYNQ_VERSION +20)
 #define LYNQ_REQUEST_MPWRSM (LYNQ_VERSION +21)
 #define LYNQ_REQUEST_MWAKEUPCFG (LYNQ_VERSION +22)
+#define LYNQ_REQUEST_CFSN (LYNQ_VERSION +23)
+#define LYNQ_REQUEST_RST (LYNQ_VERSION +25)
 /*lei add*/
 #define LYNQ_USER_REQUEST_GNSS (LYNQ_VERSION +100)
 #define LYNQ_USER_REQUEST_OTHRE (LYNQ_VERSION +101)
@@ -114,11 +116,25 @@
 */
 extern int g_lynq_mwakeupcfg;//at+mwakeupcfg need
 /*lei add for PMS*/
+
+/*
+    Can sleep sign automatically
+*/
+extern int sleep_flag;
+
+/*
+    whether can open ttyGS3
+*/
+extern int sleep_end;
+
 usb_at_transfer_t *lynqFindId(char *cmd);
 usb_cmd_t * lynqFindUsbEvent(char *cmd);
 int transferAtToRequest(char *cmd);
 //argv[2]:0 send,1 list,2 get
 int lynqParseUsbCommand(const char* cmd,char *argv[],char test[],char* parser_buf,int maxArgc);
+void auto_suspend(int argv);
+void check_autosleep(int testnum);
+void lynq_sendRequestToMd(int request, int id);
 
 int routeCmd(int request);
 
@@ -126,7 +142,7 @@
 int dialACall(int argc,char*argv[],char *rilReq, int uToken);
 int setupData(int argc,char*argv[],char *rilReq, int uToken);
 int setupData_e(int argc,char*argv[],char *rilReq, int uToken);
-int switchSim(int argc,char*argv[],char *rilReq, int uToken);
+int lynq_dsds_support(int argc,char*argv[],char *rilReq, int uToken);
 int lynq_screen(int argc,char*argv[],char *rilReq, int uToken);
 void* getMDstate(int argc,char*argv[],int uToken);
 int lynqATWaitWithTime(int time);//time(s)
@@ -136,4 +152,14 @@
 /*lei add for PMS*/
 void lynq_pms(char *argv[]);
 /*lei add for PMS*/
+
+/**
+ * @brief reboot
+ * 
+ * @param argc 
+ * @param argv 
+ * @param uToken 
+ * @return void* 
+ */
+void* rst(int argc,char*argv[],int uToken);
 #endif
diff --git a/src/lynq/framework/lynq-ril-service/src/lynq_ril_service.service b/src/lynq/framework/lynq-ril-service/src/lynq_ril_service.service
index c89731a..86df0f9 100755
--- a/src/lynq/framework/lynq-ril-service/src/lynq_ril_service.service
+++ b/src/lynq/framework/lynq-ril-service/src/lynq_ril_service.service
@@ -9,6 +9,8 @@
 RemainAfterExit=no
 ExecStart=/usr/bin/lynq-ril-service
 Restart=always
+RestartSec=500ms
+StartLimitInterval=0
 User=root
 Group=root
 
diff --git a/src/lynq/framework/lynq-ril-service/src/main.cpp b/src/lynq/framework/lynq-ril-service/src/main.cpp
index 96d5bf9..ca78fb2 100755
--- a/src/lynq/framework/lynq-ril-service/src/main.cpp
+++ b/src/lynq/framework/lynq-ril-service/src/main.cpp
@@ -35,8 +35,14 @@
 #include <sys/file.h>
 #include <sys/stat.h>
 #include <sys/types.h>
-
+#include <signal.h>
 #include "common.h"
+#include "lynq_common.h"
+#include "pms/lynq_pms.h"
+#include "network.h"
+
+#define CHECK_TIME 5 //check whether online
+
 
 extern "C" void RIL_register (const RIL_RadioFunctions *callbacks);
 
@@ -55,13 +61,110 @@
 #undef LOG_TAG
 #define LOG_TAG "DEMO_MAIN"
 
+
 static struct RIL_Env s_rilEnv = {
     RIL_onRequestComplete,
     RIL_onUnsolicitedResponse,
     NULL
 };
 
+
+
+
+
+extern int sleep_flag;
+
+extern pms_manager * g_pmsManagement;
+
+void signal_handler_fun(int signum) {
+    RLOGD("signal_handler_fun catch signal %d\n", signum);
+    check_autosleep(signum);
+    return;
+}
+
+static void query_network_state(int request, int slot)
+{
+    RequestInfo* info = creatRILInfoAndInit(request, INIT, (RIL_SOCKET_ID) ((slot)));
+    switch (request)
+    {
+    case RIL_REQUEST_DATA_REGISTRATION_STATE:
+        /* code */
+        getDataRegistrationState(1, NULL, (RIL_SOCKET_ID) (slot), info);
+        break;
+    case RIL_REQUEST_VOICE_REGISTRATION_STATE:
+        /* code */
+        getVoiceRegistrationState(1, NULL, (RIL_SOCKET_ID) (slot), info);
+        break;
+    default:
+        break;
+    }
+    return;
+}
+
+/**
+ * @brief 1 means can go to autosleep
+ * 
+ * @return int 
+ */
+static int lynq_ensure_online(void)
+{
+    #if 0
+    /*ensure inject 2G/3G/4G*/
+    int slot_id = get_default_sim_all(); 
+    int i = 10;
+    while (i)
+    {
+        if(!sleep_flag)
+        {
+            RLOGD("function %s no network\n", __FUNCTION__);
+        }
+        else
+        {
+            RLOGD("%s network is online\n", __FUNCTION__);
+            break;
+        }
+        //query_network_state(RIL_REQUEST_DATA_REGISTRATION_STATE, slot_id);
+        query_network_state(RIL_REQUEST_VOICE_REGISTRATION_STATE, slot_id);
+        sleep(1);
+        i--;
+    }
+    #endif
+    return 1;
+}
+
+void lynq_goto_sleep(void)
+{
+    if(lynq_ensure_online())//ensure online
+    {
+        if(g_lynq_mwakeupcfg != 0)//means user must be configed it
+        {
+            RLOGD("means user must be configed it go to sleep\n");
+            sleep(5);//for too early to send command cause fail
+            auto_suspend(g_lynq_mpwrsm);
+            //sleep(4);
+        }
+    }
+    else
+    {
+        RLOGD("can't autosleep because network is unreable %d\n", sleep_flag);
+    }
+    sleep_end = 1;
+    return;
+}
+
+
+
 int main(int argc, char **argv) {
+    system("route add -host 255.255.255.255 dev lo");
+    signal(SIGHUP,signal_handler_fun);
+    /*get pro*/
+    lynq_init_pms_manager();
+    g_pmsManagement->lynq_read_pms_from_memory("MPWRSM", &g_lynq_mpwrsm);
+    g_pmsManagement->lynq_read_pms_from_memory("CSCLK", &g_lynq_csclk);
+    g_pmsManagement->lynq_read_pms_from_memory("MWAKEUPCFG", &g_lynq_mwakeupcfg);
+    RLOGD("g_lynq_mpwrsm %d\n", g_lynq_mpwrsm);
+    RLOGD("CSCLK %d\n", g_lynq_csclk);
+    RLOGD("MWAKEUPCFG %d\n", g_lynq_mwakeupcfg);
     int lock_file = open("/tmp/tel_demo_single_proc.lock", O_CREAT|O_RDWR, 0666);
     int rc = flock(lock_file,LOCK_EX|LOCK_NB);
     if(rc) {
@@ -113,6 +216,7 @@
     android::startGdbusLoop();
     RLOGD("RIL_Init RIL_register completed");
     printf("DemoApp launch done!\n");
+    lynq_goto_sleep();
     while (true) {
         sleep(UINT32_MAX);
     }
diff --git a/src/lynq/framework/lynq-ril-service/src/makefile b/src/lynq/framework/lynq-ril-service/src/makefile
index f407000..10132c9 100755
--- a/src/lynq/framework/lynq-ril-service/src/makefile
+++ b/src/lynq/framework/lynq-ril-service/src/makefile
@@ -67,6 +67,7 @@
   -I$(LOCAL_PATH)/rndis \
   -I$(LOCAL_PATH)/factory \
   -I$(LOCAL_PATH)/log \
+  -I$(LOCAL_PATH)/pms \
   -I$(ROOT)$(includedir)/logger \
   -I$(ROOT)$(includedir)/liblog \
   -I$(ROOT)$(includedir)/include  \
@@ -119,7 +120,7 @@
 endif
 
 
-SOURCES = $(wildcard util/*.cpp *.cpp ecall/*.cpp ecall/gost/*.cpp ecall/gost/utils/*.cpp ecall/gost/sslp/*.cpp ecall/gost/sslp/auth/*.cpp ecall/gost/sslp/firmware/*.cpp ecall/gost/sslp/commands/*.cpp ecall/gost/sslp/ecall/*.cpp ecall/gost/sslp/teledata/*.cpp data/*.cpp  em/rfdesense/*.cpp em/networkinfo/*.cpp em/*.cpp sms/*.cpp sms/gsm/*.cpp sms/cdma/*.cpp atci/*.cpp stateManager/*.cpp sms/lynqSmsManager/*.cpp  rndis/*.cpp factory/*.cpp log/*.cpp)
+SOURCES = $(wildcard util/*.cpp *.cpp ecall/*.cpp ecall/gost/*.cpp ecall/gost/utils/*.cpp ecall/gost/sslp/*.cpp ecall/gost/sslp/auth/*.cpp ecall/gost/sslp/firmware/*.cpp ecall/gost/sslp/commands/*.cpp ecall/gost/sslp/ecall/*.cpp ecall/gost/sslp/teledata/*.cpp data/*.cpp  em/rfdesense/*.cpp em/networkinfo/*.cpp em/*.cpp sms/*.cpp sms/gsm/*.cpp sms/cdma/*.cpp atci/*.cpp stateManager/*.cpp sms/lynqSmsManager/*.cpp  rndis/*.cpp factory/*.cpp log/*.cpp pms/*.cpp)
 
 EXECUTABLE = lynq-ril-service
 
diff --git a/src/lynq/framework/lynq-ril-service/src/pms/lynq_pms.cpp b/src/lynq/framework/lynq-ril-service/src/pms/lynq_pms.cpp
new file mode 100755
index 0000000..e17c7df
--- /dev/null
+++ b/src/lynq/framework/lynq-ril-service/src/pms/lynq_pms.cpp
@@ -0,0 +1,349 @@
+#include "lynq_pms.h"

+

+enum

+{

+    NO_INFO = 2,

+    GET_INFO = 1,

+    NOT_FIND =0

+};

+

+int pms_check_res = NOT_FIND;

+

+char pmp_content[128] = {0};

+

+pms_manager *g_pmsManagement;

+

+pms_manager:: ~ pms_manager(){}

+

+int read_pms_from_memory_cb(void *data, int argc, char **argv, char **azColName)

+{

+    return 0;

+}

+

+/**

+ * @brief Check whether the ID exists in the database

+ * 

+ * @param index 

+ * @return int 

+ * find:turn 1 

+ * not find:turn 0

+ */

+int pms_manager::lynq_check_function(char *function)

+{

+    memset(pmp_content,0,128);

+    strcpy(pmp_content, function);

+    char *zErrMsg = 0;

+    int rc;

+    char sql[128]={0};

+    /* Open database */

+    rc = sqlite3_open(PMS_DB_PATH, &pmsDb);

+    if( rc )

+    {

+        //printf("[%s] Can't open database: %s\n", __FUNCTION__,sqlite3_errmsg(pmsDb));

+        return LYNQ_E_PMS_DB_FAIL;

+    }

+    sprintf(sql,"%s", "SELECT * FROM LYNQPMS W");

+    char **dbResult; 

+    int nRow=-1, nColumn=-1;

+    int i,j;

+    int rdy = 0;

+    rc = sqlite3_get_table(pmsDb,sql,&dbResult,&nRow,&nColumn,&zErrMsg); 

+    if( rc != SQLITE_OK )

+    {

+        //printf("SQL error: %s\n", zErrMsg);

+        sqlite3_free_table(dbResult);

+        sqlite3_free(zErrMsg);

+        sqlite3_close(pmsDb);

+        return LYNQ_E_PMS_DB_FAIL;

+    }

+    //printf("[%s] %s row %d\n", __FUNCTION__,sqlite3_errmsg(pmsDb),nRow);

+    int index = nColumn;

+    if(nRow == 0)

+    {

+        pms_check_res = NO_INFO;

+    }

+    else

+    {

+        for(i = 0; i < nRow; i++)

+        {

+            for(j = 0; j < nColumn; j++)

+            {

+                //printf("j:%s : index:%s\n", dbResult[j],dbResult[index]);

+                if(!strcmp(dbResult[index],function))

+                {

+                    pms_check_res = GET_INFO;

+                    rdy = 1;

+                    break;

+                }

+                index++;

+            }

+        }

+        if(!rdy)

+        {

+            pms_check_res = NOT_FIND; 

+        }

+    }

+    sqlite3_free_table(dbResult);

+    sqlite3_free(zErrMsg);

+    sqlite3_close(pmsDb);

+    return 0;

+}

+

+int pms_manager::lynq_write_pms_to_pms_db(char *function, int state)

+{

+    char *zErrMsg = 0;

+    int rc;

+    char sql[128]={0};

+    //printf("function %s %s\n", __FUNCTION__, function);

+

+    if(!lynq_check_function(function))

+    {

+        rc = sqlite3_open(PMS_DB_PATH, &pmsDb);

+        if( rc )

+        {

+            //printf("[%s] Can't open database: %s\n", __FUNCTION__,sqlite3_errmsg(pmsDb));

+            return LYNQ_E_PMS_DB_FAIL;

+        }

+        //printf("[%s] Opened database successfully\n",__FUNCTION__);

+        if(NO_INFO == pms_check_res)//insert

+        {

+            //printf("insert SQL %s rc %d\n", zErrMsg, rc);

+       

+            sprintf(sql,"INSERT INTO LYNQPMS (ID,FUNCTION,STATUS,NUMBER) VALUES (NULL,'%s',%d,%d);",function,state,1);

+            rc = sqlite3_exec(pmsDb, sql, NULL, NULL, &zErrMsg);

+            if( rc != SQLITE_OK )

+            {

+                //printf("SQL error: %s rc %d\n", zErrMsg, rc);

+                sqlite3_free(zErrMsg);

+                sqlite3_close(pmsDb);

+                return LYNQ_E_PMS_DB_FAIL;

+            }

+        }

+        else if (GET_INFO == pms_check_res)//update

+        {

+            //printf("update SQL %s rc %d\n", zErrMsg, rc);

+            /*update*/

+            sprintf(sql,"%s%d%s%s%s","UPDATE LYNQPMS set STATUS = ",state," WHERE FUNCTION='",function,"'");

+            rc = sqlite3_exec(pmsDb, sql, NULL, NULL, &zErrMsg);

+            if( rc != SQLITE_OK )

+            {

+                //printf("SQL error: %s rc %d\n", zErrMsg, rc);

+                sqlite3_free(zErrMsg);

+                sqlite3_close(pmsDb);

+                return LYNQ_E_PMS_DB_FAIL;

+            }

+        }

+        else if(NOT_FIND == pms_check_res)//insert

+        {

+            //printf("not find %s rc %d\n", zErrMsg, rc);

+            //printf("insert SQL %s rc %d\n", zErrMsg, rc);

+       

+            sprintf(sql,"INSERT INTO LYNQPMS (ID,FUNCTION,STATUS,NUMBER) VALUES (NULL,'%s',%d,%d);",function,state,1);

+            rc = sqlite3_exec(pmsDb, sql, NULL, NULL, &zErrMsg);

+            if( rc != SQLITE_OK )

+            {

+                //printf("SQL error: %s rc %d\n", zErrMsg, rc);

+                sqlite3_free(zErrMsg);

+                sqlite3_close(pmsDb);

+                return LYNQ_E_PMS_DB_FAIL;

+            }

+        }

+        

+    }

+    sqlite3_close(pmsDb);

+    return LYNQ_E_PMS_DB_OK;

+

+}

+

+int pms_manager::lynq_write_pms_to_memory(char *function, int state)

+{

+    

+    lynq_write_pms_to_pms_db(function,state);

+    return LYNQ_E_PMS_DB_OK;

+}

+

+int pms_manager::lynq_read_pms_from_memory(char *function, int *state)

+{

+    char *zErrMsg = 0;

+    int rc;

+    char sql[128]={0};

+    if(!lynq_check_function(function))

+    {

+        rc = sqlite3_open(PMS_DB_PATH, &pmsDb);

+        if( rc )

+        {

+            //printf("[%s] Can't open database: %s\n", __FUNCTION__,sqlite3_errmsg(pmsDb));

+            return LYNQ_E_PMS_DB_FAIL;

+        }

+        //printf("[%s] Opened database successfully\n",__FUNCTION__);

+        if (GET_INFO == pms_check_res)//select

+        {

+            //printf("select SQL %s rc %d\n", zErrMsg, rc);

+            /*update*/

+            //SELECT * FROM LYNQPMS WHERE FUNCTION= 'CSCLK'

+            sprintf(sql,"%s%s%s", "SELECT * FROM LYNQPMS WHERE FUNCTION ='", function, "'");

+            char **dbResult; 

+            int nRow=-1, nColumn=-1;

+            int i,j;

+            int rdy = 0;

+            rc = sqlite3_get_table(pmsDb,sql,&dbResult,&nRow,&nColumn,&zErrMsg); 

+            if( rc != SQLITE_OK )

+            {

+                //printf("SQL error: %s\n", zErrMsg);

+                sqlite3_free_table(dbResult);

+                sqlite3_free(zErrMsg);

+                sqlite3_close(pmsDb);

+                return LYNQ_E_PMS_DB_FAIL;

+            }

+            ////printf("[%s] %s row %d\n", __FUNCTION__,sqlite3_errmsg(pmsDb),nRow);

+            int index = nColumn;

+            if(nRow == 0)

+            {

+                pms_check_res = NO_INFO;

+            }

+            else

+            {

+                for(i = 0; i < nRow; i++)

+                {

+                    for(j = 0; j < nColumn; j++)

+                    {

+                        ////printf("%s:%s\n", dbResult[j],dbResult[index]);

+                        if(!strcmp(dbResult[j],"STATUS"))

+                        {

+                            pms_check_res = GET_INFO;

+                            *state = atoi(dbResult[index]);

+                            rdy = 1;

+                            break;

+                        }

+                        index++;

+                    }

+                }

+                if(!rdy)

+                {

+                    pms_check_res = NOT_FIND; 

+                }

+            }

+            sqlite3_free_table(dbResult);

+            sqlite3_free(zErrMsg);

+            sqlite3_close(pmsDb);

+        }

+

+    }

+    return 0;

+}

+

+int lynq_init_pms_manager()

+{

+    g_pmsManagement = new pms_manager();

+    if(g_pmsManagement==NULL)

+    {

+        RLOGE("init class sms manager fail!!!");

+        exit(EXIT_FAILURE);

+    }

+    RLOGD("init class sms manager success!!!");

+    g_pmsManagement->initpmsManager();

+    return 0;

+}

+

+int has_pms_db_created(char *path,sqlite3* smsDb_l)

+{

+    if (path == NULL || strlen(path) == 0)

+    {

+        //printf("initSmsDb error with null path!");

+        return PMS_DB_ERR;

+    }

+    int rc = sqlite3_open_v2(path, &smsDb_l, SQLITE_OPEN_READWRITE,NULL);

+    if (rc == SQLITE_OK) 

+    {

+        //printf("check init success!");

+        return PMS_DB_READED;

+    } 

+    else 

+    {

+        //printf("db has not create %s!", sqlite3_errmsg(smsDb_l));

+        sqlite3_close_v2(smsDb_l);

+        return PMS_DB_ERR;

+    }

+}

+

+int pms_manager::create_pms_db(char *path)

+{

+    if (path == NULL || strlen(path) == 0) {

+        //printf("initSmsDb error with null path!");

+        return PMS_DB_ERR;

+    }

+    if(PMS_DB_READED==has_pms_db_created(path,pmsDb))

+    {

+        return PMS_DB_READED;

+    }

+    int rc = sqlite3_open(path, &pmsDb);

+    if (rc != SQLITE_OK) {

+        //printf("initDb failed %s", sqlite3_errcode(pmsDb));

+        return PMS_DB_ERR;

+    } else {

+        //printf("create db in %s", path);

+    }

+    sqlite3_close(pmsDb);

+    return PMS_DB_CREATE;

+}

+

+int pms_manager::initpmsManager()

+{

+    int db_ret=0;

+    int table_ret=0;

+    db_ret = create_pms_db(PMS_DB_PATH);

+    if(db_ret==PMS_DB_CREATE)

+    {

+        table_ret = create_pms_table(PMS_DB_PATH);

+        if(table_ret!=0)

+        {

+            //printf("create sms table fail!!!");

+            return 1;

+        }

+    }

+    else if(db_ret==PMS_DB_READED)

+    {

+        //printf("[%s] sms db has be build!!!",__FUNCTION__);

+    }

+    else

+    {

+        //printf("init sms db fail!!!");

+    }

+    return 0;

+}

+

+int pms_manager::create_pms_table(char*path)

+{

+    char *zErrMsg = 0;

+    int rc;

+    char *sql;

+

+    /* Open database */

+    rc = sqlite3_open(path, &pmsDb);

+    if( rc )

+    {

+        RLOGD("[%s] Can't open database: %s\n", __FUNCTION__,sqlite3_errmsg(pmsDb));

+        return 1;

+    }

+    RLOGD("[%s] Opened database successfully\n",__FUNCTION__);

+    /* Create SQL statement */

+    /*lei modify for autosleep 2022/8/25*/

+    sql = "CREATE TABLE LYNQPMS( \

+         ID                       INTEGER PRIMARY KEY AUTOINCREMENT      NOT NULL, \

+         FUNCTION                 NONE                                 NOT NULL, \

+         STATUS            INT                                 NOT NULL, \

+         NUMBER         INT                                 NOT NULL)";

+   /* Execute SQL statement */

+   /*lei modify for autosleep 2022/8/25*/

+    rc = sqlite3_exec(pmsDb, sql, NULL, 0, &zErrMsg);

+    if( rc != SQLITE_OK )

+    {

+        RLOGD("SQL error: %s\n", zErrMsg);

+        sqlite3_free(zErrMsg);

+        sqlite3_close(pmsDb);

+        return 1;

+    }

+    RLOGD("Table LYNQSMS created successfully\n");

+    sqlite3_close(pmsDb);

+    return 0;

+}
\ No newline at end of file
diff --git a/src/lynq/framework/lynq-ril-service/src/pms/lynq_pms.h b/src/lynq/framework/lynq-ril-service/src/pms/lynq_pms.h
new file mode 100755
index 0000000..57796d0
--- /dev/null
+++ b/src/lynq/framework/lynq-ril-service/src/pms/lynq_pms.h
@@ -0,0 +1,39 @@
+#ifndef __LYNQ_PMS__

+#define __LYNQ_PMS__

+#include <sqlite3.h>

+#include <log/log.h>

+#include <stdlib.h>

+#include <string.h>

+#include <pthread.h>

+#ifdef __cplusplus

+extern "C" {

+#endif

+

+#define PMS_DB_PATH "/system/etc/tele/pms.db"

+#define LYNQ_E_PMS_DB_OK 0

+#define LYNQ_E_PMS_DB_FAIL -1

+#define PMS_DB_READED 0

+#define PMS_DB_ERR 1

+#define PMS_DB_CREATE 2

+

+class pms_manager

+{

+    public:

+        virtual ~ pms_manager();

+        int initpmsManager();

+        int lynq_write_pms_to_memory(char *function, int state);

+        int lynq_read_pms_from_memory(char *function, int *state);

+    private:

+        int create_pms_db(char *path);

+        int create_pms_table(char*path);

+        int lynq_write_pms_to_pms_db(char *function, int state);

+        int lynq_check_function(char *function);

+        sqlite3* pmsDb;

+};

+extern pms_manager *g_pmsManagement;

+int lynq_init_pms_manager();

+#ifdef __cplusplus

+}

+#endif

+

+#endif
\ No newline at end of file
diff --git a/src/lynq/framework/lynq-ril-service/src/ril.cpp b/src/lynq/framework/lynq-ril-service/src/ril.cpp
index 54d2185..d51720c 100755
--- a/src/lynq/framework/lynq-ril-service/src/ril.cpp
+++ b/src/lynq/framework/lynq-ril-service/src/ril.cpp
@@ -79,6 +79,7 @@
 /*lei add*/
 #include "lynq_at.h"
 #include "lynq_user.h"
+#include "lynq_pms.h"
 #include "lynq_rndis.h"
 #include "lynq_factory.h"
 /*victor add*/
@@ -175,6 +176,7 @@
 /*For at extension to receive at buffer*/
 char *at_buf_ext[MAX_AT_CMD];
 int sockfd = 0;
+int imei_cnt = 0;
 /*lei add*/
 #if RILC_LOG
     static char printBuf[PRINTBUF_SIZE];
@@ -3856,6 +3858,59 @@
     return 0;
 }
 
+/**
+ * @brief EGMR->CFSN
+ * 
+ * @param response 
+ */
+static void lynq_parse_EGMR(void *response)
+{
+    char *ptr = (char *)response;
+    while(*ptr != '\0')
+    {
+        *ptr++;
+        if(*ptr == 'E')
+        {
+            *ptr = 'C';
+        }
+        if(*ptr == 'G')
+        {
+            *ptr = 'F';
+        }
+        if(*ptr == 'M')
+        {
+            *ptr = 'S';
+        }
+        if(*ptr == 'R')
+        {
+            *ptr = 'N';
+        }
+        if(*ptr == ':')
+        {
+            break;
+        }
+
+    }
+    return;
+}
+
+/**
+ * @brief To handle comma-separated strings, take the character before the first comma  eg:123456,78 ->123456
+ * 
+ * @param buf Type:[IN]
+ */
+static void parse_imei(char buf[])
+{
+    if(NULL == buf)
+    {
+        return;
+    }
+    const char s[2] = ",";
+    char *token;
+    token = strtok(buf, s);
+    return;
+}
+
 extern "C" void
 RIL_onRequestComplete(RIL_Token t, RIL_Errno e, void *response, size_t responselen) {
     RequestInfo *pRI;
@@ -4086,7 +4141,6 @@
                         if(strstr((const char*)response,"+CGMR")){
                             lynq_get_version();
                         }
-                        /*lei add for at+cgmr*/
                         int n = write(ttyGS3_fd,response,responselen);
                         if(n<0)
                         {
@@ -4094,7 +4148,77 @@
                         }
                         printf("n = %d\n",n);
                    }
+                   if(pRI->lynqEvent==2)
+                   {
+                        if(strstr((const char*)response,"+EGMR")){
+                            lynq_parse_EGMR(response);
+                        }
+                        int n = write(ttyGS3_fd,response,responselen);
+                        if(n<0)
+                        {
+                            perror("lynq resp write:");
+                        }
+                        printf("n = %d\n",n);
+                   }
+                   break;
                }
+                /*lei add for AT+CGSN 2022/8/4*/
+                case RIL_REQUEST_DEVICE_IDENTITY:
+                {
+                    int resp_type;
+                    int request;
+                    int slot_id;
+                    int error1;
+                    int num;
+                    char imei[32] = {0};
+                    if(pRI->lynqEvent==1)
+                    {
+                        //printf("lei test %s\n" ,printBuf);
+                        p.setDataPosition(0);
+                        if(p.dataAvail() > 0)
+                        {
+                            p.readInt32(&resp_type);
+                            p.readInt32(&request);
+                            p.readInt32(&slot_id);
+                            p.readInt32(&error1);
+                            if(!error1)
+                            {
+                                p.readInt32(&num);
+                                char * test = strdupReadString(p);
+                                parse_imei(test);
+                                if(imei_cnt % 2 == 0)
+                                {
+                                    sprintf(imei,"%s%s%s", "+CGSN: ", test, "\n");
+                                    int n = write(ttyGS3_fd,imei,strlen(imei));
+                                    if(n<0)
+                                    {
+                                        perror("lynq resp write:");
+                                    }
+                                }
+                                else
+                                {
+                                    sprintf(imei,"%s%s%s", "+CGSN: ", test, "\n");
+                                    int n = write(ttyGS3_fd,imei,strlen(imei));
+                                    if(n<0)
+                                    {
+                                        perror("lynq resp write:");
+                                    }
+                                    char eBuf[64] = {0};
+                                    sprintf(eBuf,"OK\n");
+                                    n = write(ttyGS3_fd,eBuf,strlen(eBuf));
+                                    if(n<0)
+                                    {
+                                        perror("lynq resp write:");
+                                    }
+                                }
+                                free(test);
+                                imei_cnt++;
+                            }
+                        }
+                    }
+                    break;
+                }
+                /*lei add for AT+CGSN 2022/8/4*/
                default:
                    break;
                }
@@ -4515,6 +4639,8 @@
         if(wakeup_result)
         {
             /*RING pin pull low level to wake up host*/
+            system("echo out 4 1 >/sys/devices/platform/10005000.pinctrl/mt_gpio");
+            usleep(120*1000);
             system("echo out 4 0 >/sys/devices/platform/10005000.pinctrl/mt_gpio");
         }
         /*lei add for at+mwakeupcfg szzt*/
@@ -4538,6 +4664,8 @@
         if(wakeup_result)
         {
             /*RING pin pull low level to wake up host*/
+            system("echo out 4 1 >/sys/devices/platform/10005000.pinctrl/mt_gpio");
+            usleep(120*1000);
             system("echo out 4 0 >/sys/devices/platform/10005000.pinctrl/mt_gpio");
         }
         /*lei add for at+mwakeupcfg szzt*/
@@ -6298,7 +6426,7 @@
         printf("open ttyGS3 failure!!!\n");
         //printf("%s\n",strerr(errno));
         perror("--test--");
-        kill(0, SIGKILL);
+        //kill(0, SIGKILL);
     }
     RLOGD("[%s]open %s successfully!!!\n",__FUNCTION__,ttyname(ttyGS3_fd));
     while(1)
diff --git a/src/lynq/framework/lynq-ril-service/src/sim.cpp b/src/lynq/framework/lynq-ril-service/src/sim.cpp
index a6032a2..bcef49d 100755
--- a/src/lynq/framework/lynq-ril-service/src/sim.cpp
+++ b/src/lynq/framework/lynq-ril-service/src/sim.cpp
@@ -42,9 +42,40 @@
 #include "sim.h"
 #include  "common.h"
 #include "Radio_capability_switch_util.h"
+/*Warren add for FAW platform 2021/12/08 start*/
+#include "lynq_common.h"
+/*Warren add for FAW platform 2021/12/08 end*/
 
 #undef LOG_TAG
 #define LOG_TAG "DEMO_SIM"
+/*Warren add for FAW platform 2021/12/08 start*/
+
+static void sendAtTottyGS(int error)
+{
+    char eBuf[64] = {0};
+    bzero(eBuf, 64);
+    if(error==RIL_E_SUCCESS)
+    {
+        sprintf(eBuf,"\nOK\n\0");
+    }
+    else
+    {
+        sprintf(eBuf,"\n+CME ERROR: %d\n\0",error);
+    }
+    if(ttyGS3_fd == -1)
+    {
+        return;
+    }
+    int n = write(ttyGS3_fd,eBuf,strlen(eBuf));//if no usb will block
+    //printf("function %s line %d\n", __FUNCTION__, __LINE__);
+    if(n<0)
+    {
+        //printf("function %s line %d\n", __FUNCTION__, __LINE__);
+        perror("lynq resp write:");
+    }
+    return;
+}
+/*Warren add for FAW platform 2021/12/08 end*/
 
 static char* checkParameters(char* para){
     if (strcasecmp(para, "null") == 0) {
@@ -182,15 +213,36 @@
         free(pRI);
         RLOGD("the paremeters numbers isn't right , so return");
         android::emResultNotify("Set failed.\n");
+        /*Warren add for FAW platform 2021/12/08 start*/
+        //printf("set failed\n");
+        if(argv[2] == NULL)
+        {
+            sendAtTottyGS(2);
+        }
+        /*Warren add for FAW platform 2021/12/08 end*/
         return -1;
     }
 
     if(Radio_capability_switch_util::is_sim_inserted(atoi(argv[1]))) {
         set_default_sim_all(atoi(argv[1]));
         android::emResultNotify("Set successful.\n");
+        /*Warren add for FAW platform 2021/12/08 start*/
+        //printf("set successful\n");
+        if(argv[2] == NULL)
+        {
+            sendAtTottyGS(0);
+        }
+        /*Warren add for FAW platform 2021/12/08 end*/
         free(pRI);
     } else {
         RLOGD("Set default all fail, SIM card absent");
+        /*Warren add for FAW platform 2021/12/08 start*/
+        if(argv[2] == NULL)
+        {
+            sendAtTottyGS(11);
+        }
+        //printf("Set default all fail, SIM card absent\n");
+        /*Warren add for FAW platform 2021/12/08 end*/
         android::emResultNotify("Set default all fail, SIM card absent.\n");
         free(pRI);
     }
diff --git a/src/lynq/framework/lynq-ril-service/src/stateManager/stateManager.cpp b/src/lynq/framework/lynq-ril-service/src/stateManager/stateManager.cpp
index 9e16b5e..93e123c 100755
--- a/src/lynq/framework/lynq-ril-service/src/stateManager/stateManager.cpp
+++ b/src/lynq/framework/lynq-ril-service/src/stateManager/stateManager.cpp
@@ -128,7 +128,15 @@
 int sendATCMD(int argc, char **argv, RIL_SOCKET_ID socket_id, RequestInfo *pRI)
 {
     android::Parcel p;
-    char *cmd = (char *)argv[1];
+    char *cmd = NULL;
+    if(!strcmp(argv[1],"AT+CFSN"))
+    {
+        cmd = "AT+EGMR=0,5";
+    }
+    else
+    {
+        cmd = (char *)argv[1];
+    }
     size_t pos = p.dataPosition();
     if (cmd == NULL){
         RLOGD("sendATCMD:cmd is null\n");