[feature]add at service

Change-Id: I04fca1abfa7e324b719e08cd5c0725594e1ecc02
diff --git a/framework/lynq-ril-service/src/common.cpp b/framework/lynq-ril-service/src/common.cpp
index 37e5c41..7c5205d 100755
--- a/framework/lynq-ril-service/src/common.cpp
+++ b/framework/lynq-ril-service/src/common.cpp
@@ -44,6 +44,13 @@
 #undef LOG_TAG
 #define LOG_TAG "DEMO_COMMON"
 
+#define UNKOWN_VALUE  (-1)
+
+/*Warren add for FAW 2021/11/1 start*/
+extern int ttyGS3_fd = -1;
+/*Warren add for FAW 2021/11/1 end*/
+
+
 typedef enum {
     STATE_IN_SERVICE        =0,
     STATE_OUT_OF_SERVICE    =1,
@@ -74,6 +81,114 @@
 
 static std::int32_t token = 0;
 static std::mutex g_mutex;
+/*Warren add for SZZT 2021/11/14 start*
+** record data registration
+*/
+extern int current_data_reg = -1;
+extern int modemStatus = 0;
+
+/*Warren add for SZZT 2021/11/14 end*/
+
+
+/*hq add for key information output start 2022/03/01*/
+// extern int lynq_output_LINFO_enable =0;
+
+// typedef enum {
+//     RADIO_NW_2G = 0,
+//     RADIO_NW_3G = 1,
+//     RADIO_NW_4G = 2, 
+// #ifdef TELEMATIC_5G_SUPPORT
+//     RADIO_NW_5G = 3,    
+// #endif
+// } RIL_RadioNW;
+
+// const char * cardStateToString(int cardStatus)
+// {
+//     switch(cardStatus) {
+//         case RIL_CARDSTATE_ABSENT:
+//             return "absent";
+//         case RIL_CARDSTATE_PRESENT:
+//             return "present";        
+//         case RIL_CARDSTATE_ERROR:
+//             return "error";
+//         default:
+//             return "unknown";
+//     }
+// }
+// const char * serviceStateToString(int service_state)
+// {
+//     switch(service_state) {
+//         case STATE_IN_SERVICE:
+//             return "IN SERVICE";
+//         case STATE_OUT_OF_SERVICE:
+//             return "OUT OF SERVICE";
+//         case STATE_POWER_OFF:
+//             return "POWER_OFF";
+//         case STATE_EMERGENCY_ONLY:
+//             return "EMERGENCY_ONLY";
+//         case UNKOWN_VALUE:
+//             return "unDefined";
+//         default:
+//             return "unDefined";
+//     }
+// }
+// const char * RadioNwToString(int radio_nw)
+// {
+//     switch(radio_nw) {
+//         case RADIO_NW_2G:
+//             return "2G";
+//         case RADIO_NW_3G:
+//             return "3G";
+//         case RADIO_NW_4G:
+//             return "4G";
+// #ifdef TELEMATIC_5G_SUPPORT
+//         case RADIO_NW_5G:
+//             return "5G";
+// #endif
+//         case UNKOWN_VALUE:          
+//             return "unknown";        
+//         default:
+//             return "unknown";
+//     }
+// }
+// const char * preferredNetworkTypeToString(int preferred_network_type)
+// {
+//     switch(preferred_network_type) {
+//         case PREF_NET_TYPE_GSM_WCDMA      /*0*/     :  return " GSM/WCDMA (WCDMA case PREFerred)";
+//         case PREF_NET_TYPE_GSM_ONLY                 :  return " GSM only";
+//         case PREF_NET_TYPE_WCDMA                    :  return " WCDMA ";
+//         case PREF_NET_TYPE_GSM_WCDMA_AUTO           :  return " GSM/WCDMA (auto mode, according to PRL)";
+//         case PREF_NET_TYPE_CDMA_EVDO_AUTO           :  return " CDMA and EvDo (auto mode, according to PRL)";
+//         case PREF_NET_TYPE_CDMA_ONLY                :  return " CDMA only";
+//         case PREF_NET_TYPE_EVDO_ONLY                :  return " EvDo only";
+//         case PREF_NET_TYPE_GSM_WCDMA_CDMA_EVDO_AUTO :  return " GSM/WCDMA, CDMA, and EvDo (auto mode, according to PRL)";
+//         case PREF_NET_TYPE_LTE_CDMA_EVDO            :  return " LTE, CDMA and EvDo";
+//         case PREF_NET_TYPE_LTE_GSM_WCDMA            :  return " LTE, GSM/WCDMA";
+//         case PREF_NET_TYPE_LTE_CMDA_EVDO_GSM_WCDMA  :  return " LTE, CDMA, EvDo, GSM/WCDMA";
+//         case PREF_NET_TYPE_LTE_ONLY                 :  return " LTE only";
+//         case PREF_NET_TYPE_LTE_WCDMA     /*12*/     :  return " LTE/WCDMA";
+//         case PREF_NET_TYPE_LTE_GSM       /*30*/     :  return " LTE/GSM";
+//         case PREF_NET_TYPE_LTE_TDD_ONLY  /*31*/     :  return " LTE only";
+//         case 13:                                       return "TD-SCDMA only"; 
+//         case 14:                                       return "TD-SCDMA and WCDMA"; 
+//         case 15:                                       return "TD-SCDMA and LTE"; 
+//         case 16:                                       return "TD-SCDMA and GSM"; 
+//         case 17:                                       return "TD-SCDMA,GSM and LTE"; 
+//         case 18:                                       return "TD-SCDMA, GSM/WCDMA"; 
+//         case 19:                                       return "TD-SCDMA, WCDMA and LTE";
+//         case 20:                                       return "TD-SCDMA, GSM/WCDMA and LTE"; 
+//         case 21:                                       return "TD-SCDMA,EvDo,CDMA,GSM/WCDMA";
+//         case 22:                                       return "TD-SCDMA/LTE/GSM/WCDMA, CDMA, and EvDo";
+//       //case 30:                                       return "LTE/GSM";
+//       //case 31:                                       return "LTE TDD Only mode";
+//         case 32:                                       return "CDMA,GSM(2G Global)";
+//         case 33:                                       return "CDMA,EVDO,GSM";
+//         case 34:                                       return "LTE,CDMA,EVDO,GSM(4G Global, 4M)";        
+//         default:
+//             return "unDefined";
+//     }
+// }
+/*hq add for key information output end*/
 
 static int regCodeToRadioTechnology(int request, int code, int slot);
 
@@ -437,6 +552,10 @@
     if((reg_data_service_state[slot] != atoi(code)) || ((token&RIL_TOKEN_MARK) == RIL_TOKEN_MARK)) {
         reg_data_service_state[slot] = atoi(code);
         regCodeToServiceState(request, atoi(code), slot);
+        /*Warren change for SZZT 2021//11/14 start*/
+        int status = regCodeToServiceState(request, atoi(code), slot);           
+        current_data_reg = status;       
+        /*Warren change for SZZT 2021//11/14 end*/
     }
 }
 
@@ -824,4 +943,72 @@
         RLOGD("[lynqSocketSendto] send msg fail!!!");
         return -1;
     }
-}
\ No newline at end of file
+}
+/*hq add for key info output 2022/03/01 begin*/
+// void lynq_output_LINFO_all()
+// {
+//     int slot,startSlot=0,slotNum=SIM_COUNT;     
+
+//     if(default_sim_voice==default_sim_data && default_sim_voice==default_sim_sms){
+//         startSlot=default_sim_voice;
+//         slotNum=1;        
+//     }   
+
+//     lynq_output_info("+LINFO: Report switch when key information changed is set: %d\n",lynq_output_LINFO_enable);          
+//     lynq_output_info("+LINFO: Default voice SIM card is set : [SIM%d]\n", default_sim_voice+1);    
+//     lynq_output_info("+LINFO: Default data SIM card is set : [SIM%d]\n", default_sim_data+1);
+//     lynq_output_info("+LINFO: Default sms SIM card is set : [SIM%d]\n", default_sim_sms+1);
+   
+//     for(slot=startSlot;slot<startSlot+slotNum;slot++){   
+//         lynq_output_info("+LINFO: [SIM%d] Card State is %s\n",slot+1,cardStateToString((cur_CardS_Status[slot]!=NULL ? cur_CardS_Status[slot]->card_state:UNKOWN_VALUE)));                  
+//         lynq_output_info("+LINFO: [SIM%d] Preferred network_type: is %s\n", slot+1, preferredNetworkTypeToString(preferred_network_type[slot]));
+//         lynq_output_info("+LINFO: [SIM%d] Voice Registration State is %s\n",slot+1,serviceStateToString(regCodeToServiceState(reg_voice_service_state[slot])));
+//         lynq_output_info("+LINFO: [SIM%d] Voice Radio Access Network is %s\n",slot+1,RadioNwToString(regCodeToRadioTechnology(reg_voice_radio_tech[slot])));
+//         lynq_output_info("+LINFO: [SIM%d] Data Registration State is %s\n",slot+1,serviceStateToString(regCodeToServiceState(reg_data_service_state[slot])));
+//         lynq_output_info("+LINFO: [SIM%d] Data Radio Access Network is %s\n",slot+1,RadioNwToString(regCodeToRadioTechnology(reg_data_radio_tech[slot])));          
+//     }  
+//     return;
+// }
+// void lynq_output_LINFO(const char* format,...)
+// {
+//     char buf[1024] = {0};
+//     int n;
+//     char ebuf[1024] = {0};
+
+//     if(lynq_output_LINFO_enable)
+//     {
+//         va_list args;
+//         va_start(args, format);
+//         vsnprintf(buf, sizeof(buf), format, args);
+//         va_end(args);
+
+//         printf("hq %s",buf);
+//         n=snprintf(ebuf,sizeof(ebuf),"+LINFO: %s", buf);
+
+//         n=write(ttyGS3_fd, ebuf, strlen(ebuf));
+//         if(n < 0)
+//         {
+//             perror("lynq resp write:");
+//         }
+//     }
+//     return;
+// }
+// void lynq_output_info(const char* format,...)
+// {
+//     char buf[1024] = {0};
+//     int n;   
+    
+//     va_list args;
+//     va_start(args, format);
+//     vsnprintf(buf, sizeof(buf), format, args);
+//     va_end(args);     
+       
+//     n=write(ttyGS3_fd, buf, strlen(buf));
+//     if(n < 0)
+//     {
+//         perror("lynq resp write:");
+//     }
+
+//     return;
+// }
+/*hq add for key info output 2022/03/01 end*/
diff --git a/framework/lynq-ril-service/src/common.h b/framework/lynq-ril-service/src/common.h
index e952dcb..8de5199 100755
--- a/framework/lynq-ril-service/src/common.h
+++ b/framework/lynq-ril-service/src/common.h
@@ -139,6 +139,21 @@
     RIL_SOCKET_ID socket_id;
 } RequestInfo;
 
