[Feature][T8TSK-100] RIL3.0 AT partial upgrade

Change-Id: I8740b951a04fc8e1704dd593eb8ba12c43ac22aa
diff --git a/meta/meta-mediatek-mt2735/conf/machine/auto2735evb-ivt-main.conf b/meta/meta-mediatek-mt2735/conf/machine/auto2735evb-ivt-main.conf
index 76322b5..0c51fd9 100755
--- a/meta/meta-mediatek-mt2735/conf/machine/auto2735evb-ivt-main.conf
+++ b/meta/meta-mediatek-mt2735/conf/machine/auto2735evb-ivt-main.conf
@@ -22,3 +22,5 @@
 
 MEMORY_SIZE = "1024"
 NAND_CHIP_NAME = "MT29F8G08ADBFA"
+#support lynq_atsvc [hong.liu add for lynq atsvc on 2022.12.1]
+LYNQ_ATSVC_SUPPORT = "yes"
diff --git a/meta/meta-mediatek-mt2735/recipes-telephonyware/atcid/atci_1.0.0.bb b/meta/meta-mediatek-mt2735/recipes-telephonyware/atcid/atci_1.0.0.bb
index ffe2232..c614084 100755
--- a/meta/meta-mediatek-mt2735/recipes-telephonyware/atcid/atci_1.0.0.bb
+++ b/meta/meta-mediatek-mt2735/recipes-telephonyware/atcid/atci_1.0.0.bb
@@ -5,20 +5,25 @@
 inherit workonsrc systemd
 WORKONSRC = "${TOPDIR}/../src/telephonyware/3.0/atcid/atci/src"
 
-DEPENDS += " mipc uci libuciwrapper"
+DEPENDS += " mipc uci libuciwrapper libxml2"
 
-FILES_${PN} = "${bindir}/atcid"
+
+FILES_${PN} = "${bindir}/atcid /data/atsvc"
+
 
 ATCID_CFLAGS_ADD = " -I${STAGING_DIR_HOST}/usr/include/mipc/api \
                      -I${STAGING_DIR_HOST}/usr/include/mipc/common \
                      -I${STAGING_DIR_HOST}/usr/include/mipc/msg \
                      -I${STAGING_DIR_HOST}/usr/include/mipc/external \
                      -I${STAGING_DIR_HOST}/usr/include \
+                     -I${STAGING_DIR_HOST}/usr/include/libxml2 \
                      -D_LINUX -DTELEMATICS -fPIC \
                      -I${STAGING_DIR_HOST}/${libdir}\
                      -DENABLE_TRM \
 "
 
+EXTRA_OEMAKE = "'LYNQ_ATSVC_SUPPORT = ${LYNQ_ATSVC_SUPPORT}'"
+
 CFLAGS_append = "${ATCID_CFLAGS_ADD}"
 CXXFLAGS_append = "${ATCID_CFLAGS_ADD}"
 LDFLAGS_append = " -lmipc_msg -luci -lpthread  -luciwrapper -llog"
@@ -26,4 +31,10 @@
 do_install() {
     install -d ${D}${bindir}
     install -m 0755 atcid ${D}${bindir}
+    if test "${LYNQ_ATSVC_SUPPORT}" = "yes"; then
+        install -d ${D}/data/atsvc
+        cp -R ${WORKONSRC}/lynq-private/lynq_atsvc_plugin.xml ${D}/data/atsvc
+        cp -R ${WORKONSRC}/lynq-private/pseudo_terminal/terminal_controller.conf ${D}/data/atsvc
+    fi
+
 }
diff --git a/src/lynq/framework/lynq-ril-service/src/atci/ATCI.cpp b/src/lynq/framework/lynq-ril-service/src/atci/ATCI.cpp
index 16f38df..cdb1977 100644
--- a/src/lynq/framework/lynq-ril-service/src/atci/ATCI.cpp
+++ b/src/lynq/framework/lynq-ril-service/src/atci/ATCI.cpp
@@ -55,6 +55,7 @@
 #include "atci_sys_cmd.h"
 #include "atci_ss_cmd.h"
 #include "atci_cc_cmd.h"
+#include "atci_lynq_data_cmd.h" //warren add for lynq atsvc on 20221207
 #endif
 
 struct sockaddr_un atci_server_addr;
@@ -454,6 +455,90 @@
   RLOGD("Response Buf is %s, send length is %d",buf,len_s);
 }
 
+/*warren add for lynq atsvc on 20221208 start*/
+static int atci_send_result(int error_code)
+{
+    char buf[32];
+    memset(buf, 0, sizeof(buf));
+    if(error_code != 0)
+    {
+        sprintf(buf,"%s%d","\r\n+CME ERROR: ",error_code);
+    }
+    else
+    {
+        sprintf(buf,"%s","\r\nOK");
+    }
+    int len_s = send(atci_client_connect, buf, strlen(buf), 0);
+    if(len_s != strlen(buf))
+    {
+        RLOGD("send buf fail Response Buf is %s, send length is %d",buf,len_s);
+        return -1;
+    }
+    RLOGD("Response Buf is %s, send length is %d",buf,len_s);
+    return 0;
+}
+static int atci_send_data(char *data)
+{
+    char buf[128];
+    int data_len = 0;
+    memset(buf, 0, sizeof(buf));
+    if(NULL == data)
+    {
+        RLOGD("data is null");
+        return -1;
+    }
+    else
+    {
+        data_len = strlen(data);
+        if(data_len > 124)// \r\r + \0
+        {
+            RLOGD("data too long");
+            snprintf(buf,127,"\r\n%s",data);
+        }
+        else
+        {
+            snprintf(buf,data_len+3,"\r\n%s",data);// \r\r + \0
+        }
+        int len_s = send(atci_client_connect, buf, strlen(buf), 0);
+        if(len_s != strlen(buf))
+        {
+            RLOGD("send buf fail Response Buf is %s, send length is %d",buf,len_s);
+            return -1;
+        }
+        RLOGD("Response Buf is %s, send length is %d",buf,len_s);
+    }
+    return 0;
+}
+void ATCIResponseNoToken(int error, char* data, int reqNum)
+{
+    char buf[64];
+    if(NULL == data && reqNum == 0)
+    {
+          RLOGD("[%d][%s] input error",__LINE__,__FUNCTION__);
+          return;
+    }
+    RLOGD("request is %d,%s",reqNum,android::requestToString(reqNum));
+    if(NULL == data)
+    {
+        if(atci_send_result(error)!=0)
+        {
+            RLOGD("send result fail");
+        }
+    }
+    else
+    {
+        if(atci_send_data(data)!=0)
+        {
+            RLOGD("send data fail");
+            return;
+        }
+        if(atci_send_result(error)!=0)
+        {
+            RLOGD("send result fail");
+        }
+    }
+}
+/*warren add for lynq atsvc on 20221208 end*/
 #ifdef ATCI_PARSE
 int acti_cmd_recv(int fd, char *buf, int len) {
   int ret = 0;
@@ -588,7 +673,7 @@
   }
 #ifdef ATCI_PARSE
   DbgMsg("init cmd handle");
