[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);