+/*Warren add for FAW 2021/11/1 start*/
+extern int ttyGS3_fd;
+/*Warren add for FAW 2021/11/1 end*/
+/*Warren add for SZZT 2021/11/14 start*
+** record data registration
+*/
+extern int current_data_reg;
+extern int modemStatus;
+/*Warren add for SZZT 2021/11/14 end*/
+
+// extern int lynq_output_LINFO_enable;
+// void lynq_output_info(const char* format,...);
+// void lynq_output_LINFO(const char* format,...);
+//void lynq_output_LINFO_all();
+    
 typedef struct {
     char *name;           /* User printable name of the function. */
     int (*func)(int argc, char *argv[], RIL_SOCKET_ID socket_id, RequestInfo *pRI);       /* Function to call to do the job. */
@@ -232,7 +247,13 @@
     int emResultNotify(const char *str);
     void ATCIRequest(int request, char* reqString, void* t,int argc, char**argv);
     void startWakupLoop(void);
-/*Warren add for t800 RIL Service 2021/12/10 start*/
+    /*Warren add for FAW platform 2021/9/27 start*/
+    void startUsbLoop(void);
+    int sendRespToUsb(char *cmd);
+    int sendUrcToUsb(char *cmd);
+    int lynqSendToRil(int argc,char *argv[],int uToken);
+    /*Warren add for FAW platform 2021/9/27 end*/
+    /*Warren add for t800 RIL Service 2021/12/10 start*/
     int lynqSocketSendto(int fd,struct sockaddr *dest_addr,int addr_len,char msg[]);
 /*Warren add for t800 RIL Service 2021/12/10 end*/
 /*Warren add for t800 ril service 2021/12/23 start*/
diff --git a/framework/lynq-ril-service/src/factory/lynq_factory.cpp b/framework/lynq-ril-service/src/factory/lynq_factory.cpp
new file mode 100755
index 0000000..a8ef998
--- /dev/null
+++ b/framework/lynq-ril-service/src/factory/lynq_factory.cpp
@@ -0,0 +1,573 @@
+#include <stdio.h>
+#include "common.h"
+#include "utils.h"
+#include "Phone_utils.h"
+#include <time.h>
+#include "sim.h"
+#include <string.h>
+#include<pthread.h>
+#include <cutils/properties.h>
+#ifdef __cplusplus
+extern "C" {
+#endif
+#include <pthread.h>
+#define SIM_COUNT 2
+#define RIL_REQUEST_GET_SIM_STATUS 1
+int already_gps = 0;
+int enable_nema = 0;
+int sustain = 1;
+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;
+typedef enum {
+    sim1,
+#if (SIM_COUNT >= 2)
+    sim2,
+#if (SIM_COUNT >= 3)
+    RIL_SOCKET_3,
+#endif
+#if (SIM_COUNT >= 4)
+    RIL_SOCKET_4,
+#endif
+#endif
+    //RIL_SOCKET_NUM
+} RIL_SIM_COUNT;
+
+#include "lynq_factory.h"
+
+static const char *usb3_speed = "super-speed";
+static const char *usb2_speed = "high-speed";
+pthread_mutex_t lynq_audio_mutex = PTHREAD_MUTEX_INITIALIZER;
+
+
+static void lynq_factory_response_ttyGS3(char *buf){
+    write(ttyGS3_fd,buf,strlen(buf));
+    return;
+}
+
+static void lynq_get_sim_state(RIL_SIM_COUNT id){
+    char *argv[MAX_ARGS];
+    if(utils::is_support_dsds()) {
+        id = (RIL_SIM_COUNT)get_default_sim_all_except_data();
+    } else if(utils::is_suppport_dsss()) {
+        id = (RIL_SIM_COUNT)Phone_utils::get_enable_sim_for_dsss();
+    }
+    RequestInfo *pRI  = creatRILInfoAndInit(RIL_REQUEST_GET_SIM_STATUS, UDP, (RIL_SOCKET_ID)(id));
+    getIccCardStatus(RIL_REQUEST_GET_SIM_STATUS,argv,(RIL_SOCKET_ID)id,pRI);
+}
+void *thread_test(void *arg){
+    lynq_factory_response_ttyGS3("GPS OPNE\n");
+    #if 0
+    FILE *fp;
+    char test[100] = {0};
+    sprintf(test, "mnld_test start & %s", "2>&1");
+    char lynq_factory_buf[1024] = {0};
+    fp=popen(test, "r");
+    if(NULL == fp){
+        printf("popen errorn");
+        return 0;
+    }
+    // pthread_mutex_lock(&s_gps_state_change_mutex);
+    // pthread_cond_wait(&s_gps_change_cond, &s_gps_state_change_mutex);
+    // pthread_mutex_unlock(&s_gps_state_change_mutex);
+    while (sustain)
+    {   
+        if(fgets(lynq_factory_buf,sizeof(lynq_factory_buf),fp)){
+            if(enable_nema == 1){
+                lynq_factory_response_ttyGS3(lynq_factory_buf);
+            }
+        }
+        else{
+            break;
+        }
+    }
+    pclose(fp);
+    #endif
+    system("echo \"debug.dbg2file=1\">>/usr/share/gps/mnl.prop");
+    system("mnld_test start &");
+    return 0;
+}
+
+void *thread_test_RGMII(void *arg){
+    FILE *fp;
+    fp=popen("ping -c 4 baidu.com 2>&1", "r");
+    if(NULL == fp){
+        printf("popen errorn");
+        return 0;
+    }
+    char lynq_factory_buf[1024] = {0};
+    if(NULL == fgets(lynq_factory_buf,sizeof(lynq_factory_buf),fp)){
+        lynq_factory_response_ttyGS3("UNKONE ERROR\n");
+        pclose(fp);
+        return 0;
+    }
+    else{
+        lynq_factory_response_ttyGS3(lynq_factory_buf);
+        if(strstr(lynq_factory_buf, "bad"))
+            return 0;
+    }
+    while (NULL != fgets(lynq_factory_buf,sizeof(lynq_factory_buf),fp))
+    {
+        lynq_factory_response_ttyGS3(lynq_factory_buf);
+    }
+    pclose(fp);
+    return 0;
+}
+
+static void lynq_test_RGMII(void){
+    pthread_t thid;
+    if(pthread_create(&thid, NULL, thread_test_RGMII, NULL) != 0) {
+        return;
+    }
+    pthread_join(thid, NULL);
+    return;
+}
+
+static void lynq_gps_open(void){
+    if(already_gps == 1){
+        lynq_factory_response_ttyGS3("gps already open\n");
+        return;
+    }
+    pthread_attr_t attr;
+    pthread_attr_init(&attr);
+    pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
+    int ret = pthread_create(&lynq_gps_tid, NULL, thread_test, NULL);
+    if(ret < 0)
+    {
+        lynq_factory_response_ttyGS3("gps thread create failure!!!\n");
+        return;
+    }
+    already_gps = 1;
+    return;
+}
+
+static void lynq_gps_close(void){
+    #if 0
+    enable_nema = 0;
+    sustain = 1;
+    int res = -1;
+    res = pthread_cancel(lynq_gps_tid);
+    if(res){
+        lynq_factory_response_ttyGS3("pthread cancel fail\n");
+        return;
+    }
+    pthread_join(lynq_gps_tid,NULL);
+    int ret = system("killall mnld_test");
+    already_gps = 0;
+    if(!ret){
+        lynq_factory_response_ttyGS3("GPS CLOSE SUCCESS\n");
+    }
+    else{
+        lynq_factory_response_ttyGS3("GPS CLOSE Failed\n");
+    }
+    #endif
+    system("killall mnld_test");
+    FILE *fp;
+    char test[100] = {0};
+    sleep(1);
+    sprintf(test, "cat /usr/share/gps/*.nmac %s", "2>&1");
+    char lynq_factory_buf[1024] = {0};
+    fp=popen(test, "r");
+    if(NULL == fp){
+        printf("popen errorn");
+        return;
+    }
+    while(NULL != fgets(lynq_factory_buf,sizeof(lynq_factory_buf),fp)){
+        if(strlen(lynq_factory_buf) > 0)
+        {
+            lynq_factory_response_ttyGS3(lynq_factory_buf);
+        }else{
+            lynq_factory_response_ttyGS3("+CME: ERROR TIMEOUT\n");
+        }
+    }
+    pclose(fp);
+    return;
+}
+
+static void lynq_wifi_open(void){
+    FILE *fp;
+    char test[100] = {0};
+    sprintf(test, "connmanctl enable wifi %s", "2>&1");
+    char lynq_factory_buf[1024] = {0};
+    fp=popen(test, "r");
+    if(NULL == fp){
+        printf("popen errorn");
+        return;
+    }
+    while(NULL != fgets(lynq_factory_buf,sizeof(lynq_factory_buf),fp)){
+        if(strlen(lynq_factory_buf) > 0)
+        {
+            lynq_factory_response_ttyGS3(lynq_factory_buf);
+        }else{
+            lynq_factory_response_ttyGS3("+CME: ERROR TIMEOUT\n");
+        }
+    }
+    pclose(fp);
+}
+
+static void lynq_wifi_close(void){
+    FILE *fp;
+    char test[100] = {0};
+    sprintf(test, "connmanctl disable wifi %s", "2>&1");
+    char lynq_factory_buf[1024] = {0};
+    fp=popen(test, "r");
+    if(NULL == fp){
+        printf("popen errorn");
+        return;
+    }
+    while(NULL != fgets(lynq_factory_buf,sizeof(lynq_factory_buf),fp)){
+        if(strlen(lynq_factory_buf) > 0)
+        {
+            lynq_factory_response_ttyGS3(lynq_factory_buf);
+        }else{
+            lynq_factory_response_ttyGS3("+CME: ERROR TIMEOUT\n");
+        }
+    }
+    pclose(fp);
+}
+
+
+int lynq_dispose_factory_adc(int num,char *argv[MAX_ARGS])
+{
+    FILE *fp;
+    char lynq_adc_dev[512] = {0};
+    char lynq_adc_buf[512];
+    char lynq_adc_log_buf[512];
+
+    int lynq_adc_num = atoi(argv[4]);
+    bzero(lynq_adc_buf, 512);
+    bzero(lynq_adc_dev,512);
+    bzero(lynq_adc_log_buf,512);
+    if(lynq_adc_num == 0)
+    {
+        sprintf(lynq_adc_dev,"cat /sys/bus/iio/devices/iio:device0/in_voltage23_ADC0_raw  2>&1");
+    }
+    else if(lynq_adc_num == 1)
+    {
+        sprintf(lynq_adc_dev,"cat /sys/bus/iio/devices/iio:device0/in_voltage22_ADC1_raw  2>&1");
+    }
+    else if(lynq_adc_num == 2)
+    {
+        sprintf(lynq_adc_dev,"cat /sys/bus/iio/devices/iio:device0/in_voltage21_ADC2_raw  2>&1");
+    }
+    else
+    {
+        lynq_factory_response_ttyGS3("[adc][errror]:no adc device \n");
+    return 0;
+    }
+    fp=popen(lynq_adc_dev, "r");
+    fgets(lynq_adc_buf,sizeof(lynq_adc_buf),fp);    
+    if(strlen(lynq_adc_buf) > 0)
+    {
+        sprintf(lynq_adc_log_buf,"[adc%d][result]:%s\n",lynq_adc_num,lynq_adc_buf);
+    }
+    else
+    {
+        sprintf(lynq_adc_log_buf,"[adc%d][result]:error\n",lynq_adc_num);
+    }
+    lynq_factory_response_ttyGS3(lynq_adc_log_buf);
+    pclose(fp);
+    return 1;
+}
+
+int lynq_dispose_factory_usb(int num,char *argv[MAX_ARGS])
+{
+        FILE *fp;
+        char lynq_usb_dev[512] = {0};
+        char lynq_usb_buf[512];
+
+        bzero(lynq_usb_buf, 512);
+        bzero(lynq_usb_dev,512);
+        sprintf(lynq_usb_dev,"cat /sys/devices/platform/soc/11261000.usb/udc/11261000.usb/current_speed  2>&1");
+
+        fp=popen(lynq_usb_dev, "r");
+        fgets(lynq_usb_buf,sizeof(lynq_usb_buf),fp);
+        if(!strncmp(lynq_usb_buf,usb3_speed,strlen(usb3_speed)))
+        {   
+            lynq_factory_response_ttyGS3("[usb][result],3.0 \n");
+        }
+        else if(!strncmp(lynq_usb_buf,usb2_speed,strlen(usb2_speed)))
+        {
+            lynq_factory_response_ttyGS3("[usb][result],2.0 \n");
+        }
+        else
+        {
+            lynq_factory_response_ttyGS3("[usb][rat][UNKNOWN] \n");
+        }
+        pclose(fp);
+        return 1;
+}
+
+void *lynq_deal_witch_audio(void *arg)
+{
+    char lynq_adudio_time_arr[128] = {0};
+    char *lynq_argv  = (char *)arg;
+    pthread_mutex_lock(&lynq_audio_mutex);
+    system("echo write_reg,0x002c,0x0008 > /sys/kernel/debug/mtksocaudio");
+    system("echo write_reg,0x0030,0x0010 > /sys/kernel/debug/mtksocaudio");
+    sprintf(lynq_adudio_time_arr,"arecord -D plughw:0,1 --buffer-size=1024 -r 16000 -d %s -f S16_LE -c1 | aplay -D plughw:0,7 --buffer-size=1024 -r 16000 -d %s -f S16_LE -c1",lynq_argv,lynq_argv);
+//    system("arecord -D plughw:0,1 --buffer-size=1024 -r 16000 -d 2 -f S16_LE -c1 | aplay -D plughw:0,7 --buffer-size=1024 -r 16000 -d 2 -f S16_LE -c1 ");
+    system(lynq_adudio_time_arr);
+    free(lynq_argv);
+    lynq_argv = NULL;
+    pthread_mutex_unlock(&lynq_audio_mutex);
+    pthread_exit(0);
+}
+
+int lynq_dispose_factory_audio(int num,char *argv[MAX_ARGS])
+{
+    pthread_t id;
+    int i,ret;
+    char *lynq_audio_time = (char *)malloc(16);
+    bzero(lynq_audio_time, 16);
+    if(lynq_audio_time != NULL)
+    {
+        memcpy(lynq_audio_time,argv[4],strlen(argv[4]));
+    } 
+    ret=pthread_create(&id,NULL,lynq_deal_witch_audio,(char *)lynq_audio_time); 
+    if(ret!=0)
+    {
+        return ret;
+    }
+    pthread_join(id,NULL);
+    return 0;
+}
+
+int lynq_check_emmc()
+{
+    FILE *fp;
+    char emmc_buf[100] = {0};
+    char buf[100] = {0};
+    sprintf(emmc_buf, "ls /dev | grep mmcblk0  2>&1");
+    fp=popen(emmc_buf, "r");
+    if(!fp){
+        //printf("popen error\n");
+        lynq_factory_response_ttyGS3("\n+CME: POPEN ERROR\n");
+        return -1;
+    }
+
+    while(fgets(buf, sizeof(buf), fp) != NULL){
+        lynq_factory_response_ttyGS3("[EMMC] EMMC OK \n"); 
+        pclose(fp);
+        return 0;   
+    }
+
+    lynq_factory_response_ttyGS3("[EMMC] NO EMMC \n");  
+    pclose(fp);
+    return 0;
+}
+static void lynq_gpsinfo(char *argv){
+    if(argv ==NULL)
+        return;
+    // pthread_mutex_lock(&s_gps_state_change_mutex);
+    enable_nema = atoi(argv);
+    // pthread_cond_signal(&s_gps_change_cond);
+    // pthread_mutex_unlock(&s_gps_state_change_mutex);
+    if(enable_nema == 1){
+        lynq_factory_response_ttyGS3("enable neam\n"); 
+    }
+    else if(enable_nema == 0){
+        lynq_factory_response_ttyGS3("disable neam\n"); 
+    }
+    else{
+        lynq_factory_response_ttyGS3("invalid value\n"); 
+    }
+}
+
+int lynq_check_gpio()
+{
+    FILE *fp;
+    int lynq_gpio_arr[57] = {47,49,50,48,43,14,15,13,6,7,5,4,93,94,96,95,87,88,82,81,27,26,132,131,130,133,79,80,77,78,90,28,60,62,63,19,18,64,59,10,3,8,41,42,40,39,38,37,55,54,53,52,89,24,46,44,45};
+    char lynq_set_gpio_arr[256] = {0};
+    char lynq_get_gpio_state[512] = {0};
+    char lynq_show_gpio_state[64] = {0};
+    int lynq_gpio_low = 0;
+    int lynq_gpio_hig = 0;
+    int i = 0,m = 0;
+    int lynq_gpio_beta_state = 1;
+
+    for(m = 0; m < 57; m++)
+    {
+        bzero(lynq_set_gpio_arr, 256);
+        sprintf(lynq_set_gpio_arr,"echo mode %d 0 > /sys/devices/platform/10005000.pinctrl/mt_gpio",(char*)lynq_gpio_arr[m]);
+        system(lynq_set_gpio_arr);
+        bzero(lynq_set_gpio_arr, 256);
+        sprintf(lynq_set_gpio_arr,"echo out %d 0 > /sys/devices/platform/10005000.pinctrl/mt_gpio",(char*)lynq_gpio_arr[m]);
+        system(lynq_set_gpio_arr);
+    }
+
+    for(i = 0; i < 57; i++)
+    {
+        lynq_gpio_low = 0;
+        lynq_gpio_hig = 0;
+
+        bzero(lynq_set_gpio_arr, 256);
+        sprintf(lynq_set_gpio_arr,"echo mode %d 0 > /sys/devices/platform/10005000.pinctrl/mt_gpio",(char*)lynq_gpio_arr[i]);
+        system(lynq_set_gpio_arr);
+
+        bzero(lynq_set_gpio_arr, 256);
+        sprintf(lynq_set_gpio_arr,"echo out %d 1 > /sys/devices/platform/10005000.pinctrl/mt_gpio",(char*)lynq_gpio_arr[i]);
+        system(lynq_set_gpio_arr);
+
+        bzero(lynq_set_gpio_arr, 256);
+        sprintf(lynq_set_gpio_arr,"cat /sys/devices/platform/10005000.pinctrl/mt_gpio | grep 061");
+        fp=popen(lynq_set_gpio_arr, "r");
+        bzero(lynq_get_gpio_state, 512);
+        fgets(lynq_get_gpio_state,sizeof(lynq_get_gpio_state),fp);
+/*     
+        if(strlen(lynq_get_gpio_state) > 0)
+        {
+            lynq_factory_response_ttyGS3(lynq_get_gpio_state);
+            lynq_factory_response_ttyGS3("\n");
+        }
+*/
+        pclose(fp);
+        if(lynq_get_gpio_state[8] == '1')
+        {
+		lynq_gpio_hig = 1;
+        }
+
+        bzero(lynq_set_gpio_arr, 256);
+        sprintf(lynq_set_gpio_arr,"echo out %d 0 > /sys/devices/platform/10005000.pinctrl/mt_gpio",(char*)lynq_gpio_arr[i]);
+        system(lynq_set_gpio_arr);
+        
+        bzero(lynq_set_gpio_arr, 256);
+        sprintf(lynq_set_gpio_arr,"cat /sys/devices/platform/10005000.pinctrl/mt_gpio | grep 061");
+        fp=popen(lynq_set_gpio_arr, "r");
+        bzero(lynq_get_gpio_state, 512);
+        fgets(lynq_get_gpio_state,sizeof(lynq_get_gpio_state),fp);
+/*      
+        if(strlen(lynq_get_gpio_state) > 0)
+        {
+            lynq_factory_response_ttyGS3(lynq_get_gpio_state);
+            lynq_factory_response_ttyGS3("\n");
+        }
+*/
+        pclose(fp);
+        if(lynq_get_gpio_state[8] == '0')
+        {
+            lynq_gpio_low = 1;
+        }
+        bzero(lynq_show_gpio_state, 64);
+        if((lynq_gpio_low != 1) || (lynq_gpio_hig != 1))
+        {
+            lynq_gpio_beta_state = 0;
+            sprintf(lynq_show_gpio_state,"[gpio%d][result]:FAIL \n",(char *)lynq_gpio_arr[i]);
+            lynq_factory_response_ttyGS3(lynq_show_gpio_state);
+//            lynq_factory_response_ttyGS3("[gpio][result]:FAIL \n");
+        }
+    }
+    if(lynq_gpio_beta_state == 1)
+    {
+        sprintf(lynq_show_gpio_state,"[gpio][result]:PASS \n",(char *)lynq_gpio_arr[i]);
+        lynq_factory_response_ttyGS3(lynq_show_gpio_state);
+    }
+   return 0;
+}
+
+int lynq_factory_write_sn(int num,char *argv[MAX_ARGS])
+{
+    int err = -1;
+    char lynq_sn_arr[16] = {"ro.SN"};
+    char lynq_sn_data[64] = {0};
+
+    if(argv[4] != NULL)
+    {
+        err = property_set(lynq_sn_arr,argv[4]);
+        if(err == 0) 
+        {
+            lynq_factory_response_ttyGS3("[SN] Write SN OK \n");
+        }
+        else
+        {
+            lynq_factory_response_ttyGS3("[SN] Write SN Fail \n");
+        }
+    }
+    return err;
+}
+
+int lynq_factory_read_sn()
+{
+    int err = -1;
+    char lynq_sn_arr[16] = {"ro.SN"};
+    char lynq_sn_data[64] = {0};
+    char lynq_read_tty_buf[70] = {};
+    err = property_get(lynq_sn_arr,(char *)lynq_sn_data,NULL);
+    if(err > 0) 
+    {
+        sprintf(lynq_read_tty_buf,"[SN]:%s\n",(char *)lynq_sn_data);
+    }
+    else
+    {
+        sprintf(lynq_read_tty_buf,"[SN]:Get SN Fail\n");
+    }
+    lynq_factory_response_ttyGS3(lynq_read_tty_buf);
+    return err;
+}
+
+int lynq_get_factory_data(int num,char *argv[MAX_ARGS]){
+    if(num < 4)
+        return -1;
+    if(!strcmp(argv[3], "wifi")){
+        lynq_wifi_open();
+    }
+    else if(!strcmp(argv[3], "wifi_close")){
+        lynq_wifi_close();
+    }
+    else if(!strcmp(argv[3], "gps")){
+        lynq_gps_open();
+    }
+    else if(!strcmp(argv[3], "gps_close")){
+        lynq_gps_close();
+    }
+    #if 0
+    else if(!strcmp(argv[3], "gpsinfo")){
+        lynq_gpsinfo(argv[4]);
+    }
+    else if(!strcmp(argv[3], "sim1")){
+        lynq_get_sim_state(sim1);
+    }
+    else if(!strcmp(argv[3], "sim2")){
+        lynq_get_sim_state(sim2);
+    }
+    #endif
+    else if(!strcmp(argv[3], "rgmii")){
+        lynq_test_RGMII();
+    }
+    else if((!strcmp(argv[3],"adc")))
+    {
+        lynq_dispose_factory_adc(num,argv);
+    }
+    else if((!strcmp(argv[3],"usb")))
+    {
+         lynq_dispose_factory_usb(num,argv);
+    }
+    else if((!strcmp(argv[3],"audio")))
+    {
+        lynq_dispose_factory_audio(num,argv);
+    }
+    else if((!strcmp(argv[3], "emmc")))
+    {
+        lynq_check_emmc();
+    }
+    else if((!strcmp(argv[3],"gpio")))
+    {
+        lynq_check_gpio();
+    } 
+    else if((!strcmp(argv[3],"snwt")))
+    {
+        lynq_factory_write_sn(num,argv);
+    }
+    else if((!strcmp(argv[3],"snrd")))
+    {
+        lynq_factory_read_sn();
+    }
+    else{
+        lynq_factory_response_ttyGS3("invalid command\n"); 
+    }
+    return 0;
+}
+
+#ifdef __cplusplus
+}
+#endif
\ No newline at end of file
diff --git a/framework/lynq-ril-service/src/factory/lynq_factory.h b/framework/lynq-ril-service/src/factory/lynq_factory.h
new file mode 100755
index 0000000..bc14687
--- /dev/null
+++ b/framework/lynq-ril-service/src/factory/lynq_factory.h
@@ -0,0 +1,14 @@
+#ifndef __LYNQ_FACTORY_H__
+#define __LYNQ_FACTORY_H__
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define MAX_ARGS 101
+int lynq_get_factory_data(int num,char *argv[MAX_ARGS]);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
\ No newline at end of file
diff --git a/framework/lynq-ril-service/src/lynq_at.cpp b/framework/lynq-ril-service/src/lynq_at.cpp
new file mode 100755
index 0000000..6ff642c
--- /dev/null
+++ b/framework/lynq-ril-service/src/lynq_at.cpp
@@ -0,0 +1,40 @@
+/*============================================================================= 
+**     FileName: lynq_at.cpp
+**     Desc: lynq Send at to modem directly
+**     Author: Warren
+**     Version: V1.0
+**     LastChange: 2021-09-28 
+**     History: 
+**=============================================================================*/

+#include "lynq_at.h"

+#include "common.h"

+#include "stateManager/stateManager.h"
+#include "Phone_utils.h"
+#include "utils.h"
+

+int lynqSendAt(int argc,char *argv[],int uToken)

+{

+    int request = RIL_REQUEST_OEM_HOOK_RAW;
+    RIL_SOCKET_ID id = RIL_SOCKET_1;
+    if(utils::is_support_dsds())
+    {

+        id = (RIL_SOCKET_ID)get_default_sim_all_except_data();
+    }
+    else if(utils::is_suppport_dsss())

+    {

+        id = (RIL_SOCKET_ID)Phone_utils::get_enable_sim_for_dsss();
+    }
+   // if (request < 1 || (request >= (int32_t)NUM_ELEMS(s_commands) && request < RIL_REQUEST_VENDOR_BASE)) {
+     //   RLOGW("unsupported request code %d token %d", request);
+        // FIXME this should perhaps return a response
+       // continue;
+    //}
+
+    //RLOGD("REQUEST: %s ParamterNum:%d", requestToString(request), argc);
+    RequestInfo *pRI  = creatRILInfoAndInit(request, UDP, (RIL_SOCKET_ID)(id));

+    pRI->lynqEvent=1;

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

+    sendATCMD(2, argv,id,pRI);

+    return 0;

+}

+

diff --git a/framework/lynq-ril-service/src/lynq_at.h b/framework/lynq-ril-service/src/lynq_at.h
new file mode 100755
index 0000000..52bc79c
--- /dev/null
+++ b/framework/lynq-ril-service/src/lynq_at.h
@@ -0,0 +1,12 @@
+/*============================================================================= 
+**     FileName: lynq_at.h
+**     Desc: lynq Send at to modem directly
+**     Author: Warren
+**     Version: V1.0
+**     LastChange: 2021-09-28 
+**     History: 
+**=============================================================================*/

+#ifndef LYNQ_AT
+#define LYNQ_AT

+int lynqSendAt(int argc,char *argv[],int uToken);

+#endif

diff --git a/framework/lynq-ril-service/src/lynq_at_transfer_table.h b/framework/lynq-ril-service/src/lynq_at_transfer_table.h
new file mode 100755
index 0000000..0ee18b9
--- /dev/null
+++ b/framework/lynq-ril-service/src/lynq_at_transfer_table.h
@@ -0,0 +1,18 @@
+{LYNQ_REQUEST_ATD,"ATD",7},

+{LYNQ_REQUEST_CGCMOD,"CGCMOD",0},

+{LYNQ_REQUEST_CGAUTO,"CGAUTO",0},

+{LYNQ_REQUEST_CGACT,"CGACT",4},

+{LYNQ_REQUEST_CGDCONT,"CGDCONT",4},

+{LYNQ_USER_REQUEST_GNSS,"LYNQGNSS",7},

+{LYNQ_USER_REQUEST_OTHRE,"LYNQOTHER",7},

+{LYNQ_REQUEST_LAPNACT,"LAPNACT",7},

+{LYNQ_REQUEST_ELAPNACT,"ELAPNACT",7},

+{LYNQ_REQUEST_SWITCH_SIM,"LCSUS",7},

+{LYNQ_REQUEST_SCREEN_STATE,"SCREEN",7},

+{LYNQ_REQUEST_SEND_LOG_DATA,"LOGS",7},

+{LYNQ_PLAT_LGMDS,"LGMDS",7},

+{LYNQ_REQUEST_RNDIS,"LRNDISHANDLE",7},

+{LYNQ_REQUEST_FACTORY,"LYNQFACTORY",7},

+{LYNQ_REQUEST_LINFO,"LINFO",7},

+{LYNQ_REQUEST_FOTA,"LYNQFOTA",7},

+{-1,NULL,0},
\ No newline at end of file
diff --git a/framework/lynq-ril-service/src/lynq_commands.h b/framework/lynq-ril-service/src/lynq_commands.h
new file mode 100755
index 0000000..adfda0f
--- /dev/null
+++ b/framework/lynq-ril-service/src/lynq_commands.h
@@ -0,0 +1,18 @@
+/*============================================================================= 
+**     FileName: lynq_command.h
+**     Desc: lynq commands table
+**     Author: Warren
+**     Version: V1.0
+**     LastChange: 2021-10-27 
+**     History: 
+**=============================================================================*/
+{LYNQ_REQUEST_CGMI,NULL,"CGMI",CGMI,NULL},
+{LYNQ_REQUEST_ATD,"RIL_REQUEST_DIAL","ATD",dialACall,NULL},
+{LYNQ_REQUEST_LAPNACT,"RIL_REQUEST_SETUP_DATA_CALL","LAPNACT",setupData,NULL},
+{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_SCREEN_STATE,"RIL_REQUEST_SCREEN_STATE","SCREEN",lynq_screen,NULL},
+{LYNQ_PLAT_LGMDS,"LYNQ_PLAT_LGMDS","LGMDS",NULL,getMDstate},
+{-1,NULL,NULL,NULL,NULL},
diff --git a/framework/lynq-ril-service/src/lynq_common.cpp b/framework/lynq-ril-service/src/lynq_common.cpp
index cb136c8..f77a55e 100755
--- a/framework/lynq-ril-service/src/lynq_common.cpp
+++ b/framework/lynq-ril-service/src/lynq_common.cpp
@@ -1,10 +1,623 @@
+/*============================================================================= 
+**     FileName: lynq_common.cpp
+**     Desc: lynq common
+**     Author: Warren
+**     Version: V1.0
+**     LastChange: 2021-09-27 
+**     History: 
+**=============================================================================*/
+
+#include <stdio.h>
+#include <string.h>
+#include <log/log.h>
 #include "lynq_common.h"
+#include "lynq_user.h"
+#include "common.h"
+#include <pthread.h>
+#define USB_BUF_SIZE 8192
 #include <liblog/lynq_deflog.h>
 #include <sys/time.h>
 #include "Phone_utils.h"
-#include <stdio.h>
+usb_cmd_t Usb_commands[] = {
+#include "lynq_commands.h"
+};
+
+usb_at_transfer_t Usb_transfer_commands[] = {
+#include "lynq_at_transfer_table.h"
+};
 #undef LOG_TAG
 #define LOG_TAG "LYNQ_COMMON"
 
 extern apn_table_t apn_table[LYNQ_APN_CHANNEL_MAX] = {};
 extern int apn_count = 0;
+extern char lynq_at[LYNQ_AT_LEN_MAX]= {};
+pthread_cond_t lynq_at_cond = PTHREAD_COND_INITIALIZER;
+pthread_mutex_t lynq_at_mutex= PTHREAD_MUTEX_INITIALIZER;
+
+
+//int lynqSendToRil(int argc,char *argv[],int uToken);
+usb_at_transfer_t *lynqFindId(char *cmd)
+{
+    if(cmd==NULL)
+    {
+        RLOGD("lynqFindId CMD is NULL!!!");
+        return ((usb_at_transfer_t*)NULL);
+    }
+    for(int i=0;Usb_transfer_commands[i].cmdName;i++)
+    {
+        if (strcmp (cmd, Usb_transfer_commands[i].cmdName) == 0)
+        return (&Usb_transfer_commands[i]);
+    }
+    return ((usb_at_transfer_t*)NULL);
+}
+
+usb_cmd_t * lynqFindUsbEvent(char *cmd)
+{
+    if(cmd==NULL)
+    {
+        RLOGD("lynqFindUsbEvent CMD is NULL!!!");
+        return ((usb_cmd_t*)NULL);
+    }
+    printf("cmd =%s\n",cmd);
+    for(int i=0;Usb_commands[i].cmdName;i++)
+    {
+        if (strcmp (cmd, Usb_commands[i].cmdName) == 0)
+        return (&Usb_commands[i]);
+    }
+    return ((usb_cmd_t *)NULL);
+}
+
+int routeCmd(int request)
+{
+    switch (request)
+    {
+        case LYNQ_REQUEST_CGMI:
+        case LYNQ_REQUEST_GMI:
+        case LYNQ_REQUEST_CGACT:
+        case LYNQ_REQUEST_CGDCONT:
+        {
+             return LYNQ_GOTO_AT;
+        }
+        case LYNQ_REQUEST_ATD:
+        case LYNQ_REQUEST_LAPNACT:
+        case LYNQ_REQUEST_ELAPNACT:
+        case LYNQ_REQUEST_SCREEN_STATE:
+        case LYNQ_REQUEST_SWITCH_SIM:
+        {
+            return LYNQ_GOTO_TELE_REQ;
+        }
+        case LYNQ_REQUEST_SEND_LOG_DATA:
+        {
+            return LYNQ_GOTO_PLAT_REQ;
+        }
+        case LYNQ_USER_REQUEST_GNSS:
+        case LYNQ_USER_REQUEST_OTHRE:
+        case LYNQ_PLAT_LGMDS:
+        {
+            return LYNQ_GOTO_USER_REQ;
+        }
+        case LYNQ_REQUEST_RNDIS:
+        {
+
+            return LYNQ_GOTO_RNDIS_REQ;
+        }
+        case LYNQ_REQUEST_LINFO:
+            return LYNQ_GOTO_LINFO_REQ;
+        case LYNQ_REQUEST_FACTORY:
+            return LYNQ_GOTO_FACTORY;
+        case LYNQ_REQUEST_FOTA:
+            return LYNQ_GOTO_FOTA;
+        default:
+            return -1;
+    }
+}
+int g_number(const char *p){
+    int cnt = 0;
+    while(*p != '\0'){
+        if(*p == ','){
+            cnt++;
+        }
+        *p++;
+    }
+    return cnt+4;//for count character string
+
+}
+int syncRespToUsb(int error_code)
+{
+    char BUF[32] = {};
+    int ret = -1;
+    int len = 0;
+    if(error_code==0)
+    {
+        len = write(ttyGS3_fd,"OK\n",3);
+    }
+    else
+    {
+        sprintf(BUF,"+CME ERROR: %d\n\0",error_code);
+        len = write(ttyGS3_fd,BUF,strlen(BUF));
+    }
+    if(len < 0)
+    {
+        perror("lynq resp write:");
+        return -1;
+    }
+    return 0;
+}
+void lynqSetArgv(char **argv, char** Point,const char* value)
+{
+    *argv=*Point;
+     sprintf(*argv, "%s", value);    
+     (*Point) += (strlen(value)+1);
+}
+//argv[2]:0 send,1 list,2 get
+int lynqParseUsbCommand(const char* cmd,char *argv[],char test[],char* parser_buf,int maxArgc)
+{
+    char *token;
+    char *str = test;
+    char *string;
+    char *parameter;
+    char* Point=parser_buf;
+    int cnt = g_number(cmd);
+    memcpy(test, cmd, strlen(cmd));
+    test[strlen(cmd)] = '\0';
+    argv[1] = (char *)cmd;
+    if(strstr(cmd,"=?"))
+    {
+        token = strtok(str, "=?");
+        //argv[0] = token;
+        argv[0] = strstr(token, "+")+1; 
+        lynqSetArgv(&(argv[2]),&Point,"1");
+        while (token != NULL)
+        {
+            string = token;
+            token = strtok(NULL, "=?");
+        }
+        parameter = strtok(string, ",");
+        int i = 3;
+        while (parameter != NULL)
+        {
+            argv[i++] = parameter;
+            parameter = strtok(NULL, ",");
+        }
+    }
+    else if(strstr(cmd,"="))
+    {
+        lynqSetArgv(&(argv[2]),&Point,"0");
+        token = strtok(str, "=");
+        //argv[0] = token;
+        argv[0] = strstr(token, "+")+1;
+        while (token != NULL)
+        {
+            string = token;
+            token = strtok(NULL, "=");
+        }
+        parameter = strtok(string, ",");
+        int i = 3;
+        while (parameter != NULL)
+        {
+            argv[i++] = parameter;
+            parameter = strtok(NULL, ",");
+        }
+    }
+    else if(strstr(cmd,"?"))
+    {
+        lynqSetArgv(&(argv[2]),&Point,"2");
+        token = strtok(str, "?");
+        //argv[0] = token;
+        argv[0] = strstr(token, "+")+1;
+        while (token != NULL)
+        {
+            string = token;
+            token = strtok(NULL, "?");
+        }
+        parameter = strtok(string, ",");
+        int i = 3;
+        while (parameter != NULL)
+        {
+            argv[i++] = parameter;
+            parameter = strtok(NULL, ",");
+        }
+    }
+    else
+    {
+        lynqSetArgv(&(argv[2]),&Point,"0");
+        if(strstr(cmd,"+"))
+        {
+            argv[0] = test+3;
+            return 3;
+        }
+        else
+        {
+            RLOGD("sp test 01");
+            if(!strcmp(cmd, "ATA")){               
+                lynqSetArgv(&(argv[0]),&Point,"ATA");                      
+                return 3;
+            }
+            if(!strcmp(cmd, "AT")){
+                lynqSetArgv(&(argv[0]),&Point,"AT");               
+                return 3;
+            }
+            /*UNKNOW*/
+            else if(!strncmp(cmd, "ATD", 3)){
+                lynqSetArgv(&(argv[0]),&Point,"ATD");                
+                argv[3] = test+3;
+                return 4;
+            }
+            else if(!strncmp(cmd, "ATE", 3)){
+                lynqSetArgv(&(argv[0]),&Point,"ATE");               
+                argv[3] = test+3;
+                return 4;
+            }
+            else if(!strcmp(cmd, "ATH")){
+                lynqSetArgv(&(argv[0]),&Point,"ATH");               
+                return 3;
+            }
+            else if(!strncmp(cmd, "ATI", 3)){
+                lynqSetArgv(&(argv[0]),&Point,"ATI");               
+                argv[3] = test+3;
+                return 4;
+            }
+            else if(!strncmp(cmd, "ATL", 3)){
+                lynqSetArgv(&(argv[0]),&Point,"ATL");               
+                argv[3] = test+3;
+                return 4;
+            }
+            else if(!strncmp(cmd, "ATO", 3)){
+                lynqSetArgv(&(argv[0]),&Point,"ATO");                
+                argv[3] = test+3;
+                return 3;
+            }
+            /*ATP*/
+            /*
+            */
+            else if(!strncmp(cmd, "ATQ", 3)){
+                lynqSetArgv(&(argv[0]),&Point,"ATQ");               
+                argv[3] = test+3;
+                return 4;
+            }
+            else if(!strncmp(cmd, "ATSO", 4)){
+                lynqSetArgv(&(argv[0]),&Point,"ATSO");               
+                argv[3] = test+4;
+                return 4;
+            }
+            else if(!strncmp(cmd, "ATS3", 4)){
+                lynqSetArgv(&(argv[0]),&Point,"ATS3");              
+                argv[3] = test+4;
+                return 4;
+            }
+            else if(!strncmp(cmd, "ATS4", 4)){
+                lynqSetArgv(&(argv[0]),&Point,"ATS4");              
+                argv[3] = test+4;
+                return 4;
+            }
+            else if(!strncmp(cmd, "ATS5", 4)){
+                lynqSetArgv(&(argv[0]),&Point,"ATS5");          
+                argv[3] = test+4;
+                return 4;
+            }
+            /*ATS6*/
+            /*
+            */
+            else if(!strncmp(cmd, "ATS7", 4)){
+                lynqSetArgv(&(argv[0]),&Point,"ATS7");              
+                argv[3] = test+4;
+                return 4;
+            }
+            else if(!strncmp(cmd, "ATS8", 4)){
+                lynqSetArgv(&(argv[0]),&Point,"ATS8");       
+                argv[3] = test+4;
+                return 4;
+            }
+            else if(!strncmp(cmd, "ATS10", 5)){
+                lynqSetArgv(&(argv[0]),&Point,"ATS10");      
+                argv[3] = test+5;
+                return 4;
+            }
+            /*ATT*/
+            /*
+
+
+
+            */
+            else if(!strncmp(cmd, "ATV", 3)){
+                lynqSetArgv(&(argv[0]),&Point,"ATV");
+                argv[3] = test+3;
+                return 4;
+            }
+            /*ATX*/
+            /*
+
+
+
+            */
+            else if(!strncmp(cmd, "ATZ", 3)){
+                lynqSetArgv(&(argv[0]),&Point,"ATZ");
+                argv[3] = test+3;
+                return 4;
+            }
+            else if(!strncmp(cmd, "AT&F", 4)){
+                lynqSetArgv(&(argv[0]),&Point,"AT&F");
+                argv[3] = test+4;
+                return 4;
+            }
+            else
+            {
+                RLOGD("can't find this command");
+                return -1;
+            }
+        }
+    }
+    //char *testtest = strstr(argv[0], "+")+1;
+    //printf("testtest:%s\n", testtest);
+    //argv[0] = testtest;
+    //printf("%d\n", __FUNCTION__);
+    if(cnt > maxArgc)
+        return -1;
+    return cnt;
+}
+
+int CGMI(int argc,char*argv[],char *rilReq, int uToken)
+{
+    return 0;
+}
+int dialACall(int argc,char*argv[],char *rilReq, int uToken)
+{
+    if(argc < 4)
+    {
+        RLOGD("parameter error!!!");
+        return 1;
+    }
+    char *new_argv[3] = {};
+    new_argv[0] = (char *)rilReq;
+    new_argv[1] = argv[3];
+    new_argv[2] = "0";
+    android::lynqSendToRil(3,new_argv,uToken);
+    return 0;
+}
+int checkDataRegistration(int uToken)
+{
+    /*chech radio status*/
+    int ret = -1;
+    char *argv_temp[3]={};
+    argv_temp[0] = "RIL_REQUEST_DATA_REGISTRATION_STATE";
+    android::lynqSendToRil(1,argv_temp,uToken);
+    ret = lynqATWaitWithTime(10);
+    printf("ret=%d\n,current_data_reg=%d\n",ret,current_data_reg);
+    /*
+    if(ret == ETIMEDOUT)
+    {
+        int n = write(ttyGS3_fd,"+CME:ERROR 8004\n",strlen("+CME:ERROR 8004\n"));
+        if(n<0)
+        {
+            perror("lynq resp write:");
+        }
+        return -1;
+    }
+    */
+    if(current_data_reg!=0)
+    {
+        int n = write(ttyGS3_fd,"+CME ERROR: 1\n",strlen("+CME ERROR: 1\n"));
+        if(n<0)
+        {
+            perror("lynq resp write:");
+        }
+        return -1;
+    }
+    return 0;
+}
+int setupData(int argc,char*argv[],char *rilReq, int uToken)
+{
+    int status = 0;
+    int ret = -1;
+    if(argc < 4)
+    {
+        RLOGD("parameter error!!!");
+        return -1;
+    }
+    bzero(lynq_at,LYNQ_AT_LEN_MAX);
+    sprintf(lynq_at,"LAPNACT");
+    status = atoi(argv[3]);
+    char *new_argv[3] = {};
+    if(status==1)
+    {
+        ret = checkDataRegistration(uToken);
+        if(ret != 0)
+        {
+            RLOGD("[setupData] radio is not available!!!");
+            return -1;
+        }
+        new_argv[0] = (char *)rilReq;
+        android::lynqSendToRil(1,new_argv,uToken);
+        syncRespToUsb(0);
+    }
+    else if(status == 0)
+    {
+        new_argv[0] = "RIL_REQUEST_DEACTIVATE_DATA_CALL";
+        android::lynqSendToRil(1,new_argv,uToken);
+    }
+    return 0;
+}
+int setupData_e(int argc,char*argv[],char *rilReq, int uToken)
+{
+    int status = 0;
+    int ret = -1;
+    if(argc < 5)
+    {
+        RLOGD("parameter error!!!");
+        return 1;
+    }
+    bzero(lynq_at,LYNQ_AT_LEN_MAX);
+    sprintf(lynq_at,"ELAPNACT");
+    char *new_argv[10] = {};
+    status = atoi(argv[3]);
+    if(status == 1 )
+    {
+        ret = checkDataRegistration(uToken);
+        if(ret != 0)
+        {
+            RLOGD("[setupData] radio is not available!!!");
+            return -1;
+        }
+        new_argv[0] = (char *)rilReq;
+        new_argv[1] = argv[4];//apn
+        new_argv[2] = argv[5];//apntype
+        new_argv[3] = argv[6];//user
+        new_argv[4] = argv[7];//password
+        new_argv[5] = argv[8];//authType
+        new_argv[6] = argv[9];//normalprotocol
+        new_argv[7] = argv[10];//roamingprotocol
+        //memcpy(apn_table[apn_count].apn,argv[4],strlen(argv[4]));
+        //apn_count++;
+        android::lynqSendToRil(8,new_argv,uToken);
+        syncRespToUsb(0);
+    }
+    else if(status == 0)
+    {
+        new_argv[0] = "RIL_REQUEST_DEACTIVATE_DATA_CALL";
+        new_argv[1] = argv[4];//apntype
+        android::lynqSendToRil(2,new_argv,uToken);
+    }
+    return 0;
+}
+int switchSim(int argc,char*argv[],char *rilReq, int uToken)
+{
+    int slot = 0;
+    int ret = -1;
+    char *new_argv[10] = {};
+    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);
+    return 0;
+}
+
+void * thread_test(void * arg)
+{
+    FILE *fp;
+    char buf[1024*3] = {0};
+    sprintf(buf, "echo 11 | emdlogger_ctrl 2>&1");
+    fp=popen(buf, "r");
+    if(!fp){
+        perror("popen:");
+    }
+    while(fgets(buf, 4072, fp) != NULL){}
+    pclose(fp);
+    return 0;
+}
+
+int lynq_screen(int argc,char*argv[],char *rilReq, int uToken){
+    char eBuf[64] = {0};
+    sprintf(eBuf,"\nOK\n\0");
+    int n = write(ttyGS3_fd,eBuf,strlen(eBuf));
+    if(n<0)
+    {
+        perror("lynq resp write:");
+    }
+    pthread_t thid;
+    int ret = pthread_create(&thid, NULL, thread_test, NULL);
+    if(ret != 0){
+        RLOGD("pthread_create error!!!");
+        return ret;
+    }
+    system("mdlogctl stop");
+    system("echo mem > /sys/power/autosleep");
+    system("echo 0 > /dev/wmtWifi");
+    system("echo 7 9 0 > /proc/driver/wmt_dbg");
+    char *new_argv[2] = {};
+    if(argc < 4)
+    {
+        RLOGD("parameter error!!!");
+        return -1;
+    }
+    new_argv[0] = (char *)rilReq;
+    new_argv[1] = argv[3];
+    android::lynqSendToRil(2,new_argv,uToken);
+    system("disown -a");
+    ret = pthread_join(thid,NULL);
+    if(ret != 0){
+        RLOGD("pthread_join error!!!");
+        return ret;
+    }
+    return 0;
+}
+
+void* getMDstate(int argc,char*argv[],int uToken)
+{
+    FILE *FP;
+    char BUFFER[64]={};
+    char BUF[32] = {};
+    int ret = -1;
+    int len = 0;
+    FP = popen("cat /sys/kernel/ccci/boot","r");
+    fgets(BUFFER,sizeof(BUFFER),FP);
+    printf("buffer %s",BUFFER);
+    modemStatus = atoi(&BUFFER[4]);
+    sprintf(BUF,"+LGMDS:%d\n\0",modemStatus);
+    len = write(ttyGS3_fd,BUF,strlen(BUF));
+    if(len < 0)
+    {
+        perror("lynq resp write:");
+        return 0;
+    }
+    syncRespToUsb(0);
+    return 0;
+}
+
+int lynqATWaitWithTime(int time)
+{
+    int ret = 0;
+    struct timespec start_tm;
+    //struct timespec end_tm;
+    //int timeout_ms = 2500;
+    clock_gettime(CLOCK_MONOTONIC, &start_tm);
+    //struct timeval now;
+    struct timespec outTime;
+    //gettimeofday(&now, NULL);//now.tv_sec(s),now.tv_usec(Micro s)
+    outTime.tv_sec = start_tm.tv_sec + time;
+    pthread_mutex_lock(&lynq_at_mutex);
+    //ret = pthread_cond_timedwait(&lynq_at_cond,&lynq_at_mutex,&outTime);
+    pthread_cond_wait(&lynq_at_cond,&lynq_at_mutex);
+    pthread_mutex_unlock(&lynq_at_mutex);
+    return ret;
+}
+void lynqAtRespWatingEvent()
+{
+    pthread_mutex_lock(&lynq_at_mutex);
+    pthread_cond_signal(&lynq_at_cond);
+    pthread_mutex_unlock(&lynq_at_mutex);
+    return;
+}
+void lynqInfo(char*argv[])
+{
+    int type = atoi(argv[2]);
+   
+    if(type==2){                            
+        //lynq_output_LINFO_all();     
+        syncRespToUsb(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);    
+            syncRespToUsb(0);
+        }   
+        else {
+            //lynq_output_info("parameter error\n"); 
+            syncRespToUsb(100);    
+        }
+    }
+    else if(type==1){        
+        //lynq_output_info("+LINFO: (0-1)\n");         
+        syncRespToUsb(0);
+    }
+    else {   
+        //lynq_output_info("parameter error\n"); 
+        syncRespToUsb(100);
+    }
+}
diff --git a/framework/lynq-ril-service/src/lynq_common.h b/framework/lynq-ril-service/src/lynq_common.h
index 90aa716..513431b 100755
--- a/framework/lynq-ril-service/src/lynq_common.h
+++ b/framework/lynq-ril-service/src/lynq_common.h
@@ -1,3 +1,13 @@
+/*============================================================================= 
+**     FileName: lynq_common.h
+**     Desc: lynq common
+**     Author: Warren
+**     Version: V1.0
+**     LastChange: 2021-09-27 
+**     History: 
+**=============================================================================*/
+#ifndef LYNQ_COMMON
+#define LYNQ_COMMON
 #include <stdlib.h>
 #include <stdio.h>
 #include <log/log.h>