-  if(/*atci_generic_init(NULL)||*/atci_cc_init(NULL)||atci_ss_init(NULL)||atci_sys_init(NULL)) {
+  if(/*atci_generic_init(NULL)||*/atci_cc_init(NULL)||atci_ss_init(NULL)||atci_sys_init(NULL)||atci_lynq_data_init(NULL)) {
     ErrMsg("module init function error,exit");
     exit(-1);
   }
@@ -798,7 +883,7 @@
     int cmd_mode = atci_get_cmd_mode(line);
     char response[MAX_RESP_BUF_LENGTH];
     memset(response, 0, sizeof(response));
-    RLOGD("write to handler");
+    RLOGD("write to handler,cmd_mode:%d",cmd_mode);
     ret = cmd_handle->cmd_handle_func(line, cmd_mode, cmd_handle->target,
         response);
     if (SYS_FAIL == ret) {
diff --git a/src/lynq/framework/lynq-ril-service/src/atci/ATCI.h b/src/lynq/framework/lynq-ril-service/src/atci/ATCI.h
index 45f9d4f..0893f1d 100755
--- a/src/lynq/framework/lynq-ril-service/src/atci/ATCI.h
+++ b/src/lynq/framework/lynq-ril-service/src/atci/ATCI.h
@@ -146,6 +146,7 @@
 #endif
 
 void ATCIResponse(int token, int error, char* data, int reqNum);
+void ATCIResponseNoToken(int error, char* data, int reqNum); /*warren add for lynq atsvc on 20221208*/
 
 void * StartATCISocket(void *param);
 #endif
diff --git a/src/lynq/framework/lynq-ril-service/src/atci/atci_lynq_data_cmd.cpp b/src/lynq/framework/lynq-ril-service/src/atci/atci_lynq_data_cmd.cpp
new file mode 100755
index 0000000..8561e58
--- /dev/null
+++ b/src/lynq/framework/lynq-ril-service/src/atci/atci_lynq_data_cmd.cpp
@@ -0,0 +1,246 @@
+/**********************************************************************************************
+* @file atci_lynq_data_cmd.cpp
+* @brief.Implementation of lynq data AT commands function 
+* @details None
+* @author   Hong Liu。
+* @date     2022-12-07
+* @version  V1.0
+* @copyright   Copyright (c) MobileTek 
+***********************************************************************************************/
+#include <vendor-ril/telephony/ril.h>
+#include <string.h>
+#include <log/log.h>
+
+#include "ATCI.h"
+#include "atci_util.h"
+#include "atci_at_util.h"
+#include "atci_lynq_data_cmd.h"
+#include "atci_common.h"
+
+#undef LOG_TAG
+#define LOG_TAG "DEMO_ATCI_DATA"
+#define LINE __LINE__
+#define FUNC __FUNCTION__
+atci_cmd_type_t atci_data_cmd_table[] = {
+//cmd_name      target_type        handler
+    { "AT+LAPNACT", TARGET_TELEPHONY, atci_data_enable_pdp_hdlr },            //AT command to enable defult PDP
+    { "AT+ELAPNACT", TARGET_TELEPHONY, atci_data_enable_pdp_with_apn_hdlr },  //AT command to enable PDP with APN
+    { "AT+LEAPNMOD", TARGET_TELEPHONY, atci_data_modify_apn_hdlr },           //AT command to modify APN
+    { NULL, TARGET_UNKNOWN, NULL }
+};
+int atci_lynq_data_init(void *arg) {
+    int ret;
+    ret = atci_cmd_register(atci_data_cmd_table);
+    return ret;
+}
+
+int atci_data_enable_pdp_hdlr(char *cmd, int op_mode, int target, char *response)
+{
+    int ret;
+    char buf[16];
+    switch (op_mode)
+    {
+        case AT_SET_MODE:
+        {
+            //paser parameter
+            //send to target handle
+            //ex: at+lapnact=int
+            RLOGD("input cmd[%s]", cmd);
+
+            if (SYS_FAIL == atci_at_to_equal(&cmd))
+            {
+              //input error
+              return SYS_FAIL;
+              break;
+            }
+            RLOGD("[%d][%s] data is[%s]",LINE,FUNC,cmd);
+            int state;
+
+            if (SYS_FAIL == atci_at_get_nexthexint(&cmd, &state))
+            {
+              return SYS_FAIL;
+              break;
+            }
+
+            RLOGD("state value is %d", state);
+
+            //wrire data to target
+            atci_data_req_t req;
+            
+            if(state==1)
+            {
+                req.request_id = RIL_REQUEST_SETUP_DATA_CALL;
+            }
+            else if(state == 0)
+            {
+                req.request_id = RIL_REQUEST_DEACTIVATE_DATA_CALL;
+            }
+            else
+            {
+                return SYS_FAIL;
+            }
+            RLOGD("input req data");
+
+            char reqStr[RIL_REQUEST_STRING_LENGTH] = {0};
+            memcpy(reqStr, request2RILStr(req.request_id),strlen(request2RILStr(req.request_id)) + 1);
+            RLOGD("request is %s", reqStr);
+            char* argv[2] = { 0 };
+            argv[0] = reqStr;
+            int argc = 1;
+            sendAtciRequest(req.request_id, reqStr, argc, argv);
+            ATCIResponseNoToken(0,NULL,req.request_id);
+            break;
+        }
+        case AT_TEST_MODE:
+        {
+            memset(buf,0,sizeof(buf));
+            sprintf(buf,"%s","+LAPNACT: (0,1)");
+            ATCIResponseNoToken(0,buf,RIL_REQUEST_SETUP_DATA_CALL);
+        }
+        default:
+        {
+            RLOGD("set mute error");
+            break;
+        }
+    }
+    return SYS_SUCC;
+}
+
+int atci_data_enable_pdp_with_apn_hdlr(char *cmd, int op_mode, int target,char *response)
+{
+    int ret;
+    int argc = 0;
+    char* argv[8] = { 0 };
+    char buf[128];
+    char authTypebuf[16] = {0};
+    int state = 0;
+    int authType = 0;
+    char *apn = NULL;
+    char *apnTpye = NULL;
+    char *user = NULL;
+    char *password =NULL;
+    char *apnprotocol = NULL;
+    char *apnRoamProtocol = NULL;
+    switch (op_mode)
+    {
+        case AT_SET_MODE:
+        {
+            //paser parameter
+            //send to target handle
+            //ex: at+lapnact=int
+            RLOGD("input cmd[%s]", cmd);
+
+            if (SYS_FAIL == atci_at_to_equal(&cmd))
+            {
+              //input error
+                return SYS_FAIL;
+            }
+            RLOGD("[%d][%s] data is[%s]",LINE,FUNC,cmd);
+
+            if (SYS_FAIL == atci_at_get_nexthexint(&cmd, &state))
+            {
+                return SYS_FAIL;
+            }
+            RLOGD("state value is %d", state);
+            if(state == 1)
+            {
+                if (SYS_FAIL == atci_at_get_next_key(&cmd, &apn))
+                {
+                    return SYS_FAIL;
+                }
+                RLOGD("apn value is %s", apn);
+                if (SYS_FAIL == atci_at_get_next_key(&cmd, &apnTpye))
+                {
+                    return SYS_FAIL;
+                }
+                RLOGD("apnTpye value is %s", apnTpye);
+                if (SYS_FAIL == atci_at_get_next_key(&cmd, &user))
+                {
+                    return SYS_FAIL;
+                }
+                RLOGD("user value is %s", user);
+                if (SYS_FAIL == atci_at_get_next_key(&cmd, &password))
+                {
+                    return SYS_FAIL;
+                }
+                RLOGD("pwd value is %s", password);
+                if (SYS_FAIL == atci_at_get_nexthexint(&cmd, &authType))
+                {
+                    return SYS_FAIL;
+                }
+                RLOGD("authType value is %d", authType);
+                if (SYS_FAIL == atci_at_get_next_key(&cmd, &apnprotocol))
+                {
+                    return SYS_FAIL;
+                }
+                RLOGD("apnprotocol value is %s", apnprotocol);
+                if (SYS_FAIL == atci_at_get_next_key(&cmd, &apnRoamProtocol))
+                {
+                    return SYS_FAIL;
+                }
+                RLOGD("apnRoamProtocol value is %s", apnRoamProtocol);
+                argv[1] = apn;
+                argv[2] = apnTpye;
+                argv[3] = user;
+                argv[4] = password;
+                sprintf(authTypebuf,"%d",authType);
+                argv[5] = authTypebuf;
+                argv[6] = apnprotocol;
+                argv[7] = apnRoamProtocol;
+                argc = 8;
+            }
+            else if(state == 0)
+            {
+                 if (SYS_FAIL == atci_at_get_next_key(&cmd, &apnTpye))
+                {
+                    return SYS_FAIL;
+                }
+                RLOGD("apnTpye value is %s", apnTpye);
+                argv[1] = apnTpye;
+                argc = 2;
+            }
+            //wrire data to target
+            atci_data_req_t req;
+            if(state==1)
+            {
+                req.request_id = RIL_REQUEST_SETUP_DATA_CALL;
+            }
+            else if(state == 0)
+            {
+                req.request_id = RIL_REQUEST_DEACTIVATE_DATA_CALL;
+            }
+            else
+            {
+                return SYS_FAIL;
+            }
+            RLOGD("input req data");
+
+            char reqStr[RIL_REQUEST_STRING_LENGTH] = {0};
+            memcpy(reqStr, request2RILStr(req.request_id),strlen(request2RILStr(req.request_id)) + 1);
+            RLOGD("request is %s", reqStr);
+            argv[0] = reqStr;
+            sendAtciRequest(req.request_id, reqStr, argc, argv);
+            ATCIResponseNoToken(0,NULL,req.request_id);
+            break;
+        }
+        case AT_TEST_MODE:
+        {
+            memset(buf,0,sizeof(buf));
+            sprintf(buf,"%s","+ELAPNACT: (0,1),"","","","",(0-3),(\"null\",\"IPV4\",\"IPV6\",\"IPV4V6\"),(\"null\",\"IPV4\",\"IPV6\",\"IPV4V6\")");
+            ATCIResponseNoToken(0,buf,RIL_REQUEST_SETUP_DATA_CALL);
+        }
+        default:
+        {
+            RLOGD("set mute error");
+            break;
+        }
+    }
+    return SYS_SUCC;
+}
+
+int atci_data_modify_apn_hdlr(char *cmd, int op_mode, int target, char *response)
+{
+    return SYS_SUCC;
+}
+
+
diff --git a/src/lynq/framework/lynq-ril-service/src/atci/atci_lynq_data_cmd.h b/src/lynq/framework/lynq-ril-service/src/atci/atci_lynq_data_cmd.h
new file mode 100755
index 0000000..a078978
--- /dev/null
+++ b/src/lynq/framework/lynq-ril-service/src/atci/atci_lynq_data_cmd.h
@@ -0,0 +1,20 @@
+/**********************************************************************************************
+* @file atci_lynq_data_cmd.h
+* @brief.define lynq data at commands function
+* @details None
+* @author   Hong Liu。
+* @date     2022-12-07
+* @version  V1.0
+* @copyright   Copyright (c) MobileTek 
+***********************************************************************************************/
+
+#ifndef __ATCI_LYNQ_DATA_CMD_H__
+#define __ATCI_LYNQ_DATA__CMD_H__
+
+int atci_lynq_data_init(void *arg);
+int atci_data_enable_pdp_hdlr(char *cmd, int op_type, int target, char *response);
+int atci_data_enable_pdp_with_apn_hdlr(char *cmd, int op_mode, int target, char *response);
+int atci_data_modify_apn_hdlr(char *cmd, int op_mode, int target, char *response);
+
+#endif
+
diff --git a/src/lynq/framework/lynq-ril-service/src/atci/atci_lynq_generic_cmd.cpp b/src/lynq/framework/lynq-ril-service/src/atci/atci_lynq_generic_cmd.cpp
new file mode 100755
index 0000000..f94947c
--- /dev/null
+++ b/src/lynq/framework/lynq-ril-service/src/atci/atci_lynq_generic_cmd.cpp
@@ -0,0 +1,26 @@
+#include <vendor-ril/telephony/ril.h>
+#include <string.h>
+#include <log/log.h>
+
+#include "ATCI.h"
+#include "atci_util.h"
+#include "atci_at_util.h"
+#include "atci_lynq_generic_cmd.h"
+#include "atci_common.h"
+
+#undef LOG_TAG
+#define LOG_TAG "DEMO_ATCI_GENERIC"
+/*
+atci_cmd_type_t atci_generic_cmd_table[] = {
+//cmd_name      target_type        handler
+    { "AT+LCSUS", TARGET_TELEPHONY, atci_data_enable_pdp_hdlr },              //AT command to dsds
+    { "AT+SCREEN", TARGET_TELEPHONY, atci_data_enable_pdp_with_apn_hdlr },    //AT command to off/on modem screen
+    { "ATD", TARGET_TELEPHONY, atci_data_modify_apn_hdlr },
+    { NULL, TARGET_UNKNOWN, NULL }
+};
+int atci_lynq_generic_init(void *arg) {
+  int ret;
+  ret = atci_cmd_register(atci_generic_cmd_table);
+  return ret;
+}
+*/
diff --git a/src/lynq/framework/lynq-ril-service/src/atci/atci_lynq_generic_cmd.h b/src/lynq/framework/lynq-ril-service/src/atci/atci_lynq_generic_cmd.h
new file mode 100755
index 0000000..33882cd
--- /dev/null
+++ b/src/lynq/framework/lynq-ril-service/src/atci/atci_lynq_generic_cmd.h
@@ -0,0 +1 @@
+int atci_lynq_generic_init(void *arg);
diff --git a/src/lynq/framework/lynq-ril-service/src/atci/atci_util.cpp b/src/lynq/framework/lynq-ril-service/src/atci/atci_util.cpp
index 656a251..137d4a9 100755
--- a/src/lynq/framework/lynq-ril-service/src/atci/atci_util.cpp
+++ b/src/lynq/framework/lynq-ril-service/src/atci/atci_util.cpp
@@ -76,6 +76,10 @@
     return "RIL_REQUEST_DIAL_WITH_SIP_URI";
   case RIL_REQUEST_SET_IMS_ENABLE:
     return "RIL_REQUEST_SET_IMS_ENABLE";
+  case RIL_REQUEST_DEACTIVATE_DATA_CALL:
+    return "RIL_REQUEST_DEACTIVATE_DATA_CALL";
+  case RIL_REQUEST_SETUP_DATA_CALL:
+    return "RIL_REQUEST_SETUP_DATA_CALL";
   default:
     return "unknown define";
   }
diff --git a/src/lynq/framework/lynq-ril-service/src/main.cpp b/src/lynq/framework/lynq-ril-service/src/main.cpp
index bf44a49..5a7057b 100755
--- a/src/lynq/framework/lynq-ril-service/src/main.cpp
+++ b/src/lynq/framework/lynq-ril-service/src/main.cpp
@@ -126,7 +126,7 @@
     /*lei add for gsw
     reason:Socket sending failed at GSW
     */
-    signal(SIGHUP, signal_handler);
+    //signal(SIGHUP, signal_handler);
     system("route add -host 255.255.255.255 dev lo");
     int lock_file = open("/tmp/tel_demo_single_proc.lock", O_CREAT|O_RDWR, 0666);
     int rc = flock(lock_file,LOCK_EX|LOCK_NB);
@@ -157,7 +157,7 @@
     }
 
     android::RIL_startEventLoop();
