[Feature][T8TSK-131][AT]at instruction plug-in adaptation
Change-Id: I62702753329b8028c5ef004e86cc0b99fad64ab8
diff --git a/meta/meta-mediatek-mt2735/recipes-lynq/liblynq-at-factory/liblynq-at-factory.bb b/meta/meta-mediatek-mt2735/recipes-lynq/liblynq-at-factory/liblynq-at-factory.bb
new file mode 100755
index 0000000..45691a0
--- /dev/null
+++ b/meta/meta-mediatek-mt2735/recipes-lynq/liblynq-at-factory/liblynq-at-factory.bb
@@ -0,0 +1,49 @@
+inherit externalsrc package
+
+DESCRIPTION = "liblynq-at-factory"
+LICENSE = "MobiletekProprietary"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=c8a2ee6e65c8c0723cb8de987f22458c"
+DEPENDS += "platform-libs liblynq-log"
+inherit workonsrc
+WORKONSRC = "${TOPDIR}/../src/lynq/lib/liblynq-at-factory"
+
+TARGET_CC_ARCH += "${LDFLAGS}"
+BB_INCLUDE_ADD = "--sysroot=${STAGING_DIR_HOST}"
+BB_LDFLAGS_ADD = "--sysroot=${STAGING_DIR_HOST} -Wl,--hash-style=gnu"
+#Parameters passed to do_compile()
+EXTRA_OEMAKE = "'RAT_CONFIG_C2K_SUPPORT = ${RAT_CONFIG_C2K_SUPPORT}'\
+ 'MTK_MULTI_SIM_SUPPORT = ${MTK_MULTI_SIM_SUPPORT}'\
+ 'TARGET_PLATFORM = ${TARGET_PLATFORM}'"
+
+FILES_${PN} = "${base_libdir}/*.so \
+ ${base_bindir}\
+ ${base_sbindir} \
+ /etc/dbus-1/system.d/"
+FILES_${PN}-dev = "/test \
+ ${includedir}"
+FILES_${PN}-doc = "/doc"
+FILES_${PN}-dbg ="${base_bindir}/.debug \
+ ${base_libdir}/.debug \
+ ${base_sbindir}/.debug"
+INSANE_SKIP_${PN} += "already-stripped"
+INSANE_SKIP_${PN} += "installed-vs-shipped"
+#INHIBIT_PACKAGE_STRIP = "1"
+do_compile () {
+ if [ "${PACKAGE_ARCH}" = "cortexa7hf-vfp-vfpv4-neon" ]; then
+ oe_runmake all ROOT=${STAGING_DIR_HOST} OFLAGS="--sysroot=${STAGING_DIR_HOST} -Os -mfpu=neon-vfpv4 -mhard-float -Wl,--hash-style=gnu -DTELEPHONYWARE"
+ elif [ "${PACKAGE_ARCH}" = "cortexa7hf-neon-vfpv4" ]; then
+ oe_runmake all ROOT=${STAGING_DIR_HOST} OFLAGS="--sysroot=${STAGING_DIR_HOST} -Os -mfpu=neon-vfpv4 -mhard-float -Wl,--hash-style=gnu -DTELEPHONYWARE"
+ elif [ "${PACKAGE_ARCH}" = "cortexa53hf-neon-fp-armv8" ]; then
+ oe_runmake all ROOT=${STAGING_DIR_HOST} OFLAGS="--sysroot=${STAGING_DIR_HOST} -Os -mfpu=neon-vfpv4 -mhard-float -Wl,--hash-style=gnu -DTELEPHONYWARE -mhard-float -mfpu=neon-fp-armv8 -mfloat-abi=hard -mcpu=cortex-a53 -mtune=cortex-a53"
+ else
+ oe_runmake all ROOT=${STAGING_DIR_HOST} OFLAGS="--sysroot=${STAGING_DIR_HOST} -Os -Wl,--hash-style=gnu -DTELEPHONYWARE"
+ fi
+}
+
+do_install() {
+ oe_runmake install ROOT=${D}
+ if [ -d "${WORKONSRC}" ] ; then
+ install -d ${D}${includedir}
+ cp -af ${S}/include/libat/ ${D}${includedir}/libat
+ fi
+}
\ No newline at end of file
diff --git a/meta/meta-mediatek-mt2735/recipes-lynq/packagegroups/packagegroup-lync-mt2735.bb b/meta/meta-mediatek-mt2735/recipes-lynq/packagegroups/packagegroup-lync-mt2735.bb
index 9ecdd7d..e13c40f 100755
--- a/meta/meta-mediatek-mt2735/recipes-lynq/packagegroups/packagegroup-lync-mt2735.bb
+++ b/meta/meta-mediatek-mt2735/recipes-lynq/packagegroups/packagegroup-lync-mt2735.bb
@@ -48,6 +48,7 @@
liblynq-gnss \
liblynq-wifi6 \
liblynq-rtp \
+ liblynq-at-factory \
lynq-gnss-test \
ntp \
tzdata \
diff --git a/src/lynq/lib/liblynq-at-factory/LICENSE b/src/lynq/lib/liblynq-at-factory/LICENSE
new file mode 100755
index 0000000..382fc78
--- /dev/null
+++ b/src/lynq/lib/liblynq-at-factory/LICENSE
@@ -0,0 +1,31 @@
+Copyright Statement:
+
+This software/firmware and related documentation ("Mobiletek Software") are
+protected under relevant copyright laws. The information contained herein is
+confidential and proprietary to Mobiletek Inc. and/or its licensors. Without
+the prior written permission of Mobiletek inc. and/or its licensors, any
+reproduction, modification, use or disclosure of Mobiletek Software, and
+information contained herein, in whole or in part, shall be strictly
+prohibited.
+
+Mobiletek Inc. (C) 2015. All rights reserved.
+
+BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("Mobiletek SOFTWARE")
+RECEIVED FROM Mobiletek AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
+ON AN "AS-IS" BASIS ONLY. Mobiletek EXPRESSLY DISCLAIMS ANY AND ALL
+WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
+WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+NONINFRINGEMENT. NEITHER DOES Mobiletek PROVIDE ANY WARRANTY WHATSOEVER WITH
+RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
+INCORPORATED IN, OR SUPPLIED WITH THE Mobiletek SOFTWARE, AND RECEIVER AGREES
+TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
+RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
+OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN Mobiletek
+SOFTWARE. Mobiletek SHALL ALSO NOT BE RESPONSIBLE FOR ANY Mobiletek SOFTWARE
+RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND Mobiletek'S
+ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE Mobiletek SOFTWARE
+RELEASED HEREUNDER WILL BE, AT Mobiletek'S OPTION, TO REVISE OR REPLACE THE
+Mobiletek SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
+CHARGE PAID BY RECEIVER TO Mobiletek FOR SUCH Mobiletek SOFTWARE AT ISSUE.
\ No newline at end of file
diff --git a/src/lynq/lib/liblynq-at-factory/include/libat/lynq_at_factory.h b/src/lynq/lib/liblynq-at-factory/include/libat/lynq_at_factory.h
new file mode 100755
index 0000000..b90270c
--- /dev/null
+++ b/src/lynq/lib/liblynq-at-factory/include/libat/lynq_at_factory.h
@@ -0,0 +1,23 @@
+/*=============================================================================
+# FileName: lynq_at_factory.h
+# Desc: about at of factory
+# Author: lei
+# Version: V1.0
+# LastChange: 2022-12-14
+# History:
+ copyright:Mobiletek
+=============================================================================*/
+#ifndef LYNQ_AT_FACTORY_H
+#define LYNQ_AT_FACTORY_H 1
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef void ( *lynq_atsvc_incb )( const char *input,const int length);
+typedef void ( *lynq_atsvc_outcb )(char *output, int out_max_size, int mode);
+lynq_atsvc_incb lynq_register_at_factory(lynq_atsvc_outcb out_cb);
+
+#ifdef __cplusplus
+}
+#endif
+#endif
\ No newline at end of file
diff --git a/src/lynq/lib/liblynq-at-factory/lynq_at_factory.cpp b/src/lynq/lib/liblynq-at-factory/lynq_at_factory.cpp
new file mode 100755
index 0000000..d7706c0
--- /dev/null
+++ b/src/lynq/lib/liblynq-at-factory/lynq_at_factory.cpp
@@ -0,0 +1,477 @@
+
+
+#include <string.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <log/log.h>
+#include <liblog/lynq_deflog.h>
+#include "include/libat/lynq_at_factory.h"
+
+#define FACTORY_STRING "AT+LYNQFACTORY="
+#define INSIDE_VERSION "AT+CGIR"
+#define USER_LOG_TAG "AT_FACTORY"
+
+#undef LOG_TAG
+#define LOG_TAG "AT_FACTORY"
+#define MAX_ARGS 101
+
+lynq_atsvc_outcb handle_output;
+
+typedef struct
+{
+ char *cmd;
+ void (*func)(char *input);
+}Command;
+
+enum
+{
+ Response = 0,
+ Urc
+};
+
+void lynq_handle_adc(char *input)
+{
+ FILE *fp;
+ char lynq_adc_dev[126] = {0};
+ char lynq_adc_buf[32] = {0};
+ int lynq_adc_num = atoi(input+4);
+ char flag[64] = {0};
+ if(lynq_adc_num == 0)
+ {
+ sprintf(lynq_adc_dev,"cat /sys/bus/iio/devices/iio:device1/in_voltage0_input 2>&1");
+ }
+ else if(lynq_adc_num == 1)
+ {
+ sprintf(lynq_adc_dev,"cat /sys/bus/iio/devices/iio:device1/in_voltage1_input 2>&1");
+ }
+ else if(lynq_adc_num == 2)
+ {
+ sprintf(lynq_adc_dev,"cat /sys/bus/iio/devices/iio:device1/in_voltage2_input 2>&1");
+ }
+ else if(lynq_adc_num == 3)
+ {
+ sprintf(lynq_adc_dev,"cat /sys/bus/iio/devices/iio:device1/in_voltage3_input 2>&1");
+ }
+ fp=popen(lynq_adc_dev, "r");
+ fgets(lynq_adc_buf,sizeof(lynq_adc_buf),fp);
+ sprintf(flag,"%s %s", "ADC:", lynq_adc_buf);
+ if(handle_output != NULL)
+ {
+ handle_output(flag, strlen(flag), Response);
+ }
+ pclose(fp);
+}
+
+void lynq_handle_sink(char *input)
+{
+ FILE *fp;
+ char lynq_usb_dev[512] = {0};
+ char lynq_usb_buf[512] = {0};
+ char buf[512] = {0};
+ int sink[3][3] = {{255,0,0},{0,255,0},{0,0,255}};
+ char dev_buf[][40]={{"green:cellular-radio/brightness"},{"green:cellular-quality/brightness"},{"red:system/brightness"}};
+ int i;
+ int j;
+ int k = 15;
+ char flag_buf[64] = {0};
+ for(i = 0;i < 3;i++){
+ bzero(flag_buf, 64);
+ bzero(lynq_usb_buf, 512);
+ bzero(buf, 512);
+ k = 15;
+ for(j = 0;j < 3;j++){
+ bzero(lynq_usb_dev, 512);
+ sprintf(lynq_usb_dev,"echo %d > /sys/class/leds/led95%d:%s 2>&1", sink[i][j], k++, dev_buf[j]);
+ fp=popen(lynq_usb_dev, "r");
+ }
+ usleep(10000);
+ sprintf(lynq_usb_buf,"cat /sys/bus/iio/devices/iio:device1/in_voltage4_input 2>&1");
+ fp=popen(lynq_usb_buf, "r");
+
+ fgets(buf, sizeof(buf), fp);
+ sprintf(flag_buf, "%s%d%s%s%s", "SINK[", i+1, "]: ", buf, "\n");
+ handle_output(flag_buf, strlen(flag_buf), Response);
+ }
+ pclose(fp);
+}
+
+void lynq_handle_emmc(char *input)
+{
+ FILE *fp;
+ char emmc_buf[100] = {0};
+ char buf[100] = {0};
+ sprintf(emmc_buf, "ls /dev | grep mmcblk0 2>&1");
+ fp=popen(emmc_buf, "r");
+ if(!fp){
+ char *str = "\n+CME: POPEN ERROR\n";
+ handle_output(str, strlen(str), Response);
+ return;
+ }
+ while(fgets(buf, sizeof(buf), fp) != NULL){
+ char *str = "+EMMC: OK \n";
+ handle_output(str, strlen(str), Response);
+ pclose(fp);
+ return;
+ }
+ char *str = "\033[47;31m+EMMC: ERROR\033[0m\n";
+ handle_output(str, strlen(str), Response);
+ pclose(fp);
+}
+
+void lynq_handle_gpio(char *input)
+{
+ FILE *fp;
+ int lynq_gpio_arr[85] = {230,231,232,233,234,102,104,103,101,186 ,188 ,187 ,185 ,194 ,196 ,195 ,193 ,205 ,204 ,203 ,202, 201 ,190 ,192 ,191 ,189 ,173 ,174 ,175 ,176 ,170 ,169 ,184 ,183 ,182 ,181 ,24 ,25 ,157 ,158 ,155 ,156 ,143 ,144 ,140 ,141 ,153 ,154 ,180 ,179 ,29 ,30 ,178, 177, 7 ,5 ,4 ,113 ,112, 116 ,115 ,114, 107, 108, 105, 106, 100 ,99 ,98, 97, 94, 93, 92, 91, 1 ,130 ,41 ,67 ,69, 68, 63, 22, 23, 199, 200};
+ char lynq_set_gpio_arr[256] = {0};
+ char lynq_get_gpio_state[512] = {0};
+ char lynq_show_gpio_state[64] = {0};
+ int lynq_gpio_low = 0;
+ int lynq_gpio_hig = 0;
+ int i = 0,m = 0;
+ int lynq_gpio_beta_state = 1;
+
+ for(m = 0; m < 85; m++)
+ {
+ bzero(lynq_set_gpio_arr, 256);
+ sprintf(lynq_set_gpio_arr,"echo mode %d 0 > /sys/devices/platform/10005000.pinctrl/mt_gpio",(char*)lynq_gpio_arr[m]);
+ system(lynq_set_gpio_arr);
+ bzero(lynq_set_gpio_arr, 256);
+ sprintf(lynq_set_gpio_arr,"echo out %d 0 > /sys/devices/platform/10005000.pinctrl/mt_gpio",(char*)lynq_gpio_arr[m]);
+ system(lynq_set_gpio_arr);
+ }
+
+ for(i = 0; i < 85; i++)
+ {
+ lynq_gpio_low = 0;
+ lynq_gpio_hig = 0;
+
+ bzero(lynq_set_gpio_arr, 256);
+ sprintf(lynq_set_gpio_arr,"echo mode %d 0 > /sys/devices/platform/10005000.pinctrl/mt_gpio",(char*)lynq_gpio_arr[i]);
+ system(lynq_set_gpio_arr);
+
+ bzero(lynq_set_gpio_arr, 256);
+ sprintf(lynq_set_gpio_arr,"echo out %d 1 > /sys/devices/platform/10005000.pinctrl/mt_gpio",(char*)lynq_gpio_arr[i]);
+ system(lynq_set_gpio_arr);
+
+ bzero(lynq_set_gpio_arr, 256);
+ sprintf(lynq_set_gpio_arr,"cat /sys/devices/platform/10005000.pinctrl/mt_gpio | grep 006");
+ fp=popen(lynq_set_gpio_arr, "r");
+ bzero(lynq_get_gpio_state, 512);
+ fgets(lynq_get_gpio_state,sizeof(lynq_get_gpio_state),fp);
+ pclose(fp);
+ if(lynq_get_gpio_state[7] == '1')
+ {
+ lynq_gpio_hig = 1;
+ }
+
+ bzero(lynq_set_gpio_arr, 256);
+ sprintf(lynq_set_gpio_arr,"echo out %d 0 > /sys/devices/platform/10005000.pinctrl/mt_gpio",(char*)lynq_gpio_arr[i]);
+ system(lynq_set_gpio_arr);
+
+ bzero(lynq_set_gpio_arr, 256);
+ sprintf(lynq_set_gpio_arr,"cat /sys/devices/platform/10005000.pinctrl/mt_gpio | grep 006");
+ fp=popen(lynq_set_gpio_arr, "r");
+ bzero(lynq_get_gpio_state, 512);
+ fgets(lynq_get_gpio_state,sizeof(lynq_get_gpio_state),fp);
+ pclose(fp);
+ if(lynq_get_gpio_state[7] == '0')
+ {
+ lynq_gpio_low = 1;
+ }
+ bzero(lynq_show_gpio_state, 64);
+ if((lynq_gpio_low != 1) || (lynq_gpio_hig != 1))
+ {
+ lynq_gpio_beta_state = 0;
+ sprintf(lynq_show_gpio_state,"[gpio%d][result]:FAIL \n",(char *)lynq_gpio_arr[i]);
+ handle_output(lynq_show_gpio_state, strlen(lynq_show_gpio_state), Response);
+ }
+ else
+ {
+ sprintf(lynq_show_gpio_state,"gpio%d\n",(char *)lynq_gpio_arr[i]);
+ handle_output(lynq_show_gpio_state, strlen(lynq_show_gpio_state), Response);
+ }
+ }
+ if(lynq_gpio_beta_state == 1)
+ {
+ sprintf(lynq_show_gpio_state,"[gpio][result]:PASS \n");
+ handle_output(lynq_show_gpio_state, strlen(lynq_show_gpio_state), Response);
+ }
+}
+
+void lynq_handle_pcie(char *input)
+{
+ FILE *fp;
+ char lynq_usb_dev[128] = {0};
+ char lynq_get_gpio_state[512] = {0};
+ sprintf(lynq_usb_dev,"cat sys/devices/platform/10005000.pinctrl/mt_gpio |grep 097 2>&1");
+ fp=popen(lynq_usb_dev, "r");
+ fgets(lynq_get_gpio_state,sizeof(lynq_get_gpio_state),fp);
+ pclose(fp);
+ if(lynq_get_gpio_state[6] == '1')
+ {
+ char *str = "+PCIE: OK\n";
+ handle_output(str, strlen(str), Response);
+ }
+ else
+ {
+ char *str = "+PCIE: ERROR\n";
+ handle_output(str, strlen(str), Response);
+ }
+}
+
+void lynq_handle_rgmii(char *input)
+{
+ char *ipv4 = input+6;
+ char cmd[128] = {0};
+ FILE *fp;
+ sprintf(cmd, "%s %s %s %s", "ping -I eth2", ipv4, "-c4", "2>&1");
+ fp=popen(cmd, "r");
+ if(NULL == fp){
+ char *str = "popen errorn\n";
+ handle_output(str, strlen(str), Response);
+ }
+ char lynq_factory_buf[1024] = {0};
+ while (NULL != fgets(lynq_factory_buf,sizeof(lynq_factory_buf),fp))
+ {
+ if(strstr(lynq_factory_buf, "Usage"))
+ {
+ char *str = "RGMII cannot recognize IP addresses\nERROR\n";
+ handle_output(str, strlen(str), Response);
+ pclose(fp);
+ }
+ handle_output(lynq_factory_buf, strlen(lynq_factory_buf), Response);
+ }
+ char *str = "OK\n";
+ handle_output(str, strlen(str), Response);
+ pclose(fp);
+}
+
+void lynq_handle_sgmii(char *input)
+{
+ char *ipv4 = input+6;
+ char cmd[128] = {0};
+ FILE *fp;
+ sprintf(cmd, "%s %s %s %s", "ping -I eth1", ipv4, "-c4", "2>&1");
+ fp=popen(cmd, "r");
+ if(NULL == fp){
+ char *str = "popen errorn\n";
+ handle_output(str, strlen(str), Response);
+ }
+ char lynq_factory_buf[1024] = {0};
+ while (NULL != fgets(lynq_factory_buf,sizeof(lynq_factory_buf),fp))
+ {
+ if(strstr(lynq_factory_buf, "Usage"))
+ {
+ char *str = "RGMII cannot recognize IP addresses\nERROR\n";
+ handle_output(str, strlen(str), Response);
+ pclose(fp);
+ }
+ handle_output(lynq_factory_buf, strlen(lynq_factory_buf), Response);
+ }
+ char *str = "OK\n";
+ handle_output(str, strlen(str), Response);
+ pclose(fp);
+}
+
+void lynq_handle_inside_version(char *input)
+{
+ FILE *fp;
+ char buf[64] = {0};
+ fp=popen("uci get lynq_uci_ro.lynq_version.LYNQ_SW_INSIDE_VERSION 2>&1", "r");
+ if(NULL == fp){
+ char *str = "popen errorn\n";
+ handle_output(str, strlen(str), Response);
+ }
+ fgets(buf, sizeof(buf), fp);
+ handle_output(buf, strlen(buf), Response);
+ char *str = "OK\n";
+ handle_output(str, strlen(str), Response);
+ pclose(fp);
+}
+
+static Command commands[] =
+{
+{"adc",lynq_handle_adc},
+{"sink",lynq_handle_sink},
+{"emmc",lynq_handle_emmc},
+{"gpio",lynq_handle_gpio},
+{"pcie",lynq_handle_pcie},
+{"rgmii",lynq_handle_rgmii},
+{"sgmii",lynq_handle_sgmii},
+{"AT+CGIR",lynq_handle_inside_version},
+{NULL, NULL}
+};
+
+Command* find_command (char *input)
+{
+ RLOGD("function %s line %d input %s\n", __FUNCTION__, __LINE__, input);
+ int i;
+ int ret = -1;
+ for (i = 0; commands[i].cmd; i++)
+ {
+ ret = strncmp(input, commands[i].cmd, strlen(commands[i].cmd));
+ if(ret == 0)
+ {
+ RLOGD("function %s line %d find input %s commands[i].cmd %s strlen %d ret %d\n", __FUNCTION__, __LINE__, input, commands[i].cmd, strlen(commands[i].cmd), ret);
+ return (&commands[i]);
+ }
+ }
+ RLOGD("function %s line %d not find ret %d \n", __FUNCTION__, __LINE__, ret);
+ return ((Command *)NULL);
+}
+
+/*
+int g_number(const char *p){
+ int cnt = 0;
+ while(*p != '\0'){
+ if(*p == ','){
+ cnt++;
+ }
+ *p++;
+ }
+ return cnt+4;//for count character string
+
+}
+
+void lynqSetArgv(char **argv, char** Point,const char* value)
+{
+ *argv=*Point;
+ sprintf(*argv, "%s", value);
+ (*Point) += (strlen(value)+1);
+}
+
+int lynqParseUsbCommand(const char* cmd,char *argv[],char test[],char* parser_buf,int maxArgc)
+{
+ char *token;
+ char *str = test;
+ char *string;
+ char *parameter;
+ char* Point=parser_buf;
+ int cnt = g_number(cmd);
+ memcpy(test, cmd, strlen(cmd));
+ test[strlen(cmd)] = '\0';
+ argv[1] = (char *)cmd;
+ if(strstr(cmd,"=?"))
+ {
+ token = strtok(str, "=?");
+ //argv[0] = token;
+ argv[0] = strstr(token, "+")+1;
+ lynqSetArgv(&(argv[2]),&Point,"1");
+ while (token != NULL)
+ {
+ string = token;
+ token = strtok(NULL, "=?");
+ }
+ parameter = strtok(string, ",");
+ int i = 3;
+ while (parameter != NULL)
+ {
+ argv[i++] = parameter;
+ parameter = strtok(NULL, ",");
+ }
+ }
+ else if(strstr(cmd,"="))
+ {
+ lynqSetArgv(&(argv[2]),&Point,"0");
+ token = strtok(str, "=");
+ //argv[0] = token;
+ if(strstr(token, "+"))
+ {
+ argv[0] = strstr(token, "+")+1;
+ while (token != NULL)
+ {
+ string = token;
+ token = strtok(NULL, "=");
+ }
+ parameter = strtok(string, ",");
+ int i = 3;
+ while (parameter != NULL)
+ {
+ argv[i++] = parameter;
+ parameter = strtok(NULL, ",");
+ }
+ }
+ else
+ {
+ argv[0] = token;
+ }
+ }
+ else if(strstr(cmd,"?"))
+ {
+ lynqSetArgv(&(argv[2]),&Point,"2");
+ token = strtok(str, "?");
+ //argv[0] = token;
+ argv[0] = strstr(token, "+")+1;
+ while (token != NULL)
+ {
+ string = token;
+ token = strtok(NULL, "?");
+ }
+ parameter = strtok(string, ",");
+ int i = 3;
+ while (parameter != NULL)
+ {
+ argv[i++] = parameter;
+ parameter = strtok(NULL, ",");
+ }
+ }
+ if(cnt > maxArgc)
+ return -1;
+ return cnt;
+}
+*/
+
+
+
+void lynq_at_factory_cb(char *input, int input_max_size)
+{
+ char buffer[128]={};
+ char tempbuf[128]={};
+ char buf_parser[64] = {};
+ int argc = 0;
+ char *argv[MAX_ARGS];
+ if(handle_output != NULL)
+ {
+ RLOGD("function %s line %d input %s\n", __FUNCTION__, __LINE__, input);
+ if(input != NULL)
+ {
+ if(!strncmp(input, INSIDE_VERSION, strlen(INSIDE_VERSION)))
+ {
+ Command *cmd = find_command(input);
+ if(cmd != NULL)
+ {
+ RLOGD("function %s line %d\n", __FUNCTION__, __LINE__);
+ (*(cmd->func))(input);
+ return;
+ }
+ }
+ else if(!strncmp(input, FACTORY_STRING, strlen(FACTORY_STRING)))
+ {
+ char *handle_string = input + strlen(FACTORY_STRING);
+ if(!strlen(handle_string))
+ {
+ RLOGD("function %s line %d strlen %d\n", __FUNCTION__, __LINE__, strlen(handle_string));
+ return;
+ }
+ RLOGD("function %s line %d handle_string %s\n", __FUNCTION__, __LINE__, handle_string);
+ Command *cmd = find_command(handle_string);
+ if(cmd != NULL)
+ {
+ RLOGD("function %s line %d\n", __FUNCTION__, __LINE__);
+ (*(cmd->func))(handle_string);
+ return;
+ }
+ }
+ }
+ }
+}
+
+lynq_atsvc_incb lynq_register_at_factory(lynq_atsvc_outcb out_cb)
+{
+ if(out_cb != NULL)
+ {
+ handle_output = out_cb;
+ RLOGD("function %s line %d\n", __FUNCTION__, __LINE__);
+ return lynq_at_factory_cb;
+ }
+}
diff --git a/src/lynq/lib/liblynq-at-factory/makefile b/src/lynq/lib/liblynq-at-factory/makefile
new file mode 100755
index 0000000..f621678
--- /dev/null
+++ b/src/lynq/lib/liblynq-at-factory/makefile
@@ -0,0 +1,73 @@
+
+SHELL = /bin/sh
+RM = rm -f
+
+LOCAL_CFLAGS := -Wall \
+ -std=gnu++14 \
+ -g -Os \
+ -flto \
+ -DRIL_SHLIB \
+ -DATCI_PARSE \
+ -fPIC \
+ -DKEEP_ALIVE \
+ -DECALL_SUPPORT \
+ -fpermissive \
+
+$(warning ################# lynq at factory demo ROOT: $(ROOT),includedir:$(includedir))
+LOCAL_PATH = .
+
+LOCAL_C_INCLUDES = \
+ -I. \
+ -I$(LOCAL_PATH)/include/libat \
+ -I$(ROOT)$(includedir)/logger \
+ -I$(ROOT)$(includedir)/liblog \
+ -I$(ROOT)$(includedir)/vendor-ril \
+
+
+LOCAL_LIBS := \
+ -L. \
+ -ldl \
+ -lstdc++ \
+ -llog \
+ -lcutils \
+ -lutils \
+ -lbinder \
+ -lpthread \
+ -llynq-log \
+
+
+SOURCES = $(wildcard *.cpp)
+
+EXECUTABLE = liblynq-at-factory.so
+
+OBJECTS=$(SOURCES:.cpp=.o)
+
+.PHONY: build clean install pack_rootfs
+
+all: build
+$(EXECUTABLE): $(OBJECTS)
+ $(CXX) -shared -Wl,--no-undefined $(OBJECTS) $(LOCAL_LIBS) $(LOCAL_CFLAGS) $(LOCAL_C_INCLUDES) -o $@
+
+%.o : %.cpp
+ $(CXX) $(LOCAL_C_INCLUDES) $(LOCAL_CFLAGS) $(LOCAL_LIBS) -o $@ -c $<
+
+build: $(EXECUTABLE)
+ $(warning ########## build $(EXECUTABLE) ##########)
+
+install:
+ mkdir -p $(ROOT)$(base_libdir)/
+ install $(EXECUTABLE) $(ROOT)$(base_libdir)/
+ mkdir -p $(ROOT)$(includedir)/$(NAME)/sdk
+
+pack_rootfs:
+ mkdir -p $(PACK_INITRAMFS_TO)$(base_libdir)/
+ cp -af $(EXECUTABLE) $(PACK_INITRAMFS_TO)$(base_libdir)/
+ $(CROSS)strip $(PACK_INITRAMFS_TO)$(base_libdir)/$(EXECUTABLE)
+ mkdir -p $(PACK_TO)$(base_libdir)/
+ cp -af $(EXECUTABLE) $(PACK_TO)$(base_libdir)/
+ $(CROSS)strip $(PACK_TO)$(base_libdir)/$(EXECUTABLE)
+
+.PHONY: clean
+clean:
+ $(RM) $(OBJECTS) $(EXECUTABLE)
+ -find . -name "*.o" -delete