@@ -6,19 +16,70 @@
 #include "common.h"
 #include <stateManager/stateManager.h>
 #include <liblog/lynq_deflog.h>
-#include <pthread.h>
-#ifdef __cplusplus
-extern "C" {
-#endif
+# include <pthread.h>
+
+#define LYNQ_GOTO_AT 1
+/*telephony*/
+#define LYNQ_GOTO_TELE_REQ 2
+/*Other-for-User*/
+#define LYNQ_GOTO_USER_REQ 3
+/*audio/etc*/
+#define LYNQ_GOTO_PLAT_REQ 4
+/*rndis/*/
+#define LYNQ_GOTO_RNDIS_REQ 5
+/*factory*/
+#define LYNQ_GOTO_FACTORY 6
+/*info output*/
+#define LYNQ_GOTO_LINFO_REQ 7
+/*fota*/
+#define LYNQ_GOTO_FOTA 8
+
 #define LYNQ_APN_LEN_MAX 100
 #define LYNQ_APNTPYE_LEN_MAX 50
 #define LYNQ_APN_CHANNEL_MAX 10
 #define LYNQ_AT_LEN_MAX 20
 #define LYNQ_EVENT_WAIT_TIME_MAX 25 //m
 
+#define LYNQ_VERSION 8500
+#define LYNQ_REQUEST_CGMI (LYNQ_VERSION+1)
+#define LYNQ_REQUEST_GMI (LYNQ_VERSION+2)
+#define LYNQ_REQUEST_CGMM (LYNQ_VERSION +3)
+#define LYNQ_REQUEST_GMM (LYNQ_VERSION +4)
+#define LYNQ_REQUEST_ATD (LYNQ_VERSION +5)
+#define LYNQ_REQUEST_CGCMOD (LYNQ_VERSION +6)
+#define LYNQ_REQUEST_CGAUTO (LYNQ_VERSION +7)
+#define LYNQ_REQUEST_CGACT (LYNQ_VERSION +8)
+#define LYNQ_REQUEST_CGDCONT (LYNQ_VERSION +9)
+#define LYNQ_REQUEST_LAPNACT (LYNQ_VERSION +10)
+#define LYNQ_REQUEST_ELAPNACT (LYNQ_VERSION +11)
+#define LYNQ_REQUEST_SWITCH_SIM (LYNQ_VERSION +12)
+#define LYNQ_REQUEST_SEND_LOG_DATA (LYNQ_VERSION +13)
+#define LYNQ_PLAT_LGMDS (LYNQ_VERSION +14)
+#define LYNQ_REQUEST_RNDIS (LYNQ_VERSION +15)
+#define LYNQ_REQUEST_FACTORY (LYNQ_VERSION +16)
+#define LYNQ_REQUEST_LINFO (LYNQ_VERSION +17)
+#define LYNQ_REQUEST_SCREEN_STATE (LYNQ_VERSION +18)
+#define LYNQ_REQUEST_FOTA (LYNQ_VERSION +19)
+#define LYNQ_USER_REQUEST_GNSS (LYNQ_VERSION +100)
+#define LYNQ_USER_REQUEST_OTHRE (LYNQ_VERSION +101)
 
 typedef struct
 {
+    int cmdId;
+    char * cmdName;
+    int support;
+}usb_at_transfer_t;
+
+typedef struct
+{
+    int cmdId;
+    char* rilRequest;
+    char * cmdName;
+    int (*fun)(int argc,char*argv[],char *rilReq,int uToken);
+    void* (*ufun)(int argc,char *argv[],int uToken);
+}usb_cmd_t;
+typedef struct
+{
     char apn[LYNQ_APN_LEN_MAX];
     char apntype[LYNQ_APNTPYE_LEN_MAX];
     char ifaceName[LYNQ_APNTPYE_LEN_MAX];
@@ -28,6 +89,24 @@
 }apn_table_t;
 extern apn_table_t apn_table[LYNQ_APN_CHANNEL_MAX];
 extern int apn_count;
-#ifdef __cplusplus
-}
+extern char lynq_at[LYNQ_AT_LEN_MAX];
+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);
+
+int routeCmd(int request);
+
+int CGMI(int argc,char*argv[],char *rilReq, int uToken);
+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_screen(int argc,char*argv[],char *rilReq, int uToken);
+void* getMDstate(int argc,char*argv[],int uToken);
+int lynqATWaitWithTime(int time);//time(s)
+void lynqAtRespWatingEvent();
+int syncRespToUsb(int error_code);
+void lynqInfo(char*argv[]);
 #endif