-    //android::startATCILoop();
+    android::startATCILoop();
     //android::startPMLoop();
     //android::startWakupLoop();
 
diff --git a/src/lynq/framework/lynq-ril-service/src/ril.cpp b/src/lynq/framework/lynq-ril-service/src/ril.cpp
index e44cd49..ffd80d8 100755
--- a/src/lynq/framework/lynq-ril-service/src/ril.cpp
+++ b/src/lynq/framework/lynq-ril-service/src/ril.cpp
@@ -4220,41 +4220,7 @@
                    }
                    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);
-                   }
-                   /*lei add only for factory test 2022/5/19*/
-                   if(pRI->lynqEvent==3)
-                   {
-                       /*lei add for at+cgir*/
-                        if(strstr((const char*)response,"+CGMR")){
-                            lynq_get_inside_version();
-                        }
-                        /*lei add for at+cgir*/
-                        parse_inside_version(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*/
+               /*lei add for sdk ready 2022/8/17*/
                 case RIL_REQUEST_DEVICE_IDENTITY:
                 {
                     int resp_type;
@@ -4264,9 +4230,8 @@
                     int error1;
                     int num;
                     char imei[32] = {0};
-                    if(pRI->lynqEvent==1)
+                    if(sdk_ready == true)
                     {
-                        //printf("lei test %s\n" ,printBuf);
                         p.setDataPosition(0);
                         if(p.dataAvail() > 0)
                         {
@@ -4277,68 +4242,18 @@
                             p.readInt32(&error1);
                             if(!error1)
                             {
-                                p.readInt32(&num);
-                                char * test = lynqStrdupReadString(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:");
-                                    }
-                                }
-                                imei_cnt++;
-                                free(test);
+                               system("uci set lynq_uci.sdk_ready=0");
                             }
-                        }
-                    }
-                    /*lei add for sdk ready 2022/8/17*/
-                    else
-                    {
-                        if(sdk_ready == true)
-                        {
-                            p.setDataPosition(0);
-                            if(p.dataAvail() > 0)
+                            else
                             {
-                                p.readInt32(&resp_type);
-                                p.readInt32(&token);
-                                p.readInt32(&request);
-                                p.readInt32(&slot_id);
-                                p.readInt32(&error1);
-                                if(!error1)
-                                {
-                                   system("uci set lynq_uci.sdk_ready=0");
-                                }
-                                else
-                                {
-                                    system("uci set lynq_uci.sdk_ready=2");
-                                }
+                                system("uci set lynq_uci.sdk_ready=2");
                             }
-                            sdk_ready = false;
                         }
+                        sdk_ready = false;
                     }
-                    /*lei add for sdk ready 2022/8/17*/
                     break;
                 }
-                /*lei add for AT+CGSN 2022/8/4*/
+                /*lei add for sdk ready 2022/8/17*/
                 case RIL_REQUEST_OPERATOR:
                 {
                     lynq_get_mccmnc(p, mccmnc);
@@ -4347,30 +4262,6 @@
                    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));
         }