diff --git a/framework/lynq-ril-service/src/lynq_user.cpp b/framework/lynq-ril-service/src/lynq_user.cpp
new file mode 100755
index 0000000..7078df7
--- /dev/null
+++ b/framework/lynq-ril-service/src/lynq_user.cpp
@@ -0,0 +1,20 @@
+/*============================================================================= 
+**     FileName: lynq_user.cpp
+**     Desc: handle data from user
+**     Author: Warren
+**     Version: V1.0
+**     LastChange: 2021-09-28 
+**     History: 
+**=============================================================================*/

+#include <stdio.h>

+#include "lynq_user.h"

+void* lynqGnss(int argc,char *argv[],int uToken)

+{

+    printf("[lynqGnss] this is user space !!!\n");

+    return 0;

+}

+void* lynqOther(int argc,char *argv[],int uToken)

+{

+    printf("[lynqOther] this is user space !!!\n");

+    return 0;

+}

diff --git a/framework/lynq-ril-service/src/lynq_user.h b/framework/lynq-ril-service/src/lynq_user.h
new file mode 100755
index 0000000..6ad7361
--- /dev/null
+++ b/framework/lynq-ril-service/src/lynq_user.h
@@ -0,0 +1,14 @@
+/*============================================================================= 
+**     FileName: lynq_user.h
+**     Desc: handle data from user
+**     Author: Warren
+**     Version: V1.0
+**     LastChange: 2021-09-28 
+**     History: 
+**=============================================================================*/

+#ifndef LYNQ_USER
+#define LYNQ_USER

+

+void* lynqGnss(int argc,char *argv[],int uToken);

+void* lynqOther(int argc,char *argv[],int uToken);

+#endif

diff --git a/framework/lynq-ril-service/src/lynq_user_commands.h b/framework/lynq-ril-service/src/lynq_user_commands.h
new file mode 100755
index 0000000..d3f5a12
--- /dev/null
+++ b/framework/lynq-ril-service/src/lynq_user_commands.h
@@ -0,0 +1 @@
+

diff --git a/framework/lynq-ril-service/src/makefile b/framework/lynq-ril-service/src/makefile
index d6d78f6..39ae608 100755
--- a/framework/lynq-ril-service/src/makefile
+++ b/framework/lynq-ril-service/src/makefile
@@ -64,8 +64,14 @@
   -I$(LOCAL_PATH)/ecall/gost/sslp/commands \
   -I$(LOCAL_PATH)/ecall/gost/sslp/ecall \
   -I$(LOCAL_PATH)/ecall/gost/sslp/teledata \
+  -I$(LOCAL_PATH)/rndis \
+  -I$(LOCAL_PATH)/factory \
+  -I$(LOCAL_PATH)/fota \
   -I$(ROOT)$(includedir)/logger \
   -I$(ROOT)$(includedir)/liblog \