@@ -7220,7 +7111,8 @@
     while (s_started == 0) {
         pthread_cond_wait(&s_startupCond, &s_startupMutex);
     }
-    /*mobiletek add*/
+    //warren delete,beacuse of update at fwk.
+    /*mobiletek add*
     s_started = 0;
     result = pthread_create(&s_tid_dispatch, &attr, eventLoop_at, NULL);
     if (result != 0) {
@@ -7231,7 +7123,7 @@
     while (s_started == 0) {
         pthread_cond_wait(&s_startupCond, &s_startupMutex);
     }
-    /*mobiletek add*/
+    *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/src/telephonyware/3.0/atcid/atci/src/Makefile b/src/telephonyware/3.0/atcid/atci/src/Makefile
index 42c2169..77f997a 100755
--- a/src/telephonyware/3.0/atcid/atci/src/Makefile
+++ b/src/telephonyware/3.0/atcid/atci/src/Makefile
@@ -2,9 +2,15 @@
 
 FLAGS += -DMTK_GPS_FEATURE
 
+$(warning ################# warren LYNQ_ATSVC_SUPPORT: $(LYNQ_ATSVC_SUPPORT))
+ifeq ($(strip $(LYNQ_ATSVC_SUPPORT)), yes)
+    FLAGS += -DLYNQ_ATSVC 
+endif
+
 INCLUDES := -I. \
          -I./platform \
-
+         -I./lynq-private \
+         -I./lynq-private/pseudo_terminal \
 
 SRCS := \
            ./at_tok.c \
@@ -18,6 +24,8 @@
            ./platform/atcid_common.c \
            ./atcid_sim_cmd.c\
            ./atcid_universal_ant_cmd.c\
+           ./lynq-private/lynq_atsvc_controller.c \
+           ./lynq-private/pseudo_terminal/transfer_controller.c \
 
 
 CXXSRCS := \
@@ -30,7 +38,7 @@
 
 CXXOBJS := ${CXXSRCS:%.cpp=%.o}
 
-#LDFLAGS = -L. -lz -ldl -lpthread -lstdc++
+LDFLAGS += -L. -lpthread -lxml2 -ldl
 
 .PHONY: all
 all : $(TARGET)
diff --git a/src/telephonyware/3.0/atcid/atci/src/atcid.c b/src/telephonyware/3.0/atcid/atci/src/atcid.c
index 0bb0641..d5ee767 100755
--- a/src/telephonyware/3.0/atcid/atci/src/atcid.c
+++ b/src/telephonyware/3.0/atcid/atci/src/atcid.c
@@ -44,6 +44,7 @@
 
 #include <netinet/in.h>
 #include <sys/socket.h>
+#include "lynq_atsvc_controller.h"
 
 /*misc global vars */
 Serial serial;
@@ -69,11 +70,19 @@
 */
 int main() {
     int i = 0;
+    int res = 0;
     LOGATCI(LOG_INFO, "atcid-daemon start!!!");
 
     //Initial the parameter for serial dervice
     initSerialDevice(&serial);
-
+#ifdef LYNQ_ATSVC
+    res = lynq_atsvc_init(0,PLUGIN_CONF_PATH);
+    if(res!=0)
+    {
+        ALOGD("lynq_atsvc_init fail,result = %d",res);
+        ALOGD("lynq all at cmd can`t use");
+    }
+#endif
 #ifdef MTK_DATACARD_ATCI
     //AP AT port is GS3 in factory mode
     snprintf(serial.devicename[0], strlen(TTY_GS3) + 1, "%s", TTY_GS3);
diff --git a/src/telephonyware/3.0/atcid/atci/src/atcid_cmd_dispatch.c b/src/telephonyware/3.0/atcid/atci/src/atcid_cmd_dispatch.c
index 08810de..6d9dc8a 100755
--- a/src/telephonyware/3.0/atcid/atci/src/atcid_cmd_dispatch.c
+++ b/src/telephonyware/3.0/atcid/atci/src/atcid_cmd_dispatch.c
@@ -292,6 +292,32 @@
     free(line_cut);
     return 0;
 }
+/*warren add for lynq atsvc on 2022/12/06 start*/
+#ifdef LYNQ_ATSVC
+int lynq_command_hdlr(char *line)
+{
+    int i = 0;
+    int table_size = 0;
+    char* line_cut = cut_cmd_line(line);
+    if (line_cut == NULL)
+    {
+        return 0;
+    }
+    table_size = (sizeof(lynq_cmd_table)/sizeof(generic_cmd_type));
+
+    for (i = 0; i < table_size; i++)
+    {
+        if (strcmp(line_cut, lynq_cmd_table[i].cmdName) == 0)
+        {
+            free(line_cut);
+            return 1; //The command is handled here
+        }
+    }
+    free(line_cut);
+    return 0;
+}
+#endif
+/*warren add for lynq atsvc on 2022/12/06 end*/
 
 int process_cmd_line(char* line) {
     LOGATCI(LOG_DEBUG,"Enter");
@@ -311,6 +337,14 @@
     if (generic_command_hdlr(line)) {
         return GENERIC_TYPE;
     }
+/*warren add for lynq atsvc on 2022/12/06 start*/
+#ifdef LYNQ_ATSVC
+    LOGATCI(LOG_DEBUG, "handle in lynq_command_hdlr");
+    if (lynq_command_hdlr(line)) {
+        return LYNQ_CMD_TYPE;
+    }
+#endif
+/*warren add for lynq atsvc on 2022/12/06 end*/
 
     LOGATCI(LOG_DEBUG, "handle in audio_command_hdlr");
     int audio_result = audio_command_hdlr(line);
diff --git a/src/telephonyware/3.0/atcid/atci/src/atcid_cmd_dispatch.h b/src/telephonyware/3.0/atcid/atci/src/atcid_cmd_dispatch.h
old mode 100644
new mode 100755
index 8f31e46..3ff7bda
--- a/src/telephonyware/3.0/atcid/atci/src/atcid_cmd_dispatch.h
+++ b/src/telephonyware/3.0/atcid/atci/src/atcid_cmd_dispatch.h
@@ -178,6 +178,18 @@
     {"AT+CMGC"},    // AT command to send command
     {"AT+CNMA"},
 };
+/*warren add for lynq atsvc on 2022/12/06 start*/
+#ifdef LYNQ_ATSVC
+static generic_cmd_type lynq_cmd_table[] = {
+    {"AT+LAPNACT"},     //AT command to enable defult PDP
+    {"AT+ELAPNACT"},    //AT command to enable PDP with APN
+    {"AT+LCSUS"},       //AT command to dsds
+    {"AT+SCREEN"},      //AT command to off/on modem screen
+    {"ATD"},
+};
+char* cut_cmd_line(char* line);
+#endif
+/*warren add for lynq atsvc on 2022/12/06 end*/
 
 int process_cmd_line(char* line);
 char* cut_cmd_line(char* line);
diff --git a/src/telephonyware/3.0/atcid/atci/src/atcid_serial.c b/src/telephonyware/3.0/atcid/atci/src/atcid_serial.c
index 54be009..9ae9f21 100755
--- a/src/telephonyware/3.0/atcid/atci/src/atcid_serial.c
+++ b/src/telephonyware/3.0/atcid/atci/src/atcid_serial.c
@@ -56,7 +56,9 @@
 #else
 #include <sys/un.h>
 #endif
-
+#ifdef LYNQ_ATSVC
+#include "lynq_atsvc_controller.h"
+#endif
 #define MAX_FAILURE_RETRY 3
 #define BUILD_TYPE_PROP "ro.build.type"
 #define BUILD_TYPE_PROP_ENG "eng"
@@ -66,7 +68,7 @@
 
 
 /*misc global vars */
-extern Serial serial;
+//extern Serial serial;
 extern At_Ril_Mmi_t atRilMmi_info;
 
 #define CONN_VCOM 1
@@ -542,7 +544,15 @@
         }
 
 #endif