+  -I$(ROOT)$(includedir)/include  \
+  -I$(ROOT)$(includedir)/ftp \
+  -I$(ROOT)$(includedir)/logger \
   -I$(ROOT)$(includedir)/vendor-ril \
   -I$(ROOT)$(includedir)/gstreamer-1.0 \
   -I$(ROOT)$(includedir)/glib-2.0 \
@@ -99,7 +105,9 @@
     -ldtmf \
     -lapn \
     -ldbus-1 \
+    -llynq-log \
     -lsqlite3 \
+    -lnandapi  \
 
 ifeq ($(strip $(TARGET_PLATFORM)), mt2735)
 LOCAL_LIBS += -luciwrapper
@@ -108,7 +116,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)
+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)
 
 EXECUTABLE = lynq-ril-service
 
diff --git a/framework/lynq-ril-service/src/ril.cpp b/framework/lynq-ril-service/src/ril.cpp
index bc6133a..3dd15d3 100755
--- a/framework/lynq-ril-service/src/ril.cpp
+++ b/framework/lynq-ril-service/src/ril.cpp
@@ -76,6 +76,12 @@
 #include "lynq_interface.h"
 #include "lynq_common.h"
 #include "lynq_sms_manager.h"
+/*lei add*/
+#include "lynq_at.h"
+#include "lynq_user.h"
+#include "lynq_rndis.h"
+#include "lynq_factory.h"
+/*lei add*/
 /*Warren add for t800 RIL service 2021_12_10 end*/
 
 #define LOG_TAG "DEMO_RIL"
@@ -3794,6 +3800,49 @@
 
 #endif
 
+static void parse_version_buf(char *buf){
+    char *p = buf;
+    int flag = 0;
+    int recv = 0;
+    int tmp = -1;
+    while (*p != '\0')
+    {   
+        recv++;
+        if(*p == '"'){
+            tmp = recv;        
+        }
+        if(tmp >= 0){
+            buf[flag++] = buf[tmp++];
+            if(buf[flag-1] == '\"'){
+                buf[flag-1] = '\0';
+            }
+        }
+        *p++;
+    }
+    return;
+}
+
+static int lynq_get_version(){
+    FILE *fp;
+    char buf[128] = {0};
+    char cgmr[128] = {0};
+    sprintf(buf, "uci get lynq_uci_ro.lynq_version.LYNQ_SW_VERSION 2>&1");
+    fp=popen(buf, "r");
+    int n;
+    while(fgets(buf, sizeof(buf), fp) != NULL){
+        
+    }
+    //parse_version_buf(buf);
+    sprintf(cgmr, "%s %s", "+CGMR: ", buf);
+    n = write(ttyGS3_fd,cgmr,strlen(cgmr));
+    if(n<0)
+    {
+        perror("lynq resp write:");
+    }
+    pclose(fp);
+    return 0;
+}
+
 extern "C" void
 RIL_onRequestComplete(RIL_Token t, RIL_Errno e, void *response, size_t responselen) {
     RequestInfo *pRI;
@@ -3944,6 +3993,9 @@
                    {
                        update_reg_data_radio_tech(RIL_REQUEST_DATA_REGISTRATION_STATE, atoi((char *)p_cur[3]), socket_id, pRI->token);
                    }
+                   /*Warren add for SZZT 2021/11/14 start*/
+                   lynqAtRespWatingEvent();
+                   /*Warren add for SZZT 2021/11/14 end*/
                    break;
                }
                case RIL_REQUEST_GET_CURRENT_CALLS:
@@ -4013,11 +4065,51 @@
                    }
                    break;
                }
+               case RIL_REQUEST_OEM_HOOK_RAW:
+               {
+                   if(pRI->lynqEvent==1)
+                   {    
+                        /*lei add for at+cgmr*/
+                        if(strstr((const char*)response,"+CGMR")){
+                            lynq_get_version();
+                        }
+                        /*lei add for at+cgmr*/
+                        int n = write(ttyGS3_fd,response,responselen);
+                        if(n<0)
+                        {
+                            perror("lynq resp write:");
+                        }
+                        printf("n = %d\n",n);
+                   }
+               }
                default:
                    break;
                }
         }
-
+       /*Warren add for FAW platform 2021/10/8 start*/
+       else
+       {
+           if(pRI->lynqEvent==1)
+           {
+               char eBuf[64] = {0};
+               bzero(eBuf, 64);
+               if(e==RIL_E_SUCCESS)
+               {
+                    sprintf(eBuf,"\nOK\n\0");
+               }
+               else
+               {
+                   sprintf(eBuf,"\nCME ERROR: %d\n\0",e);
+               }
+               int n = write(ttyGS3_fd,eBuf,strlen(eBuf));
+               if(n<0)
+               {
+                   perror("lynq resp write:");
+               }
+               //printf("n = %d\n",n);
+           }
+       }
+       /*Warren add for FAW platform 2021/10/8 start*/
         if (e != RIL_E_SUCCESS) {
             appendPrintBuf("%s fails by %s", printBuf, failCauseToString(e));
         }
@@ -5958,6 +6050,149 @@
     return 0;
 }
 
+void startUsbLoop(void)
+{
+    int nread=-1;
+    int n = -1;
+    int routeId = -1;
+    char buffer[1024]={};
+    char tempbuf[1024]={};
+    char buf_parser[64] = {};
+    int argc = 0;
+    char *argv[MAX_ARGS];//argv[0]:at name,argv[1]:raw data,argv[2]:at type,argv[3]:paramter1,argv[4]:paramter2 ....
+    char eBuf[1024];
+    ttyGS3_fd = open("/dev/ttyGS3",O_RDWR);
+    if(ttyGS3_fd==-1)
+    {
+        RLOGE("open ttyGS3 failure!!!");
+        printf("open ttyGS3 failure!!!\n");
+        //printf("%s\n",strerr(errno));
+        perror("--test--");
+        kill(0, SIGKILL);
+    }
+    printf("[%s]open %s successfully!!!\n",__FUNCTION__,ttyname(ttyGS3_fd));
+    while(1)
+    {
+        bzero(buffer, 1024);
+        bzero(tempbuf, 1024);
+        bzero(buf_parser, 64);
+        if((nread=read(ttyGS3_fd,buffer,1024))>0)
+        {
+            if(nread<2)
+            {
+                //RLOGD("input is space!!!");
+                continue;
+            }
+            buffer[nread-1] = '\0';
+            //printf("buffer is %s\n",buffer);
+            for(int i = 0 ; i < nread ; i++)
+            {
+                if(buffer[i]=='=')
+                {
+                    break;
+                }
+                if(buffer[i]>='a'&&buffer[i]<='z')
+                {
+                    buffer[i] = buffer[i]-32;
+                }
+            }
+            printf("buffer is %s\n",buffer);
+            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:");
+               }
+               printf("n = %d\n",n);
+               continue;
+            }
+            usb_at_transfer_t *atCmd = lynqFindId(argv[0]);
+            if(atCmd==NULL)
+            {
+                RLOGD("LYNQ send ATCMD:%s!!!",argv[1]);
+                lynqSendAt(argc,argv,1010);
+                continue;
+            }
+            if(!((1<<atoi(argv[2])) & (atCmd->support)))
+            {
+                RLOGD("LYNQ %s not support!!!",atCmd->cmdName);
+                int n = write(ttyGS3_fd,"\n+CME ERROR: 100\n",strlen("\n+CME ERROR: 100\n"));
+                if(n<0)
+                {
+                    perror("lynq resp write:");
+                }
+                continue;
+            }
+            routeId = routeCmd(atCmd->cmdId);
+            //routeId = routeCmd(atcmd->cmdId);
+            //routeId = LYNQ_GOTO_AT;
+            switch(routeId)
+            {
+                case LYNQ_GOTO_AT:
+                {
+                    lynqSendAt(argc,argv,1010);
+                    break;
+                }
+                case LYNQ_GOTO_TELE_REQ:
+                {
+                    usb_cmd_t *atCmdEvn = lynqFindUsbEvent(argv[0]);
+                    if(!atCmdEvn)
+                    {
+                        RLOGD("can not find at cmd event!!!");
+                        continue;
+                    }
+                    atCmdEvn->fun(argc,argv,atCmdEvn->rilRequest,1011);
+                    break;
+                }
+                case LYNQ_GOTO_USER_REQ:
+                {
+                    usb_cmd_t *atCmdEvn = lynqFindUsbEvent(argv[0]);
+                    if(!atCmdEvn)
+                    {
+                        RLOGD("can not find at cmd event!!!");
+                        continue;
+                    }
+                    atCmdEvn->ufun(argc,argv,1012);
+                    break;
+                }
+                case LYNQ_GOTO_LINFO_REQ:
+                {
+                    lynqInfo(argv);
+                    break;
+                }
+                // case LYNQ_GOTO_PLAT_REQ:
+                // {
+                //     lynq_deal_with_log_at(&argv[3]);
+                //     break;
+                // }
+                case LYNQ_GOTO_RNDIS_REQ:
+                {
+                    lynq_get_rndis_data(buffer);
+                    break;
+                }
+                case LYNQ_GOTO_FACTORY:
+                {
+                    lynq_get_factory_data(argc,argv);
+                    break;
+                }
+                // case LYNQ_GOTO_FOTA:
+                // {
+                //     lynq_atfota_test(argv);
+                //     break;
+                // }
+                default:
+                    break;
+            }
+        }
+    }
+    close(ttyGS3_fd);
+    return;
+}
+
 void *
 eventLoop(void *param) {
     pthread_mutex_lock(&s_startupMutex);
@@ -5979,6 +6214,23 @@
     return NULL;
 }
 