-    } else if (GENERIC_TYPE == dataType) {
+    } 
+    /*warren add for lynq atsvc on 2022/12/06 start*/
+#ifdef LYNQ_ATSVC
+    else if ((GENERIC_TYPE == dataType)||(LYNQ_CMD_TYPE == dataType))
+#else
+    else if (GENERIC_TYPE == dataType)
+#endif
+    /*warren add for lynq atsvc on 2022/12/06 end*/
+    {
 #ifdef ANDROID
         if (s_fdService_command == INVALIDE_SOCKET_FD) {
             s_fdService_command = connectToSystemAtciService();
@@ -1203,7 +1213,7 @@
     Serial *p_serial = (Serial *)arg;
     ATCI_DataType dataType = UNKNOWN_TYPE;
     char operator[MTK_PROPERTY_VALUE_MAX] = {0};
-
+    int plugin_count = -1; /*warren add for lynq at svc on 2022/12/12*/
     signal(SIGPIPE, sigpipe_handler);
 
     LOGATCI(LOG_DEBUG,"Enter");
@@ -1257,7 +1267,19 @@
         convertToUpperCase(line,'=');
         trim_string(&line);
         LOGATCI(LOG_INFO, "Command:%s",line);
-
+        /*warren add for lynq at svc on 2022/12/12 start*/
+        #ifdef LYNQ_ATSVC
+        plugin_count = -1;
+        plugin_count = lynq_dispatch_atcmd(line);
+        ALOGD("plugin count:%d",plugin_count);
+        if(0 <= plugin_count)
+        {
+            plugin_msg_array[plugin_count].atsvc_incb(line,strlen(line));
+            continue;
+        }
+//todo check whither plugin at cmd, if is plugin atcmd call cb and send msg to com,and continue
+        #endif
+        /*warren add for lynq at svc on 2022/12/12 end*/
         dataType = process_cmd_line(line);
 
         LOGATCI(LOG_INFO, "The command type is belonged to :%d",dataType);
@@ -1358,7 +1380,21 @@
             } else {
                 LOGATCI(LOG_INFO, "Generic AT COMMAND");
             }
-        } else if (dataType == AUDIO_TYPE) {
+        }
+        /*warren add for lynq atsvc on 2022/12/06 start*/
+        #ifdef LYNQ_ATSVC
+        else if(dataType == LYNQ_CMD_TYPE)
+        {
+            if (s_fdService_command < 0 || s_fdService_command_vendor < 0) 
+            {
+                connectTarget(LYNQ_CMD_TYPE);
+            }
+            sendDataToGenericService(line);
+            LOGATCI(LOG_INFO, "LYNQ AT COMMAND");
+        }
+        #endif
+        /*warren add for lynq atsvc on 2022/12/06 end*/
+        else if (dataType == AUDIO_TYPE) {
             LOGATCI(LOG_INFO, "AUDIO COMMAND");
             if (dataType == AUDIO_TYPE && s_fdAudio_command < 0) {
                 connectTarget(dataType);
diff --git a/src/telephonyware/3.0/atcid/atci/src/atcid_serial.h b/src/telephonyware/3.0/atcid/atci/src/atcid_serial.h
index 1e0a923..55d0868 100755
--- a/src/telephonyware/3.0/atcid/atci/src/atcid_serial.h
+++ b/src/telephonyware/3.0/atcid/atci/src/atcid_serial.h
@@ -91,6 +91,9 @@
     BATTERY_TYPE = 6,
     AUDIO_EXTERNAL_TYPE =7,
     META_TYPE = 8,
+#ifdef LYNQ_ATSVC
+    LYNQ_CMD_TYPE = 9, //warren add for lynq atsvc on 2022/12/06 start
+#endif
 } ATCI_DataType;
 
 typedef enum{
@@ -120,6 +123,7 @@
     int currDevice;
 } Serial;
 
+extern Serial serial;
 
 static const char *s_MsgResponses[] = {
    "OK",
diff --git a/src/telephonyware/3.0/atcid/atci/src/lynq-private/lynq_atsvc_controller.c b/src/telephonyware/3.0/atcid/atci/src/lynq-private/lynq_atsvc_controller.c
new file mode 100755
index 0000000..0f32469
--- /dev/null
+++ b/src/telephonyware/3.0/atcid/atci/src/lynq-private/lynq_atsvc_controller.c
@@ -0,0 +1,390 @@
+#include <stdio.h>
+#include <sys/socket.h>
+#include <sys/un.h>
+#include <sys/types.h>
+#include <errno.h>
+#include <libxml/tree.h>
+#include <libxml/parser.h>
+#include <dlfcn.h>
+#include "lynq_atsvc_controller.h"
+#include "atcid.h"
+#include "atcid_serial.h"
+#include "atcid_cmd_dispatch.h"
+#include "transfer_controller.h"
+#define FUNC __FUNCTION__
+#define LINE __LINE__
+int g_atsvc_socket_fd = 0;
+//struct sockaddr_in server_addr;
+//struct sockaddr_in lynqClient_addr;
+
+struct sockaddr_un g_remote_addr = {0};
+struct sockaddr_un g_local_addr = {0};
+
+typedef enum
+{
+    INIT_SUCCESS=0,
+    INIT_PULGIN_FAIL,
+    INIT_SOCKET_FAIL,
+    INIT_THREAD_FAIL
+}init_reuslt_t;
+
+typedef struct
+{
+    xmlChar* name;
+    xmlChar* reg;
+    xmlChar* cmd;
+}plugin_conf_t;
+
+plugin_msg_t plugin_msg_array[PLUGINE_MAX_COUNT] = {0};
+void lynq_atsvc_outcb_entity(char *output,int out_size,int type)
+{
+    if(NULL == output)
+    {
+        ALOGE("output is null");
+    }
+    int length = 0;
+    length = strlen(output);
+    if(length != out_size)
+    {
+        ALOGD("strlen length != output");
+    }
+    ALOGD("ouput:%s,len:%d",output,out_size);
+    lynq_write_data_to_serail(output,out_size,type);
+}
+
+
+int create_socket(const int domain, const int type, const int protocol,const int port,const char *IP,const char *socket_name,void * addr,int backlog)
+{
+    ALOGD("[%d][%s]start create socket",LINE,FUNC);
+    ALOGD("domain:%d,type:%d,protocol:%d,port:%d,IP:%s,socket_name:%s,backlog:%d",domain,type,protocol,port,IP,socket_name,backlog);
+    int socket_fd = -1;
+    char acBuf[1024] = {0};
+    struct sockaddr_un *local_addr = NULL;
+    local_addr = (struct sockaddr_un *)addr;
+    socket_fd = socket(domain, type,protocol);
+    if(0 > socket_fd)
+    {
+        ALOGD("create socket fail:fd = %d",socket_fd);
+        return socket_fd;
+    }
+    switch (domain)
+    {
+        case AF_UNIX:
+        {
+            if (strlen(socket_name) > sizeof(local_addr->sun_path) - 1)
+            {
+                ALOGD("Server socket path too long: %s", socket_name);
+                return (-strlen(socket_name));
+            }
+            if (remove(socket_name) == -1 && errno != ENOENT)
+            { 
+                ALOGD("remove-%s fail and errno:%d", socket_name,errno); 
+            }
+            ALOGD("remove %s", socket_name);
+            local_addr->sun_family = AF_UNIX;
+            sprintf(local_addr->sun_path, socket_name);
+            if(bind(socket_fd, (struct sockaddr *)local_addr, sizeof(struct sockaddr_un)) == -1)
+            {
+                ALOGD("[%d][%s]bind fail and errno: %d",LINE,FUNC,errno);
+                return -1;
+            }
+            if(type == SOCK_STREAM)
+            {
+                if(listen(socket_fd,backlog) == -1)
+                {
+                    ALOGD("[%d]listen fd: %dfail",LINE);
+                    return -1;
+                }
+            }
+           
+            break;
+        }
+        case AF_INET:
+        {
+            break;
+        }
+        default:
+            break;
+    }
+    return socket_fd;
+}
+
+int send_msg(int socket_fd,const struct sockaddr *dest_addr,const char *msg)
+{
+    ALOGD("[%d][%s] msg is:%s",LINE,FUNC,msg);
+    int ret = 0;
+    ret = sendto(socket_fd,msg, sizeof(msg), 0, dest_addr, sizeof(dest_addr));
+    if(0 > ret)
+    {
+        ALOGD("sendto fail,ret:%d,errno:%d",ret,errno);
+        return ret;
+    }
+    else
+    {
+        ALOGD("sendto msg len:%d",ret);
+        ALOGD("return %d",0);
+        return 0;
+    }
+}
+int lynq_dispatch_atcmd(char* atcmd)
+{
+    ALOGD("[%d][%s] enter",LINE,FUNC);
+    char *needleP = NULL;
+    if(NULL == atcmd)
+    {
+        ALOGD("[%d][%s] atcmd is null",LINE,FUNC);
+        return -1;
+    }
+    ALOGD("[%d][%s]atcmd:%s",LINE,FUNC,atcmd);
+    char* line_cut = cut_cmd_line(atcmd);
+    if (line_cut == NULL)
+    {
+        return 0;
+    }
+    for(int i = 0;i < PLUGINE_MAX_COUNT;i++)
+    {
+        ALOGD("i:%d,state:%d,atcmd:%s",i,plugin_msg_array[i].state,plugin_msg_array[i].atcmd);
+        if((plugin_msg_array[i].state == 1) && (NULL != plugin_msg_array[i].atcmd))
+        {
+            needleP =strstr(plugin_msg_array[i].atcmd,line_cut);
+            if(NULL != needleP)
+            {
+                ALOGD("[%d][%s] find atcmd:%s",LINE,FUNC,line_cut);
+                free(line_cut);
+                return i;
+            }
+        }
+    }
+    free(line_cut);
+    return -1;
+}
+
+
+int load_pulgin(const char * plugin_conf_path)
+{
+    ALOGD("[%d][%s]load pulgin",LINE,FUNC);
+    int count = 0;
+    char *atcmd = NULL;
+    int atcmd_len = 0;
+    xmlDocPtr pdoc = NULL;
+    xmlNodePtr root = NULL;
+    plugin_conf_t plugin_conf;
+    memset(plugin_msg_array,0,sizeof(plugin_msg_array));
+    pdoc = xmlReadFile(plugin_conf_path ,"UTF-8",XML_PARSE_RECOVER);
+    if(NULL == pdoc)
+    {
+        ALOGD("[%d][%s]open file %s" ,LINE,FUNC, plugin_conf_path);
+        return -1;
+    }
+    root = xmlDocGetRootElement(pdoc);
+    if(NULL == root)
+    {
+        ALOGD("get xmlDocGetRootElement() empty document fail");
+        return -1;
+    }
+    ALOGD("root->name :%s",root->name);
+    root = root->xmlChildrenNode;
+    while (root != NULL)
+    {
+        ALOGD("count is:%d",count);
+        if(PLUGINE_MAX_COUNT <= count)
+        {
+            ALOGD("plugin too many!!!");
+            break;
+        }
+        if ((!xmlStrcmp(root->name, (const xmlChar *)"module")))
+        {
+            ALOGD("find module");
+            plugin_conf.name = xmlGetProp(root, "name");
+            plugin_conf.reg = xmlGetProp(root, "register");
+            plugin_conf.cmd = xmlGetProp(root, "cmd");
+            if((NULL == plugin_conf.name)||(NULL == plugin_conf.reg)||(NULL == plugin_conf.cmd))
+            {
+                ALOGE("get prop fail,name:%s,reg:%s,cmd=%s",plugin_conf.name,plugin_conf.reg,plugin_conf.cmd);
+                root = root->next;
+                continue;
+            }
+            ALOGE("[%d][%s]plugin_conf name:%s,reg:%s,cmd=%s",LINE,FUNC,plugin_conf.name,plugin_conf.reg,plugin_conf.cmd);
+            plugin_msg_array[count].dlHandle_plugin = dlopen(plugin_conf.name, RTLD_NOW);
+            if(NULL == plugin_msg_array[count].dlHandle_plugin)
+            {
+                ALOGE("open lib %s fail",plugin_conf.name);
+                root = root->next;
+                continue;
+            }
+            ALOGD("plugin_msg_array[%d].dlHandle_plugin :%p",count,plugin_msg_array[count].dlHandle_plugin);
+            plugin_msg_array[count].register_module = (lynq_atsvc_incb(*)(lynq_atsvc_outcb out_cb))dlsym(plugin_msg_array[count].dlHandle_plugin, plugin_conf.reg);
+            if(NULL == plugin_msg_array[count].register_module)
+            {
+                ALOGD("open plugin_msg_array[%d].%p fail",count,plugin_msg_array[count].register_module);
+                ALOGD("dlsym failed: %s", dlerror());
+                root = root->next;
+                continue;
+            }
+            plugin_msg_array[count].atsvc_incb = plugin_msg_array[count].register_module(lynq_atsvc_outcb_entity);
+            if(NULL == plugin_msg_array[count].atsvc_incb)
+            {
+                ALOGE("call %s fail",plugin_conf.reg);
+                root = root->next;
+                continue;
+            }
+            atcmd_len = strlen(plugin_conf.cmd);
+            atcmd = (char *)malloc(atcmd_len*(sizeof(char)+1));
+            if(NULL == atcmd)
+            {
+                ALOGE("count %d atcmd malloc fail",count);
+                root = root->next;
+                continue;
+            }
+            plugin_msg_array[count].state = 1;
+            memcpy(atcmd,plugin_conf.cmd,atcmd_len);
+            atcmd[atcmd_len] = '\0';
+            plugin_msg_array[count].atcmd = atcmd;
+            count++;
+        }
+        root = root->next;
+    }
+    ALOGD("pcurnode->name return");
+    xmlFreeDoc(pdoc);
+    xmlCleanupParser();
+    return 0;
+}
+
+int lynq_atsvc_init(int count,const char * plugin_conf_path)
+{
+    ALOGD("start [%d][%s]",LINE,FUNC);
+    int res = 0;
+    g_atsvc_socket_fd = create_socket(AF_UNIX, SOCK_STREAM,0, 0, NULL,RIL_SOCKET_NAME, (void *)&g_local_addr, 2);
+    if(0 > g_atsvc_socket_fd)
+    {
+        ALOGD("init socket fail and fd:%d",g_atsvc_socket_fd);
+        //return INIT_SOCKET_FAIL;
+    }
+    res = load_pulgin(PLUGIN_CONF_PATH);
+    if(0 > res)
+    {
+        for(int i = 0;i < PLUGINE_MAX_COUNT; i++)
+        {
+            if(NULL != plugin_msg_array[i].atcmd)
+            {
+                free(plugin_msg_array[i].atcmd);
+            }
+        }
+        ALOGD("load_pulgin fail,code is %d",res);
+        return INIT_PULGIN_FAIL;
+    }
+    for(int i = 0;i < PLUGINE_MAX_COUNT; i++)
+    {
+        if(NULL != plugin_msg_array[i].atcmd)
+        {
+            ALOGD("atcmd:%s",plugin_msg_array[i].atcmd);
+        }
+    }
+    res = init_pseudo_terminal();
+    if(res != 0)
+    {
+        ALOGD("init pseudo terminal fail");
+    }
+    /*create thread for reacive ril msg*/
+    /*load pulgin from plugin config*/
+    return 0;
+}
+
+#if 0
+
+/*
+    //填充对端地址
+    //报式传输,只发不收可以不bind,要发要收必须要bind
+    stRemoteAddr.sun_family = AF_UNIX;
+    sprintf(stRemoteAddr.sun_path, "./server"); //注意用sprintf            
+ 
+    if(0 > sendto(iSocketFD, "客户端", sizeof("客户端"), 0, (void *)&stRemoteAddr, sizeof(stRemoteAddr)))
+    {
+        close(iSocketFD);
+        printf("发送数据失败!\n");
+        return -1;
+    }
+    
+    if(0 > recvfrom(iSocketFD, acBuf, sizeof(acBuf), 0, NULL, NULL))
+    {
+        close(iSocketFD);
+        printf("接收数据失败!\n");
+        return -1;
+    }
+ 
+    printf("客户端接收到服务器发来的消息是:%s\n", acBuf);
+    while(1)
+	{
+	sleep(1);
+	}
+    return 0;
+*/
+
+
+
+/*listen UPD SOCKET port */
+struct sockaddr_in server_addr;
+struct sockaddr_in lynqClient_addr;
+bzero(&server_addr, sizeof(server_addr));
+server_addr.sin_family = AF_INET;
+server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
+server_addr.sin_port = htons(LYNQ_SERVICE_PORT);
+/* create socket */
+//int server_socket_fd = socket(AF_INET, SOCK_DGRAM, 0);
+atsvc_socket_fd = socket(AF_INET, SOCK_DGRAM, 0);
+if(atsvc_socket_fd == -1)
+{
+    RLOGE("Create Socket Failed:");
+    exit(1);
+}
+
+/* bind socket port*/
+if(-1 == (bind(server_socket_fd,(struct sockaddr*)&server_addr,sizeof(server_addr))))
+{
+     RLOGE("Server Bind Failed:");
+     exit(1);
+}
+/* create epoll fd,add socket to epoll */
+ep_fd = epoll_create(LYNQ_SOCKET_ENVNT_FD_MAX);
+//int len = sizeof(struct sockaddr_in);
+lynq_ev.events = EPOLLIN | EPOLLET;
+lynq_ev.data.fd = server_socket_fd;
+if(epoll_ctl(ep_fd, EPOLL_CTL_ADD, server_socket_fd, &lynq_ev) < 0) 
+{
+    fprintf(stderr, "epoll set insertion error: fd=%d\n", server_socket_fd);
+    return;
+}
+else
+{
+    printf("monitor socket add epoll success!!!\n");
+}
+char buffer[LYNQ_SOCKET_BUFFER];
+lynq_client_t *client_tmp = NULL;
+/* tranlate data */
+while(true)
+{
+    if(!s_registerCalled)
+    {
+        sleep(1);
+        continue;
+    }
+    en_fd = epoll_wait(ep_fd, lynq_events, 10000, -1);//###Check  valid
+    if(en_fd <=0 )
+    {
+        continue;
+    }
+    for (int n = 0; n < en_fd; ++n)
+    {
+        if (lynq_events[n].data.fd == server_socket_fd)
+        {
+            /* define address to catch the client addreess*/
+            //struct sockaddr_in client_addr;
+            socklen_t client_addr_length = sizeof(lynqClient_addr);
+            /* receive the data */
+            bzero(buffer, LYNQ_SOCKET_BUFFER);
+            if(recvfrom(server_socket_fd, buffer, LYNQ_SOCKET_BUFFER,0,(struct sockaddr*)&lynqClient_addr, &client_addr_length) == -1)
+            {
+                RLOGE("Receive Data Failed:");
+                continue;
+            }
+#endif
diff --git a/src/telephonyware/3.0/atcid/atci/src/lynq-private/lynq_atsvc_controller.h b/src/telephonyware/3.0/atcid/atci/src/lynq-private/lynq_atsvc_controller.h
new file mode 100755
index 0000000..a49400cf
--- /dev/null
+++ b/src/telephonyware/3.0/atcid/atci/src/lynq-private/lynq_atsvc_controller.h
@@ -0,0 +1,64 @@
+/**********************************************************************************************
+* @file lynq_atsvc_controller.h
+* @brief Control the initialization of lynq at, and dispacthing, etc.
+* @details None
+* @author   Hong Liu。
+* @date     2022-11-24
+* @version  V1.0
+* @copyright   Copyright (c) MobileTek 
+***********************************************************************************************/
+
+
+#ifndef LYNQ_ATSVC_COBTROLLER_H
+#define LYNQ_ATSVC_COBTROLLER_H 1
+
+#include <sys/types.h>
+#include <sys/socket.h>
+
+#include <pthread.h>
+#define PLUGIN_CONF_PATH "/data/atsvc/lynq_atsvc_plugin.xml"
+#define RIL_SOCKET_NAME "/dev/socket/lynq_atsvc_socket_1"
+#define PLUGINE_MAX_COUNT 16
+/**********************************************************************************************
+/**函数列表是第六部分
+* @brief initalize lynq atsvc,it will load plugin and create socket process
+* @param plugin_conf_path [IN] plugin config file path
+* @param sum [OUT](OUT 表示出参) 参数b 说明
+* @return 
+*     0:success
+*     1:load pugin config file fail
+*     2:create socket fail
+*     3:create thread fail
+************************************************************************************************/
+typedef void ( *lynq_atsvc_incb )(const char *input,const int length);
+/*type:
+** 0:response 
+** 1:unsolictedresponse
+*/
+typedef void ( *lynq_atsvc_outcb )(char *output,int out_size,int type);
+
+typedef lynq_atsvc_incb (*lynq_register_module)(lynq_atsvc_outcb out_cb);
+
+
+typedef struct
+{
+    lynq_atsvc_incb atsvc_incb;
+    lynq_register_module register_module;
+    void *dlHandle_plugin;
+    char * atcmd;
+    int state;
+}plugin_msg_t;
+
+extern plugin_msg_t plugin_msg_array[PLUGINE_MAX_COUNT];
+
+int lynq_atsvc_init(int count,const char * plugin_conf_path);
+
+int create_socket(const int domain, const int type, const int protocol,const int port,const char *IP,const char *socket_name,void * addr,int backlog);
+int send_msg(int socket_fd,const struct sockaddr *dest_addr,const char *msg);
+int lynq_dispatch_atcmd(char* atcmd);
+
+
+
+#endif
+
+
diff --git a/src/telephonyware/3.0/atcid/atci/src/lynq-private/lynq_atsvc_plugin.xml b/src/telephonyware/3.0/atcid/atci/src/lynq-private/lynq_atsvc_plugin.xml
new file mode 100755
index 0000000..7f88859
--- /dev/null
+++ b/src/telephonyware/3.0/atcid/atci/src/lynq-private/lynq_atsvc_plugin.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<lynq_atsvc_plugin >
+  <module name="/lib64/liblynq-test-data.so"
+                 register="lynq_register_test_data"
+                 cmd="AT+LETEST;AT+LEABC;AT+LEDEF"
+  />
+   <module name="/lib64/xxx.so"
+                 register="lynq_register_xxx"
+                 cmd="AT+LETEST;AT+LEABC;AT+LEDEF"
+  />
+</lynq_atsvc_plugin>
\ No newline at end of file
diff --git a/src/telephonyware/3.0/atcid/atci/src/lynq-private/pseudo_terminal/terminal_controller.conf b/src/telephonyware/3.0/atcid/atci/src/lynq-private/pseudo_terminal/terminal_controller.conf
new file mode 100755
index 0000000..89a86ed
--- /dev/null
+++ b/src/telephonyware/3.0/atcid/atci/src/lynq-private/pseudo_terminal/terminal_controller.conf
@@ -0,0 +1,6 @@
+#ttyGS0:0
+#ttyGS1:1
+#ttyGS3:2
+#ttyGS4:3
+CONF_PORT_ATIO:0
+CONF_PORT_ATURC:2
diff --git a/src/telephonyware/3.0/atcid/atci/src/lynq-private/pseudo_terminal/transfer_controller.c b/src/telephonyware/3.0/atcid/atci/src/lynq-private/pseudo_terminal/transfer_controller.c
new file mode 100755
index 0000000..2562585
--- /dev/null
+++ b/src/telephonyware/3.0/atcid/atci/src/lynq-private/pseudo_terminal/transfer_controller.c
@@ -0,0 +1,137 @@
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include "transfer_controller.h"
+#include "atcid_serial.h"
+typedef struct
+{
+    int serial_io_port;
+    int serial_urc_port;
+}port_conf_t;
+
+port_conf_t port_config;
+
+static int conf_to_colon(char *p_cur)
+{
+    if (p_cur == NULL)
+    {
+        return -1;
+    }
+    p_cur = strchr(p_cur, ':');
+    if (p_cur == NULL)
+    {
+        return -1;
+    }
+    ALOGD("line:%s",p_cur+1);
+    return atoi(p_cur+1);
+}
+
+int parse_terminal_config(char *path, port_conf_t * port_conf)
+{
+    ALOGD("[%d][%s] enter",__LINE__,__FUNCTION__);
+    FILE *fp;
+    const char *at_io = "CONF_PORT_ATIO";
+    const char *at_urc = "CONF_PORT_ATURC";
+    char *needle = NULL;
+    int conut = 0;
+    int ret = 0;
+    char line[100] = {0};
+    fp=fopen(path,"r");
+    if(fp==NULL)
+    {
+        ALOGD("can not load file!");
+        return -1;
+    }
+    while(!feof(fp))
+    {
+        memset(line,0,100);
+        fgets(line,100,fp);
+        ALOGD("%d:%s",conut,line);
+        needle = NULL;
+        needle = strstr(line,at_io);
+        if(NULL != needle)
+        {
+            ret = conf_to_colon(line);
+            if(ret >= 0 && ret <= 3)
+            {
+                port_conf->serial_io_port = ret;
+            }
+            ALOGD("line:%s:ret:%d",line,ret);
+        }
+        needle = NULL;
+        needle = strstr(line,at_urc);
+        if(NULL != needle)
+        {
+            ret = conf_to_colon(line);
+            if(ret >= 0 && ret <= 3)
+            {
+                port_conf->serial_urc_port = ret;
+            }
+            ALOGD("urc line:%s:ret:%d",line,ret);
+        }
+        conut++;
+    }
+    fclose(fp);
+    return 0;
+}
+int init_pseudo_terminal()
+{
+    ALOGD("[%d][%s] enter",__LINE__,__FUNCTION__);
+    int ret = 0;
+    bool init_default = true;
+    ret = parse_terminal_config(TERMINAL_CONF_PATH, &port_config);
+    if(ret < 0)
+    {
+        ALOGD("parse terminal fail,init defualt prot");
+        init_default = false;
+        port_config.serial_io_port = L_TTY_GS0;
+        port_config.serial_urc_port = L_TTY_GS0;
+    }
+    //todo init device
+    return 0;
+}
+char* map_device(int device_id)
+{
+    switch (device_id)
+    {
+        case L_TTY_GS0:
+            return "/dev/ttyGS0";
+        case L_TTY_GS1:
+            return "/dev/ttyGS1";
+        case L_TTY_GS3:
+            return "/dev/ttyGS3";
+        case L_TTY_GS4:
+            return "/dev/ttyGS4";
+        default:
+            return "unkonw";
+    }
+    return NULL;
+}
+void write_data_to_serial_with_port(int serial_port,char *output,int out_size)
+{
+    ALOGD("serial_io_port:%d,output:%s,out_size:%d",serial_port,output,out_size);
+    return;
+}
+
+
+void lynq_write_data_to_serail(char *output,int out_size,int type)
+{
+    if(type == L_RESP_TYPE)
+    {
+        ALOGD("device:%s,total:%d,current:%d",serial.devicename[0],serial.totalSize,serial.currDevice);
+        if(strcmp(serial.devicename[0],map_device(port_config.serial_io_port)) == 0)
+        {
+            ALOGD("use writeDataToSerial");
+            writeDataToSerial(output,out_size);
+        }
+        else
+        {
+            write_data_to_serial_with_port(port_config.serial_io_port,output,out_size);
+        }
+    }
+    else if(type == L_URC_TYPE)
+    {
+        write_data_to_serial_with_port(port_config.serial_urc_port,output,out_size);
+    }
+    return;
+}
diff --git a/src/telephonyware/3.0/atcid/atci/src/lynq-private/pseudo_terminal/transfer_controller.h b/src/telephonyware/3.0/atcid/atci/src/lynq-private/pseudo_terminal/transfer_controller.h
new file mode 100755
index 0000000..52c82cc
--- /dev/null
+++ b/src/telephonyware/3.0/atcid/atci/src/lynq-private/pseudo_terminal/transfer_controller.h
@@ -0,0 +1,18 @@
+/**********************************************************************************************
+* @file transfer_controller.h
+* @brief Control the data transfer to whicth serial,etc.
+* @details None
+* @author   Hong Liu。
+* @date     2022-12-13
+* @version  V1.0
+* @copyright   Copyright (c) MobileTek 
+***********************************************************************************************/
+#define L_TTY_GS0 0
+#define L_TTY_GS1 1
+#define L_TTY_GS3 2
+#define L_TTY_GS4 3
+#define L_RESP_TYPE 0
+#define L_URC_TYPE 1
+#define TERMINAL_CONF_PATH "/data/atsvc/terminal_controller.conf"
+void lynq_write_data_to_serail(char *output,int out_size,int type);
+
diff --git a/src/telephonyware/3.0/atcid/atci/src/lynq-private/pseudo_terminal/transfer_queue.c b/src/telephonyware/3.0/atcid/atci/src/lynq-private/pseudo_terminal/transfer_queue.c
new file mode 100644
index 0000000..792d600
--- /dev/null
+++ b/src/telephonyware/3.0/atcid/atci/src/lynq-private/pseudo_terminal/transfer_queue.c
@@ -0,0 +1 @@
+#
diff --git a/src/telephonyware/3.0/atcid/atci/src/lynq-private/pseudo_terminal/transfer_queue.h b/src/telephonyware/3.0/atcid/atci/src/lynq-private/pseudo_terminal/transfer_queue.h
new file mode 100644
index 0000000..792d600
--- /dev/null
+++ b/src/telephonyware/3.0/atcid/atci/src/lynq-private/pseudo_terminal/transfer_queue.h
@@ -0,0 +1 @@
+#
diff --git a/src/telephonyware/3.0/atcid/atci/src/platform/atcid_adaptation.cpp b/src/telephonyware/3.0/atcid/atci/src/platform/atcid_adaptation.cpp
index 29d17da..8038fb8 100755
--- a/src/telephonyware/3.0/atcid/atci/src/platform/atcid_adaptation.cpp
+++ b/src/telephonyware/3.0/atcid/atci/src/platform/atcid_adaptation.cpp
@@ -259,7 +259,7 @@
 #include <unistd.h>
 #include <sys/un.h>
 
-#define ATCI_SERVICE_SOCKET "atci_server_socket"
+#define ATCI_SERVICE_SOCKET "/dev/socket/atci_server_socket"
 
 int socket_local_client (char* name) {
     struct sockaddr_un server;
diff --git a/src/telephonyware/3.0/atcid/atci_service/src/atci_service.h b/src/telephonyware/3.0/atcid/atci_service/src/atci_service.h
index b4b1029..788905f 100755
--- a/src/telephonyware/3.0/atcid/atci_service/src/atci_service.h
+++ b/src/telephonyware/3.0/atcid/atci_service/src/atci_service.h
@@ -47,13 +47,42 @@
 #ifdef ANDROID
 #include <utils/Log.h>
 #endif
+//just dummy defines since were not including syslog.h.
+#define LOG_EMERG   0
+#define LOG_ALERT   1
+#define LOG_CRIT    2
+#define LOG_ERR     3
+#define LOG_WARNING 4
+#define LOG_NOTICE  5
+#define LOG_INFO    6
+#define LOG_DEBUG   7
 
-#define UNUSED(x) do { (void)(x); } while (0)
+#define syslog_level LOG_DEBUG
 
+#ifdef TELEMATICS
+#define ALOGD(...)   {\
+        syslog(LOG_DEBUG, ## __VA_ARGS__);}
+#define ALOGE(...)   {\
+        syslog(LOG_ERR, ## __VA_ARGS__);}
+#define ALOGW(...)   {\
+        syslog(LOG_WARNING, ## __VA_ARGS__);}
+#define ALOGI(...)   {\
+        syslog(LOG_INFO, ## __VA_ARGS__);}
+#else
 #define ALOGD printf
 #define ALOGE printf
 #define ALOGW printf
 #define ALOGI printf
+#endif
+
+#define LOGATCI(lvl, f, ...) do { \
+        if (lvl <= LOG_ERR) {ALOGE("[ATCI] %d:%s(): " f "\n", __LINE__, __FUNCTION__, ##__VA_ARGS__);} \
+        else if (lvl == LOG_WARNING) {ALOGW("[ATCI] %d:%s(): " f "\n", __LINE__, __FUNCTION__, ##__VA_ARGS__);} \
+        else if (lvl <= LOG_INFO) {ALOGI("[ATCI] %d:%s(): " f "\n", __LINE__, __FUNCTION__, ##__VA_ARGS__);} \
+        else if (lvl == LOG_DEBUG) {ALOGD("[ATCI] %d:%s(): " f "\n", __LINE__, __FUNCTION__, ##__VA_ARGS__);} \
+    } while (0)
+
+#define UNUSED(x) do { (void)(x); } while (0)
 
 extern void process_mmi_response(char* data, int dataLen);