+
+void *
+eventLoop_at(void *param) {
+    pthread_mutex_lock(&s_startupMutex);
+    s_started = 1;
+    pthread_cond_broadcast(&s_startupCond);
+    pthread_mutex_unlock(&s_startupMutex);
+    //RIL_StartRevSocket();
+    startUsbLoop();
+    //startUsbLoop_test();
+    RLOGD("error in event_loop_base errno:%d", errno);
+    // kill self to restart on error
+    kill(0, SIGKILL);
+
+    return NULL;
+}
+
 const int RspDispFunction(int request,char* arg, RIL_SOCKET_ID socket_id)
 {
     int waittoken;
@@ -6221,6 +6473,82 @@
 done:
     pthread_mutex_unlock(&s_startupMutex);
 }
+/*Warren add for  FAW 2021/09/23 start
+** use ttyGS0 port
+*/
+int lynqSendToRil(int argc,char *argv[],int uToken)
+{
+    if(argc < 1)
+    {
+        RLOGE("lynqSendToRil error input.");
+        return 1;
+    }
+    for(int i =0;i<argc;i++)
+    {
+        printf("argv[%d]=%s\n",i,argv[i]);
+    }
+    COMMAND *command = find_command(argv[0]);
+    if(!command)
+    {
+        RLOGE("%s: No such command for DemoApp", argv[0]);
+        return 1;
+    }
+
+    int32_t request;
+
+    request = command->request;
+
+    RIL_SOCKET_ID id = RIL_SOCKET_1;
+    if(utils::is_support_dsds()) {
+        id = (RIL_SOCKET_ID)get_default_sim_all_except_data();
+    } else if(utils::is_suppport_dsss()) {
+        id = (RIL_SOCKET_ID)Phone_utils::get_enable_sim_for_dsss();
+    }
+
+    if(request == -1)
+    {
+        (*(command->func)) (argc, argv, id, NULL);
+        return 1;
+    }
+
+    if (request < 1 || (request >= (int32_t)NUM_ELEMS(s_commands) && request < RIL_REQUEST_VENDOR_BASE)) {
+        RLOGW("unsupported request code %d token %d", request);
+        // FIXME this should perhaps return a response
+        return 1;
+    }
+
+    RLOGD("REQUEST: %s ParamterNum:%d", requestToString(request), argc);
+
+
+    RequestInfo *pRI  = creatRILInfoAndInit(request, UDP, (RIL_SOCKET_ID)(id));
+    pRI->lynqEvent = 1;
+    //Radio on/off only allow one thread operate.
+    if(request == RIL_REQUEST_RADIO_POWER)
+    {
+        speciaRequest_wait();
+    }
+    memset(Time_buf,0,sizeof(Time_buf));
+    GetTimeString(Time_buf);
+    //FUNCTION_CALLED(Time_buf,requestToString(request));
+    int waittoken = pRI->token;
+    (*(command->func)) (argc, argv, pRI->socket_id, pRI);
+    FUNCTION_CALLED(Time_buf,requestToString(request));
+    waitResponse(waittoken);
+    memset(Time_buf,0,sizeof(Time_buf));
+    GetTimeString(Time_buf);
+    FUNCTION_RETURN(Time_buf,requestToString(request));
+    return 0;
+}
+
+int sendRespToUsb(char *cmd)
+{
+    return 0;
+}
+int sendUrcToUsb(char *cmd)
+{
+    return 0;
+}
+/*Warren add for  FAW 2021/09/23 end*/
 
 void startPMLoop(void)
 {
@@ -6302,11 +6630,22 @@
         RLOGW("Failed to create dispatch thread: %s", strerror(result));
         goto done;
     }
+   
+    while (s_started == 0) {
+        pthread_cond_wait(&s_startupCond, &s_startupMutex);
+    }
+    /*mobiletek add*/
+    s_started = 0;
+    result = pthread_create(&s_tid_dispatch, &attr, eventLoop_at, NULL);
+    if (result != 0) {
+        RLOGW("Failed to create dispatch thread: %s", strerror(result));
+        goto done;
+    }
 
     while (s_started == 0) {
         pthread_cond_wait(&s_startupCond, &s_startupMutex);
     }
-
+    /*mobiletek add*/
     result = pthread_create(&s_tid_dispatch, &attr, responseLoop, NULL);
     if (result != 0) {
         RLOGW("Failed to create response dispatch thread: %s", strerror(result));
diff --git a/framework/lynq-ril-service/src/rndis/lynq_rndis.cpp b/framework/lynq-ril-service/src/rndis/lynq_rndis.cpp
new file mode 100755
index 0000000..c7849c7
--- /dev/null
+++ b/framework/lynq-ril-service/src/rndis/lynq_rndis.cpp
@@ -0,0 +1,156 @@
+/*============================================================================= 

+**     FileName: lynq_send_log_data

+**     Desc: send log data

+**     Author: victor

+**     Version: V1.0

+**     LastChange: 2021-12-23

+**     History: 

+=============================================================================*/

+

+#include "common.h"

+#include <stdio.h>

+#include <string.h>

+#include <stdlib.h>

+#include <malloc.h>

+#include<unistd.h>

+

+#include <pthread.h>

+

+#ifdef __cplusplus

+extern "C" {

+#endif

+

+#include <log/log.h>

+#include "lynq_rndis.h"

+

+#define LYNQ_RNDIS_MALLOC_LEN 64

+

+void lynq_rndis_response_ttyGS3(char *log_buf)

+{

+//    sprintf(log_buf,"LYNQ_GOTO_LOGS_REQ\n");

+    write(ttyGS3_fd,log_buf,strlen(log_buf));

+    return ;

+}

+

+int lynqParseRndisCommand(const char* cmd,char **argv)

+{

+    char test[1024];

+    char *token;

+    char *str = test;

+    char *string;

+    char *lynq_str_buf;

+    char *parameter;

+    int cnt = 0;

+    memcpy(test, cmd, strlen(cmd));  

+    if(strstr(cmd,"="))

+    {

+        token = strtok(str, "=");

+        lynq_str_buf = strstr(token, "+");

+    cnt++;

+    if((strlen(lynq_str_buf)) <LYNQ_RNDIS_MALLOC_LEN)

+        {

+             bzero(argv[0], LYNQ_RNDIS_MALLOC_LEN);

+             memcpy(argv[0],lynq_str_buf,strlen(lynq_str_buf));

+        }   

+    

+        while (token != NULL)

+        {

+            string = token;

+            token = strtok(NULL, "=");

+        }

+        parameter = strtok(string, ",");

+        int i = 1;

+        while (parameter != NULL)

+        {

+         if(((strlen(parameter)) <LYNQ_RNDIS_MALLOC_LEN) && (cnt < MAX_RNDIS_NUM))

+             {

+                 cnt++;

+                     bzero(argv[i], LYNQ_RNDIS_MALLOC_LEN);

+                 memcpy(argv[i++],parameter,strlen(parameter));

+         }

+            parameter = strtok(NULL, ",");

+        }

+    }

+    if(cnt > MAX_RNDIS_NUM)

+        return -1;

+    return cnt;

+}

+

+

+int lynq_deal_with_rndis(int cmd_num,char **lynq_rndis_arr)

+{

+    FILE *fp;

+    char lynq_rndis_dev[LYNQ_RNDIS_MALLOC_LEN+32] = {0};

+    char lynq_rndis_buf[1024];

+    char lynq_rndis_log_buf[256];

+    int m = 1;

+    if(0 == strcmp(lynq_rndis_arr[0], "+LRNDISHANDLE"))

+    {

+//            lynq_rndis_response_ttyGS3("##############\n");

+        for(m = 1; m < cmd_num; m++)

+        {

+/*                bzero(lynq_rndis_log_buf, 256);

+            sprintf(lynq_rndis_log_buf,"cmd_num:%d,m=%d:%s\n",cmd_num,m,lynq_rndis_arr[m]);

+            lynq_rndis_response_ttyGS3(lynq_rndis_log_buf);

+*/        

+            bzero(lynq_rndis_buf, 1024);

+

+            bzero(lynq_rndis_dev, (LYNQ_RNDIS_MALLOC_LEN+32));

+            sprintf(lynq_rndis_dev,"%s  2>&1",lynq_rndis_arr[m]);

+            fp=popen(lynq_rndis_dev, "r");

+            usleep(500);

+//                sleep(2);

+            fgets(lynq_rndis_buf,sizeof(lynq_rndis_buf),fp);

+            pclose(fp);

+            if(strlen(lynq_rndis_buf) > 0)

+            {

+                lynq_rndis_response_ttyGS3(lynq_rndis_buf);

+                lynq_rndis_response_ttyGS3("\n");

+            }

+        }

+

+    }

+    return 1;

+}

+

+int lynq_open_rndis(int cmd_num,char **lynq_argv)

+{

+    for(int j = 0;j<cmd_num;j++)

+        {

+            lynq_rndis_response_ttyGS3(lynq_argv[j]);

+        lynq_rndis_response_ttyGS3("\n");

+        }

+    return 1;

+}

+

+int lynq_get_rndis_data(char *rndis_data)

+{

+    int lynq_argc_num = 0;

+    char *lynq_str_argv[MAX_RNDIS_NUM];

+

+for(int i = 0;i < MAX_RNDIS_NUM; i++)

+{

+    lynq_str_argv[i] = (char*)calloc(1,LYNQ_RNDIS_MALLOC_LEN); 

+    if(lynq_str_argv[i] == NULL)

+    {

+        return -1;

+    }    

+}

+

+    lynq_argc_num = lynqParseRndisCommand(rndis_data,lynq_str_argv);

+//    lynq_open_rndis(lynq_argc_num,lynq_str_argv);

+    lynq_deal_with_rndis(lynq_argc_num,lynq_str_argv);

+for(int mm= 0;mm < MAX_RNDIS_NUM; mm++)

+{

+    if(lynq_str_argv[mm] != NULL)

+    {

+        free(lynq_str_argv[mm]);

+        lynq_str_argv[mm] = NULL;

+    }    

+}

+    return 1;

+}

+

+#ifdef __cplusplus

+}

+#endif

diff --git a/framework/lynq-ril-service/src/rndis/lynq_rndis.h b/framework/lynq-ril-service/src/rndis/lynq_rndis.h
new file mode 100755
index 0000000..a6d9009
--- /dev/null
+++ b/framework/lynq-ril-service/src/rndis/lynq_rndis.h
@@ -0,0 +1,16 @@
+#ifndef __LYNQ_RNDIS_H__

+#define __LYNQ_RNDIS_H__

+#ifdef __cplusplus
+extern "C" {
+#endif

+

+#define MAX_RNDIS_NUM 10

+

+int lynq_open_rndis(int cmd_num,char **lynq_argv);

+int lynq_get_rndis_data(char *rndis_data);

+

+#ifdef __cplusplus
+}
+#endif
+

+#endif //__LYNQ_LOGSEND_TEST_H__