Squashed 'LYNQ_PUBLIC/' content from commit 79d8f932f

git-subtree-dir: LYNQ_PUBLIC
git-subtree-split: 79d8f932fb4ebc4b5aec6c5ace97634912394272
Change-Id: If2527ba937f56fe989487bf71e996f7cfd9fbe61
diff --git a/IC_src/mtk/packages/apps/lynq-at-test/src/main.cpp b/IC_src/mtk/packages/apps/lynq-at-test/src/main.cpp
new file mode 100755
index 0000000..367a6bb
--- /dev/null
+++ b/IC_src/mtk/packages/apps/lynq-at-test/src/main.cpp
@@ -0,0 +1,121 @@
+
+/*============================================================================= 
+#     FileName: lynq-at-test
+#     Desc: about SIMAPI
+#     Author: lei 
+#     Version: V1.0
+#     LastChange: 2023-03-09 
+#     History: 
+# 
+=============================================================================*/
+
+#include <stdio.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <stdint.h>
+
+#include "mipc_msg.h"
+#include "mipc_msg_tlv_api.h"
+#include "mipc_msg_tlv_const.h"
+#include "mipc_msg_host.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+char str[] = "AT;AT+CSQ;AT+ECSQ;AT+CREG;AT+CEREG;AT+C5GREG;AT+COPS;AT+CFUN;AT+ERAT";
+
+int check_buf(char *str,char *cmd)
+{
+    char *q = (char *)calloc(64,sizeof(char));
+    strcpy(q, str);
+    char *name;
+    char cmp[16] = {0};
+    while(q != NULL)
+    {
+        name = strsep(&q,";");
+        //printf("name %s\n", name);
+        strcpy(cmp, name);
+        //printf("cmp %s\n", cmp);
+        if(!strncmp(cmp, cmd, strlen(cmp)))
+        {
+            //printf("equal\n");
+            return 1;
+        }
+        // if(name != NULL)
+        // {
+        //     printf("%s\n", name);
+        //     if(!strncmp(name, cmd, strlen(name)))
+        //     {
+        //         return 1;
+        //     }
+        // }
+    }
+    free(q);
+    return 0;
+}
+
+void uper_char(char *cmd)
+{
+    char *p = cmd;
+    while (*p != '\0')
+    {
+        if((*p >= 'a') && (*p <= 'z'))
+        {
+            *p = *p-32;
+        }
+        *p++;
+    }
+}
+
+void sendcmd(char *cmd)
+{
+    mipc_msg_t *msg_req_ptr = mipc_msg_init(MIPC_SYS_AT_REQ, (mipc_msg_sim_ps_id_enum)MIPC_PS0);
+    mipc_msg_t *msg_cnf_ptr = NULL;
+    mipc_result_enum result;
+    char *atcmd_res_ptr = NULL;//, *atci_res = NULL;
+    uint16_t atcmd_res_len;
+    mipc_msg_add_tlv(msg_req_ptr, MIPC_SYS_AT_REQ_T_ATCMD, strlen(cmd), cmd);
+    msg_cnf_ptr = mipc_msg_sync_timeout(msg_req_ptr);
+    mipc_msg_deinit(msg_req_ptr);
+    result = mipc_get_result(msg_cnf_ptr);
+    if (result == MIPC_RESULT_SUCCESS) {
+        atcmd_res_ptr = (char *)mipc_msg_get_val_ptr(msg_cnf_ptr, MIPC_SYS_AT_CNF_T_ATCMD, &atcmd_res_len);
+        //int res_len = strlen(atcmd_res_ptr);
+        //printf( "res_len is:%d, atcmd_res_len is %d\n", res_len, atcmd_res_len);
+        //strncpy(response, atcmd_res_ptr, res_len);
+        //response[res_len] = '\0';
+        //atcmd_res_ptr[atcmd_res_len] = '\0';
+        printf( "%s\n", atcmd_res_ptr);
+    } else {
+        printf( "Failed to execute:%d\n", result);
+    }
+    mipc_msg_deinit(msg_cnf_ptr);
+}
+
+int main(void)
+{
+    SETCOM("/dev/ttyCMIPC2");
+    mipc_init("atci");
+    printf( "set mipc_inited true (UANT)\n");
+    char cmd[256] = {0};
+    while (1)
+    {
+        printf("please input at cmd:\n");
+        fgets(cmd, 256, stdin);
+        cmd[strlen(cmd)-1]='\0';
+        uper_char(cmd);
+        if(check_buf(str, cmd))
+        {
+            sendcmd(cmd);
+        }
+        else
+        {
+            printf("we just support AT+CSQ AT+ECSQ AT+CREG AT+CEREG AT+C5GREG AT+COPS AT+CFUN AT+ERAT\n");
+        }
+        
+    }
+}
+#ifdef __cplusplus
+}
+#endif 
diff --git a/IC_src/mtk/packages/apps/lynq-at-test/src/makefile b/IC_src/mtk/packages/apps/lynq-at-test/src/makefile
new file mode 100755
index 0000000..bf048d7
--- /dev/null
+++ b/IC_src/mtk/packages/apps/lynq-at-test/src/makefile
@@ -0,0 +1,64 @@
+SHELL = /bin/sh
+RM = rm -f
+
+LOCAL_CFLAGS := -Wall \
+                -g -Os \
+                -flto \
+                -DRIL_SHLIB \
+                -D_LINUX \
+
+$(warning ################# TARGET_PLATFORM: $(TARGET_PLATFORM))
+ifeq ($(strip $(TARGET_PLATFORM)), mt2731)
+#$(warning #################add for debug $(ROOT), $(includedir))
+$(warning ################# TARGET_PLATFORM_MT2731)
+    LOCAL_CFLAGS += -DTARGET_PLATFORM_MT2731 \
+                    -DMD_93_SUPPORT
+else ifeq ($(strip $(TARGET_PLATFORM)), mt2635)
+$(warning ################# TARGET_PLATFORM_MT2635)
+    LOCAL_CFLAGS += -DTARGET_PLATFORM_MT2635 \
+                    -DMD_90_SUPPORT
+endif
+
+
+LOCAL_PATH   = .
+
+$(warning ################# ZHOUQUNCHAO ROOT: $(ROOT),includedir:$(includedir),LOCAL_PATH:$(LOCAL_PATH))
+LOCAL_C_INCLUDES = \
+  -I. \
+  -I$(LOCAL_PATH) \
+  -I$(ROOT)$(includedir)/ \
+  -I$(ROOT)$(includedir)/mipc/api  \
+  -I$(ROOT)$(includedir)/mipc/common  \
+  -I$(ROOT)$(includedir)/mipc/msg  \
+  -I$(ROOT)$(includedir)/mipc/external  \
+  -DLIB_GNSS_HAL_DIR='"$(libdir)"'
+
+LOCAL_C_INCLUDES+=$(DNS_FLAGS)
+
+LOCAL_LIBS := \
+    -L. \
+    -ldl \
+    -lstdc++ \
+    -llog \
+    -pthread \
+    -lmipc_msg \
+
+LOCAL_SRC_FILES_CPP = $(wildcard *.cpp gpio/*.cpp ril/*.cpp)
+LOCAL_SRC_FILES_C = $(wildcard *.c gps/*.c)
+EXECUTABLE = lynq-at-test
+
+OBJECTS=$(LOCAL_SRC_FILES_CPP:.cpp=.o) $(LOCAL_SRC_FILES_C:.c=.o)
+all: $(EXECUTABLE)
+
+$(EXECUTABLE): $(OBJECTS)
+	$(CXX) $(OBJECTS) $(LOCAL_LIBS) $(LOCAL_CFLAGS) $(LOCAL_C_INCLUDES) -o $@
+
+%.o: %.c
+	$(warning ----->build $<)
+	$(CC) $(LOCAL_C_INCLUDES) $(LOCAL_CFLAGS) $(LOCAL_LIBS) -o $@ -c $<
+%.o : %.cpp
+	$(CXX) $(LOCAL_C_INCLUDES) $(LOCAL_CFLAGS) $(LOCAL_LIBS) -o $@ -c $<
+
+.PHONY: clean
+clean:
+	$(RM) $(OBJECTS) $(EXECUTABLE)
diff --git a/IC_src/mtk/packages/apps/lynq-conti-plugin-test/LICENSE b/IC_src/mtk/packages/apps/lynq-conti-plugin-test/LICENSE
new file mode 100644
index 0000000..77f59ed
--- /dev/null
+++ b/IC_src/mtk/packages/apps/lynq-conti-plugin-test/LICENSE
@@ -0,0 +1,31 @@
+Copyright Statement:
+
+This software/firmware and related documentation ("MediaTek Software") are
+protected under relevant copyright laws. The information contained herein is
+confidential and proprietary to MediaTek Inc. and/or its licensors. Without
+the prior written permission of MediaTek inc. and/or its licensors, any
+reproduction, modification, use or disclosure of MediaTek Software, and
+information contained herein, in whole or in part, shall be strictly
+prohibited.
+
+MediaTek Inc. (C) 2015. All rights reserved.
+
+BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
+ON AN "AS-IS" BASIS ONLY. MEDIATEK 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 MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH
+RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
+INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK 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 MEDIATEK
+SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE
+RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S
+ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE
+RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE
+MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
+CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
diff --git a/IC_src/mtk/packages/apps/lynq-conti-plugin-test/lynq-conti-plugin-response.c b/IC_src/mtk/packages/apps/lynq-conti-plugin-test/lynq-conti-plugin-response.c
new file mode 100644
index 0000000..4d86952
--- /dev/null
+++ b/IC_src/mtk/packages/apps/lynq-conti-plugin-test/lynq-conti-plugin-response.c
@@ -0,0 +1,35 @@
+//

+// Created by DELL on 2021/7/12.

+//

+#include <stdint.h>

+#include <stdlib.h>

+#include <string.h>

+#include "nadif_hal_service.h"

+#include "nadif_hal_service_types.h"

+#include "lynq-conti-plugin-response.h"

+

+#define ARRAY_SIZE(X) (sizeof(X)/sizeof(X[0]))

+

+void parse_resp_imsi(int32_t sv_id, void *resp_data)

+{

+    NADIF_HAL_RESP_DATA *respData = (NADIF_HAL_RESP_DATA*)resp_data;

+    printf("get imsi: ret=%d ,imsi=%s\n", respData->imsi_resp.result, respData->imsi_resp.imsi);

+}

+

+extern parse_resp_t parse_resp_tables[] =

+{

+        {NADIF_HAL_SVC_GET_IMSI, parse_resp_imsi},

+        {0, NULL}

+};

+

+int list_param_for_sv_id(int32_t sv_id, void *data)

+{

+    for(int i= 0; i < ARRAY_SIZE(parse_resp_tables); i++)

+    {

+        if(sv_id == parse_resp_tables[i].sv_id)

+        {

+            parse_resp_tables[i].parse_response(sv_id, data);

+        }

+    }

+}

+

diff --git a/IC_src/mtk/packages/apps/lynq-conti-plugin-test/lynq-conti-plugin-response.h b/IC_src/mtk/packages/apps/lynq-conti-plugin-test/lynq-conti-plugin-response.h
new file mode 100644
index 0000000..3ef0624
--- /dev/null
+++ b/IC_src/mtk/packages/apps/lynq-conti-plugin-test/lynq-conti-plugin-response.h
@@ -0,0 +1,15 @@
+//

+// Created by DELL on 2021/7/12.

+//

+

+#ifndef LYNQ_LYNQ_CONTI_PLUGIN_RESPONSE_H

+#define LYNQ_LYNQ_CONTI_PLUGIN_RESPONSE_H

+

+typedef struct{

+    int32_t sv_id;

+    void (*parse_response)(int32_t sv_id, void *resp_data);

+}parse_resp_t;

+

+int list_param_for_sv_id(int32_t sv_id, void *data);

+

+#endif //LYNQ_LYNQ_CONTI_PLUGIN_RESPONSE_H

diff --git a/IC_src/mtk/packages/apps/lynq-conti-plugin-test/lynq-conti-plugin-test.c b/IC_src/mtk/packages/apps/lynq-conti-plugin-test/lynq-conti-plugin-test.c
new file mode 100644
index 0000000..009f52f
--- /dev/null
+++ b/IC_src/mtk/packages/apps/lynq-conti-plugin-test/lynq-conti-plugin-test.c
@@ -0,0 +1,111 @@
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <arpa/inet.h>
+#include<stdlib.h>
+#include <netinet/in.h>
+#include <strings.h>
+#include <stdlib.h>
+#include <dlfcn.h>
+#include "nadif.h"
+#include "nadif_hal_service.h"
+#include "nadif_hal_service_types.h"
+#include "liblog/liblog.h"
+#include "liblog/lynq_deflog.h"
+#include <vendor-ril/telephony/ril.h>
+#include <errno.h>
+#include "lynq-conti-plugin-response.h"
+
+#define USER_LOG_TAG "CONTI-PLUGIN-TEST"
+
+NADIF_HAL_SVC_ID req_sv_id = 0;
+
+typedef const NADIF_HAL_PluginFunctions *(*PLUGIN_INIT)(const NADIF_HAL_Callbacks *callbacks, void *token);
+
+const char *conti_plugin_path = "/lib64/liblynq-conti-plugin.so";
+
+static void conti_plugin_response(void *data, size_t datalen, NADIF_RESULT res, void *token);
+
+static void conti_plugin_unsol_response(NADIF_HAL_SVC_ID command, void *data, size_t datalen);
+
+static NADIF_RESULT conti_plugin_db_write(const gchar *key, const void *data, const size_t datalen);
+
+static NADIF_RESULT conti_plugin_db_read(const gchar *key, void *data, size_t datalen);
+
+static void conti_plugin_status(void *data, size_t datalen, void *init_token);
+
+NADIF_HAL_PluginFunctions *pluginFunctions = NULL;
+NADIF_HAL_Callbacks conti_callbacks =
+        {
+                conti_plugin_response,
+                conti_plugin_unsol_response,
+                conti_plugin_db_write,
+                conti_plugin_db_read,
+                conti_plugin_status,
+        };
+
+int main(int argc, const char *argv[]) {
+    //LYLOGEINIT(USER_LOG_TAG);
+    printf("conti Plugin test demo\n");
+
+#if 1
+    void *handle = dlopen(conti_plugin_path, RTLD_LAZY);
+    printf("conti Plugin test demo: %d\n", __LINE__);
+    if (!handle) {
+        printf("[%s][%d]dlopen get error: %s\n", __FILE__, __LINE__, dlerror());
+        exit(EXIT_FAILURE);
+    }
+    printf("conti Plugin test demo: %d\n", __LINE__);
+
+
+    PLUGIN_INIT plugin_init = (PLUGIN_INIT) dlsym(handle, "plugin_init");
+    printf("conti Plugin test demo: %d\n", __LINE__);
+    if (!plugin_init) {
+        printf("plugin_init error:%s\n", dlerror());
+    }
+
+    pluginFunctions = plugin_init(&conti_callbacks, "test");
+    printf("conti Plugin test demo: %d\n", __LINE__);
+
+
+    if (NULL != pluginFunctions)
+        printf("plugin init is ok\n");
+#endif
+
+    while (1) {
+        req_sv_id = NADIF_HAL_SVC_GET_IMSI;
+        char test_buf[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
+        pluginFunctions->plugin_request(req_sv_id, test_buf, 10, "test");
+        printf("conti-test: sv_iid=%d\n", req_sv_id);
+        sleep(2);
+        req_sv_id = NADIF_HAL_SVC_GET_VOICE_CALL_INFO;
+        char *phone_num = "+8615826484140";
+        pluginFunctions->plugin_request(req_sv_id, phone_num, strlen(phone_num), "test");
+        sleep(2);
+    }
+    return 0;
+}
+
+static void conti_plugin_response(void *data, size_t datalen, NADIF_RESULT res, void *token) {
+    list_param_for_sv_id(req_sv_id, data);
+    printf("[%s][%s][%d]:dataLen=%d, res=%d\n", __FILE__, __FUNCTION__, __LINE__, datalen, res);
+}
+
+static void conti_plugin_unsol_response(NADIF_HAL_SVC_ID command, void *data, size_t datalen) {
+    list_param_for_sv_id(command, data);
+    printf("[%s][%s][%d]:id=%d, dataLen=%d\n", __FILE__, __FUNCTION__, __LINE__, command, datalen);
+}
+
+static NADIF_RESULT conti_plugin_db_write(const gchar *key, const void *data, const size_t datalen) {
+    printf("[%s][%s][%d]:key=%s, dataLen=%d\n", __FILE__, __FUNCTION__, __LINE__, key, datalen);
+    return NADIF_RESULT_SUCCESS;
+}
+
+static NADIF_RESULT conti_plugin_db_read(const gchar *key, void *data, size_t datalen) {
+    printf("[%s][%s][%d]:key=%s, res=%d\n", __FILE__, __FUNCTION__, __LINE__, key, datalen);
+    return NADIF_RESULT_SUCCESS;
+}
+
+static void conti_plugin_status(void *data, size_t datalen, void *init_token) {
+    printf("[%s][%s][%d]:dataLen=%d\n", __FILE__, __FUNCTION__, __LINE__, datalen);
+}
diff --git a/IC_src/mtk/packages/apps/lynq-conti-plugin-test/makefile b/IC_src/mtk/packages/apps/lynq-conti-plugin-test/makefile
new file mode 100644
index 0000000..81ced95
--- /dev/null
+++ b/IC_src/mtk/packages/apps/lynq-conti-plugin-test/makefile
@@ -0,0 +1,79 @@
+SHELL = /bin/sh
+RM = rm -f
+
+CC=aarch64-poky-linux-gcc -g -os
+
+$(warning ################# C2K support: $(RAT_CONFIG_C2K_SUPPORT))
+ifeq ($(strip $(RAT_CONFIG_C2K_SUPPORT)), yes)
+    $(CFLAGS) += -DC2K_SUPPORT
+
+endif
+
+ifeq ($(strip $(MTK_MULTI_SIM_SUPPORT)), dsds)
+    $(CFLAGS) += -DANDROID_SIM_COUNT_2 \
+                     -DANDROID_MULTI_SIM \
+                     -DMODE_DSDS
+endif
+
+ifeq ($(strip $(MTK_MULTI_SIM_SUPPORT)), dsss)
+    $(CFLAGS) += -DMODE_DSSS
+endif
+
+$(warning ################# TARGET_PLATFORM: $(TARGET_PLATFORM))
+ifeq ($(strip $(TARGET_PLATFORM)), mt2731)
+#$(warning #################add for debug $(ROOT), $(includedir))
+$(warning ################# TARGET_PLATFORM_MT2731)
+    $(CFLAGS) += -DTARGET_PLATFORM_MT2731 \
+                    -DMD_93_SUPPORT
+else ifeq ($(strip $(TARGET_PLATFORM)), mt2635)
+$(warning ################# TARGET_PLATFORM_MT2635)
+    $(CFLAGS) += -DTARGET_PLATFORM_MT2635 \
+                    -DMD_90_SUPPORT
+endif
+
+
+LOCAL_PATH   = .
+#CFLAGS = $(LOCAL_CFLAGS) -std=c99 
+#CXXFLAGS = $(LOCAL_CFLAGS) -std=gnu++14
+$(warning ################# ZHOUQUNCHAO ROOT: $(ROOT),includedir:$(includedir),LOCAL_PATH:$(LOCAL_PATH))
+LOCAL_C_INCLUDES = \
+  -I. \
+  -I$(LOCAL_PATH) \
+  -I$(ROOT)$(includedir)/glib-2.0 \
+  -I$(ROOT)$(libdir)/glib-2.0/include \
+  -I$(ROOT)$(includedir)/include/hal/external \
+  -I$(ROOT)$(includedir)/include/types/ \
+  -I$(ROOT)$(includedir)/include/ \
+  -I$(ROOT)$(includedir)/liblog \
+  -I$(ROOT)$(includedir)/vendor-ril \
+
+LOCAL_C_INCLUDES+=$(DNS_FLAGS)
+
+LOCAL_LIBS := \
+    -L. \
+    -ldl \
+    -lpthread \
+    -llynq-log \
+
+LOCAL_SRC_FILES_C = $(wildcard *.c )
+EXECUTABLE = lynq-conti-plugin-test
+
+OBJECTS=$(LOCAL_SRC_FILES_C:.c=.o)
+all: $(EXECUTABLE)
+
+$(EXECUTABLE): $(OBJECTS)
+	$(CXX) $(OBJECTS) $(CFLAGS) $(LOCAL_LIBS) $(LOCAL_C_INCLUDES) -o $@
+
+%.o: %.c
+	$(warning ----->build $<)
+	echo $(CC)
+	echo $(CFLAGS)
+	$(CC) $(CFLAGS) $(LOCAL_C_INCLUDES) $(LOCAL_LIBS) -o $@ -c $<
+%.o : %.cpp
+	echo $(CXX)
+	echo $(CFLAGS)
+	$(CXX) $(CFLAGS) $(LOCAL_C_INCLUDES) $(LOCAL_LIBS) -o $@ -c $<
+
+.PHONY: clean
+clean:
+	$(RM) $(OBJECTS) $(EXECUTABLE)
diff --git a/IC_src/mtk/packages/apps/lynq-default/lynq_default.c b/IC_src/mtk/packages/apps/lynq-default/lynq_default.c
new file mode 100755
index 0000000..ba3a4b4
--- /dev/null
+++ b/IC_src/mtk/packages/apps/lynq-default/lynq_default.c
@@ -0,0 +1,41 @@
+#include <stdio.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#include <strings.h>
+#include<stdlib.h>
+#include <include/lynq_uci.h>
+
+
+
+//#define USER_LOG_TAG "lynq_default"
+//#define  LYNQ_SW_VERSION "T800v02.MP1_MR1.01b04.01"//needs to be modified if upgrade version
+//#define  LYNQ_SW_INSIDE_VERSION "T800v02.MP1_MR1.01b04.04"//only for insde check
+
+//#define GET_DATA_LEN 64
+#define BUF_LEN 258
+#define LYNQ_UCI_RO_SECTION "lynq_version"
+#define LYNQ_UCI_RO_KEY_VERSION "LYNQ_SW_VERSION"
+#define LYNQ_UCI_RO_KEY_INSIDE_VERSION "LYNQ_SW_INSIDE_VERSION"
+
+
+int main(int argc, const char *argv[])
+{
+	//char data[GET_DATA_LEN] = "";
+       char buf[BUF_LEN] = "";
+       char buf_insde[BUF_LEN] = "";
+       int ret = 0;
+
+
+	//lynq_get_value(LYNQ_UCI_RO_FILE, LYNQ_UCI_RO_SECTION, LYNQ_UCI_RO_KEY, data);
+	//if(strncmp(LYNQ_SW_VERSION, data, sizeof(LYNQ_SW_VERSION))!=0)
+	//{
+                sprintf(buf,"%s.%s.%s=%s", LYNQ_UCI_RO_FILE, LYNQ_UCI_RO_SECTION, LYNQ_UCI_RO_KEY_VERSION, LYNQ_SW_VERSION);
+                sprintf(buf_insde,"%s.%s.%s=%s", LYNQ_UCI_RO_FILE, LYNQ_UCI_RO_SECTION, LYNQ_UCI_RO_KEY_INSIDE_VERSION, LYNQ_SW_INSIDE_VERSION);
+
+                lynq_uci_set(buf);
+                lynq_uci_set(buf_insde);
+	//}
+
+	return ret;
+}
diff --git a/IC_src/mtk/packages/apps/lynq-default/makefile b/IC_src/mtk/packages/apps/lynq-default/makefile
new file mode 100644
index 0000000..e5e41eb
--- /dev/null
+++ b/IC_src/mtk/packages/apps/lynq-default/makefile
@@ -0,0 +1,48 @@
+SHELL = /bin/sh
+RM = rm -f
+
+LOCAL_CFLAGS := -Wall \
+                -g -Os \
+                -flto \
+                -fpermissive \
+                -fPIC \
+
+
+
+LOCAL_CFLAGS += -DLYNQ_SW_INSIDE_VERSION=\"$(LYNQ_CONFIG_VERSION)\"
+LOCAL_CFLAGS += -DLYNQ_SW_VERSION=\"$(LYNQ_CONFIG_SW_VERSION)\"
+
+LOCAL_PATH   = .
+
+LOCAL_C_INCLUDES = \
+  -I. \
+  -I$(ROOT)$(includedir)/logger \
+  -I$(ROOT)$(includedir)/liblog \
+
+
+
+
+LOCAL_LIBS := \
+    -L. \
+    -ldl \
+    -lpthread \
+    -llynq-log \
+    -lssl \
+    -llynq-uci \
+
+SOURCES = $(wildcard *.c)
+
+EXECUTABLE = lynq-default
+
+OBJECTS=$(SOURCES:.c=.o)
+all: $(EXECUTABLE)
+
+$(EXECUTABLE): $(OBJECTS)
+	$(CXX) $(OBJECTS) $(LOCAL_LIBS) $(LOCAL_CFLAGS) $(LOCAL_C_INCLUDES) -o $@
+
+%.o : %.c
+	$(CC) $(LOCAL_C_INCLUDES) $(LOCAL_CFLAGS) $(LOCAL_LIBS) -o $@ -c $<
+
+.PHONY: clean
+clean:
+	$(RM) $(OBJECTS) $(EXECUTABLE)
diff --git a/IC_src/mtk/packages/apps/lynq-factorytest/src/LICENSE b/IC_src/mtk/packages/apps/lynq-factorytest/src/LICENSE
new file mode 100644
index 0000000..77f59ed
--- /dev/null
+++ b/IC_src/mtk/packages/apps/lynq-factorytest/src/LICENSE
@@ -0,0 +1,31 @@
+Copyright Statement:
+
+This software/firmware and related documentation ("MediaTek Software") are
+protected under relevant copyright laws. The information contained herein is
+confidential and proprietary to MediaTek Inc. and/or its licensors. Without
+the prior written permission of MediaTek inc. and/or its licensors, any
+reproduction, modification, use or disclosure of MediaTek Software, and
+information contained herein, in whole or in part, shall be strictly
+prohibited.
+
+MediaTek Inc. (C) 2015. All rights reserved.
+
+BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
+ON AN "AS-IS" BASIS ONLY. MEDIATEK 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 MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH
+RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
+INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK 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 MEDIATEK
+SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE
+RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S
+ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE
+RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE
+MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
+CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
diff --git a/IC_src/mtk/packages/apps/lynq-factorytest/src/autoFactoryTest.cpp b/IC_src/mtk/packages/apps/lynq-factorytest/src/autoFactoryTest.cpp
new file mode 100644
index 0000000..5dea35f
--- /dev/null
+++ b/IC_src/mtk/packages/apps/lynq-factorytest/src/autoFactoryTest.cpp
@@ -0,0 +1,13 @@
+#include <memory>
+
+#include "rfAutomaticTest.h"
+#include "autoFactoryTest.h"
+
+
+static RfAutomaticTest* mTx = NULL;
+int factory_auto_test() {
+    if(!mTx) {
+        mTx = RfAutomaticTest::getInstance();
+    }  
+    return 0;
+}
diff --git a/IC_src/mtk/packages/apps/lynq-factorytest/src/autoFactoryTest.h b/IC_src/mtk/packages/apps/lynq-factorytest/src/autoFactoryTest.h
new file mode 100644
index 0000000..ede96fb
--- /dev/null
+++ b/IC_src/mtk/packages/apps/lynq-factorytest/src/autoFactoryTest.h
@@ -0,0 +1,39 @@
+/* Copyright Statement:
+ *
+ * This software/firmware and related documentation ("MediaTek Software") are
+ * protected under relevant copyright laws. The information contained herein
+ * is confidential and proprietary to MediaTek Inc. and/or its licensors.
+ * Without the prior written permission of MediaTek inc. and/or its licensors,
+ * any reproduction, modification, use or disclosure of MediaTek Software,
+ * and information contained herein, in whole or in part, shall be strictly prohibited.
+ *
+ * MediaTek Inc. (C) 2016. All rights reserved.
+ *
+ * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+ * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+ * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER ON
+ * AN "AS-IS" BASIS ONLY. MEDIATEK 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 MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
+ * SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
+ * SUPPLIED WITH THE MEDIATEK 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 MEDIATEK SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK
+ * SOFTWARE RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+ * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND
+ * CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
+ * AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
+ * OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY RECEIVER TO
+ * MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+ *
+ * The following software/firmware and/or related documentation ("MediaTek Software")
+ * have been modified by MediaTek Inc. All revisions are subject to any receiver's
+ * applicable license agreements with MediaTek Inc.
+ */
+
+#ifndef AUTOFACTORYTEST_H_
+#define AUTOFACTOYRTEST_H_
+ int factory_auto_test();
+#endif /* AUTOFACTOYRTEST_H_ */
diff --git a/IC_src/mtk/packages/apps/lynq-factorytest/src/common.cpp b/IC_src/mtk/packages/apps/lynq-factorytest/src/common.cpp
new file mode 100644
index 0000000..e23d0fc
--- /dev/null
+++ b/IC_src/mtk/packages/apps/lynq-factorytest/src/common.cpp
@@ -0,0 +1,119 @@
+#include "common.h"

+#include "libtel/lynq_call.h"

+#include <log/log.h>

+#include <cutils/properties.h>

+int get_call(){

+	char property_value[PHONE_SIZE] = { 0 };

+	property_get(PHONE_NUMBER, property_value, "18964376469");

+	RLOGD("factory_manual,property_value:%s",property_value);

+	//RIL_Dial *mRIL_Dial = (RIL_Dial *)calloc(1, sizeof(RIL_Dial));

+	//mRIL_Dial->address = property_value;   

+	//mRIL_Dial->clir = 0;

+   // return lynq_call(property_value);

+   return 1;

+}

+void register_factory_auto_hook_raw(RfAutomaticTest* rf){

+    if(!m_RfDesense) {

+        m_RfDesense = rf;

+    }

+}

+

+void unregister_factory_auto_hook_raw(){

+    if(m_RfDesense) {

+        m_RfDesense == NULL;

+    }

+}

+int getParameter(const int length, char* string, char* argv[])

+{

+    int num = 0;

+    int count = 0;

+    int i = 0;

+    char* pos= string;

+    //string++;

+    while (1)

+    {

+        if (*pos == '\0')

+        {

+            break;

+        }

+        argv[num++] = pos;

+        while (1)

+        {

+            if ((*pos == '\0'))

+            {

+                break;

+            }

+            if ((*pos == '|') && (*(pos - 1) != '\\'))

+            {

+                count++;

+                break;

+            }

+            pos++;

+        }

+        *pos++ = '\0';

+    }

+    /*

+    for (int i = 0;i < num-1;i++)

+    {

+        printf("agrv[%d]=%s\n", i, argv[i]);

+    }

+    */

+    if(count!=length)

+    {

+        return 0;

+    }

+    return count;

+}

+

+int removeFlag(int argc, char* argv[])

+{

+    char* temp = NULL;

+    char* temp1= NULL;

+    char** pos = argv;

+    for (int i = 0;i < argc+1;i++)

+    {

+        temp1 = pos[i];

+        while (1)

+        {

+            if (*pos[i] == '\0')

+            {

+                break;

+            }

+            if ((*pos[i] == '|') && (*(pos[i] - 1) == '\\'))

+            {

+                temp = pos[i];

+                while (1)

+                {

+                    *(pos[i]-1) = *(pos[i]);

+                    if (*(pos[i]) == '\0')

+                    {

+                        break;

+                    }

+                    pos[i]++;

+                }

+                pos[i] = temp;

+            }

+            pos[i]++;

+        }

+        pos[i] = temp1;

+    }

+    return 0;

+}

+int parseParam(const int length, char* string, char* argv[])

+{

+    int num = 0;

+    if(string ==NULL)

+    {

+        return 0;

+    }

+    if(num = getParameter(length, string, argv))

+    {

+        removeFlag(num,argv);

+        for (int i = 1;i < num + 1;i++)

+        {

+            printf("argv[%d]=%s\n", i, argv[i]);

+        }

+        return num;

+    }

+    return 0;

+}
\ No newline at end of file
diff --git a/IC_src/mtk/packages/apps/lynq-factorytest/src/common.h b/IC_src/mtk/packages/apps/lynq-factorytest/src/common.h
new file mode 100644
index 0000000..356e13a
--- /dev/null
+++ b/IC_src/mtk/packages/apps/lynq-factorytest/src/common.h
@@ -0,0 +1,58 @@
+/* Copyright Statement:
+ *
+ * This software/firmware and related documentation ("MediaTek Software") are
+ * protected under relevant copyright laws. The information contained herein
+ * is confidential and proprietary to MediaTek Inc. and/or its licensors.
+ * Without the prior written permission of MediaTek inc. and/or its licensors,
+ * any reproduction, modification, use or disclosure of MediaTek Software,
+ * and information contained herein, in whole or in part, shall be strictly prohibited.
+ */
+/* MediaTek Inc. (C) 2010. All rights reserved.
+ *
+ * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+ * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+ * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER ON
+ * AN "AS-IS" BASIS ONLY. MEDIATEK 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 MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
+ * SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
+ * SUPPLIED WITH THE MEDIATEK 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 MEDIATEK SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK
+ * SOFTWARE RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+ * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND
+ * CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
+ * AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
+ * OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY RECEIVER TO
+ * MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+ *
+ * The following software/firmware and/or related documentation ("MediaTek Software")
+ * have been modified by MediaTek Inc. All revisions are subject to any receiver's
+ * applicable license agreements with MediaTek Inc.
+ */
+#ifndef __LYNQ_FACTORY_COMMON__
+#define __LYNQ_FACTORY_COMMON__
+#include "rfAutomaticTest.h"
+extern RfAutomaticTest* m_RfDesense;
+static int32_t auto_reqId = 0;
+static int32_t manu_reqId = 0;
+#define PHONE_SIZE 20
+#define PHONE_NUMBER    "persist.factory.phone"
+#define NUM_ITEMS(a)     (sizeof (a) / sizeof (a)[0])
+#define FACTORY_SH 0
+#define FACTORY_SINGLE_SH 1
+typedef struct factory_arry_{
+    char *name;  /* main test name. */
+    int subcnt;
+    struct factory_arry_ *subarray;     /* Function to call to do the job. */
+    int param; //0 :no parame ,1:normal parame,2:memory data ,3: normal parame and memory data
+    int go_thread; //goto rita thread
+} factory_arry_t;
+int get_call();
+void register_factory_auto_hook_raw(RfAutomaticTest* rf);
+void unregister_factory_auto_hook_raw();
+int parseParam(const int length, char* string, char* argv[]);
+int emResultNotify(const char *str,int command);
+#endif
diff --git a/IC_src/mtk/packages/apps/lynq-factorytest/src/factoryManual.cpp b/IC_src/mtk/packages/apps/lynq-factorytest/src/factoryManual.cpp
new file mode 100644
index 0000000..6e45ab1
--- /dev/null
+++ b/IC_src/mtk/packages/apps/lynq-factorytest/src/factoryManual.cpp
@@ -0,0 +1,91 @@
+# include <stdio.h>
+#include "factoryManual.h"
+#include <unistd.h>
+#include <log/log.h>
+#include "libtel/lib_tele.h"
+#include <libtel/lynq_call.h>
+#include <libtel/lynq_sim.h>
+#include "gpio/gpio_test.h"
+#include<common.h>
+/*
+#ifdef __cplusplus
+extern "C" {
+#endif
+#include <gps/gps_test.h>
+#ifdef __cplusplus
+}
+#endif
+*/
+#include <string.h>
+
+#undef LOG_TAG
+#define LOG_TAG "FACTORY_MANUAL"
+//#include "Parcel.h"
+//extern void get_gps_test();
+
+
+int32_t factory_manual(int argc, int multicnt,int *item ,int command){
+
+    int propertyid = item[1];
+    int select = item[2];
+    int32_t token ;
+ /*
+ for (int i = 0;i<10;i++){
+      RLOGD("item%d: %d", i,item[i]);
+ }*/
+    switch (select) {
+        case 0:
+        {
+            int32_t status;
+            char output[1024] = {0};
+            const char *addr1 = "10086";
+            lynqCallList * test_call_info;
+            test_call_info = (lynqCallList*)malloc(sizeof(lynqCallList));
+            memset(test_call_info,0,sizeof(lynqCallList));    
+            test_call_info->addr=(char *)malloc(sizeof(char));
+            memset(test_call_info->addr,0,sizeof(char));
+            status = lynq_call(addr1,test_call_info);
+            //printf("status is %x\n",status);
+            printf("[MAIN_LOG] request is %d,phone number is %s,token is %x,error is %d,call_state is %d\n",
+                test_call_info->base.request,test_call_info->addr,test_call_info->base.token,test_call_info->base.e,
+                test_call_info->call_state);
+            //free(test_call_info);
+            sprintf(output, "Factory_result  error_code:%d\ndone\n",test_call_info->base.e);
+            emResultNotify(output,command);
+            break;
+        }
+        case 1:
+        {
+            char output[1024] = {0};
+            static int32_t token;    
+            simStatus * sim_status=NULL;    
+            sim_status = (simStatus *)malloc(sizeof(simStatus));
+            token = lynq_get_sim_status(sim_status);
+            printf("test process token %x\n",token);
+            printf("card_status:%d,card_type:%d,pin_state:%d,error_code:%d,request:%d,token:%x\n",sim_status->card_status,    
+                sim_status->card_type,sim_status->pin_state,sim_status->base.e,sim_status->base.request,sim_status->base.token);
+            sprintf(output, "Factory_result Sim status  error_code:%d\ndone\n",sim_status->base.e);
+            emResultNotify(output,command);
+            free(sim_status);
+            sim_status=NULL;
+            break;
+        }
+        case 2:
+        {
+    //    get_gps_test();
+            break;
+        }
+        case 3:
+        {
+            int result=set_gpio143();
+            if(result == -1)
+            RLOGE("set gpio error :%d",result);    
+            get_gpio143(command);
+            break;
+        }
+        default:
+            RLOGE("logic eror ");
+            return -1;
+    }
+    return token;
+}
diff --git a/IC_src/mtk/packages/apps/lynq-factorytest/src/factoryManual.h b/IC_src/mtk/packages/apps/lynq-factorytest/src/factoryManual.h
new file mode 100644
index 0000000..218c65c
--- /dev/null
+++ b/IC_src/mtk/packages/apps/lynq-factorytest/src/factoryManual.h
@@ -0,0 +1,8 @@
+#ifndef __LYNQ_FACTORY_MANUAL_API__
+#define __LYNQ_FACTORY_MANUAL_API__
+
+
+#include <sys/types.h>
+int factory_manual(int argc, int multicnt,int *item,int command);
+#endif
+
diff --git a/IC_src/mtk/packages/apps/lynq-factorytest/src/factoryOpen/factory.sh b/IC_src/mtk/packages/apps/lynq-factorytest/src/factoryOpen/factory.sh
new file mode 100644
index 0000000..f493a6a
--- /dev/null
+++ b/IC_src/mtk/packages/apps/lynq-factorytest/src/factoryOpen/factory.sh
@@ -0,0 +1,109 @@
+#!/bin/bash
+#Copyright (c) 2016, MediaTek Inc. All rights reserved.
+#This software/firmware and related documentation ("MediaTek Software") are protected under relevant copyright laws.
+#The information contained herein is confidential and proprietary to MediaTek Inc. and/or its licensors.
+#Except as otherwise provided in  the applicable licensing terms with MediaTek Inc. and/or its licensors, any reproduction,
+#modification, use or disclosure of MediaTek Software, and information contained herein, in whole or in part, shall be strictly prohibited.
+echo "FactoryTest"
+QUITSTRING=""
+EM_COMMAND="FACTORY"
+EM_LAST_COMMAND="FACTORY"
+
+recv_data() {
+    cat <&9 | while read line
+    do
+       result=${line}
+	   
+       catp=$(ps | grep cat | awk '{print $1}')
+		#echo -e "recv_data,line:$line,QUITSTRING:$QUITSTRING"
+       if [ "$line" != "" ];then
+          if [ "$line" != "stopemdone" -a "$line" != "done" -a "$line" != "only_em_message" ];then
+              echo $line
+          fi
+          if [ "$line" = "done" ];then
+            QUITSTRING="quit"
+            echo $QUITSTRING > /tmp/factory_test/done.temp
+          fi
+          if [ "$line" = "only_em_message" ];then
+            QUITSTRING="only_em_message"
+            echo $QUITSTRING > /tmp/factory_test/done.temp
+          fi
+          if [ "$catp" != "" ];then
+            kill $catp
+          fi
+       fi
+    done
+}
+#open a socket, communicated with Service.
+exec 9<> /dev/udp/127.0.0.1/8000
+
+if [ ! -d "/tmp/factory_test" ];then
+    mkdir /tmp/factory_test
+else
+    rm -rf /tmp/factory_test
+    mkdir /tmp/factory_test
+fi
+
+echo "$EM_COMMAND" >&9
+recv_data
+echo $QUITSTRING
+ISDONE="no"
+while [ "$QUITSTRING" != "quit" ]; do
+    read -p "Select menu:" name
+    if [ $(expr match "$name" ".*quit") != 0 ];then
+	#echo -e "while quit"
+       break
+    fi
+    if [ $(expr match "$name" ".*back") != 0 ];then
+				
+        echo "" > /tmp/factory_test/done.temp
+        echo -e "EM_COMMAND:$EM_COMMAND"
+                EM_COMMAND=${EM_COMMAND% *}
+			  #EM_COMMAND=$EM_LAST_COMMAND
+			#	echo -e "while back,$EM_COMMAND,EM_LAST_COMMAND:$EM_LAST_COMMAND"
+        echo "$EM_COMMAND" >&9
+         recv_data
+       continue
+    fi
+
+    echo -e "\nselect item $name"
+    if [ -n "$name" ]
+    then
+        echo "$EM_COMMAND $name" >&9
+        recv_data
+    fi
+
+  if test -e /tmp/factory_test/done.temp
+  then
+    ISDONE=$(cat /tmp/factory_test/done.temp)
+  fi
+
+
+  if [ "$ISDONE" = "quit" -o "$name" = "" ];then
+    echo "" > /tmp/factory_test/done.temp
+    echo "$EM_COMMAND" >&9
+    recv_data
+  elif [ "$ISDONE" = "only_em_message" ]
+  then
+    while [ "$ISDONE" != "quit" ]
+    do
+        echo "" > /tmp/factory_test/done.temp
+        recv_data
+    done
+    echo "" > /tmp/factory_test/done.temp
+    echo "$EM_COMMAND" >&9
+    recv_data
+  else
+        EM_LAST_COMMAND=$EM_COMMAND
+		
+        EM_COMMAND="$EM_LAST_COMMAND $name"
+		#echo -e "EM_LAST_COMMAND:$EM_LAST_COMMAND,EM_COMMAND:$EM_COMMAND"
+  fi
+done
+
+
+echo "recived results done!"
+#close socket R/W
+exec 9>&-
+exec 9<&-
+exit 0
diff --git a/IC_src/mtk/packages/apps/lynq-factorytest/src/factoryOpen/factory_singel.sh b/IC_src/mtk/packages/apps/lynq-factorytest/src/factoryOpen/factory_singel.sh
new file mode 100644
index 0000000..5154994
--- /dev/null
+++ b/IC_src/mtk/packages/apps/lynq-factorytest/src/factoryOpen/factory_singel.sh
@@ -0,0 +1,40 @@
+#!/bin/bash
+#Copyright (c) [2016], MediaTek Inc. All rights reserved.
+#This software/firmware and related documentation ("MediaTek Software") are protected under relevant copyright laws.
+#The information contained herein is confidential and proprietary to MediaTek Inc. and/or its licensors.
+#Except as otherwise provided in  the applicable licensing terms with MediaTek Inc. and/or its licensors, any reproduction, 
+#modification, use or disclosure of MediaTek Software, and information contained herein, in whole or in part, shall be strictly prohibited.
+
+echo "factory singel"
+Menu1=$1
+Menu2=$2
+Menu3=$3
+Menu4=$4
+Menu5=$5
+Menu6=$6
+#if [ -z $3 ]
+#then
+#echo "FACTORY $Menu1 $Menu2" >&9
+#else
+#Menu3=$3
+ #if [ -z $4 ]
+ #then
+ #echo "FACTORY $Menu1 $Menu2 $Menu3" >&9
+ #else
+ #Menu4=$4
+ #echo "FACTORY $Menu1 $Menu2 $Menu3 $Menu4" >&9
+ #fi
+#fi
+
+
+#open a socket, communicated with Service.
+exec 9<> /dev/udp/127.0.0.1/8000
+
+#send Terminal response CMD
+echo "FACTORY_SINGEL $Menu1 $Menu2 $Menu3 $Menu4 \"$Menu5\" $Menu6 " >&9
+#sleep 1
+
+#close socket R/W
+exec 9>&-
+exec 9<&-
+exit 0
diff --git a/IC_src/mtk/packages/apps/lynq-factorytest/src/factoryOpen/factory_single.sh b/IC_src/mtk/packages/apps/lynq-factorytest/src/factoryOpen/factory_single.sh
new file mode 100644
index 0000000..9a1c54a
--- /dev/null
+++ b/IC_src/mtk/packages/apps/lynq-factorytest/src/factoryOpen/factory_single.sh
@@ -0,0 +1,40 @@
+#!/bin/bash
+#Copyright (c) [2016], MediaTek Inc. All rights reserved.
+#This software/firmware and related documentation ("MediaTek Software") are protected under relevant copyright laws.
+#The information contained herein is confidential and proprietary to MediaTek Inc. and/or its licensors.
+#Except as otherwise provided in  the applicable licensing terms with MediaTek Inc. and/or its licensors, any reproduction, 
+#modification, use or disclosure of MediaTek Software, and information contained herein, in whole or in part, shall be strictly prohibited.
+
+echo "function single"
+Menu1=$1
+Menu2=$2
+Menu3=$3
+Menu4=$4
+Menu5=$5
+Menu6=$6
+#if [ -z $3 ]
+#then
+#echo "FACTORY $Menu1 $Menu2" >&9
+#else
+#Menu3=$3
+ #if [ -z $4 ]
+ #then
+ #echo "FACTORY $Menu1 $Menu2 $Menu3" >&9
+ #else
+ #Menu4=$4
+ #echo "FACTORY $Menu1 $Menu2 $Menu3 $Menu4" >&9
+ #fi
+#fi
+
+
+#open a socket, communicated with Service.
+exec 9<> /dev/udp/127.0.0.1/8000
+
+#send Terminal response CMD
+echo "FUNCTION_SINGLE $Menu1 $Menu2 $Menu3 $Menu4 \"$Menu5\" $Menu6 " >&9
+#sleep 1
+
+#close socket R/W
+exec 9>&-
+exec 9<&-
+exit 0
diff --git a/IC_src/mtk/packages/apps/lynq-factorytest/src/factory_main.cpp b/IC_src/mtk/packages/apps/lynq-factorytest/src/factory_main.cpp
new file mode 100644
index 0000000..0733500
--- /dev/null
+++ b/IC_src/mtk/packages/apps/lynq-factorytest/src/factory_main.cpp
Binary files differ
diff --git a/IC_src/mtk/packages/apps/lynq-factorytest/src/factory_main.h b/IC_src/mtk/packages/apps/lynq-factorytest/src/factory_main.h
new file mode 100644
index 0000000..f010f2b
--- /dev/null
+++ b/IC_src/mtk/packages/apps/lynq-factorytest/src/factory_main.h
@@ -0,0 +1,80 @@
+/* Copyright Statement:
+ *
+ * This software/firmware and related documentation ("MediaTek Software") are
+ * protected under relevant copyright laws. The information contained herein
+ * is confidential and proprietary to MediaTek Inc. and/or its licensors.
+ * Without the prior written permission of MediaTek inc. and/or its licensors,
+ * any reproduction, modification, use or disclosure of MediaTek Software,
+ * and information contained herein, in whole or in part, shall be strictly prohibited.
+ */
+/* MediaTek Inc. (C) 2010. All rights reserved.
+ *
+ * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+ * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+ * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER ON
+ * AN "AS-IS" BASIS ONLY. MEDIATEK 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 MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
+ * SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
+ * SUPPLIED WITH THE MEDIATEK 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 MEDIATEK SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK
+ * SOFTWARE RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+ * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND
+ * CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
+ * AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
+ * OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY RECEIVER TO
+ * MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+ *
+ * The following software/firmware and/or related documentation ("MediaTek Software")
+ * have been modified by MediaTek Inc. All revisions are subject to any receiver's
+ * applicable license agreements with MediaTek Inc.
+ */
+#ifndef __LYNQ_FACTORY_MAIN__
+#define __LYNQ_FACTORY_MAIN__
+#include <cutils/properties.h>
+#include <string>
+#include <vector>
+#include <sys/types.h>
+#include "common.h"
+#define SMS_MESSAGE    "persist.factory.message"
+#define GPS_STATUS    "persist.gps.status"
+static const int INDEX_PHONENUMB = 0;
+static const int INDEX_SMS_MESSAGE = 1;
+#define SERVER_PORT 8000
+#define BUFFER_SIZE 8192
+
+#define MAX_ARGS 101
+#define PRAME_NONE 0
+#define PARME_NORMAL 1
+#define PARME_DATA 2
+#define PRAME_NORMAL_DATA 3
+
+
+typedef enum {
+    FACTORY_TEST = 0,
+    API_TEST,
+    DEMO_TEST,
+}TEST_MAIN_ITEM;
+
+/*
+typedef enum {
+   WIFI_OPEN = 1,
+  // WIFI_SCAN,
+   WIFI_CONNECT,
+   WIFI_CLOSE,
+}WIFI_API;*/
+
+typedef enum {
+	CONFIG = 0,
+    AUTO_TESTING ,
+    MANUAL_TEST,
+}FACTORY_MAIN_ITEM;
+
+int32_t getRequestId();
+void lynqStartEventLoop(void);
+
+
+#endif
diff --git a/IC_src/mtk/packages/apps/lynq-factorytest/src/gpio/gpio_test.cpp b/IC_src/mtk/packages/apps/lynq-factorytest/src/gpio/gpio_test.cpp
new file mode 100644
index 0000000..08667cc
--- /dev/null
+++ b/IC_src/mtk/packages/apps/lynq-factorytest/src/gpio/gpio_test.cpp
@@ -0,0 +1,175 @@
+#include <stdio.h>
+#include <string.h>
+#include <pthread.h>
+#include <ctype.h>
+#include <stdlib.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <gio/gio.h>
+#include <log/log.h>
+#include <glib.h>
+#include "common.h"
+#include "gpio/gpio_test.h"
+#define GPIO_SERVICE "gpio.lynq" /*well-known bus name */
+#define GPIO_DATA_INTERFACE "gpio.lynq.Data" /*interface name*/
+#define GPIO_DATA_PATH "/gpio/lynq/data" /*object name*/
+GMainLoop *loop = NULL;
+GDBusProxy *proxy = NULL;
+#define LOG_TAG "GPIO_CONTROL"
+int set_gpio (char * mode,int gpio_numb,int param){
+	GDBusConnection *c1;
+	GVariant *result;
+	GError *error;
+	GMainLoop *loop;
+	gint32  set_result = -1;
+	g_type_init();
+	loop = g_main_loop_new(NULL, FALSE);   /** create main loop, but do not start it.*/
+	error = NULL;
+	c1 = g_bus_get_sync (G_BUS_TYPE_SYSTEM, NULL, &error);
+	g_assert_no_error (error);
+	error = NULL;
+	g_assert (c1 != NULL);
+	g_assert (!g_dbus_connection_is_closed (c1));
+	result = g_dbus_connection_call_sync (c1,
+                                        GPIO_SERVICE,  /* bus name */
+                                        GPIO_DATA_PATH, /* object path */
+                                        GPIO_DATA_INTERFACE,  /* interface name */
+                                        "setGpio",                 /* method name */
+                                        g_variant_new ("(sii)", mode,gpio_numb,param),  /* parameters */
+                                         G_VARIANT_TYPE ("(i)"),                    /* return type */
+                                        G_DBUS_CALL_FLAGS_NONE,
+                                        -1,
+                                        NULL,
+                                        &error);
+										
+	g_assert_no_error (error);
+	g_assert (result != NULL);
+	g_variant_get(result, "(i)", &(set_result));
+	  RLOGD("%s, %s, %d,result:%d", __FILE__, __FUNCTION__, __LINE__,set_result);
+	g_variant_unref (result);
+	//g_main_loop_run (loop);
+	g_main_loop_unref (loop);
+    return set_result;
+}
+int set_gpio143(){
+ 
+  int   result;
+  result = set_gpio (GPIO_MODE,WIFI_LED_CONTROL,1);
+  return result;
+ // sprintf(output, "gpio set stauts %d\n",result);
+ // printf("%s",output);
+ // emResultNotify(output);
+}
+void get_gpio (guint gpio_numb,gchar *response){
+   	GDBusConnection *c1;
+	GError *error;
+	GMainLoop *loop;
+   //	char output[2048] = {0};
+   	//gchar *response;
+   	GVariant *get;
+	gsize n_elts=0;
+	GVariantIter *iter;
+	//guchar *response;
+	gchar *get_res;
+//	const char *p;
+	g_type_init();
+	loop = g_main_loop_new(NULL, FALSE);   /** create main loop, but do not start it.*/
+	error = NULL;
+	c1 = g_bus_get_sync (G_BUS_TYPE_SYSTEM, NULL, &error);
+	g_assert_no_error (error);
+	error = NULL;
+	g_assert (c1 != NULL);
+	g_assert (!g_dbus_connection_is_closed (c1));
+	error = NULL;
+	get = g_dbus_connection_call_sync (c1,
+                                        GPIO_SERVICE,  
+                                        GPIO_DATA_PATH, 
+                                        GPIO_DATA_INTERFACE,  
+                                        "getGpio",                 
+                                        g_variant_new ("(i)",gpio_numb), 
+                                         G_VARIANT_TYPE ("(s)"),                     
+                                        G_DBUS_CALL_FLAGS_NONE,
+                                        -1,
+                                        NULL,
+                                        &error);
+	g_assert_no_error (error);
+	g_assert (get != NULL);
+	g_variant_get (get, "(s)",&get_res);
+	strcpy(response, get_res);
+	g_variant_unref (get);
+	RLOGD("get_gpio,%s",response);
+	g_main_loop_unref (loop);
+}
+void get_gpio143(int command){
+  char output[1024] = {0};
+  char output1[2048] = {0};
+  get_gpio (WIFI_LED_CONTROL,output);
+  printf("get_gpio143,%s\n",output);
+  sprintf(output1, "Factory_result gpio143 set state:%s\n",output);
+  printf("%s",output1);
+  emResultNotify(output1,command);
+}
+void proxy_ready(GObject *source, GAsyncResult *result, gpointer user_data) {
+    GError *error;
+
+    error = NULL;
+    proxy = g_dbus_proxy_new_for_bus_finish(result, &error);
+    if (proxy == NULL) {
+        RLOGE("create proxy fail");
+        return ;
+    }
+    RLOGD("proxy is ready");
+   // gulong signal_handler_id;
+
+  //  signal_handler_id = g_signal_connect(proxy, "g-signal",
+  //          G_CALLBACK (proxy_signals_on_signal), NULL);
+   // if (signal_handler_id == 0) {
+   //     RLOGE("listen singal fail!");
+   // }
+}
+
+void* init_data_gdbus_cb(void *param)
+{
+    /* all the tests rely on a shared main loop */
+    loop = g_main_loop_new(NULL, FALSE);
+
+    g_dbus_proxy_new_for_bus(G_BUS_TYPE_SYSTEM,
+            G_DBUS_PROXY_FLAGS_NONE,
+            NULL, /* GDBusInterfaceInfo */
+            GPIO_SERVICE, /* name */
+            GPIO_DATA_PATH, /* object path */
+            GPIO_DATA_INTERFACE, /* interface */
+            NULL, /* GCancellable */
+            proxy_ready,
+            NULL);
+
+    g_main_loop_run(loop);
+
+    RLOGD("data gdbus main loop run()");
+    if(proxy != NULL) {
+        g_object_unref (proxy);
+    }
+    if(loop != NULL) {
+        g_main_loop_unref(loop);
+    }
+}
+
+
+void startGdbusLoop(void)
+{
+    pthread_t gpioThread;
+
+    RLOGD("startGdbusLoop()");
+   // pthread_mutex_lock(&s_startupMutex);
+    pthread_attr_t attr;
+    pthread_attr_init(&attr);
+    pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
+
+    int result = pthread_create(&gpioThread, &attr, init_data_gdbus_cb, NULL);
+    if (result != 0) {
+        RLOGW("Failed to create gdbus thread: %s", strerror(result));
+        //goto done;
+    }
+//done:
+ //   pthread_mutex_unlock(&s_startupMutex);
+}
diff --git a/IC_src/mtk/packages/apps/lynq-factorytest/src/gpio/gpio_test.h b/IC_src/mtk/packages/apps/lynq-factorytest/src/gpio/gpio_test.h
new file mode 100644
index 0000000..9d7008c
--- /dev/null
+++ b/IC_src/mtk/packages/apps/lynq-factorytest/src/gpio/gpio_test.h
@@ -0,0 +1,12 @@
+#ifndef __LYNQ_GPIO_CONTROL__
+#define __LYNQ_GPIO_CONTROL__
+
+#define GPIO_MODE "mode"
+#define GPIO_DIR "dir"
+#define GPIO_OUT "out"
+static constexpr int WIFI_LED_CONTROL = 143;
+int set_gpio143();
+void get_gpio143(int command);
+
+#endif
+
diff --git a/IC_src/mtk/packages/apps/lynq-factorytest/src/gps/gps_cb.tmp b/IC_src/mtk/packages/apps/lynq-factorytest/src/gps/gps_cb.tmp
new file mode 100644
index 0000000..bac3bd2
--- /dev/null
+++ b/IC_src/mtk/packages/apps/lynq-factorytest/src/gps/gps_cb.tmp
@@ -0,0 +1,263 @@
+#include<pthread.h>
+#include<stdio.h>
+#include<unistd.h>
+#include<errno.h>
+#include<string.h>
+//#include <sys/time.h>
+//#include <time.h>
+#include"gps/gps_test.h"
+#include <gps/gps_test.h>
+#include"mtk_lbs_utility.h"
+#include <log/log.h>
+
+extern struct timespec mnld_test_gnss_open_tm;
+extern int mnld_test_ttff;
+extern int mnld_test_session_end;
+GpsLocation_ext location_rslt;
+mnld_test_result mnld_test_result_body;
+void mnld_test_gps_location_callback(GpsLocation_ext* location)
+{
+
+//    memset(&result,0,sizeof(mnld_test_result));
+    if(location->legacyLocation.size == sizeof(GpsLocation_ext))
+    {
+     	char output[2048] = {0};
+        RLOGD("===============Update Location Info==================");
+        RLOGD("flags:0x%x", location->legacyLocation.flags);
+        RLOGD("zqc latitude:%.10lf", location->legacyLocation.latitude);
+        RLOGD("zqc longitude:%.10lf", location->legacyLocation.longitude);
+        RLOGD("zqc altitude:%.10lf", location->legacyLocation.altitude);
+        RLOGD("zqc speed:%f", location->legacyLocation.speed);
+        RLOGD("bearing:%f", location->legacyLocation.bearing);
+        RLOGD("timestamp:%d", location->legacyLocation.timestamp);
+        RLOGD("horizontalAccuracyMeters:%f", location->horizontalAccuracyMeters);
+        RLOGD("verticalAccuracyMeters:%f", location->verticalAccuracyMeters);
+        RLOGD("speedAccuracyMetersPerSecond:%f", location->speedAccuracyMetersPerSecond);
+        RLOGD("bearingAccuracyDegrees:%f", location->bearingAccuracyDegrees);
+        memcpy(&(mnld_test_result_body.location), location, sizeof(GpsLocation_ext));
+  	sprintf(output, "gps success latitude:%.10lf,longitude:%.10lf\n",
+           location->legacyLocation.latitude,location->legacyLocation.longitude);
+    
+    }else {
+        RLOGE("GpsLocation_ext size is wrong");
+    }
+#if 0
+        memcpy(&(result.location), location, sizeof(GpsLocation_ext));
+        if((location->flags & GPS_LOCATION_HAS_ACCURACY) && (mnld_test_ttff == 0))
+        {
+            struct timespec fix_tm;
+            if(clock_gettime(CLOCK_BOOTTIME,&fix_tm) == -1)
+            {
+                result.ttff = 0;
+                RLOGE("[%s]Fail to get time(%s)\r\n",__func__,strerror(errno));
+            }else{
+                RLOGD("Flags:0x%x,start time:%ds,%dns; ttff time:%ds,%dns\r\n",result.location.flags,mnld_test_gnss_open_tm.tv_sec,mnld_test_gnss_open_tm.tv_nsec,fix_tm.tv_sec,fix_tm.tv_nsec);
+                result.ttff = (fix_tm.tv_sec-mnld_test_gnss_open_tm.tv_sec)*1000+((fix_tm.tv_nsec-mnld_test_gnss_open_tm.tv_nsec)/1000000);
+                mnld_test_ttff = result.ttff;
+                RLOGD("TTFF:%dms",mnld_test_ttff);
+            }
+        }else{
+            result.ttff = mnld_test_ttff;
+        }
+        result.location.timestamp = location->timestamp;
+        RLOGD("ts:%d,result.timestamp:%ld\r\n",location->timestamp,result.location.timestamp);
+        mnld_test_show_test_result(&result);
+    }else{
+        RLOGE("[%s]size error!\r\n", __func__);
+    }
+#endif
+    
+}
+
+void mnld_test_gps_status_callback(GpsStatus* status)
+{
+    if(status->size == sizeof(GpsStatus))
+    {
+        RLOGD("GPS Status:%d", status->status);
+        if(status->status == GPS_STATUS_SESSION_BEGIN)
+        {
+            mnld_test_ttff = 0;
+            mnld_test_session_end = 0;
+//          usleep(500000);
+            mnld_test_get_mnl_ver();
+        #ifdef MNLD_TEST_TTFF_SESSION_BEGIN
+            if(clock_gettime(CLOCK_BOOTTIME,&mnld_test_gnss_open_tm) == -1)
+            {
+                RLOGE("Fail to get time(%s).", strerror(errno));
+            }
+        #endif
+        }
+        if(status->status == GPS_STATUS_SESSION_BEGIN){
+            mnld_get_gps_status(0);
+        }else if(status->status == GPS_STATUS_NONE){
+            mnld_get_gps_status(1);
+        }
+        if(status->status == GPS_STATUS_SESSION_END)
+        {
+            mnld_test_session_end = 1;
+        }
+    }else{
+        RLOGE("size error!");
+    }
+}
+
+void mnld_test_gps_sv_status_callback(GpsSvStatus* sv_info)
+{
+    RLOGD("gps sv status");
+}
+
+#define NMEA_GGA "GGA"
+#define NMEA_GSA "GSA"
+#define NMEA_ACC "ACCURACY"
+extern int valid_ttff_cnt;
+extern int valid_ttff_sum;
+void mnld_test_gps_nmea_callback(GpsUtcTime timestamp, const char* nmea, int length)
+{
+//    RLOGD("%d",timestamp);
+
+    //$GPGSA,A,3,...
+    if( strncmp(nmea+3,NMEA_GSA,strlen(NMEA_GSA)) == 0 )
+    {
+        mnld_test_result_body.fix_type = *(nmea+9) - '0';
+        if(mnld_test_result_body.fix_type == 1)
+        {
+            mnld_test_result_body.fix_type = 0;
+        }
+ 
+        if((mnld_test_ttff == 0) && mnld_test_result_body.fix_type != 0)
+        {
+            struct timespec fix_tm;
+
+            if(clock_gettime(CLOCK_BOOTTIME,&fix_tm) == -1)
+            {
+                mnld_test_result_body.ttff[CURR] = 0;
+                RLOGE("[%s]Fail to get time(%s)\r\n",__func__,strerror(errno));
+            }else{
+               // RLOGD("Flags:0x%x,start time:%ds,%dns; ttff time:%ds,%dns\r\n",mnld_test_result_body.location.flags,mnld_test_gnss_open_tm.tv_sec,mnld_test_gnss_open_tm.tv_nsec,fix_tm.tv_sec,fix_tm.tv_nsec);
+                mnld_test_ttff = (fix_tm.tv_sec-mnld_test_gnss_open_tm.tv_sec)*1000+((fix_tm.tv_nsec-mnld_test_gnss_open_tm.tv_nsec)/1000000);
+                mnld_test_result_body.ttff[CURR] = mnld_test_ttff;
+                valid_ttff_cnt++;
+                valid_ttff_sum+=mnld_test_result_body.ttff[CURR];
+
+                mnld_test_result_body.ttff[MEAN] = valid_ttff_sum/valid_ttff_cnt;
+                //Find the MIN TTFF
+                if((mnld_test_result_body.ttff[MIN] == 0 ) || (mnld_test_result_body.ttff[MIN] > mnld_test_result_body.ttff[CURR]))
+                {
+                    mnld_test_result_body.ttff[MIN] = mnld_test_result_body.ttff[CURR];
+                }
+                // Find the MAX TTFF
+                if(mnld_test_result_body.ttff[MAX] < mnld_test_result_body.ttff[CURR])
+                {
+                    mnld_test_result_body.ttff[MAX] = mnld_test_result_body.ttff[CURR];
+                }
+                RLOGD("TTFF:%dms",mnld_test_ttff);
+            }
+
+        }else{
+            mnld_test_result_body.ttff[CURR] = mnld_test_ttff;
+        }
+    }
+
+    if(mnld_test_result_body.fix_type != 0)
+    {
+        //GNGGA,hhmmss.mss,...
+        if(strncmp(nmea+3,NMEA_GGA,strlen(NMEA_GGA)) == 0)
+        {
+            strncpy(mnld_test_result_body.utc_time, nmea+7, MNL_UTC_TIME_LEN);
+            mnld_test_result_body.utc_time[MNL_UTC_TIME_LEN-1] = '\0';
+        }
+    }else{
+        memset(mnld_test_result_body.utc_time, 0, MNL_UTC_TIME_LEN);
+        mnld_test_result_body.utc_time[0] = '-';
+    }
+
+    if(strncmp(nmea+3,NMEA_ACC,strlen(NMEA_ACC)) == 0)
+    {
+        mnld_test_result_body.location.legacyLocation.timestamp = timestamp;
+        mnld_test_show_test_result(&mnld_test_result_body);
+    }
+    
+}
+
+void mnld_test_gps_set_capabilities(uint32_t capabilities)
+{
+
+    RLOGD("gps set capabilities");
+}
+
+void mnld_test_gps_acquire_wakelock(void)
+{
+
+    RLOGD("gps acquire wakelock");
+}
+
+void mnld_test_gps_release_wakelock(void)
+{
+
+    RLOGD("gps release wakelock");
+}
+
+void mnld_test_gps_request_utc_time(void)
+{
+
+    RLOGD("gps request utc time");
+}
+
+void mnld_test_set_system_info_cb(const GnssSystemInfo* info)
+{
+    RLOGD("set system info");
+}
+
+void mnld_test_gnss_sv_status_cb(GnssSvStatus_ext* sv_info)
+{
+    RLOGD(" zqc gnss sv status");
+}
+
+pthread_t mnld_test_gps_create_thread(const char* name, void (*start)(void *), void* arg)
+{
+    pthread_t ntid = 0;
+    int ret = 0;
+    ret = pthread_create(&ntid, NULL, start, arg);
+
+    if(ret != 0)
+    {
+        RLOGE("thread %s create fail(%s)!", name, strerror(errno));
+        ntid = 0;
+    }else{
+        RLOGD("tread %s create success!", name);
+    }
+
+    return ntid;
+}
+
+void mnld_test_gnss_set_name_cb(const char* name, int length)
+{
+    RLOGD("gnss set name");
+}
+
+void mnld_test_gnss_request_location_cb(bool independentFromGnss)
+{
+    RLOGD("gnss request location");
+}
+
+GpsCallbacks_ext mnld_test_gps_callbacks = {
+    .size = sizeof(GpsCallbacks_ext),
+    .location_cb = mnld_test_gps_location_callback,
+    .status_cb = mnld_test_gps_status_callback,
+    .sv_status_cb = mnld_test_gps_sv_status_callback,
+    .nmea_cb = mnld_test_gps_nmea_callback,
+    .set_capabilities_cb = mnld_test_gps_set_capabilities,
+    .acquire_wakelock_cb = mnld_test_gps_acquire_wakelock,
+    .release_wakelock_cb = mnld_test_gps_release_wakelock,
+    .create_thread_cb = mnld_test_gps_create_thread,
+    .request_utc_time_cb = mnld_test_gps_request_utc_time,
+    .set_system_info_cb = mnld_test_set_system_info_cb,
+    .gnss_sv_status_cb = mnld_test_gnss_sv_status_cb,
+    .set_name_cb = mnld_test_gnss_set_name_cb,
+    .request_location_cb = mnld_test_gnss_request_location_cb,
+};
+
+GpsCallbacks_ext* mnld_test__get_gps_callbacks(void)
+{
+    return &mnld_test_gps_callbacks;
+}
diff --git a/IC_src/mtk/packages/apps/lynq-factorytest/src/gps/gps_test.h.tmp b/IC_src/mtk/packages/apps/lynq-factorytest/src/gps/gps_test.h.tmp
new file mode 100644
index 0000000..db07f43
--- /dev/null
+++ b/IC_src/mtk/packages/apps/lynq-factorytest/src/gps/gps_test.h.tmp
@@ -0,0 +1,83 @@
+#ifndef __LYNQ_GPS_TEST_H__
+#define __LYNQ_GPS_TEST_H__
+#include <gps_mtk.h>
+
+#define MNLD_TEST_CMD_OPEN "start"
+#define MNLD_TEST_CMD_CLOSE "stop"
+#define MNLD_TEST_CMD_NETWORK "network"
+#define MNLD_TEST_NETWORK_WIFI "wifi"
+#define MNLD_TEST_NETWORK_MOBILE "mobile"
+#define MNLD_TEST_NETWORK_ROAMING "roaming"
+#define MNLD_TEST_NETWORK_DISABLE "disable"
+
+#define MNL_VER_LEN 52
+#define MNL_UTC_TIME_LEN 11
+#define MNLD_TEST_TTFF_SESSION_BEGIN
+
+typedef enum{
+    MNLD_TEST_ACTION_UNKNOWN = -1,
+    MNLD_TEST_ACTION_GNSS_OPEN,
+    MNLD_TEST_ACTION_GNSS_CLOSE,
+    MNLD_TEST_ACTION_SET_NETWORK,
+    MNLD_TEST_ACTION_MAX
+} MNLD_TEST_ACTION;
+
+typedef enum{
+    MNLD_TEST_RESTART_TYPE_UNKNOWN = -1,
+    MNLD_TEST_RESTART_TYPE_HOT,
+    MNLD_TEST_RESTART_TYPE_WARM,
+    MNLD_TEST_RESTART_TYPE_COLD,
+    MNLD_TEST_RESTART_TYPE_FULL,
+    MNLD_TEST_RESTART_TYPE_MAX
+} MNLD_TEST_RESTART_TYPE;
+
+typedef enum{
+    CURR = 0,
+    MIN = 1,
+    MAX = 2,
+    MEAN = 3,
+    TTFF_NUM
+}MNLD_TEST_TTFF;
+
+typedef struct {
+    char chip_ver[12];
+    char mnl_ver[MNL_VER_LEN];
+    char clk_type;
+    char clk_buff;
+    int ttff[TTFF_NUM];//time-to-first_fix in ms
+    int fix_type;
+    GpsLocation_ext location;
+    char utc_time[MNL_UTC_TIME_LEN];
+}mnld_test_result;
+
+typedef struct{
+    char type_int;
+    char type_str[10];
+}clock_type;
+
+#define MNLD_TEST_CMD_CNT_MAX 5
+#define GPS_DELETE_EPHEMERIS        0x0001
+#define GPS_DELETE_ALMANAC          0x0002
+#define GPS_DELETE_POSITION         0x0004
+#define GPS_DELETE_TIME             0x0008
+#define GPS_DELETE_IONO             0x0010
+#define GPS_DELETE_UTC              0x0020
+#define GPS_DELETE_HEALTH           0x0040
+#define GPS_DELETE_SVDIR            0x0080
+#define GPS_DELETE_SVSTEER          0x0100
+#define GPS_DELETE_SADATA           0x0200
+#define GPS_DELETE_RTI              0x0400
+#define GPS_DELETE_CELLDB_INFO      0x8000
+#define GPS_DELETE_ALL              0xFFFF
+
+typedef void (*gpsStatusCb)(int stauts);
+GpsCallbacks_ext* mnld_test__get_gps_callbacks(void);
+//GpsInterface* gps_device__get_gps_interface(struct gps_device_t* device);
+
+void mnld_test_show_test_result(mnld_test_result* result);
+void mnld_test_get_mnl_ver(void);
+void register_gps_callback(gpsStatusCb cb);
+void get_gps_test();
+
+
+#endif //__MNLD_TEST_H__
diff --git a/IC_src/mtk/packages/apps/lynq-factorytest/src/gps/gps_test.tmp b/IC_src/mtk/packages/apps/lynq-factorytest/src/gps/gps_test.tmp
new file mode 100644
index 0000000..a1a7222
--- /dev/null
+++ b/IC_src/mtk/packages/apps/lynq-factorytest/src/gps/gps_test.tmp
@@ -0,0 +1,620 @@
+#include <stdio.h>
+#include <stdarg.h>
+#include <unistd.h>
+#include <sys/time.h>
+#include <time.h>
+#include <signal.h>
+#include <string.h>
+#include <errno.h>
+#include <sys/socket.h>
+#include <sys/un.h>
+#include <arpa/inet.h>
+#include <dlfcn.h>
+#include <stdlib.h>
+#include "hal2mnl_interface.h"
+#include "gps_mtk.h"
+#include "gps/gps_test.h"
+#include "mtk_lbs_utility.h"
+#include <log/log.h>
+
+#ifdef LOG_TAG
+#undef LOG_TAG
+#define LOG_TAG "mnldtest"
+#endif
+
+
+#ifdef CONFIG_GPS_MT3303
+#define MNLD_TEST_CHIP_VER "MT3303"
+#else
+#define MNLD_TEST_CHIP_VER "MT6630"
+#endif
+#define MNLD_TEST_MNL_VER mnld_test_mnl_ver
+#define MNLD_TEST_CLOCK_TYPE 0xFF
+#define MNLD_TEST_CLOCK_BUFF 2
+
+/*Socket port nubmer*/
+#define PORT 7000
+/*The max length of socket receive buffer*/
+#define MNL_TEST_REC_BUFF_LEN 2048
+
+#define MNL_TEST_MNL_VER_PMTK "$PMTK705"
+#define mnld_test_printf printf
+
+GpsCallbacks_ext* mnld_test_cbs = NULL;
+GpsInterface_ext* mnld_test_gpsinfs = NULL;
+gpsStatusCb gps_status_cb = NULL;
+
+int valid_ttff_cnt = 0;
+int valid_ttff_sum = 0;
+
+int mnld_test_session_end = 0;
+int mnld_test_ttff = 0;
+int mnld_test_restart_cnt = 0;
+int mnld_test_restart_time = 0;
+int mnld_test_restart_interval = 0;
+
+int mnld_test_network_type = NETWORK_TYPE_WIFI;
+int mnld_test_network_on = 0;
+int mnld_test_network_roaming = 0;
+
+timer_t mnld_test_restart_timer = 0;
+MNLD_TEST_RESTART_TYPE mnld_test_restart_type = MNLD_TEST_RESTART_TYPE_HOT;
+struct timespec mnld_test_gnss_open_tm;
+char mnld_test_mnl_ver[MNL_VER_LEN];
+extern mnld_test_result mnld_test_result_body;
+
+clock_type mnld_test_clock_type[] = {
+    {0xFE,"Co-Clock"},
+    {0xFF,"TCXO"}
+};
+
+#define MNLD_TEST_NETWORK_TYPE_STR_LEN 8
+const char mnld_test_network_type_str[][MNLD_TEST_NETWORK_TYPE_STR_LEN] = {
+    {"mobile"},
+    {"wifi"}
+};
+
+void mnld_test_show_help(void)
+{
+ 	RLOGD("ZHOUQUNCHAO,START");
+    mnld_test_printf("MNLD client test :\r\n");
+    mnld_test_printf("------------------------------------------------------------------------------\r\n");
+    mnld_test_printf("The command to start GNSS test:\r\n");
+    mnld_test_printf("\tmnld_test start [start type] [restart times] [restart interval]\r\n");
+    mnld_test_printf("\t\t[start type]: \r\n\t\th/H: hot start;\r\n\t\tw/W: Warm start;\r\n\t\tc/C: Cold start;\r\n\t\tf/F: Full start\r\n");
+    mnld_test_printf("\t\t[restart times]: integer value, range is 0-1000, default is 0(no restart, always on). \r\n");
+    mnld_test_printf("\t\t[restart interval]: integer value, range is 0-3600, the unit is second; the default value is 60\r\n");
+    mnld_test_printf("------------------------------------------------------------------------------\r\n");
+    mnld_test_printf("The command to stop GNSS test:\r\n");
+    mnld_test_printf("\tmnld_test stop\r\n");
+    mnld_test_printf("------------------------------------------------------------------------------\r\n");
+    mnld_test_printf("The command to update network status:\r\n");
+    mnld_test_printf("\tmnld_test network [type] [roaming]\r\n");
+    mnld_test_printf("\t[type]: wifi, mobile, disable\r\n");
+    mnld_test_printf("\t[roaming]: roaming, the mobile network is in roaming state\r\n");
+}
+
+/*
+Function:mnld_test_socket_open
+Description:open and connect a INET socket by given port number
+Param:[IN] port, the port number of socket
+Param:[OUT] fd, the socket fd
+Return:NULL -- some thing is incorrect; Other value -- open and connect sokcet successfully
+*/
+int mnld_test_socket_open(int port)
+{
+    struct sockaddr_in servaddr;
+    int socketfd = 0;
+
+    if((socketfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
+    {
+        RLOGE("Create socket error:%d,%s\n", errno, strerror(errno));
+        return socketfd;
+    }
+
+    memset(&servaddr, 0, sizeof(servaddr));
+    servaddr.sin_family = AF_INET;
+    servaddr.sin_port = htons(port);
+    servaddr.sin_addr.s_addr = INADDR_ANY;
+
+    if( connect(socketfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) < 0 )
+    {
+        RLOGE("connect error:%d,%s\n", errno, strerror(errno));
+        return -1;
+    }
+
+    return(socketfd);
+}
+
+#ifdef CONFIG_GPS_MT3303
+void mnld_test_get_mnl_ver(void )
+{
+    LOGI("GNSS chip is 3303, there is no MNL.");
+    strcpy(mnld_test_mnl_ver, "GNSS chip is 3303,there is no MNL");
+}
+#else
+#ifdef MTK_ADR_SUPPORT
+void mnld_test_get_mnl_ver(void )
+{
+    LOGI("ADR has used the port 7000, the mnl version is static.");
+    strcpy(mnld_test_mnl_ver, "MNL_VER_18070301ALPS05_5.5U_25");
+}
+#else
+void mnld_test_get_mnl_ver(void )
+{
+    int sock_fd = 0;
+    int rec_len = 0;
+    int raw_socket_connected = 1;
+    char rec_buff[MNL_TEST_REC_BUFF_LEN+1] = {0};
+    char *mnl_ver_addr = NULL;
+    int i = 0;
+    int got_mnl_ver = 0;
+    int retry_cnt = 0;
+
+    if((sock_fd = mnld_test_socket_open(PORT)) < 0 )
+    {
+        RLOGE("Socket open error\n");
+        strcpy(mnld_test_mnl_ver,"UNKNOWN");
+        //raw_socket_connected = 0;
+    }else//    if(raw_socket_connected)
+    {
+        char *outbuff = "$PMTK605*31\r\n";
+        int cmd_sent = 0;
+        do{
+           // if((cmd_sent == 0) && send(sock_fd,outbuff,strlen(outbuff)+1, 0) == -1)
+            if((cmd_sent == 0) && hal2mnl_send_pmtk(outbuff,strlen(outbuff)) == -1)
+            {
+                cmd_sent = 0;
+                RLOGE("Socket send error(%s)\n",strerror(errno));
+            }else{
+                cmd_sent = 1;
+                if((rec_len = recv(sock_fd, rec_buff, MNL_TEST_REC_BUFF_LEN, 0)) < 0)
+                {
+                    RLOGE("Recieve error(%d):%s\n",errno, strerror(errno));
+                    usleep(20000);
+                }else{
+                    rec_buff[rec_len] = '\0';
+                    if(strncmp(rec_buff, MNL_TEST_MNL_VER_PMTK, strlen(MNL_TEST_MNL_VER_PMTK)) == 0)
+                    {
+                        mnl_ver_addr = strstr(rec_buff,"MNL_VER");
+                        strncpy(mnld_test_mnl_ver, mnl_ver_addr, strlen(mnl_ver_addr));
+                        for(i=0;i<strlen(mnld_test_mnl_ver);i++)
+                        {
+                            if(mnld_test_mnl_ver[i] == ',')
+                            {
+                                mnld_test_mnl_ver[i] = '\0';
+                                break;
+                            }
+                        }
+                        got_mnl_ver = 1;
+                        RLOGD("\nRCV[%d]:%s\n", rec_len, rec_buff);
+                    }
+                    //Parser
+                }
+            }
+            if(retry_cnt ++ >= 5)
+            {
+                RLOGE("Get mnl version fail\r\n");
+                strcpy(mnld_test_mnl_ver,"UNKNOWN");
+                break;
+            }
+        }while(!got_mnl_ver);
+        close(sock_fd);
+    }
+}
+#endif
+#endif
+
+void mnld_test_open_gnss(MNLD_TEST_RESTART_TYPE restart_type, GpsInterface_ext* gps_interface, GpsCallbacks_ext* gps_cbs)
+{
+    GpsCallbacks_ext* cbs = gps_cbs;
+    GpsInterface_ext* gpsinterface = gps_interface;
+    switch(restart_type) {
+        case MNLD_TEST_RESTART_TYPE_HOT:
+            RLOGD("Hot Start\n");
+            hal2mnl_gps_delete_aiding_data(GPS_DELETE_RTI);
+            break;
+        case MNLD_TEST_RESTART_TYPE_WARM:
+            RLOGD("Warm Start\n");
+            hal2mnl_gps_delete_aiding_data(GPS_DELETE_EPHEMERIS);
+            break;
+        case MNLD_TEST_RESTART_TYPE_COLD:
+            RLOGD("Cold Start\n");
+            hal2mnl_gps_delete_aiding_data(GPS_DELETE_EPHEMERIS |
+                GPS_DELETE_POSITION | GPS_DELETE_TIME | GPS_DELETE_IONO |
+                GPS_DELETE_UTC | GPS_DELETE_HEALTH);
+            break;
+        case MNLD_TEST_RESTART_TYPE_FULL:
+            RLOGD("Full Start\n");
+            hal2mnl_gps_delete_aiding_data(GPS_DELETE_ALL);
+            break;
+        default:
+            RLOGE("ERR: read unhandled value=[%d]\n", restart_type);
+            return;
+    }
+    if(gpsinterface != NULL && cbs != NULL)
+    {
+        gpsinterface->init(cbs);
+        //hal2mnl_update_network_state(1,NETWORK_TYPE_WIFI,0,"NULL");
+        //hal2mnl_update_network_state(mnld_test_network_on,mnld_test_network_type,mnld_test_network_roaming,"NULL");
+        gpsinterface->start();
+        memset(&(mnld_test_result_body.location),0,sizeof(GpsLocation));
+        mnld_test_result_body.fix_type = 0;
+        mnld_test_ttff = 0;
+        mnld_test_session_end = 0;
+       // usleep(500000);
+       // mnld_test_connect_mnl();
+    #ifndef MNLD_TEST_TTFF_SESSION_BEGIN
+        if(clock_gettime(CLOCK_BOOTTIME,&mnld_test_gnss_open_tm) == -1)
+        {
+            RLOGE("Fail to get time(%s).",strerror(errno));
+        }
+    #endif
+    }else{
+        RLOGE("param error:%d, %d",gpsinterface, cbs);
+    }
+}
+
+void mnld_test_close_gnss(GpsInterface_ext* gps_interface)
+{
+    GpsInterface_ext* gpsinterface = gps_interface;
+//    gpsinterface = gps_device__get_gps_interface("mnld_test stop");
+    if(gpsinterface != NULL)
+    {
+        gpsinterface->cleanup();
+        gpsinterface->stop();
+    }else{
+        RLOGE("[%s]param error\r\n",__func__);
+    }
+
+}
+
+
+void mnld_test_gnss_restart(void)
+{
+    int retry_cnt = 0;
+    if(mnld_test_restart_cnt < mnld_test_restart_time)
+    {
+        mnld_test_restart_cnt++;
+        mnld_test_close_gnss(mnld_test_gpsinfs);
+        while(!mnld_test_session_end)
+        {
+            if(retry_cnt++>500)
+            {
+                RLOGW("[%s] wait gnss close timeout\r\n",__func__);
+                break;
+            }
+            usleep(10000);
+        }
+        mnld_test_open_gnss(mnld_test_restart_type,mnld_test_gpsinfs,mnld_test_cbs);
+        start_timer(mnld_test_restart_timer,mnld_test_restart_interval*1000);
+    }else{
+        stop_timer(mnld_test_restart_timer);
+    }
+}
+
+char* mnld_test_get_clock_type_str(int clock_type_int)
+{
+    int i = 0;
+    int len = sizeof(mnld_test_clock_type)/sizeof(clock_type);
+
+    for(i=0;i<len;i++)
+    {
+        if(clock_type_int == mnld_test_clock_type[i].type_int)
+        {
+            break;
+        }
+    }
+
+    if(i < len)
+    {
+        return(mnld_test_clock_type[i].type_str);
+    }else{
+        return("Unknown");
+    }
+}
+
+void mnld_test_show_test_result(mnld_test_result* result)
+{
+    if(NULL != result)
+    {
+        memcpy(result->chip_ver,MNLD_TEST_CHIP_VER,sizeof(MNLD_TEST_CHIP_VER));
+        memcpy(result->mnl_ver,MNLD_TEST_MNL_VER,strlen(MNLD_TEST_MNL_VER));
+        result->clk_type = MNLD_TEST_CLOCK_TYPE;
+        result->clk_buff = MNLD_TEST_CLOCK_BUFF;
+
+        //system("clear");
+        RLOGD("---------------------------------------------");
+        RLOGD("Chip:%s",result->chip_ver);
+        RLOGD("MNL Version:%s",result->mnl_ver);
+        RLOGD("Clock Type:%s",mnld_test_get_clock_type_str(result->clk_type));
+        RLOGD("Clock Buffer:%d",result->clk_buff);
+        RLOGD("---------------------------------------------");
+        if(result->ttff[CURR] == 0)
+        {
+            RLOGD("TTFF: - ");
+        }else{
+            RLOGD("TTFF: %d ms",result->ttff[CURR]);
+        }
+
+        if(result->ttff[MIN] == 0)
+        {
+            RLOGD("TTFF min: - ");
+        }else{
+            RLOGD("TTFF min: %d ms",result->ttff[MIN]);
+        }
+
+        if(result->ttff[MAX] == 0)
+        {
+            RLOGD("TTFF max: - ");
+        }else{
+            RLOGD("TTFF max: %d ms",result->ttff[MAX]);
+        }
+
+        if(result->ttff[MEAN] == 0)
+        {
+            RLOGD("TTFF mean: - ");
+        }else{
+            RLOGD("TTFF mean: %d ms",result->ttff[MEAN]);
+        }
+        RLOGD("---------------------------------------------");
+        RLOGD("zqc Fix Type: %d",result->fix_type);
+        RLOGD("zqc Flags: 0x%x",result->location.legacyLocation.flags);
+        RLOGD("zqc Latitude: %.10lf",result->location.legacyLocation.latitude);
+        RLOGD("Longtitude: %.10lf",result->location.legacyLocation.longitude);
+        RLOGD("Altitude: %.10lf",result->location.legacyLocation.altitude);
+        RLOGD("Speed: %fm/s",result->location.legacyLocation.speed);
+        RLOGD("Bearing: %f",result->location.legacyLocation.bearing);
+//        RLOGD("Time stamp: %d",result->location.timestamp);
+        RLOGD("horizontalAccuracyMeters: %f",result->location.horizontalAccuracyMeters);
+        RLOGD("verticalAccuracyMeters: %f",result->location.verticalAccuracyMeters);
+        RLOGD("speedAccuracyMetersPerSecond: %f",result->location.speedAccuracyMetersPerSecond);
+        RLOGD("bearingAccuracyDegrees: %f",result->location.bearingAccuracyDegrees);
+        RLOGD("Utc time: %s",result->utc_time);
+        RLOGD("---------------------------------------------");
+        RLOGD("GNSS testing(%d).",mnld_test_restart_cnt);
+    }
+}
+
+void get_gps_test(){
+   void *handle;
+   char *error;
+   struct gps_device_t_ext *gpsdev = NULL;
+   mnld_test_restart_time = 0;
+   mnld_test_restart_interval = 60;//Default is 60s
+   mnld_test_restart_type = MNLD_TEST_RESTART_TYPE_HOT;
+   handle = dlopen(LIB_GNSS_HAL_DIR"/libgpshal.so.0", RTLD_LAZY);
+        if (!handle) {
+            fprintf(stderr, "%s\n", dlerror());
+            exit(EXIT_FAILURE);
+        }
+        gpsdev = (struct gps_device_t_ext *)dlsym(handle, "linux_gps_device");
+        if ((error = dlerror()) != NULL) {
+            fprintf(stderr, "%s\n", error);
+            exit(EXIT_FAILURE);
+        }
+        mnld_test_gpsinfs = (GpsInterface_ext*)gpsdev->get_gps_interface(gpsdev);
+        RLOGE("zhouqunchao,%s, %s, %d", __FILE__, __FUNCTION__, __LINE__);
+        mnld_test_cbs = mnld_test__get_gps_callbacks();//&mnld_test_gps_callbacks;
+        memset(&mnld_test_result_body,0,sizeof(mnld_test_result));
+        mnld_test_open_gnss(mnld_test_restart_type,mnld_test_gpsinfs,mnld_test_cbs);
+         if(mnld_test_restart_interval != 0)
+            {
+                mnld_test_restart_timer = init_timer(mnld_test_gnss_restart);
+                start_timer(mnld_test_restart_timer,mnld_test_restart_interval*1000);
+            }
+}
+
+
+
+void register_gps_callback(gpsStatusCb cb){
+    gps_status_cb = cb;
+}
+void mnld_get_gps_status(int result){
+	RLOGD("mnld_get_gps_status,%s, %s, %d", __FILE__, __FUNCTION__, __LINE__);
+	gps_status_cb(result);
+}
+/*
+void main(int argc, char** argv)
+{
+    struct sigaction actions;
+
+    actions.sa_handler = daemon_sighlr;
+    sigemptyset(&actions.sa_mask);
+    actions.sa_flags = 0;
+    sigaction(SIGUSR1, &actions, NULL);
+    sigaction(SIGINT, &actions, NULL);
+    sigaction(SIGTTIN, &actions, NULL);
+    sigaction(SIGKILL, &actions, NULL);
+    sigaction(SIGTERM, &actions, NULL);    
+    RLOGD("ZHOUQUNCHAO,START");
+    mnld_test_printf("main zhouqunchao:\r\n");
+    pthread_mutex_init(&main_mutex, NULL);
+    pthread_cond_init(&main_cond, NULL);
+
+    int exit_flag = 0;
+    int cnt = 0;
+    int index = 0;
+    int ret = 0;
+    char input_c = 0;
+    char *error;
+    struct gps_device_t_ext *gpsdev = NULL;
+    void *handle;
+    MNLD_TEST_ACTION action = MNLD_TEST_ACTION_UNKNOWN;
+    //Show the recieved command
+  RLOGD("ZHOUQUNCHAO,START");
+    for(index=0; index<argc; index++)
+    {
+        mnld_test_printf("%s ",argv[index]);
+    }
+    mnld_test_printf("\r\n");
+
+    if(argc >= 2 && argc <= MNLD_TEST_CMD_CNT_MAX)
+    {
+        if(!strncmp(argv[1], MNLD_TEST_CMD_OPEN, strlen(MNLD_TEST_CMD_OPEN)))//Open GNSS
+        {
+            action = MNLD_TEST_ACTION_GNSS_OPEN;
+            //re-init restart parameters
+            mnld_test_restart_time = 0;
+            mnld_test_restart_interval = 60;//Default is 60s
+            mnld_test_restart_type = MNLD_TEST_RESTART_TYPE_HOT;
+
+            switch(argc)
+            {
+                case 5://No break
+                mnld_test_restart_interval = atoi(&argv[4][0]);
+                case 4://No break
+                mnld_test_restart_time = atoi(&argv[3][0]);
+                case 3://No break
+                mnld_test_restart_type = mnld_test_get_restart_type(argv[2][0]);
+                case 2://No break
+                case 1://No break
+                default:
+                break;
+            }
+            RLOGD("mnld_test start.\r\n");
+            if(mnld_test_restart_time > 1000)
+            {
+                RLOGE("The max value of restart time is 1000, %d is over this range\r\n",mnld_test_restart_time);
+                mnld_test_restart_time = 1000;
+            }
+
+            if(mnld_test_restart_interval > 3600)
+            {
+                RLOGE("The max value of restart interval is 3600s(1h), %d is over this range\r\n",mnld_test_restart_interval);
+                mnld_test_restart_interval = 3600;
+            }
+
+            if(mnld_test_restart_time <= 0)//No restart
+            {
+                mnld_test_restart_interval = 0;
+            }
+            RLOGD("restart_time:%d, restart_interval:%ds,restart_type:%d\r\n",mnld_test_restart_time,mnld_test_restart_interval,mnld_test_restart_type);
+            exit_flag = 0;
+        }else if(!strncmp(argv[1],MNLD_TEST_CMD_CLOSE, strlen(MNLD_TEST_CMD_CLOSE))){//Close GNSS
+            action = MNLD_TEST_ACTION_GNSS_CLOSE;
+            RLOGD("mnld_test stop.\r\n");
+            exit_flag = 0;
+        }else if(!strncmp(argv[1], MNLD_TEST_CMD_NETWORK, strlen(MNLD_TEST_CMD_NETWORK))){
+            RLOGD("mnld_test set network.\r\n");
+            exit_flag = 0;
+            if(argc == 3)
+            {
+                if(!strncmp(argv[2], MNLD_TEST_NETWORK_WIFI, strlen(MNLD_TEST_NETWORK_WIFI)))
+                {
+                    mnld_test_network_type = NETWORK_TYPE_WIFI;
+                    mnld_test_network_on = 1;
+                    mnld_test_network_roaming = 0;
+                }else if(!strncmp(argv[2],MNLD_TEST_NETWORK_MOBILE, strlen(MNLD_TEST_NETWORK_MOBILE))){
+                    mnld_test_network_type = NETWORK_TYPE_MOBILE;
+                    mnld_test_network_on = 1;
+                    mnld_test_network_roaming = 0;
+                }else if(!strncmp(argv[2],MNLD_TEST_NETWORK_DISABLE, strlen(MNLD_TEST_NETWORK_DISABLE)))                {
+                    mnld_test_network_type = NETWORK_TYPE_WIFI;
+                    mnld_test_network_on = 0;
+                    mnld_test_network_roaming = 0;
+                }else{
+                    LOGW("Network set fail!Unknown command!(%d)\r\n", argc);
+                    mnld_test_show_help();
+                    exit_flag = 1;
+                }
+            }else if(argc == 4){
+                if(!strncmp(argv[2],MNLD_TEST_NETWORK_MOBILE, strlen(MNLD_TEST_NETWORK_MOBILE)) && !strncmp(argv[3],MNLD_TEST_NETWORK_ROAMING, strlen(MNLD_TEST_NETWORK_ROAMING)))
+                {
+                    mnld_test_network_type = NETWORK_TYPE_MOBILE;
+                    mnld_test_network_on = 1;
+                    mnld_test_network_roaming = 1;
+                }else{
+                    LOGW("Network set fail!Unknown command!(%d)\r\n", argc);
+                    mnld_test_show_help();
+                    exit_flag = 1;
+                }
+            }else{
+                LOGW("Network set fail! Error cmd count(%d).\r\n",argc);
+                mnld_test_show_help();
+                exit_flag = 1;
+            }
+
+            RLOGD("network, type:%s, on:%d, roaming:%d.\r\n",mnld_test_network_type_str[mnld_test_network_type], mnld_test_network_on, mnld_test_network_roaming);
+            action = MNLD_TEST_ACTION_SET_NETWORK;
+        }else{
+            RLOGE("Unknown command!\r\n");
+            mnld_test_show_help();
+            exit_flag = 1;
+        }
+    }else{
+        RLOGE("Unknown command!\r\n");
+        mnld_test_show_help();
+        exit_flag = 1;
+    }
+
+    if(!exit_flag)
+    {
+        handle = dlopen(LIB_GNSS_HAL_DIR"/libgpshal.so.0", RTLD_LAZY);
+        if (!handle) {
+            fprintf(stderr, "%s\n", dlerror());
+            exit(EXIT_FAILURE);
+        }
+
+        gpsdev = (struct gps_device_t_ext *)dlsym(handle, "linux_gps_device");
+        if ((error = dlerror()) != NULL) {
+            fprintf(stderr, "%s\n", error);
+            exit(EXIT_FAILURE);
+        }
+        mnld_test_gpsinfs = (GpsInterface_ext*)gpsdev->get_gps_interface(gpsdev);
+        RLOGE("zhouqunchao,%s, %s, %d", __FILE__, __FUNCTION__, __LINE__);
+        mnld_test_cbs = mnld_test__get_gps_callbacks();//&mnld_test_gps_callbacks;
+        switch(action)
+        {
+            case MNLD_TEST_ACTION_GNSS_OPEN:
+
+            valid_ttff_cnt = 0;
+            valid_ttff_sum = 0;
+
+            memset(&mnld_test_result_body,0,sizeof(mnld_test_result));
+            mnld_test_open_gnss(mnld_test_restart_type,mnld_test_gpsinfs,mnld_test_cbs);
+            //system("clear");
+            if(mnld_test_restart_interval != 0)
+            {
+                mnld_test_restart_timer = init_timer(mnld_test_gnss_restart);
+                start_timer(mnld_test_restart_timer,mnld_test_restart_interval*1000);
+            }
+            pthread_mutex_lock(&main_mutex);
+            while(main_running) {
+                LOGI("main thread going....\n");
+                pthread_cond_wait(&main_cond, &main_mutex);
+                LOGI("some signal catched, go to exit!!!\n");
+            }
+            pthread_mutex_unlock(&main_mutex);
+            exit_flag = 1;
+            break;
+
+            case MNLD_TEST_ACTION_GNSS_CLOSE:
+            mnld_test_close_gnss(mnld_test_gpsinfs);
+
+            exit_flag = 1;
+            break;
+
+            case MNLD_TEST_ACTION_SET_NETWORK:
+
+            ret = hal2mnl_update_network_state(mnld_test_network_on,mnld_test_network_type,mnld_test_network_roaming,"NULL");
+            if(-1 == ret)
+            {
+                RLOGE("Network set fail!\r\n");
+            }else{
+                RLOGD("Network set successfully! type: %s,on:%d,roaming:%d\r\n",mnld_test_network_type_str[mnld_test_network_type],mnld_test_network_on,mnld_test_network_roaming);
+            }
+            exit_flag = 1;
+            break;
+
+            default:
+            LOGW("Unknown action(%d)\r\n",action);
+            mnld_test_show_help();
+            break;
+        }
+
+    }
+    pthread_cond_destroy(&main_cond);
+    pthread_mutex_destroy(&main_mutex);
+}
+*/
diff --git a/IC_src/mtk/packages/apps/lynq-factorytest/src/main.cpp b/IC_src/mtk/packages/apps/lynq-factorytest/src/main.cpp
new file mode 100644
index 0000000..5736132
--- /dev/null
+++ b/IC_src/mtk/packages/apps/lynq-factorytest/src/main.cpp
@@ -0,0 +1,75 @@
+/*
+*  Copyright (C) 2014 MediaTek Inc.
+*
+*  Modification based on code covered by the below mentioned copyright
+*  and/or permission notice(s).
+*/
+
+/* 
+**
+** Copyright 2006 The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+**     http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <dlfcn.h>
+#include <string.h>
+#include <stdint.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <errno.h>
+//#include <vendor-ril/telephony/ril.h>
+#include <log/log.h>
+#include <sys/file.h>
+#include <sys/stat.h>
+#include <libtel/lib_tele.h>
+//#include "libtel/lynq_call.h"
+//#include "libtel/lynq_sim.h"
+#include <pthread.h>
+#include <sys/types.h>
+
+
+
+#include <factory_main.h>
+#include "common.h"
+
+
+#undef LOG_TAG
+#define LOG_TAG "FACTORY_TEST"
+void lynq_incoming_call_cb(RIL_SOCKET_ID soc_id,int index, char * addr, RIL_CallState state, int toa)
+{
+    printf("[SIM%d]index is %d,addr is %s,state is %d,toa is %d\n",soc_id,index,addr,state,toa);
+}
+
+void lynq_recive_new_sms_cb(RIL_SOCKET_ID soc_id,char * num, char * smsc, char * msg, int charset)
+{
+    printf("[SIM%d]num is %s,smsc is %s,msg is %s,charset is %d\n",soc_id,num,smsc,msg,charset);
+}
+static user_cb mytest={
+    lynq_recive_new_sms_cb,
+    lynq_incoming_call_cb
+};
+int main(int argc, char **argv) { 
+  RLOGD("main\n");
+  lynqRegisterUnsolicitedResponse(&mytest);
+  //RLOGD("responseCallback,%p \n",responseCallback);
+  lynq_ril_init();
+  //call_Info_Init();
+  //init_sim();
+  lynqStartEventLoop();
+  while (true) {
+    sleep(UINT32_MAX);
+    }
+}
diff --git a/IC_src/mtk/packages/apps/lynq-factorytest/src/makefile b/IC_src/mtk/packages/apps/lynq-factorytest/src/makefile
new file mode 100644
index 0000000..38a00c8
--- /dev/null
+++ b/IC_src/mtk/packages/apps/lynq-factorytest/src/makefile
@@ -0,0 +1,110 @@
+SHELL = /bin/sh
+RM = rm -f
+
+LOCAL_CFLAGS := -Wall \
+                -g -Os \
+                -flto \
+                -DRIL_SHLIB \
+                -DATCI_PARSE \
+                -DKEEP_ALIVE \
+                -D__LINUX_OS__ \
+                -DECALL_SUPPORT
+
+$(warning ################# C2K support: $(RAT_CONFIG_C2K_SUPPORT))
+ifeq ($(strip $(RAT_CONFIG_C2K_SUPPORT)), yes)
+    LOCAL_CFLAGS += -DC2K_SUPPORT
+
+endif
+
+ifeq ($(strip $(MTK_MULTI_SIM_SUPPORT)), dsds)
+    LOCAL_CFLAGS += -DANDROID_SIM_COUNT_2 \
+                     -DANDROID_MULTI_SIM \
+                     -DMODE_DSDS
+endif
+
+ifeq ($(strip $(MTK_MULTI_SIM_SUPPORT)), dsss)
+    LOCAL_CFLAGS += -DMODE_DSSS
+endif
+
+$(warning ################# TARGET_PLATFORM: $(TARGET_PLATFORM))
+ifeq ($(strip $(TARGET_PLATFORM)), mt2731)
+#$(warning #################add for debug $(ROOT), $(includedir))
+$(warning ################# TARGET_PLATFORM_MT2731)
+    LOCAL_CFLAGS += -DTARGET_PLATFORM_MT2731 \
+                    -DMD_93_SUPPORT
+else ifeq ($(strip $(TARGET_PLATFORM)), mt2635)
+$(warning ################# TARGET_PLATFORM_MT2635)
+    LOCAL_CFLAGS += -DTARGET_PLATFORM_MT2635 \
+                    -DMD_90_SUPPORT
+endif
+
+
+LOCAL_PATH   = .
+#CFLAGS = $(LOCAL_CFLAGS) -std=c99 
+#CXXFLAGS = $(LOCAL_CFLAGS) -std=gnu++14
+$(warning ################# ZHOUQUNCHAO ROOT: $(ROOT),includedir:$(includedir),LOCAL_PATH:$(LOCAL_PATH))
+LOCAL_C_INCLUDES = \
+  -I. \
+  -I$(LOCAL_PATH) \
+  -I$(ROOT)$(includedir)/logger \
+  -I$(ROOT)$(includedir)/vendor-ril \
+  -I$(ROOT)$(includedir)/libtel \
+  -I$(ROOT)$(includedir)/libdriver \
+  -I$(ROOT)$(includedir)/gstreamer-1.0 \
+  -I$(ROOT)$(includedir)/glib-2.0 \
+  -I$(ROOT)$(libdir)/glib-2.0/include \
+  -I$(ROOT)$(libdir)/gstreamer-1.0/include\
+  -I$(ROOT)$(includedir)/dbus-1.0 \
+  -I../gps_hal/inc \
+  -I../gps_hal/inc/hardware \
+  -I$(ROOT)$(libdir)/dbus-1.0/include \
+  -DLIB_GNSS_HAL_DIR='"$(libdir)"'
+
+LOCAL_C_INCLUDES+=$(DNS_FLAGS)
+
+LOCAL_LIBS := \
+    -L. \
+    -ldl \
+    -lstdc++ \
+    -llog \
+    -lsncfg \
+    -lcutils \
+    -lutils \
+    -lpower \
+    -lbinder \
+    -lpthread \
+    -lrt \
+    -ltel-ril \
+    -lcontrol \
+    -lgpshal \
+    -lasound \
+    -lpal \
+    -lgstreamer-1.0 \
+    -lglib-2.0 \
+    -lgstbase-1.0 \
+    -lgstreamer-1.0 \
+    -lgobject-2.0 \
+    -lgio-2.0 \
+    -ldtmf \
+    -lapn \
+    -ldbus-1 \
+
+LOCAL_SRC_FILES_CPP = $(wildcard *.cpp gpio/*.cpp ril/*.cpp)
+LOCAL_SRC_FILES_C = $(wildcard *.c gps/*.c)
+EXECUTABLE = lynq-factorytest
+
+OBJECTS=$(LOCAL_SRC_FILES_CPP:.cpp=.o) $(LOCAL_SRC_FILES_C:.c=.o)
+all: $(EXECUTABLE)
+
+$(EXECUTABLE): $(OBJECTS)
+	$(CXX) $(OBJECTS) $(LOCAL_LIBS) $(LOCAL_CFLAGS) $(LOCAL_C_INCLUDES) -o $@
+
+%.o: %.c
+	$(warning ----->build $<)
+	$(CC) $(LOCAL_C_INCLUDES) $(LOCAL_CFLAGS) $(LOCAL_LIBS) -o $@ -c $<
+%.o : %.cpp
+	$(CXX) $(LOCAL_C_INCLUDES) $(LOCAL_CFLAGS) $(LOCAL_LIBS) -o $@ -c $<
+
+.PHONY: clean
+clean:
+	$(RM) $(OBJECTS) $(EXECUTABLE)
diff --git a/IC_src/mtk/packages/apps/lynq-factorytest/src/menu/api_menu.h b/IC_src/mtk/packages/apps/lynq-factorytest/src/menu/api_menu.h
new file mode 100644
index 0000000..e4a84df
--- /dev/null
+++ b/IC_src/mtk/packages/apps/lynq-factorytest/src/menu/api_menu.h
@@ -0,0 +1,96 @@
+#ifndef __LYNQ_TEST_MENU__
+#define __LYNQ_TEST_MENU__
+#include "common.h"
+/* module api test menu*/
+typedef enum {
+   RIL_API  = 0,
+   GPIO_API,
+   WIFI_API,
+   GPS_API,
+   MQTT_API,
+}API_MENU;
+typedef enum {
+   SET_GPIO  = 0,
+   GET_GPIO,
+}DRIVER_MENU;
+
+factory_arry_t call_api_menu[] ={
+    {"dail a call",0,NULL,1,0},
+    {"answer call",0,NULL,0,0},
+    {"hang up call",0,NULL,1,0},
+    {"reject call",0,NULL,0,0},
+    {"auto answer call",0,NULL,1,0},
+    {"set mute status",0,NULL,1,0},
+    {"get mute status",0,NULL,0,0},
+    {"set DTMF",0,NULL,1,0},
+    {"set DTMF volume",0,NULL,1,0},
+    {"do multi conference",0,NULL,0,0},
+    {"other call hold",0,NULL,1,0},
+    {"hang up waiting call",0,NULL,0,0},
+    {"hang up foreground and resume background",0,NULL,0,0},
+    {"switch waiting or holding and active ",0,NULL,0,0},
+    {"get last call fail cause",0,NULL,0,0},
+};
+factory_arry_t network_api_menu[] = {
+    {"query operator",0,NULL,0,0},
+    {"query network selection mode",0,NULL,0,0},
+    {"set network selection mode",0,NULL,1,0},
+    {"query available network",0,NULL,0,0},
+    {"query registration state",0,NULL,1,0},
+    {"query prefferred network type",0,NULL,0,0},
+    {"set prefferred network type",0,NULL,1,0},
+    {"query cell info",0,NULL,0,0},
+    {"set unsol cell info list rate",0,NULL,1,0},
+    {"query neighboring cell IDs",0,NULL,0,0},
+    {"set band mode",0,NULL,1,0},
+    {"query available band mode",0,NULL,0,0},
+    {"radio on",0,NULL,1,0},
+    {"query radio tech",0,NULL,0,0},
+    {"solicited signal strength",0,NULL,0,0},
+    {"modem on",0,NULL,1,0},
+};
+factory_arry_t data_api_menu[] ={
+    {"setup data call",0,NULL,0,0},
+    {"deactivte data call",0,NULL,0,0},
+    {"get data call list",0,NULL,0,0},
+
+};
+
+factory_arry_t sim_api_menu[] ={
+    {"get sim status",0,NULL,0,0},
+    {"get imsi",0,NULL,0,0},
+};
+
+factory_arry_t sms_api_menu[] ={
+    {"send sms",0,NULL,1,0},
+    {"ims send sms",0,NULL,1,0},
+    {"write sms to sim",0,NULL,1,0},
+    {"report sms memory status",0,NULL,1,0},
+    {"deleted sms on sim",0,NULL,1,0},
+    {"get smsc address",0,NULL,0,0},
+    {"set smsc address",0,NULL,1,0},
+};
+
+
+factory_arry_t ril_api_menu[] = {
+ {"CALL",NUM_ITEMS(call_api_menu),call_api_menu,1,0},
+ {"NETWORK",NUM_ITEMS(network_api_menu),network_api_menu,1,0},
+ {"DATA",NUM_ITEMS(data_api_menu),data_api_menu,1,0},
+ {"SMS",NUM_ITEMS(sms_api_menu),sms_api_menu,1,0},
+ {"SIM",NUM_ITEMS(sim_api_menu),sim_api_menu,1,0},
+};
+factory_arry_t gpio_api_menu[] = {
+ {"gpio set",0,NULL,1,0},
+ {"gpio get",0,NULL,1,0},
+};
+
+factory_arry_t api_menu[] = {
+ {"Ril",NUM_ITEMS(ril_api_menu),ril_api_menu,0,0},
+ {"gpio",NUM_ITEMS(gpio_api_menu),gpio_api_menu,0,0},
+ {"wifi",0,NULL,0,0},
+ {"gps",0,NULL,0,0},
+ {"mqtt",0,NULL,0,0},
+};
+
+
+#endif
diff --git a/IC_src/mtk/packages/apps/lynq-factorytest/src/menu/demo_menu.h b/IC_src/mtk/packages/apps/lynq-factorytest/src/menu/demo_menu.h
new file mode 100644
index 0000000..8f4b145
--- /dev/null
+++ b/IC_src/mtk/packages/apps/lynq-factorytest/src/menu/demo_menu.h
@@ -0,0 +1,18 @@
+#ifndef __LYNQ_DEMO_MENU__
+#define __LYNQ_DEMO_MENU__
+#include "common.h"
+/* module api test menu*/
+typedef enum {
+   DEMO_TEST1  = 0,
+   DEMO_TEST2,
+   DEMO_TEST3,
+   DEMO_TEST4,
+}DEMO_ENUM;
+factory_arry_t demo_menu[] = {
+ {"demo1",0,NULL,0,0},
+ {"demo2",0,NULL,0,0},
+ {"demo3",0,NULL,0,0},
+ {"demo4",0,NULL,0,0},
+};
+
+#endif
diff --git a/IC_src/mtk/packages/apps/lynq-factorytest/src/menu/factory_menu.h b/IC_src/mtk/packages/apps/lynq-factorytest/src/menu/factory_menu.h
new file mode 100644
index 0000000..ffbc4d4
--- /dev/null
+++ b/IC_src/mtk/packages/apps/lynq-factorytest/src/menu/factory_menu.h
@@ -0,0 +1,27 @@
+#ifndef __LYNQ_FACTORY_MENU__
+#define __LYNQ_FACTORY_MENU__
+#include "common.h"
+factory_arry_t manual_menu[] ={
+  {"telephone test",0,NULL,0,0},
+  {"Sim test",0,NULL,0,0},
+  {"gps test",0,NULL,0,0},
+  {"gpio test",0,NULL,0,0},
+};
+
+factory_arry_t imei_menu[] ={
+  {"imei",0,NULL,0,0},
+};
+
+
+factory_arry_t set_get[] = {
+  {"get",0,NULL,0,0},
+  {"set",0,NULL,1,0},
+};
+factory_arry_t phone_menu[] ={
+  {"phone",NUM_ITEMS(imei_menu),imei_menu,0,0},
+};
+factory_arry_t config[] ={
+  {"Phone number",NUM_ITEMS(set_get),set_get,0,0},
+  {"SMS message",NUM_ITEMS(set_get),set_get,0,0},
+};
+#endif
diff --git a/IC_src/mtk/packages/apps/lynq-factorytest/src/rfAutomaticTest.cpp b/IC_src/mtk/packages/apps/lynq-factorytest/src/rfAutomaticTest.cpp
new file mode 100644
index 0000000..7003dad
--- /dev/null
+++ b/IC_src/mtk/packages/apps/lynq-factorytest/src/rfAutomaticTest.cpp
@@ -0,0 +1,202 @@
+#include "rfAutomaticTest.h"
+#include<common.h>
+/*
+#ifdef __cplusplus
+extern "C" {
+#endif
+#include "gps/gps_test.h"
+#ifdef __cplusplus
+}
+#endif
+*/
+#include <log/log.h>
+#include "libtel/lynq_call.h"
+#include "libtel/lynq_sim.h"
+#undef LOG_TAG
+#define LOG_TAG "Factory_RfAutomaticTxTest"
+//extern void get_gps_test();
+//extern C lynq_get_sim_status();
+const int RfAutomaticTest::MSG_TELE = 3;
+const int RfAutomaticTest::MSG_GPS = 2;
+const int RfAutomaticTest::MSG_SIM = 1;
+const int RfAutomaticTest::MSG_NULL = 0;
+
+RfAutomaticTest* RfAutomaticTest::m_instance = NULL;
+std::mutex RfAutomaticTest::mMutex;
+// Method implements of RequestHandleThread
+RfAutomaticTest::RequestHandleThread::RequestHandleThread(RfAutomaticTest* tx) : m_looper(NULL) {
+    mTx = tx;
+    RLOGD( "RequestHandleThread created");
+}
+
+RfAutomaticTest::RequestHandleThread::~RequestHandleThread() {
+    mTx = NULL;
+    RLOGD( "RequestHandleThread destroyed");
+}
+RfAutomaticTest::RfRequestMessage::RfRequestMessage(RfAutomaticTest* tx) : mTx(tx),mMsgType(0),
+        response(""),responselen(0), slot(0), e(ERROR) {
+}
+
+RfAutomaticTest::RfRequestMessage::~RfRequestMessage() {
+    RLOGD( "RequestHandleThread destroyed");
+}
+
+void RfAutomaticTest::RfRequestHandler::handleMessage(const Message& message) {
+    RLOGD( "handleMessage msg->mMsgType: %d", mMsg->mMsgType);
+    if(mTx != NULL) {
+        mTx->factory_test_onebyone(mMsg);
+    } else {
+        RLOGD( "handleMessage mTx is null");
+    }
+}
+void RfAutomaticTest::factory_test_onebyone(sp<RfRequestMessage> msg){
+  RLOGD( "FactoryTestOneByOne, type: %d,slot:%d,auto_reqId:%d", msg->mMsgType,msg->slot,auto_reqId);
+  int responselen = msg->responselen;
+  std::string response = msg->response;
+  if(msg->slot != 0){
+  	RLOGD("%s, %s, %d", __FILE__, __FUNCTION__, __LINE__);
+    if(msg->slot == auto_reqId){
+  	RLOGD("%s, %s, %d", __FILE__, __FUNCTION__, __LINE__);
+      switch (msg->mMsgType) {
+  //    case MSG_NULL: {
+	//  	  mCurrentFlag = MSG_SIM;
+	  	//  auto_reqId = lynq_get_sim_status();
+    //  	} 	
+      case MSG_SIM: {
+	  	  	RLOGD("%s, %s, %d", __FILE__, __FUNCTION__, __LINE__);
+
+        if(msg->e == SUCCESS){
+          mFactoryResult[0] = 1;
+        }else{
+          mFactoryResult[0] = 0;
+          mFactoryResult[1] = 0;  
+          mCurrentFlag = MSG_GPS;
+      //    get_gps_test();
+          break;
+  	    }
+        mCurrentFlag = MSG_TELE;
+       // auto_reqId = get_call();
+		  auto_reqId = 88;
+        RLOGD( "get_call,auto_reqId:%d",auto_reqId);
+        break;
+      }
+      case MSG_TELE:{
+        if(msg->e == SUCCESS){
+          mFactoryResult[1] = 1;
+          RLOGD("%s, %s, %d", __FILE__, __FUNCTION__, __LINE__);
+        }else{
+          mFactoryResult[1] = 0;
+          RLOGD("%s, %s, %d", __FILE__, __FUNCTION__, __LINE__);
+
+        }  
+        mCurrentFlag = MSG_GPS;
+  	  //  get_gps_test();
+        break ;
+      }
+      default:
+        break; 
+    }
+  }
+}else if(msg->mMsgType == MSG_NULL ){
+  	RLOGD("%s, %s, %d", __FILE__, __FUNCTION__, __LINE__);
+	mCurrentFlag = MSG_SIM;
+	auto_reqId = 99;
+    //auto_reqId = lynq_get_sim_status();
+    RLOGD( "lynq_get_sim_status,auto_reqId:%d",auto_reqId);
+
+  }
+else if(MSG_GPS == msg->mMsgType){
+	int i;
+  	RLOGD("%s, %s, %d", __FILE__, __FUNCTION__, __LINE__);
+
+  if(msg->e == SUCCESS){
+    mFactoryResult[2] = 1;
+  }else{
+    mFactoryResult[2] = 0;
+  }
+  mCurrentFlag = 0;
+  for(i = 0; i<3;i++){
+    RLOGD("mFactoryResult[%d]:%d",i,mFactoryResult[i]);
+  }
+  unregister_factory_auto_hook_raw();
+  }else{
+	RLOGE("Error11111,Unknown location");
+  }
+}
+  
+sp<RfAutomaticTest::RfRequestHandler> RfAutomaticTest::sendMessage(sp<RfRequestMessage> msg, int delayms) {
+    RLOGD( "sendMessage msg token=%d delayms=%d", msg->mMsgType, delayms);
+    sp<RfRequestHandler> handler = new RfRequestHandler(this);
+    handler->mMsg = msg;
+    if(mRequestHandleThread.get()) {
+        sp<Looper> looper = mRequestHandleThread->getLooper();
+        if(looper.get()) {
+            if (delayms > 0) {
+                looper->sendMessageDelayed(ms2ns(delayms),handler, handler->m_dummyMsg);
+            } else {
+                looper->sendMessage(handler, handler->m_dummyMsg);
+            }
+        } else {
+            RLOGD( "looper fail");
+        }
+    } else {
+        RLOGD( "mRequestHandleThread fail");
+    }
+
+    return handler;
+}
+
+RfAutomaticTest::RfRequestHandler:: ~RfRequestHandler() {
+    mTx = NULL;
+    RLOGD( "RfRequestHandler destroyed");
+}
+
+bool RfAutomaticTest::RequestHandleThread::threadLoop() {
+    RLOGD( "RequestHandleThread threadLoop");
+    // start message loop
+    m_looper = Looper::prepare(0);
+    int result;
+    do {
+        result = m_looper->pollAll(-1);
+        RLOGD( "RequestHandleThread threadLoop, pull message result = %d", result);
+    } while (result == Looper::POLL_WAKE || result == Looper::POLL_CALLBACK);
+    return true;
+}
+
+sp<Looper> RfAutomaticTest::RequestHandleThread::getLooper() {
+    return m_looper;
+}
+RfAutomaticTest::RfAutomaticTest(): mCurrentFlag(0) {
+  
+}
+
+RfAutomaticTest::~RfAutomaticTest() {
+    RLOGD("RfDesenseTxTest destroyed");
+}
+
+void RfAutomaticTest::handle_request(string response,int responselen,int slot, RIL_Errcode e) {
+	sp<RfRequestMessage> msg = new RfRequestMessage(this);
+	RLOGD("RfDesenseTxTest handle_request");
+    msg->mMsgType = mCurrentFlag;
+    msg->response = response;
+    msg->responselen = responselen;
+    msg->slot = slot;
+    msg->e = e;
+    sendMessage(msg, 1000);
+}
+void RfAutomaticTest::init() {
+    register_factory_auto_hook_raw(m_instance);
+    mRequestHandleThread = new RequestHandleThread(this);
+    mRequestHandleThread->run();
+}
+RfAutomaticTest* RfAutomaticTest::getInstance() {
+    if(!m_instance) {
+        mMutex.lock();
+        if(!m_instance) {
+            m_instance = new RfAutomaticTest();
+            m_instance->init();
+        }
+        mMutex.unlock();
+    }
+    return m_instance;
+}
diff --git a/IC_src/mtk/packages/apps/lynq-factorytest/src/rfAutomaticTest.h b/IC_src/mtk/packages/apps/lynq-factorytest/src/rfAutomaticTest.h
new file mode 100644
index 0000000..a15afd7
--- /dev/null
+++ b/IC_src/mtk/packages/apps/lynq-factorytest/src/rfAutomaticTest.h
@@ -0,0 +1,131 @@
+/* Copyright Statement:
+ *
+ * This software/firmware and related documentation ("MediaTek Software") are
+ * protected under relevant copyright laws. The information contained herein
+ * is confidential and proprietary to MediaTek Inc. and/or its licensors.
+ * Without the prior written permission of MediaTek inc. and/or its licensors,
+ * any reproduction, modification, use or disclosure of MediaTek Software,
+ * and information contained herein, in whole or in part, shall be strictly prohibited.
+ *
+ * MediaTek Inc. (C) 2016. All rights reserved.
+ *
+ * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+ * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+ * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER ON
+ * AN "AS-IS" BASIS ONLY. MEDIATEK 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 MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
+ * SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
+ * SUPPLIED WITH THE MEDIATEK 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 MEDIATEK SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK
+ * SOFTWARE RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+ * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND
+ * CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
+ * AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
+ * OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY RECEIVER TO
+ * MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+ *
+ * The following software/firmware and/or related documentation ("MediaTek Software")
+ * have been modified by MediaTek Inc. All revisions are subject to any receiver's
+ * applicable license agreements with MediaTek Inc.
+ */
+
+#ifndef RFAUTOMATICTEST_H_
+#define RFAUTOMATICTEST_H_
+
+#include <string>
+#include <vector>
+#include <memory>
+#include <mutex>
+#include <thread>
+#include <condition_variable>
+#include <vendor-ril/telephony/ril.h>
+#include <utils/Looper.h>
+#include <utils/Thread.h>
+#include <utils/RefBase.h>
+#include "libtel/lib_tele.h"
+using namespace std;
+using ::android::Looper;
+using ::android::Thread;
+using ::android::MessageHandler;
+using ::android::Message;
+using ::android::sp;
+using ::android::RefBase;
+
+static  int mFactoryResult[3] = { 0, 0, 0 };
+
+class RfAutomaticTest: public android::RefBase {
+public:
+    RfAutomaticTest();
+    virtual ~RfAutomaticTest();
+    static RfAutomaticTest* getInstance();
+    int AutoFactoryStart();
+    class RequestHandleThread: public Thread {
+    public:
+        RequestHandleThread(RfAutomaticTest* tx);
+        virtual ~RequestHandleThread();
+        sp<Looper> getLooper();
+
+    protected:
+        RfAutomaticTest* mTx;
+        virtual bool threadLoop();
+    private:
+        sp<Looper> m_looper;
+    };
+
+    class RfRequestMessage: public RefBase {
+    public:
+        RfRequestMessage(RfAutomaticTest* tx);
+        virtual ~RfRequestMessage();
+    //    void sendMessage(int delayms);
+    public:
+        int mMsgType;
+        string response;
+        int responselen;
+        int slot;
+        RIL_Errcode e;
+    private:
+        RfAutomaticTest* mTx;
+    };
+
+    class RfRequestHandler: public MessageHandler {
+    public:
+        RfRequestHandler(RfAutomaticTest* tx): mTx(tx){}
+        virtual ~RfRequestHandler();
+
+    public:
+ //       void sendMessage(sp<RfRequestMessage> msg, int delayms);
+        void handleMessage(const Message& message);
+        sp<RfRequestMessage> mMsg;
+        // dummy message that makes handler happy
+        Message m_dummyMsg;
+    private:
+        RfAutomaticTest* mTx;
+    };  
+public:
+    static const int MSG_NULL;
+    static const int MSG_TELE;
+    static const int MSG_SIM;
+    static const int MSG_GPS;
+    int mCurrentFlag;
+    sp<RequestHandleThread> mRequestHandleThread;
+    sp<RfRequestHandler> mRfRequestHandler;
+
+	sp<RfRequestHandler> sendMessage(sp<RfRequestMessage> msg, int delayms);
+	void handle_request(string response,int responselen,int slot, RIL_Errcode e);
+    void factory_test_onebyone(sp<RfRequestMessage> msg);
+	int  factory_test_go();
+	//int factory_auto_test();
+
+private:
+    static RfAutomaticTest* m_instance;
+	static std::mutex mMutex;
+private:
+    void init();
+
+};
+
+#endif /* RFDESENSETXTEST_H_ */
diff --git a/IC_src/mtk/packages/apps/lynq-factorytest/src/ril/ril_test.cpp b/IC_src/mtk/packages/apps/lynq-factorytest/src/ril/ril_test.cpp
new file mode 100644
index 0000000..eab253b
--- /dev/null
+++ b/IC_src/mtk/packages/apps/lynq-factorytest/src/ril/ril_test.cpp
@@ -0,0 +1,1403 @@
+#include "common.h"

+#include <log/log.h>

+#include "libtel/lib_tele.h"

+#include <libtel/lynq_call.h>

+#include <libtel/lynq_sim.h>

+#include <libtel/lynq_network.h>

+#include <libtel/lynq_data.h>

+#include <libtel/lynq_sms.h>

+#include <ril/ril_test.h>

+#include <cutils/properties.h>

+#define MAX_P 10

+static int strUpper(char * str)

+{
+    int i=0;
+    while(1)
+    {
+        if(str[i]=='\0')
+        {
+            break;
+        }
+        if(str[i]>='a'&&str[i]<='z')
+        {
+             //printf("str %c\n",str[i]-32);
+             str[i]=str[i]-32;
+        }
+        i++;
+    }
+    return 0;
+}

+

+int eventDial(const char *addr,int command)

+{

+    int32_t token;

+    //const char* addr = "10086";

+    char output[1024] = {0};

+    lynqCallList *msg = (lynqCallList*)malloc(sizeof(lynqCallList));
+    memset(msg,0,sizeof(lynqCallList));
+    msg->addr=(char *)malloc(sizeof(char));
+    memset(msg->addr,0,sizeof(char));
+    //printf("call start \n");

+    token = lynq_call(addr, msg);

+    RLOGD("[MAIN_LOG] request is %d,phone number is %s,token is %x,error is %d,call_state is %d",
+        msg->base.request,msg->addr,msg->base.token,msg->base.e,msg->call_state);
+    sprintf(output, "Factory_result  error_code:%d\n",msg->base.e);

+    emResultNotify(output,command);

+    free(msg->addr);
+    msg->addr=NULL;
+    free(msg);
+    msg=NULL;

+    return 0;
+}

+

+int eventAnswer(int command)

+{
+    int32_t token;

+    char output[1024] = {0};

+    lynqCallList *msg = (lynqCallList*)malloc(sizeof(lynqCallList));
+    memset(msg,0,sizeof(lynqCallList));
+    msg->addr=(char *)malloc(sizeof(char));
+    memset(msg->addr,0,sizeof(char));
+    //printf("call start \n");

+    token = lynq_call_answer(msg);
+    //printf("[MAIN_LOG] request is %d,phone number is %s,token is %x,error is %d,call_state is %d\n",

+        //msg->base.request,msg->addr,msg->base.token,msg->base.e,msg->call_state);

+    RLOGD("[MAIN_LOG] request is %d,phone number is %s,token is %x,error is %d,call_state is %d",
+        msg->base.request,msg->addr,msg->base.request,msg->base.e,msg->call_state);
+    sprintf(output, "Factory_result  error_code:%d\n",msg->base.e);

+    emResultNotify(output,command);

+    free(msg->addr);
+    msg->addr=NULL;
+    free(msg);
+    msg=NULL;
+    return 0;
+}
+int eventAutoAnswer(const int  status,int command)

+{
+    int32_t token=0;
+    int mode=0;

+    char output[1024] = {0};

+    token = lynq_set_auto_answercall(status,&mode);

+    RLOGD("Auto answer mode is %d",mode);

+    sprintf(output, "Factory_result auto answer mode:%d\n",mode);

+    emResultNotify(output,command);

+    return 0;
+}
+int eventSetMute(const int mute,int command)

+{
+    int32_t token = 0;
+    int status =0;

+    char output[1024] = {0};

+    token = lynq_set_mute_mic(mute, &status);

+    RLOGD("set mute status is %s,current mute status is %s",mute>0?"mute on":"mute off",status>0?"mute on":"mute off");

+    //printf("set mute status is %s,current mute status is %s\n",mute>0?"mute on":"mute off",status>0?"mute on":"mute off");

+    sprintf(output, "Factory_result set mute status is %s,current mute status is %s\n",mute>0?"mute on":"mute off",status>0?"mute on":"mute off");

+    emResultNotify(output,command);

+    return 0;
+}
+int eventGetMute(int command)

+{
+    int32_t token = 0;
+    int status =0;

+    char output[1024] = {0};

+    token = lynq_get_mute_status(&status);
+    RLOGD("current mute status is %s",status>0?"mute on":"mute off");
+    //printf("current mute status is %s\n",status>0?"mute on":"mute off");

+    sprintf(output, "Factory_result current mute status is %s\n",status>0?"mute on":"mute off");

+    emResultNotify(output,command);

+    return 0;
+}
+int eventLastCallFailCause(int command)

+{
+    int32_t token = 0;
+    int status =0;

+    char output[1024] = {0};

+    lynqLastCallFailCause * msg = (lynqLastCallFailCause*)malloc(sizeof(lynqLastCallFailCause));
+    memset(msg,0,sizeof(lynqLastCallFailCause));
+    msg->vendor_cause = (char *)malloc(sizeof(char));
+    memset(msg->vendor_cause,0,sizeof(char));
+    token = lynq_get_last_call_fail_cause(msg);
+    RLOGD("token is %x,request is %d,error_code is %d,cause_code is %d,vendor_cause  is %s",msg->base.token,
+        msg->base.request,msg->base.e,msg->cause_code,msg->vendor_cause);
+    //printf("token is %x,request is %d,error_code is %d,cause_code is %d,vendor_cause  is %s\n",msg->base.token,

+        //msg->base.request,msg->base.e,msg->cause_code,msg->vendor_cause);

+    sprintf(output, "Factory_result error code %d\n",msg->base.e);

+    emResultNotify(output,command);

+    free(msg->vendor_cause);
+    free(msg);
+    return 0;
+}
+int eventCallHangUp(int index,int command)

+{
+    lynqBase msg;

+    char output[1024] = {0};

+    lynq_call_hang_up(index,&msg);

+    //printf("request is %d,token is %x,error is %d\n",msg.request,msg.token,msg.e);

+    RLOGD("request is %d,token is %x,error is %d",msg.request,msg.token,msg.e);

+    sprintf(output, "Factory_result  erro code:%d\n",msg.e);

+    emResultNotify(output,command);

+    return 0;
+}
+int eventRejectCall(int command)

+{
+    lynqBase msg;

+    char output[1024] = {0};

+    lynq_reject_call(&msg);
+    //printf("request is %d,token is %x,error is %d\n",msg.request,msg.token,msg.e);

+    RLOGD("request is %d,token is %x,error is %d",msg.request,msg.token,msg.e);

+    sprintf(output, "Factory_result  erro code:%d\n",msg.e);

+    emResultNotify(output,command);

+    return 0;
+}
+int eventSetDTMF(const char value,int command)

+{
+    lynqBase msg;

+    char output[1024] = {0};

+    lynq_set_DTMF(value,&msg);

+    //printf("request is %d,token is %x,error is %d\n",msg.request,msg.token,msg.e);

+    RLOGD("request is %d,token is %x,error is %d",msg.request,msg.token,msg.e);

+    sprintf(output, "Factory_result  erro code:%d\n",msg.e);

+    emResultNotify(output,command);

+    return 0;
+}
+int eventSetDTMFVolume(const int volume,int command)

+{
+    int32_t token =0;

+    char output[1024] = {0};

+    token = lynq_set_DTMF_volume(volume);

+    //printf("set DTMF Volume is %s\n",(token>0?"success":"fail"));

+    sprintf(output, "Factory_result set DTMF Volume is %s\n",(token>0?"success":"fail"));

+    emResultNotify(output,command);

+    return 0;
+}
+int eventDoMultiConference(int command)

+{
+    lynqCallList msg;
+    msg.addr=NULL;

+    char output[1024] = {0};

+    lynq_do_multi_conference(&msg);
+    //printf("request is %d,token is %x,error is %d\n",msg.base.request,msg.base.token,msg.base.e);

+    //RLOGD("request is %d,token is %x,error is %d\n",msg.reqNumber,msg.token,msg.error_code);
+    //printf("[MAIN_LOG] request is %d,call id is %d,phone number is %s,type of address is %d,token is %x,error is %d,call_state is %d\n",

+        //msg.base.request,msg.call_id,msg.addr,msg.toa,msg.base.e,msg.base.e,msg.call_state);

+    RLOGD("[MAIN_LOG] request is %d,call id is %d,phone number is %s,type of address is %d,token is %x,error is %d,call_state is %d",
+        msg.base.request,msg.call_id,msg.addr,msg.toa,msg.base.token,msg.base.e,msg.call_state);

+    sprintf(output, "Factory_result error code:%d\n",msg.base.e);

+    emResultNotify(output,command);

+    return 0;
+}
+int eventOthercallHold(const int call_id,int command)

+{
+    lynqBase msg;

+    char output[1024] = {0};

+    lynq_othercall_hold(call_id,&msg);

+    //printf("request is %d,token is %x,error is %d\n",msg.request,msg.token,msg.e);

+    RLOGD("request is %d,token is %x,error is %d",msg.request,msg.token,msg.e);

+    sprintf(output, "Factory_result error code:%d\n",msg.e);

+    emResultNotify(output,command);

+    return 0;
+}
+int eventHangupWatingForCall(int command)

+{
+    lynqCallList msg;
+    msg.addr=NULL;

+    char output[1024] = {0};

+    lynq_hangup_wating_for_call(&msg);
+    //printf("request is %d,token is %x,error is %d\n",msg.base.request,msg.base.token,msg.base.e);

+    //RLOGD("request is %d,token is %x,error is %d\n",msg.reqNumber,msg.token,msg.error_code);
+    //printf("[MAIN_LOG] request is %d,call id is %d,phone number is %s,type of address is %d,token is %x,error is %d,call_state is %d\n",

+        //msg.base.request,msg.call_id,msg.addr,msg.toa,msg.base.token,msg.base.e,msg.call_state);

+    RLOGD("[MAIN_LOG] request is %d,call id is %d,phone number is %s,type of address is %d,token is %x,error is %d,call_state is %d",
+        msg.base.request,msg.call_id,msg.addr,msg.toa,msg.base.token,msg.base.e,msg.call_state);

+    sprintf(output, "Factory_result error code:%d\n",msg.base.e);

+    emResultNotify(output,command);

+    return 0;
+}
+int eventHangupForegroundResumeBackground(int command)

+{
+    lynqCallList msg;
+    msg.addr=NULL;

+    char output[1024] = {0};

+    lynq_hangup_foreground_resume_background(&msg);
+    //printf("request is %d,token is %x,error is %d\n",msg.base.request,msg.base.token,msg.base.e);

+    //RLOGD("request is %d,token is %x,error is %d\n",msg.reqNumber,msg.token,msg.error_code);
+    //printf("[MAIN_LOG] request is %d,call id is %d,phone number is %s,type of address is %d,token is %x,error is %d,call_state is %d\n",

+        //msg.base.request,msg.call_id,msg.addr,msg.toa,msg.base.token,msg.base.e,msg.call_state);

+    RLOGD("[MAIN_LOG] request is %d,call id is %d,phone number is %s,type of address is %d,token is %x,error is %d,call_state is %d",
+        msg.base.request,msg.call_id,msg.addr,msg.toa,msg.base.token,msg.base.e,msg.call_state);

+    sprintf(output, "Factory_result error code:%d\n",msg.base.e);

+    emResultNotify(output,command);

+    return 0;
+}
+int eventSwitchWaitOrHoldAndActiveCall(int command)

+{
+    lynqCallList msg;
+    msg.addr=NULL;

+    char output[1024] = {0};

+    lynq_switch_hold_and_active_call(&msg);
+    //printf("request is %d,token is %x,error is %d\n",msg.base.request,msg.base.token,msg.base.e);

+    //RLOGD("request is %d,token is %x,error is %d\n",msg.reqNumber,msg.token,msg.error_code);
+    //printf("[MAIN_LOG] request is %d,call id is %d,phone number is %s,type of address is %d,token is %x,error is %d,call_state is %d\n",

+        //msg.base.request,msg.call_id,msg.addr,msg.toa,msg.base.token,msg.base.e,msg.call_state);

+    RLOGD("[MAIN_LOG] request is %d,call id is %d,phone number is %s,type of address is %d,token is %x,error is %d,call_state is %d",
+        msg.base.request,msg.call_id,msg.addr,msg.toa,msg.base.token,msg.base.e,msg.call_state);

+    sprintf(output, "Factory_result error code:%d\n",msg.base.e);

+    emResultNotify(output,command);

+    return 0;
+}

+

+int eventQueryOperator(int command)

+{
+    operatorInfo msg;

+    char output[1024] = {0};

+    msg.OperatorFN=NULL;
+    msg.OperatorSH=NULL;
+    msg.MccMnc=NULL;
+    lynq_query_operater(&msg);
+    //printf("request is %d,token is %x,error is %d,OperatorFN is %s,OperatorSH is %s,MccMnc is %s\n",msg.base.request,msg.base.token,msg.base.e,msg.OperatorFN,msg.OperatorSH,msg.MccMnc);

+    RLOGD("request is %d,token is %x,error is %d\n",msg.base.request,msg.base.token,msg.base.e);
+    //printf("OperatorFN is %s,OperatorSH is %s,MccMnc is %s\n",msg.OperatorFN,msg.OperatorSH,msg.MccMnc);
+    RLOGD("OperatorFN is %s,OperatorSH is %s,MccMnc is %s\n",msg.OperatorFN,msg.OperatorSH,msg.MccMnc);

+    sprintf(output, "Factory_result error code:%d\n",msg.base.e);

+    emResultNotify(output,command);

+    return 0;
+}
+int eventQueryNetSelectMode(int command)

+{

+    char output[1024] = {0};

+    networkSelecttionMode msg;
+    lynq_query_network_selection_mode(& msg);
+    //printf("request is %d,token is %x,error is %d,mode is %d\n",msg.base.request,msg.base.token,msg.base.e,msg.mode);

+    RLOGD("request is %d,token is %x,error is %d,mode is %d",msg.base.request,msg.base.token,msg.base.e,msg.mode);
+    sprintf(output, "Factory_result error code:%d\n",msg.base.e);

+    emResultNotify(output,command);

+    return 0;

+}
+int eventSetNetSelectMode(const int mode,int command)

+{

+    char output[1024] = {0};

+    char str[100]={0};

+    const char * mccmnc = "46000";//just China Mobile Communications Group

+    lynqBase msg;

+    sprintf(str,"%s",(mode==0?"Auto":"Manual"));

+    if(mode==0)

+    {

+        lynq_set_network_selection_mode(str,NULL,&msg);

+    }

+    else if(mode ==1)

+    {

+        printf("You have selected manual mode, this command only supports CMCC SIM card temporarily");

+        lynq_set_network_selection_mode(str,mccmnc,&msg);

+    }

+    else

+    {

+        sprintf(output, "please input network selection mode:0 or 1,and try again\n");

+        emResultNotify(output,command);

+        return 0;

+    }

+    //lynq_set_network_selection_mode(argv[2],argv[3],&msg);//0:auto selection 1:manual selection

+    RLOGD("request is %d,token is %x,error is %d",msg.request,msg.token,msg.e);

+    sprintf(output, "Factory_result error code:%d\n",msg.e);

+    emResultNotify(output,command);

+    return 0;

+}
+int eventQueryAvailableNetwork(int command)

+{
+    int32_t token=0;

+    char output[1024] = {0};

+    availableNetwork msg;
+    msg.OperatorFN=NULL;
+    msg.OperatorSH=NULL;
+    msg.MccMnc=NULL;
+    msg.NetStatus=NULL;
+    lynq_query_available_network(&msg);
+    //printf("request is %d,token is %x,error is %d,OperatorFN is %s,OperatorSH is %s,MccMnc is %s,Netstatus is %s\n",msg.base.request,msg.base.token,msg.base.e,msg.OperatorFN,msg.OperatorSH,msg.MccMnc,msg.NetStatus);

+    RLOGD("request is %d,token is %x,error is %d",msg.base.request,msg.base.token,msg.base.e);
+    //printf("OperatorFN is %s,OperatorSH is %s,MccMnc is %s\n",msg.OperatorFN,msg.OperatorSH,msg.MccMnc);
+    RLOGD("OperatorFN is %s,OperatorSH is %s,MccMnc is %s,NetStatus is %s",msg.OperatorFN,msg.OperatorSH,msg.MccMnc,msg.NetStatus);
+    sprintf(output, "Factory_result error code:%d\n",msg.base.e);

+    emResultNotify(output,command);

+

+    return 0;

+
+}
+ int eventQueryRegistrationState(char *type,int command)

+{

+    char output[1024] = {0};

+    registrationStateInfo msg;
+    msg.CID=NULL;
+    msg.LAC=NULL;

+    char str[10];

+    if (strlen(type)>10)
+    {
+        RLOGD("the parameter is inavaliable !");
+        return -1;
+    }
+    memcpy(str,type,strlen(type)+1);
+    strUpper(str);
+    //printf("upper str is %s\n",str);

+    lynq_query_registration_state(str,&msg);

+    if(!strcmp(str,"VOICE")){
+        //printf("request is %d,token is %x,error is %d,registration state is %d\n",

+        //msg.base.request,msg.base.token,msg.base.e,msg.regState);

+        RLOGD("request is %d,token is %x,error is %d",msg.base.request,msg.base.token,msg.base.e);
+        RLOGD("registration state is %d",msg.regState);
+    }else if(!strcmp(str,"DATA")){
+        //printf("request is %d,token is %x,error is %d,registration state is %d,LAC is %s,CID is %s,network type is %d\n",

+        //msg.base.request,msg.base.token,msg.base.e,msg.regState,msg.LAC,msg.CID,msg.netType);

+        RLOGD("request is %d,token is %x,error is %d",msg.base.request,msg.base.token,msg.base.e);
+        RLOGD("registration state is %d,LAC is %s,CID is %s,network type is %d",msg.regState,msg.LAC,msg.CID,msg.netType);
+    }else if(!strcmp(str,"IMS")){
+        //printf("request is %d,token is %x,error is %d,ims registration state is %d,radio tech family is %d\n",

+        //msg.base.request,msg.base.token,msg.base.e,msg.imsRegState,msg.radioTechFam);

+        RLOGD("request is %d,token is %x,error is %d",msg.base.request,msg.base.token,msg.base.e);
+        RLOGD("ims registration state is %d,radio tech family is %d",msg.imsRegState,msg.radioTechFam);
+    }else{
+        printf("--------->[%s,%d] query ims registration state about voice, data, and ims!!! \n",__FUNCTION__,__LINE__);
+        return -1;
+    }

+    sprintf(output, "Factory_result error code:%d\n",msg.base.e);

+    emResultNotify(output,command);

+    return 0;
+ }
+ int eventQueryPrefferredNetworkType(int command)

+{

+    char output[1024] = {0};

+    prefferredNetworkType msg;
+    lynq_query_prefferred_networktype(&msg);
+    //printf("request is %d,token is %x,error is %d,preffered network is %d\n",

+    //msg.base.request,msg.base.token,msg.base.e,msg.pnt);

+    RLOGD("request is %d,token is %x,error is %d",msg.base.request,msg.base.token,msg.base.e);
+    RLOGD("preffered network is %d",msg.pnt);

+    sprintf(output, "Factory_result error code:%d\n",msg.base.e);

+    emResultNotify(output,command);

+    return 0;
+}
+ int eventSetPrefferredNetworkType(const int type,int command)

+{
+    lynqBase msg;

+    char output[1024] = {0};

+    lynq_set_prefferred_networktype(type,&msg);

+    //printf("request is %d,token is %x,error is %d\n",

+    //msg.request,msg.token,msg.e);

+    RLOGD("request is %d,token is %x,error is %d",msg.request,msg.token,msg.e);

+    sprintf(output, "Factory_result error code:%d\n",msg.e);

+    emResultNotify(output,command);

+    return 0;
+}
+int eventQueryCellInfo(int command)

+{
+    cellInfoList **msg;

+    char output[1024] = {0};

+    int num=5;
+    int realNum =0;
+    int32_t token=0;
+    msg = (cellInfoList **)malloc(sizeof(cellInfoList *)*num);
+    if(msg==NULL)
+    {
+        RLOGD("malloc LYNQ_Data_Call_Response_v11 fail \n");
+        return -1;
+    }
+    for(int i =0;i<num;i++)
+    {
+        msg[i] = (cellInfoList*)malloc(sizeof(cellInfoList));
+        if (msg[i]==NULL)
+        {
+            for (int n=0;n<i;n++)
+            {
+                free(msg[n]);
+            }
+            return -1;
+        }
+        memset(msg[i],0,sizeof(cellInfoList));
+    }
+    token = lynq_query_cell_info(msg, num, &realNum);

+    /*

+    printf("request is %d,\ntoken is %x,\ne is %d\n",msg[0]->base.request,msg[0]->base.token,msg[0]->base.e);

+    for(int i = 0; i<realNum; i++)
+    {
+        //printf("request is %d,\ntoken is %x,\ne is %d\n",msg[i]->base.request,msg[i]->base.token,msg[i]->base.e);
+        printf("cellInfoType is %d\n",msg[i]->cellinfo.cellInfoType);
+        printf("registered is %d\n",msg[i]->cellinfo.registered);
+        printf("timeStampType is %d\n",msg[i]->cellinfo.timeStampType);
+        printf("timeStamp is %d\n",msg[i]->cellinfo.timeStamp);
+        switch(msg[i]->cellinfo.cellInfoType) {
+            case RIL_CELL_INFO_TYPE_GSM: {
+                printf("gsm.cellIdentityGsm.mcc is %d\n",msg[i]->cellinfo.CellInfo.gsm.cellIdentityGsm.mcc);
+                printf("gsm.cellIdentityGsm.mnc is %d\n",msg[i]->cellinfo.CellInfo.gsm.cellIdentityGsm.mnc);
+                printf("gsm.cellIdentityGsm.lac is %d\n",msg[i]->cellinfo.CellInfo.gsm.cellIdentityGsm.lac);
+                printf("gsm.cellIdentityGsm.cid is %d\n",msg[i]->cellinfo.CellInfo.gsm.cellIdentityGsm.cid);
+                printf("gsm.signalStrengthGsm.signalStrength is %d\n",msg[i]->cellinfo.CellInfo.gsm.signalStrengthGsm.signalStrength);
+                printf("gsm.signalStrengthGsm.bitErrorRate is %d\n",msg[i]->cellinfo.CellInfo.gsm.signalStrengthGsm.bitErrorRate);
+                printf("gsm.signalStrengthGsm.timingAdvance is %d\n",msg[i]->cellinfo.CellInfo.gsm.signalStrengthGsm.timingAdvance);
+                break;
+            }
+            case RIL_CELL_INFO_TYPE_WCDMA: {
+                printf("wcdma.cellIdentityWcdma.mcc is %d\n",msg[i]->cellinfo.CellInfo.wcdma.cellIdentityWcdma.mcc);
+                printf("wcdma.cellIdentityWcdma.mnc is %d\n",msg[i]->cellinfo.CellInfo.wcdma.cellIdentityWcdma.mnc);
+                printf("wcdma.cellIdentityWcdma.lac is%d\n",msg[i]->cellinfo.CellInfo.wcdma.cellIdentityWcdma.lac);
+                printf("wcdma.cellIdentityWcdma.cid is %d\n",msg[i]->cellinfo.CellInfo.wcdma.cellIdentityWcdma.cid);
+                printf("wcdma.cellIdentityWcdma.psc is %d\n",msg[i]->cellinfo.CellInfo.wcdma.cellIdentityWcdma.psc);
+                printf("wcdma.signalStrengthWcdma.signalStrength is %d\n",msg[i]->cellinfo.CellInfo.wcdma.signalStrengthWcdma.signalStrength);
+                printf("wcdma.signalStrengthWcdma.bitErrorRate is %d\n",msg[i]->cellinfo.CellInfo.wcdma.signalStrengthWcdma.bitErrorRate);
+                break;
+            }
+            case RIL_CELL_INFO_TYPE_CDMA: {
+                printf("cdma.cellIdentityCdma.networkId is %d\n",msg[i]->cellinfo.CellInfo.cdma.cellIdentityCdma.networkId);
+                printf("cdma.cellIdentityCdma.systemId is %d\n",msg[i]->cellinfo.CellInfo.cdma.cellIdentityCdma.systemId);
+                printf("cdma.cellIdentityCdma.basestationId is %d\n",msg[i]->cellinfo.CellInfo.cdma.cellIdentityCdma.basestationId);
+                printf("cdma.cellIdentityCdma.longitude is %d\n",msg[i]->cellinfo.CellInfo.cdma.cellIdentityCdma.longitude);
+                printf("cdma.cellIdentityCdma.latitude is %d\n",msg[i]->cellinfo.CellInfo.cdma.cellIdentityCdma.latitude);
+                printf("cdma.signalStrengthCdma.dbm is %d\n",msg[i]->cellinfo.CellInfo.cdma.signalStrengthCdma.dbm);
+                printf("cdma.signalStrengthCdma.ecio is %d\n",msg[i]->cellinfo.CellInfo.cdma.signalStrengthCdma.ecio);
+                printf("cdma.signalStrengthEvdo.dbm is %d\n",msg[i]->cellinfo.CellInfo.cdma.signalStrengthEvdo.dbm);
+                printf("cdma.signalStrengthEvdo.ecio is %d\n",msg[i]->cellinfo.CellInfo.cdma.signalStrengthEvdo.ecio);
+                printf("cdma.signalStrengthEvdo.signalNoiseRatio is %d\n",msg[i]->cellinfo.CellInfo.cdma.signalStrengthEvdo.signalNoiseRatio);
+                break;
+            }
+            case RIL_CELL_INFO_TYPE_LTE: {
+                printf("lte.cellIdentityLte.mcc is %d\n",msg[i]->cellinfo.CellInfo.lte.cellIdentityLte.mcc);
+                printf("lte.cellIdentityLte.mnc is %d\n",msg[i]->cellinfo.CellInfo.lte.cellIdentityLte.mnc);
+                printf("lte.cellIdentityLte.ci is %d\n",msg[i]->cellinfo.CellInfo.lte.cellIdentityLte.ci);
+                printf("lte.cellIdentityLte.pci is %d\n",msg[i]->cellinfo.CellInfo.lte.cellIdentityLte.pci);
+                printf("lte.cellIdentityLte.tac is %d\n",msg[i]->cellinfo.CellInfo.lte.cellIdentityLte.tac);
+                printf("lte.signalStrengthLte.signalStrength is %d\n",msg[i]->cellinfo.CellInfo.lte.signalStrengthLte.signalStrength);
+                printf("lte.signalStrengthLte.rsrp is %d\n",msg[i]->cellinfo.CellInfo.lte.signalStrengthLte.rsrp);
+                printf("lte.signalStrengthLte.rsrq is %d\n",msg[i]->cellinfo.CellInfo.lte.signalStrengthLte.rsrq);
+                printf("lte.signalStrengthLte.rssnr is %d\n",msg[i]->cellinfo.CellInfo.lte.signalStrengthLte.rssnr);
+                printf("lte.signalStrengthLte.cqi is %d\n",msg[i]->cellinfo.CellInfo.lte.signalStrengthLte.cqi);
+                printf("lte.signalStrengthLte.timingAdvance is %d\n",msg[i]->cellinfo.CellInfo.lte.signalStrengthLte.timingAdvance);
+                break;
+            }
+            case RIL_CELL_INFO_TYPE_TD_SCDMA: {
+                printf("tdscdma.cellIdentityTdscdma.mcc is %d\n",msg[i]->cellinfo.CellInfo.tdscdma.cellIdentityTdscdma.mcc);
+                printf("tdscdma.cellIdentityTdscdma.mnc is %d\n",msg[i]->cellinfo.CellInfo.tdscdma.cellIdentityTdscdma.mnc);
+                printf("tdscdma.cellIdentityTdscdma.lac is %d\n",msg[i]->cellinfo.CellInfo.tdscdma.cellIdentityTdscdma.lac);
+                printf("tdscdma.cellIdentityTdscdma.cid is %d\n",msg[i]->cellinfo.CellInfo.tdscdma.cellIdentityTdscdma.cid);
+                printf("tdscdma.cellIdentityTdscdma.cpid is %d\n",msg[i]->cellinfo.CellInfo.tdscdma.cellIdentityTdscdma.cpid);
+                printf("tdscdma.signalStrengthTdscdma.rscp is %d\n",msg[i]->cellinfo.CellInfo.tdscdma.signalStrengthTdscdma.rscp);
+                break;
+            }
+        }
+    }*/

+    sprintf(output, "Factory_result error code:%d\n",msg[0]->base.e);

+    emResultNotify(output,command);

+    for (int i = 0; i < num; i++) 
+    {
+        if (msg[i]!=NULL)
+        {    
+            free(msg[i]);
+            msg[i]=NULL;
+        }
+    }
+    free(msg);
+    msg=NULL;
+    return 0;
+}
+int eventSetUnsolCellInfoListrate(const int rate,int command)

+{
+    lynqBase msg;

+    char output[1024] = {0};

+    lynq_set_unsol_cell_info_listrate(rate,&msg);

+    //printf("request is %d,token is %x,error is %d\n",

+    //msg.request,msg.token,msg.e);

+    RLOGD("request is %d,token is %x,error is %d",msg.request,msg.token,msg.e);

+    sprintf(output, "Factory_result error code:%d\n",msg.e);

+    emResultNotify(output,command);

+    return 0;
+}
+int eventQueryNeighboringCellids(int command)

+{
+    neighboringCellIDs **msg=NULL;

+    char output[1024] = {0};

+    //printf("neighboring celll ids\n");

+    int num=5;
+    int realNum =0;
+    int32_t token=0;
+    msg = (neighboringCellIDs **)malloc(sizeof(neighboringCellIDs *)*num);
+    if(msg==NULL)
+    {
+        RLOGD("malloc LYNQ_Data_Call_Response_v11 fail \n");
+        return -1;
+    }
+    for(int i =0;i<num;i++)
+    {
+        msg[i] = (neighboringCellIDs*)malloc(sizeof(neighboringCellIDs));
+        msg[i]->cid = (char*)malloc(sizeof(char));
+        if (msg[i]==NULL)
+        {
+            for (int n=0;n<i;n++)
+            {
+                free(msg[n]->cid);
+                free(msg[n]);
+            }
+            return -1;
+        }
+        memset(msg[i],0,sizeof(neighboringCellIDs));
+    }
+    token = lynq_query_neighboring_cellids(msg, num, &realNum);
+    //printf("request is %d,token is %x,error is %d\n",

+    //msg[0]->base.request,msg[0]->base.token,msg[0]->base.e);

+    /*

+    for(int i =0;i<realNum;i++)
+    {
+        printf("request is %d,token is %x,error is %d,cid is %s,rssi is %d\n",
+        msg[i]->base.request,msg[i]->base.token,msg[i]->base.e,msg[i]->cid,msg[i]->rssi);
+        RLOGD("request is %d,token is %x,error is %d",msg[i]->base.request,msg[i]->base.token,msg[i]->base.e);
+        RLOGD("cid is %s,rssi is %d %d",msg[i]->cid,msg[i]->rssi);
+    }

+    */

+    sprintf(output, "Factory_result error code:%d\n",msg[0]->base.e);

+    emResultNotify(output,command);

+    for (int i = 0; i < num; i++) 
+    {
+        if (msg[i]!=NULL)
+        {
+            free(msg[i]->cid);
+            msg[i]->cid=NULL;
+            free(msg[i]);
+            msg[i]=NULL;
+        }
+    }
+    free(msg);
+    msg=NULL;
+    return 0;
+}
+int eventSetBandMode(const int mode,int command)

+{
+    lynqBase msg;

+    char output[1024] = {0};

+    lynq_set_band_mode(mode,&msg);

+    //printf("request is %d,token is %x,error is %d\n",msg.request,msg.token,msg.e);

+    RLOGD("request is %d,token is %x,error is %d",msg.request,msg.token,msg.e);

+    sprintf(output, "Factory_result error code:%d\n",msg.e);

+    emResultNotify(output,command);

+    return 0;
+
+}
+int eventQueryAvailableBandmode(int command)

+{
+    availableBandMode msg;

+    char output[1024] = {0};

+    lynq_query_available_bandmode(&msg);
+    //printf("request is %d,token is %x,error is %d,\n",msg.base.request,msg.base.token,msg.base.e);

+    RLOGD("request is %d,token is %x,error is %d",msg.base.request,msg.base.token,msg.base.e);
+    if(msg.bandmode[0]>0)
+    {
+        printf("available band mode is:");
+        for(int i =1;i<=msg.bandmode[0];i++)
+        {
+            printf("%d,",msg.bandmode[i]);
+        }
+        printf("\n");

+        sprintf(output, "Factory_result error code:%d\n",msg.base.e);

+        emResultNotify(output,command);

+        return 0;

+    }

+    sprintf(output, "Factory_result error code:%d\n",msg.base.e);

+    emResultNotify(output,command);

+    RLOGD("available band mode is null");

+    return 0;
+}
+int eventRadioOn(const int state,int command)

+{
+    lynqBase msg;

+    char output[1024] = {0};

+    lynq_radio_on(state,&msg);

+    //printf("request is %d,token is %x,error is %d\n",msg.request,msg.token,msg.e);

+    RLOGD("request is %d,token is %x,error is %d",msg.request,msg.token,msg.e);

+    sprintf(output, "Factory_result error code:%d\n",msg.e);

+    emResultNotify(output,command);

+    return 0;
+}
+int eventQueryRadioTech(int command)

+{
+    radioTechnology msg;

+    char output[1024] = {0};

+    lynq_query_radio_tech(&msg);
+    //printf("request is %d,token is %x,error is %d,RadioTech is %d\n",

+    //msg.base.request,msg.base.token,msg.base.e,msg.radioTech);

+    RLOGD("request is %d,token is %x,error is %d",msg.base.request,msg.base.token,msg.base.e);
+    RLOGD("RadioTech %d",msg.radioTech);

+    sprintf(output, "Factory_result error code:%d\n",msg.base.e);

+    emResultNotify(output,command);

+    return 0;
+return 0;}
+int eventSolicitedSignalStrength(int command)

+{
+    solicitedSignalStrength msg;

+    char output[1024] = {0};

+    lynq_solicited_signal_strength(&msg);
+    //printf("request is %d,token is %x,error is %d\n",

+    //msg.base.request,msg.base.token,msg.base.e);

+    RLOGD("request is %d,token is %x,error is %d",msg.base.request,msg.base.token,msg.base.e);
+    if(msg.base.e!=RIL_E_SUCCESS)
+    {
+        return -1;
+    }

+    /*

+    printf("V5 GW signalStrength=%d\n", msg.signalStrength.GW_SignalStrength.signalStrength);
+    printf("GW bitErrorRate=%d\n", msg.signalStrength.GW_SignalStrength.bitErrorRate);
+    printf("GW timingAdvance=%d\n", msg.signalStrength.GW_SignalStrength.timingAdvance);
+    printf("CDMA dbm=%d\n", msg.signalStrength.CDMA_SignalStrength.dbm);
+    printf("CDMA ecio=%d\n", msg.signalStrength.CDMA_SignalStrength.ecio);
+    printf("EVDO dbm=%d\n", msg.signalStrength.EVDO_SignalStrength.dbm);
+    printf("EVDO ecio=%d\n", msg.signalStrength.EVDO_SignalStrength.ecio);
+    printf("EVDO signalNoiseRatio=%d\n", msg.signalStrength.EVDO_SignalStrength.signalNoiseRatio);
+    printf("V6 LTE signalStrength=%d\n", msg.signalStrength.LTE_SignalStrength.signalStrength);
+    printf("LTE rsrp=%d\n", msg.signalStrength.LTE_SignalStrength.rsrp);
+    printf("LTE rsrq=%d\n", msg.signalStrength.LTE_SignalStrength.rsrq);
+    printf("LTE rssnr=%d\n", msg.signalStrength.LTE_SignalStrength.rssnr);
+    printf("LTE cqi=%d\n", msg.signalStrength.LTE_SignalStrength.cqi);
+    printf("LTE timingAdvance=%d\n", msg.signalStrength.LTE_SignalStrength.timingAdvance);
+    printf("TD_SCDMA signalStrength=%d\n", msg.signalStrength.TD_SCDMA_SignalStrength.signalStrength);
+    printf("TD_SCDMA bitErrorRate=%d\n", msg.signalStrength.TD_SCDMA_SignalStrength.bitErrorRate);
+    printf("TD_SCDMA rscp=%d\n", msg.signalStrength.TD_SCDMA_SignalStrength.rscp);
+    printf("WCDMA signalStrength=%d\n", msg.signalStrength.WCDMA_SignalStrength.signalStrength);
+    printf("WCDMA bitErrorRate=%d\n", msg.signalStrength.WCDMA_SignalStrength.bitErrorRate);
+    printf("WCDMA rscp=%d\n", msg.signalStrength.WCDMA_SignalStrength.rscp);
+    printf("WCDMA ecno=%d\n", msg.signalStrength.WCDMA_SignalStrength.ecno);

+    */

+    sprintf(output, "Factory_result error code:%d\n",msg.base.e);

+    emResultNotify(output,command);

+    return 0;
+}
+int eventModemOn(const int state,int command)

+{
+    lynqBase msg;

+    char output[1024] = {0};

+    lynq_modem_on(state,&msg);

+    //printf("request is %d,token is %x,error is %d\n",msg.request,msg.token,msg.e);

+    RLOGD("request is %d,token is %x,error is %d",msg.request,msg.token,msg.e);

+    sprintf(output, "Factory_result error code:%d\n",msg.e);

+    emResultNotify(output,command);

+    return 0;
+}

+int eventSetupDataCall(int command)

+{
+    int32_t token;

+    char output[1024] = {0};

+    int state=0;
+    token = lynq_data_enable_data(&state);
+    //printf("pdn state is %s\n",state<0?"disconnect":"connect");

+    sprintf(output, "Factory_result pdn state is %s\n",state<0?"disconnect":"connect");

+    emResultNotify(output,command);

+    return 0;
+}
+int eventDeactiveDataCall(int command)

+{
+    int32_t token;
+    int state=0;

+    char output[1024] = {0};

+    token = lynq_data_dectivate_data_call(&state);
+    //printf("pdn state is %s\n",state<0?"connect":"disconnect");

+    sprintf(output, "Factory_result pdn state is %s\n",state<0?"connect":"disconnect");

+    emResultNotify(output,command);

+    return 0;
+}
+int eventGetDataCalllist(int command)

+{
+    int32_t token=0;

+    char output[1024] = {0};

+    int num=5;
+    int realNum=0;
+    LYNQ_Data_Call_Response_v11 **msg=(LYNQ_Data_Call_Response_v11**)malloc(sizeof(LYNQ_Data_Call_Response_v11*)*num);
+    if (msg == NULL)
+    {
+        printf("malloc LYNQ_Data_Call_Response_v11 fail \n");
+        return -1;
+    }
+    for(int i =0;i<num;i++)
+    {
+        msg[i] = (LYNQ_Data_Call_Response_v11*)malloc(sizeof(LYNQ_Data_Call_Response_v11));
+        if (msg[i]==NULL)
+        {
+            for (int n=0;n<i;n++)
+            {
+                free(msg[n]);
+            }
+            return -1;
+        }
+        memset(msg[i],0,sizeof(LYNQ_Data_Call_Response_v11));
+    }
+    token = lynq_get_data_call_list(msg, num,&realNum);

+    /*

+    for(int i = 0; i<realNum; i++)
+    {

+        printf("status is %d,\nsuggestedRetryTime is %d,\ncid is %d,\nactive is %d,\nmtu is %d\n",msg[i]->status,msg[i]->suggestedRetryTime,msg[i]->cid,msg[i]->active,msg[i]->mtu);
+        printf("type is %s\n",msg[i]->type);
+        printf("ifname is %s\n",msg[i]->ifname);
+        printf("addresses is %s\n",msg[i]->addresses);
+        printf("dnses is %s\n",msg[i]->dnses);
+        printf("gateways is %s\n",msg[i]->gateways);
+        printf("pcscf is %s\n",msg[i]->pcscf);
+    }

+    */

+    if(realNum>0)

+    {

+        sprintf(output, "Factory_result error code 1\n");

+        emResultNotify(output,command);

+    }

+    else

+    {

+        sprintf(output, "Factory_result error code 2\n");

+        emResultNotify(output,command);

+    }

+    for (int i = 0; i < num; i++) 
+    {
+        if (msg[i]!=NULL)
+        {    
+            free(msg[i]);
+            msg[i]=NULL;
+        }
+    }
+    free(msg);
+    msg=NULL;
+    return 0;

+}
+

+int eventGetSimStatus(int command)

+{
+    static int32_t token=0;

+    char output[1024] = {0};

+    simStatus * sim_status=NULL;
+    sim_status = (simStatus *)malloc(sizeof(simStatus));
+    token = lynq_get_sim_status(sim_status);
+    //printf("card_status:%d,card_type:%d,pin_state:%d,error_code:%d,request:%d,token:%x\n",sim_status->card_status,

+        //sim_status->card_type,sim_status->pin_state,sim_status->base.e,sim_status->base.request,sim_status->base.token);

+    RLOGD("card_status:%d,card_type:%d,pin_state:%d,error_code:%d,request:%d,token:%x",sim_status->card_status,
+        sim_status->card_type,sim_status->pin_state,sim_status->base.e,sim_status->base.request,sim_status->base.token);
+    sprintf(output, "Factory_result error code %d\n",sim_status->base.e);

+    emResultNotify(output,command);

+    if (sim_status->base.e==-1)

+    {
+        free(sim_status);
+        sim_status=NULL;
+        return -1;
+    }
+    free(sim_status);
+    sim_status=NULL;
+    return 0;
+}
+int eventGetImsi(int command)

+{
+    simImsi msg;

+    char output[1024] = {0};

+    lynq_get_imsi(&msg);
+    //printf("request is %d, token is %x,error_code %d,imsi is %s\n",msg.base.request,msg.base.token, msg.base.e,msg.imsi);

+    RLOGD("request is %d, token is %x,error_code %d,imsi is %s",msg.base.request,msg.base.token, msg.base.e,msg.imsi);
+    sprintf(output, "Factory_result error code %d\n",msg.base.e);

+    emResultNotify(output,command);

+    if (msg.base.e==-1)

+    {
+        return -1;
+    }
+    return 0;
+}

+int eventSendSms(const char *telephonyNumber, const char *msgcont,int command)

+{
+    int32_t token=0;

+    char output[1024] = {0};

+    smsResponse msg;
+    msg.smsResp.ackPDU=NULL;

+    //const char *telephonyNumber ="10086";

+    //const char * msgcont = "103";

+    token = lynq_send_sms(telephonyNumber, 0,msgcont, NULL,&msg);

+    //printf("request is %d,token is %x,error is %d,\nmessageRef is %d,ackPDU is %s,errorCode is %d\n",msg.base.request,msg.base.token,msg.base.e,

+        //msg.smsResp.messageRef,msg.smsResp.ackPDU,msg.smsResp.errorCode);

+    RLOGD("request is %d,token is %x,error is %d,messageRef is %d,ackPDU is %s,errorCode is %d",msg.base.request,msg.base.token,msg.base.e,
+        msg.smsResp.messageRef,msg.smsResp.ackPDU,msg.smsResp.errorCode);

+    sprintf(output, "Factory_result error code %d\n",msg.base.e);

+    emResultNotify(output,command);

+    return 0;
+}
+int eventImsSendSms(const char *telephonyNumber, const char *msgcont,int command)

+{
+    int32_t token=0;

+    char output[1024] = {0};

+    smsResponse msg;
+    msg.smsResp.ackPDU=NULL;

+    //const char *telephonyNumber ="10086";

+    //const char * msgcont = "103";

+    const char* retryNum ="0";

+    const char *messageRef = "201";

+    token = lynq_Ims_send_sms(telephonyNumber, 0,msgcont,retryNum,messageRef, NULL,&msg);

+    //printf("request is %d,token is %x,error is %d,\nmessageRef is %d,ackPDU is %s,errorCode is %d\n",msg.base.request,msg.base.token,msg.base.e,

+        //msg.smsResp.messageRef,msg.smsResp.ackPDU,msg.smsResp.errorCode);

+    RLOGD("request is %d,token is %x,error is %d,messageRef is %d,ackPDU is %s,errorCode is %d",msg.base.request,msg.base.token,msg.base.e,
+        msg.smsResp.messageRef,msg.smsResp.ackPDU,msg.smsResp.errorCode);

+    sprintf(output, "Factory_result error code %d\n",msg.base.e);

+    emResultNotify(output,command);

+    return 0;
+}
+int eventWriteSmsToSim(int smsStatus,const char *recPhonNum, const char *msgcont,int command)

+{
+    int32_t token=0;

+    char output[1024] = {0};

+    messageStoreInfo msg;

+    //const int smsStatus = 2;

+    //const char *recPhonNum = "10086";

+    //const char *msgcont = "103";

+    token = lynq_write_sms_to_sim(smsStatus,recPhonNum,0,msgcont,NULL,&msg);

+    //printf("request is %d,token is %x,error is %d,\nmessage strore index is %d\n",msg.base.request,msg.base.token,msg.base.e,

+        //msg.msgStoreIndex);

+    RLOGD("request is %d,token is %x,error is %d,\nmessage strore index is %d\n",msg.base.request,msg.base.token,msg.base.e,
+        msg.msgStoreIndex);

+    sprintf(output, "Factory_result error code %d\n",msg.base.e);

+    emResultNotify(output,command);

+    return 0;
+}
+int eventReportSmsMemoryStatus(const int value,int command)

+{
+    lynqBase msg;

+    char output[1024] = {0};

+    lynq_report_sms_memory_status(value,&msg);

+    //printf("request is %d,token is %x,error is %d,\n",msg.request,msg.token,msg.e);

+    RLOGD("request is %d,token is %x,error is %d",msg.request,msg.token,msg.e);

+    sprintf(output, "Factory_result error code %d\n",msg.e);

+    emResultNotify(output,command);

+    return 0;
+}
+int eventDeletSmsOnSim(const int value,int command)

+{
+    lynqBase msg;

+    char output[1024] = {0};

+    lynq_delet_sms_on_sim(value,&msg);

+    //printf("request is %d,token is %x,error is %d,\n",msg.request,msg.token,msg.e);

+    RLOGD("request is %d,token is %x,error is %d",msg.request,msg.token,msg.e);

+    sprintf(output, "Factory_result error code %d\n",msg.e);

+    emResultNotify(output,command);

+    return 0;
+}
+int eventGetSmscAddress(int command)

+{
+    smscCbInfo msg;

+    char output[1024] = {0};

+    lynq_get_smsc_address(&msg);
+    //printf("request is %d,token is %x,error is %d,smsc address is %s\n",msg.base.request,msg.base.token,msg.base.e,msg.smsc);

+    RLOGD("request is %d,token is %x,error is %d,smsc address is %s",msg.base.request,msg.base.token,msg.base.e,msg.smsc);

+    sprintf(output, "Factory_result error code %d\n",msg.base.e);

+    emResultNotify(output,command);

+    return 0;
+}
+int eventSetSmscAddress(const char* serviceNumber,int command)

+{
+    lynqBase msg;

+    char output[1024] = {0};

+    //const char* serviceNumber = "+8613800280500";

+    lynq_set_smsc_address(serviceNumber,&msg);

+    //printf("request is %d,token is %x,error is %d,\n",msg.request,msg.token,msg.e);

+    RLOGD("request is %d,token is %x,error is %d",msg.request,msg.token,msg.e);

+    sprintf(output, "Factory_result error code %d\n",msg.e);

+    emResultNotify(output,command);

+    return 0;

+}

+int callController(int *item, char *value,int command);

+int networkcontroller(int *item, char *value,int command);

+int datacontroller(int *item, char *value,int command);

+int simcontroller(int *item, char *value,int command);

+int smscontroller(int *item, char *value,int command);

+int ril_test(int *item, char *value,char *data,int command) {

+    int ril_api_choice = item[2];

+    switch (ril_api_choice) {

+        case CALL_API:

+        {

+            callController(item,value,command);

+            break;

+        }

+        case NETWORK_API:

+        {

+            networkcontroller(item,value,command);

+            break;

+        }

+        case DATA_API:

+        {

+            datacontroller(item,value,command);

+            break;

+        }

+        case SMS_API:

+        {

+            smscontroller(item,value,command);

+            //RLOGD("test_api,RIL_API");

+            break;

+        }

+        case SIM_API:

+        {

+            simcontroller(item,value,command);

+            break;

+        }

+        default:

+            break;

+    }

+    printf("value:%s\n",value);

+    return 0;

+}

+int callController(int *item, char *value,int command)

+{

+    int call_api_choice = item[3];

+    char output[1024] = {0};

+    switch(call_api_choice)

+    {

+        case DAIL:

+        {

+            int num=0;

+            char *argv[2]={0};

+            if(num=parseParam(1, value,argv))

+            {

+                eventDial(argv[1],command);

+            }

+            else

+            {

+                sprintf(output, "please input caavaliable call number,and try again!\n");

+                emResultNotify(output,command);

+            }

+            break;

+        }

+        case ANSWER_CALL:

+        {

+            eventAnswer(command);

+            break;

+        }

+        case HANGUP_CALL:

+        {

+            int num=0;

+            char *argv[2]={0};

+            if(num=parseParam(1, value,argv))

+            {

+                eventCallHangUp(atoi(&argv[1][0]),command);

+            }

+            else

+            {

+                sprintf(output, "please input call id,and try again!\n");

+                emResultNotify(output ,command);

+            }

+            break;

+        }

+        case REJECT_CALL:

+        {

+            eventRejectCall(command);

+            break;

+        }

+        case AUTO_ANSWER_CALL:

+        {

+            int num=0;

+            char *argv[2]={0};

+            if(num=parseParam(1, value,argv))

+            {

+                eventAutoAnswer(atoi(&argv[1][0]),command);

+            }

+            else

+            {

+                sprintf(output,"please input auto answer mode value:0 or 1,and try again!\n");

+                emResultNotify(output,command);

+            }

+            break;

+        }

+        case SET_MUTE_STATUS:

+        {

+            int num=0;

+            char *argv[2]={0};

+            if(num=parseParam(1, value,argv))

+            {

+                eventSetMute(atoi(&argv[1][0]),command);

+            }

+            else

+            {

+                sprintf(output,"please input set mute mode:0 or 1,and try again!\n");

+                emResultNotify(output,command);

+            }

+            break;

+        }

+        case GET_MUTE_STATUS:

+        {

+            eventGetMute(command);

+            break;

+        }

+        case SET_DTMF:

+        {

+            int num=0;

+            char *argv[2]={0};

+            if(num=parseParam(1, value,argv))

+            {

+                eventSetDTMF(argv[1][0],command);

+            }

+            else

+            {

+                sprintf(output,"please input DTMF value:0-9,8,#,and try again!\n");

+                emResultNotify(output,command);

+            }

+            break;

+        }

+        case SET_DTMF_V:

+        {

+            int num=0;

+            char *argv[2]={0};

+            if(num=parseParam(1, value,argv))

+            {

+                eventSetDTMFVolume(atoi(&argv[1][0]),command);

+            }

+            else

+            {

+                sprintf(output,"please input volume value,0-36,and try again!\n");

+                emResultNotify(output,command);

+            }

+            break;

+        }

+        case DO_MULTI_CONF:

+        {

+            eventDoMultiConference(command);

+            break;

+        }

+        case OTHER_CALL_HOLD:

+        {

+            int num=0;

+            char *argv[2]={0};

+            if(num=parseParam(1, value,argv))

+            {

+                eventOthercallHold(atoi(&argv[1][0]),command);

+            }

+            else

+            {

+                sprintf(output,"please input call id, and try again!\n");

+                emResultNotify(output,command);

+            }

+            break;

+        }

+        case HANGUP_WAITING_CALL:

+        {

+            eventHangupWatingForCall(command);

+            break;

+        }

+        case HANGUP_FORE_RES_BACK:

+        {

+            eventHangupForegroundResumeBackground(command);

+            break;

+        }

+        case SWITCH_HOLD_AND_ACTIVE_CALL:

+        {

+            eventSwitchWaitOrHoldAndActiveCall(command);

+            break;

+        }

+        case GET_LAST_CALL_FAIL_CAUSE:

+        {

+            eventLastCallFailCause(command);

+            break;

+        }

+        default:

+            break;

+    }

+    return 0;

+}

+int networkcontroller(int *item, char *value,int command)

+{

+    int network_api_choice = item[3];

+    char output[1024] = {0};

+    switch(network_api_choice)

+    {

+        case QUERY_OPERATOR:

+        {

+            eventQueryOperator(command);

+            break;

+        }

+        case QUERY_NETWORK_SELECTION_MODE:

+        {

+            eventQueryNetSelectMode(command);

+            break;

+        }

+        case SET_NETWORK_SELECTION_MODE:

+        {

+            int num=0;

+            char *argv[2]={0};

+            if(num=parseParam(1, value,argv))

+            {

+                eventSetNetSelectMode(atoi(&argv[1][0]),command);

+            }

+            else

+            {

+                sprintf(output,"please input network selection mode 0 or 1, and try again!\n");

+                emResultNotify(output,command);

+            }

+            break;

+        }

+        case QUERY_AVAILABLE_NETWORKS:

+        {

+            eventQueryAvailableNetwork(command);

+            break;

+        }

+        case QUERY_REGISTRATION_STATE:

+        {

+            int num=0;

+            char *argv[2]={0};

+            if(num=parseParam(1, value,argv))

+            {

+                eventQueryRegistrationState(argv[1],command);

+            }

+            else

+            {

+                sprintf(output,"please input type voice,data,or ims, and try again!\n");

+                emResultNotify(output,command);

+            }

+            break;

+        }

+        case GET_PREFERRED_NETWORK_TYPE:

+        {

+            eventQueryPrefferredNetworkType(command);

+            break;

+        }

+        case SET_PREFERRED_NETWORK_TYPE:

+        {

+            int num=0;

+            char *argv[2]={0};

+            if(num=parseParam(1, value,argv))

+            {

+                eventSetPrefferredNetworkType(atoi(&argv[1][0]),command);

+            }

+            else

+            {

+                sprintf(output,"please input preferred network type value , and try again!\n");

+                emResultNotify(output,command);

+            }

+            break;

+        }

+        case GET_CELL_INFO_LIST:

+        {

+            eventQueryCellInfo(command);

+            break;

+        }

+        case SET_UNSOL_CELL_INFO_LIST_RATE:

+        {

+            int num=0;

+            char *argv[2]={0};

+            if(num=parseParam(1, value,argv))

+            {

+                eventSetUnsolCellInfoListrate(atoi(&argv[1][0]),command);

+            }

+            else

+            {

+                sprintf(output,"please input unsolicited cell infomation list rate , and try again!\n");

+                emResultNotify(output,command);

+            }

+            break;

+        }

+        case GET_NEIGHBORING_CELL_IDS:

+        {

+            eventQueryNeighboringCellids(command);

+            break;

+        }

+        case SET_BAND_MODE:

+        {

+            int num=0;

+            char *argv[2]={0};

+            if(num=parseParam(1, value,argv))

+            {

+                eventSetBandMode(atoi(&argv[1][0]),command);

+            }

+            else

+            {

+                sprintf(output,"please input band mode, and try again!\n");

+                emResultNotify(output,command);

+            }

+            break;

+        }

+        case QUERY_AVAILABLE_BAND_MODE:

+        {

+            eventQueryAvailableBandmode(command);

+            break;

+        }

+        case RADIO_POWER:

+        {

+            int num=0;

+            char *argv[2]={0};

+            if(num=parseParam(1, value,argv))

+            {

+                eventRadioOn(atoi(&argv[1][0]),command);

+            }

+            else

+            {

+                sprintf(output,"please input radio power status value 0 or 1, and try again!\n");

+                emResultNotify(output,command);

+            }

+            break;

+        }

+        case VOICE_RADIO_TECH:

+        {

+            eventQueryRadioTech(command);

+            break;

+        }

+        case SIGNAL_STRENGTH:

+        {

+            eventSolicitedSignalStrength(command);

+            break;

+        }

+        case MODEM_POWER:

+        {

+            int num=0;

+            char *argv[2]={0};

+            if(num=parseParam(1, value,argv))

+            {

+                eventModemOn(atoi(&argv[1][0]),command);

+            }

+            else

+            {

+                sprintf(output,"please input modem power status value 0 or 1, and try again!\n");

+                emResultNotify(output,command);

+            }

+            break;

+        }

+        default:

+            break;

+    }

+    return 0;

+}

+int datacontroller(int *item, char *value,int command)

+{

+    int data_api_choice = item[3];

+    char output[1024] = {0};

+    switch(data_api_choice)

+    {

+        case SETUP_DATA_CALL:

+        {

+            eventSetupDataCall(command);

+            break;

+        }

+        case DEACTIVATE_DATA_CALL:

+        {

+            eventDeactiveDataCall(command);

+            break;

+        }

+        case GET_DATA_CALL_LIST:

+        {

+            eventGetDataCalllist(command);

+            break;

+        }

+        default:

+            break;

+    }

+    return 0;

+}

+int simcontroller(int *item, char *value,int command)

+{

+    int sim_api_choice = item[3];

+    char output[1024] = {0};

+    switch(sim_api_choice)

+    {

+        case GET_SIM_STATUS:

+        {

+            eventGetSimStatus(command);

+            break;

+        }

+        case GET_IMSI:

+        {

+            eventGetImsi(command);

+            break;

+        }

+        default:

+            break;

+    }

+    return 0;

+}

+int smscontroller(int *item, char *value,int command)

+{

+    int sms_api_choice = item[3];

+    char output[1024] = {0};

+    switch(sms_api_choice)

+    {

+        case SEND_SMS:

+        {

+            int num=0;

+            char *argv[MAX_P]={0};

+            if(num=parseParam(2, value,argv))

+            {

+                eventSendSms(argv[1], argv[2],command);

+            }

+            else

+            {

+                sprintf(output,"please input phone number and message, and try again!\n");

+                emResultNotify(output,command);

+            }

+            break;

+        }

+        case IMS_SEND_SMS:

+        {

+            int num=0;

+            char *argv[MAX_P]={0};

+            if(num=parseParam(2, value,argv))

+            {

+                eventImsSendSms(argv[1], argv[2],command);

+            }

+            else

+            {

+                sprintf(output,"please input phone number and message, and try again!\n");

+                emResultNotify(output,command);

+            }

+            break;

+        }

+        case WRITE_SMS_TO_SIM:

+        {

+            int num=0;

+            char *argv[MAX_P]={0};

+            if(num=parseParam(3, value,argv))

+            {

+                eventWriteSmsToSim(atoi(&argv[1][0]),argv[2], argv[3],command);

+            }

+            else

+            {

+                sprintf(output,"please input sms status,phone number and message, and try again!\n");

+                emResultNotify(output,command);

+            }

+            break;

+        }

+        case REPORT_SMS_MEMORY_STATUS:

+        {

+            int num=0;

+            char *argv[MAX_P]={0};

+            if(num=parseParam(1, value,argv))

+            {

+                eventReportSmsMemoryStatus(atoi(&argv[1][0]),command);

+            }

+            else

+            {

+                sprintf(output,"please input memory status 0 or 1,and try agin!\n");

+                emResultNotify(output,command);

+            }

+            break;

+        }

+        case DELETE_SMS_ON_SIM:

+        {

+            int num=0;

+            char *argv[MAX_P]={0};

+            if(num=parseParam(1, value,argv))

+            {

+                eventDeletSmsOnSim(atoi(&argv[1][0]),command);

+            }

+            else

+            {

+                sprintf(output,"please input sms index,and try agin!\n");

+                emResultNotify(output,command);

+            }

+            break;

+        }

+        case GET_SMSC_ADDRESS:

+        {

+            eventGetSmscAddress(command);

+            break;

+        }

+        case SET_SMSC_ADDRESS:

+        {

+            int num=0;

+            char *argv[MAX_P]={0};

+            if(num=parseParam(1, value,argv))

+            {

+                eventSetSmscAddress(argv[1],command);

+            }

+            else

+            {

+                sprintf(output,"please input serviceNumber,and try agin!\n");

+                emResultNotify(output,command);

+            }

+            break;

+        }

+    }

+    return 0;

+}

+

diff --git a/IC_src/mtk/packages/apps/lynq-factorytest/src/ril/ril_test.h b/IC_src/mtk/packages/apps/lynq-factorytest/src/ril/ril_test.h
new file mode 100644
index 0000000..5582b3f
--- /dev/null
+++ b/IC_src/mtk/packages/apps/lynq-factorytest/src/ril/ril_test.h
@@ -0,0 +1,73 @@
+#ifndef __LYNQ_RIL_TEST_H__
+#define __LYNQ_RIL_TEST_H__
+typedef enum {
+   CALL_API  = 0,
+   NETWORK_API,
+   DATA_API,
+   SMS_API,
+   SIM_API,
+   //GET_IMEI_API,
+}RIL_API_MENU;
+typedef enum{
+    DAIL= 0,
+    ANSWER_CALL,
+    HANGUP_CALL,
+    REJECT_CALL,
+    AUTO_ANSWER_CALL,
+    SET_MUTE_STATUS,
+    GET_MUTE_STATUS,
+    SET_DTMF,
+    SET_DTMF_V,
+    DO_MULTI_CONF,
+    OTHER_CALL_HOLD,
+    HANGUP_WAITING_CALL,
+    HANGUP_FORE_RES_BACK,
+    SWITCH_HOLD_AND_ACTIVE_CALL,
+    GET_LAST_CALL_FAIL_CAUSE,
+}RIL_CALL_MENU;
+
+typedef enum
+{
+    QUERY_OPERATOR=0,
+    QUERY_NETWORK_SELECTION_MODE,
+    SET_NETWORK_SELECTION_MODE,
+    QUERY_AVAILABLE_NETWORKS,
+    QUERY_REGISTRATION_STATE,
+    GET_PREFERRED_NETWORK_TYPE,
+    SET_PREFERRED_NETWORK_TYPE,
+    GET_CELL_INFO_LIST,
+    SET_UNSOL_CELL_INFO_LIST_RATE,
+    GET_NEIGHBORING_CELL_IDS  ,
+    SET_BAND_MODE,
+    QUERY_AVAILABLE_BAND_MODE,
+    RADIO_POWER,
+    VOICE_RADIO_TECH,
+    SIGNAL_STRENGTH,
+    MODEM_POWER,
+}RIL_NETWORK_MENU;
+
+typedef enum{
+    SETUP_DATA_CALL=0,
+    DEACTIVATE_DATA_CALL,
+    GET_DATA_CALL_LIST,
+}RIL_DATA_MENU;
+
+typedef enum{
+    GET_SIM_STATUS=0,
+    GET_IMSI,
+}RIL_SIM_MENU;
+
+typedef enum{
+    SEND_SMS=0,
+    IMS_SEND_SMS,
+    WRITE_SMS_TO_SIM,
+    REPORT_SMS_MEMORY_STATUS,
+    DELETE_SMS_ON_SIM,
+    GET_SMSC_ADDRESS,
+    SET_SMSC_ADDRESS,
+}RIL_SMS_MENU;
+
+int ril_test(int *item, char *value,char *data,int command);
+
+
+#endif //__LYNQ_RIL_TEST_H__
diff --git a/IC_src/mtk/packages/apps/lynq-function-test/src/audio_test.h b/IC_src/mtk/packages/apps/lynq-function-test/src/audio_test.h
new file mode 100644
index 0000000..c596926
--- /dev/null
+++ b/IC_src/mtk/packages/apps/lynq-function-test/src/audio_test.h
@@ -0,0 +1,10 @@
+typedef enum {
+   AUDIO_SUCCESS  = 0 ,
+   AUDIO_API_ERROR ,
+   AUDIO_PRAME_ERROR ,
+
+}AUDIO_RESULT;
+
+int audio_test(char *api,char *string);
+
+
diff --git a/IC_src/mtk/packages/apps/lynq-function-test/src/audio_test.tmp b/IC_src/mtk/packages/apps/lynq-function-test/src/audio_test.tmp
new file mode 100755
index 0000000..c99e61e
--- /dev/null
+++ b/IC_src/mtk/packages/apps/lynq-function-test/src/audio_test.tmp
@@ -0,0 +1,127 @@
+
+
+
+/*============================================================================= 
+**     FileName: audio_test.cpp
+**     Desc: about function test
+**     Author: zhouqunchao
+**     Version: V1.0
+**     LastChange: 2021-08-18 
+**     History: 
+=============================================================================*/
+
+
+#include "function_common.h"
+#include <log/log.h>
+#include "audio_test.h"
+#include <unistd.h>
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <fcntl.h>
+#include "liblog/liblog.h"
+#include "liblog/lynq_deflog.h"
+#ifdef __cplusplus
+extern "C" {
+#endif 
+#include "liblynq-media/lynq_medial.h"
+#include "liblynq-media/lynq_modem_voice.h"
+#ifdef __cplusplus
+}
+#endif 
+void *media_handle = NULL;
+int check_spk_volume(int volume_level)
+{
+    if((volume_level>VOLUME_MAX)||(volume_level<VOLUME_MIN)){
+      //  LYVERBLOG("+[audio][spk_volume_set]: error num = %d\n", AUDIO_PRAME_ERROR);
+	    return 0;
+	}
+	return 1;
+}
+int check_mic_volume(int volume_level)
+{
+    if((volume_level>VOLUME_MAX)||(volume_level<VOLUME_MIN)){
+        LYVERBLOG("+[audio][mic_volume_set]: error num = %d\n", AUDIO_PRAME_ERROR);
+	    return 0;
+	}
+	return 1;
+}
+int audio_test(char *api,char *string) {
+    char *argv[100] = {0};
+	int spk_volume,mic_volume;
+    parseParameters(string,argv);
+    for(int i = 0;i < 10;i++){
+        printf("argv[%d] = %s \n", i, argv[i]);
+    }
+    if(!strcmp(api, "spk_volume_set")){
+        
+        int volume_level = atoi(argv[0]);
+        int ret;
+        if(check_spk_volume(volume_level))
+        {
+            ret = lynq_set_spk_volume(volume_level);
+            if(ret == 1)			
+            LYVERBLOG("+[audio][spk_volume_set][success]\n");
+            else
+            LYVERBLOG("+[audio][spk_volume_set]: error num = %d\n",  AUDIO_PRAME_ERROR);
+		}
+		else
+		{
+            LYVERBLOG("+[audio][spk_volume_set]: error num = %d\n",  AUDIO_PRAME_ERROR);
+            return	0;
+		}
+    }
+    else if(!strcmp(api, "spk_volume_get")){    
+        spk_volume = lynq_get_spk_volume();	
+        LYVERBLOG("+[audio][spk_volume_get][success]: data = %d\n",spk_volume);
+    }
+    else if(!strcmp(api,"mic_volume_set")){
+        int volume_level = atoi(argv[0]);
+        if(check_mic_volume(volume_level))
+        {
+            lynq_set_spk_volume(volume_level);	
+            LYVERBLOG("+[audio][spk_volume_set][success]\n");
+        }
+        else
+        {
+            LYVERBLOG("+[audio][mic_volume_set]: error num = %d\n",  AUDIO_PRAME_ERROR);
+            return	0;
+        }
+    }
+    else if(!strcmp(api, "mic_volume_get")){    
+        mic_volume = lynq_get_spk_volume();	
+        LYVERBLOG("+[audio][mic_volume_get][success]: data = %d\n",mic_volume);
+    }
+    else if(!strcmp(api, "record_start")){ 
+       // if((access(argv[0],F_OK))!=-1)
+        //{
+           lynq_incall_record(argv[0]);
+           LYVERBLOG("+[audio][record_start][success]");
+       // }
+       // else
+        //{
+ //          LYVERBLOG("+[audio][record_start]: error num = %d\n", AUDIO_PRAME_ERROR);
+       // }
+    }
+    else if(!strcmp(api, "record_stop")){ 
+        lynq_stop_record();
+        LYVERBLOG("+[audio][record_stop][success]");	
+    }
+    else if(!strcmp(api,"play_audio")){
+        if((access(argv[0],F_OK))!=-1){	
+           media_handle = lynq_media_play_audio(argv[0]);
+           LYVERBLOG("+[audio][play_audio][success]");
+        }
+        else
+        {
+           LYVERBLOG("+[audio][play_audio]: error num = %d\n", AUDIO_PRAME_ERROR);
+        }
+    }
+    else if(!strcmp(api,"stop_audio")){
+          lynq_media_stop_audio(media_handle);
+    }
+    else {
+        LYVERBLOG("+[command error]:error num = %d\n", AUDIO_API_ERROR);
+    }
+    return 0;
+}
diff --git a/IC_src/mtk/packages/apps/lynq-function-test/src/commands.h b/IC_src/mtk/packages/apps/lynq-function-test/src/commands.h
new file mode 100644
index 0000000..71316d4
--- /dev/null
+++ b/IC_src/mtk/packages/apps/lynq-function-test/src/commands.h
@@ -0,0 +1,60 @@
+/*============================================================================= 

+**     FileName: command.h

+**     Desc: about function test

+**     Author: Warren

+**     Version: V1.0

+**     LastChange: 2021-02-26 

+**     History: 

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

+//call api

+{"dial",eventDial, "dial a call"},

+{"an",eventAnswer,"answer in coming call"},

+{"atan",eventAutoAnswer,"auto answer mode"},

+{"stme",eventSetMute, "set mute"},

+{"gtme",eventGetMute, "get mute status"},

+{"lcfc",eventLastCallFailCause, "last call fail cause"},

+{"hup",eventCallHangUp, "hang up a call"},

+{"udub",eventRejectCall, "hang up all call or reject a call"},

+{"dtmf",eventSetDTMF, "send DTMF number"},

+{"dtmfv",eventSetDTMFVolume, "set DTMF volume"},

+{"hwc",eventHangupWatingForCall, "hang up waiting or background call"},

+{"hfrb",eventHangupForegroundResumeBackground, "hang up foregound call and resume background call"},

+{"swha",eventSwitchWaitOrHoldAndActiveCall, "switch waiting or holding call to active"},

+{"dmc",eventDoMultiConference, "do multi conference"},

+{"och",eventOthercallHold, "separate conferece"},

+//data api

+{"edc",eventSetupDataCall, "enable data call"},

+{"ddc",eventDeactiveDataCall, "disable data call"},

+{"gdcl",eventGetDataCalllist,"get data call list"},

+//network

+{"qop",eventQueryOperator, "query operator"},

+{"qnsm",eventQueryNetSelectMode, "query network selection mode"},

+{"snsm",eventSetNetSelectMode,"set network selection mode"},

+{"qan",eventQueryAvailableNetwork, "query available network"},

+{"qrs",eventQueryRegistrationState, "query registration state"},

+{"gpnt",eventQueryPrefferredNetworkType,"get preferred network type"},

+{"spnt",eventSetPrefferredNetworkType, "set preferred network type"},

+{"gcil",eventQueryCellInfo, "get cell info list"},

+{"sucilr",eventSetUnsolCellInfoListrate,"set unsol cell info list rate"},

+{"gncid",eventQueryNeighboringCellids, "get neighboring cell IDs"},

+{"sbm",eventSetBandMode, "set band mode"},

+{"qabm",eventQueryAvailableBandmode,"query available band mode"},

+{"rpo",eventRadioOn,"set radio power on/off"},

+{"vrt",eventQueryRadioTech,"voice radio tech"},

+{"sst",eventSolicitedSignalStrength,"singal strength"},

+{"mpo",eventModemOn,"modem power"},

+//sim api

+{"gss",eventGetSimStatus, "get sim status"},

+{"gimsi",eventGetImsi, "get IMSI"},

+//sms api

+{"ssm",eventSendSms,"send sms"},

+{"iss",eventImsSendSms,"send  sms over IMS"},

+{"wsts",eventWriteSmsToSim,"write sms to sim card"},

+{"rsms",eventReportSmsMemoryStatus,"report sms memory state"},

+{"dsos",eventDeletSmsOnSim,"delete sms on sim"},

+{"gsmsc",eventGetSmscAddress,"get smsc address"},

+{"ssmsc",eventSetSmscAddress,"set smsc address"},

+{"sstm",evenStoreSmsToMemory,"srore sms to memory"},

+{"gsfm",eventGetSmsFromMemory,"get sms from memory"},

+{"dmfm",eventDeleteMessageFromMemory,"delete sms from memory"},

+{(char *)NULL, NULL, (char *)NULL},

diff --git a/IC_src/mtk/packages/apps/lynq-function-test/src/fota_test.cpp b/IC_src/mtk/packages/apps/lynq-function-test/src/fota_test.cpp
new file mode 100755
index 0000000..d717940
--- /dev/null
+++ b/IC_src/mtk/packages/apps/lynq-function-test/src/fota_test.cpp
@@ -0,0 +1,163 @@
+/*============================================================================= 

+**     FileName: fota_test.c

+**     Desc: about function test

+**     Author: victor

+**     Version: V1.0

+**     LastChange: 2021-10-11

+**     History: 

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

+#include "function_common.h"

+#include <log/log.h>

+#include <stdio.h>

+#include <string.h>

+#include <stdlib.h>

+#include "fota_test.h"

+#include "fcntl.h"

+#include "mtk_device_wrap.h"

+

+

+#ifdef __cplusplus

+extern "C" {

+#endif

+#include "include/iot_rock.h"

+//#include "ftp/lynq_ftp.h"

+#ifdef __cplusplus

+}

+#endif

+

+//lynq_ftp_socker_info ftp_log_info;

+

+#define UPDATA_ADDR "/tmp/fota.delta"

+#define READ_BLOCK_SIZE 0x40000

+

+int lynq_fota_md5_flag = -1;

+

+#if 0

+#define FLASH_DEV_DELTA       "/dev/disk/by-partlabel/delta"

+#else

+#define FLASH_DEV_DELTA       "/dev/mtd41"	

+#endif

+

+#if 0

+int lynq_ftp_download_fota_package(char *string[])

+{

+

+    sprintf(ftp_log_info.sevname,"%s",string[1]);

+    LYVERBLOG("[+UP]: sevname:%s\n",ftp_log_info.sevname);

+    ftp_log_info.portnum = atoi(string[2]);

+    LYVERBLOG("[+UP]: portnum:%d\n",ftp_log_info.portnum);

+

+    sprintf(ftp_log_info.username,"%s",string[3]);

+    sprintf(ftp_log_info.pw,"%s",string[4]);

+    LYVERBLOG("[+UP]: username:%s\n",ftp_log_info.username);

+    LYVERBLOG("[+UP]: pw:%s\n",ftp_log_info.pw);

+

+    sprintf(ftp_log_info.is_pasv_mode,"%s",string[5]);

+    sprintf(ftp_log_info.file_type,"%s",string[6]);

+    sprintf(ftp_log_info.put_opt,"%s",string[7]);

+

+    sprintf(ftp_log_info.getfilename_path,"%s",string[8]);

+    sprintf(ftp_log_info.getfilename,"%s",string[9]);

+    LYVERBLOG("[+UP]: getfilename_path:%s\n",ftp_log_info.getfilename_path);

+

+    LYVERBLOG("[+UP]: Download the FTP data start\n");

+    lynq_ftp_login(&ftp_log_info);

+    lynq_ftp_download(&ftp_log_info);

+    LYVERBLOG("[+UP]: Download the FTP data end\n");

+

+    return 0;

+}

+#endif

+

+int lynq_md5_fota_package(char *string[])

+{

+    int ret = 0;

+    int fd_down,size,fd_target;

+    char delta_data[READ_BLOCK_SIZE];

+    char input_md5_data[64] = {0};

+	

+    sprintf(input_md5_data,"%s",string[0]);

+//LYVERBLOG("[+UP]: input_md5_data:%s\n",input_md5_data);

+    lynq_fota_md5_flag = lynq_md5_file_verfy(UPDATA_ADDR, input_md5_data);

+    if(lynq_fota_md5_flag == 0)

+    {

+        LYVERBLOG("[+UP]: md5 fota package success\n");

+    }

+    else

+    {

+        LYVERBLOG("[+UP]: md5 fota package fail\n");

+        return 1;

+    }

+

+    fd_down = open(UPDATA_ADDR,O_RDONLY);

+    if (fd_down < 0) {

+        LYVERBLOG("[+UP]: open source  error\n");

+        return 1;

+    }

+

+    fd_target = mtk_device_wrap_open(FLASH_DEV_DELTA,O_RDWR);

+

+    if (fd_target < 0) {

+        close(fd_down);

+        LYERRLOG("+[UA]: open target  error\n");

+        return 1;

+    } 

+

+    LYVERBLOG("[+UP]: Get ftp data write to delta\n");

+    while(( size = read(fd_down,delta_data,READ_BLOCK_SIZE))>0) {

+        mtk_device_wrap_write(fd_target,delta_data,READ_BLOCK_SIZE);

+        memset(delta_data,0,READ_BLOCK_SIZE);

+    }

+

+    LYVERBLOG("[+UP]: Store upgrade data to delta success\n");

+

+    mtk_device_wrap_close(fd_target);

+    close(fd_down);

+

+    return 0;

+}

+

+int lynq_fota_func_test(void)

+{

+    int first_run = 1; 

+    LYVERBLOG("+[UA]: Upgrade to start\n");

+    if(lynq_fota_md5_flag == 0)

+    {

+        lynq_rock_main(first_run);

+    }

+    else

+    {

+        LYVERBLOG("+[UA]: MD5 verify fail\n");

+        return 1;

+    }

+    LYVERBLOG("+[UA]: Upgrade to end\n");

+    return 0;

+}

+

+int fota_test(char *api,char *string) 

+{

+    char *argv[100] = {0};

+    parseParameters(string,argv);

+    if(!strcmp(api, "download"))

+    {

+        if(!(strcmp(argv[0], "ftp")))

+        {

+  //       lynq_ftp_download_fota_package(argv);

+        }

+    }

+    else if(!(strcmp(api, "md5")))

+    {

+        lynq_md5_fota_package(argv);

+    }

+    else if(!(strcmp(api, "upgrade")))

+    {

+        lynq_fota_func_test();

+    }

+    else

+    {

+        LYVERBLOG("+[fota][fota_test]: fota api error!!!\n");

+    }

+    return 0;

+}

+

+

diff --git a/IC_src/mtk/packages/apps/lynq-function-test/src/fota_test.h b/IC_src/mtk/packages/apps/lynq-function-test/src/fota_test.h
new file mode 100644
index 0000000..06187d8
--- /dev/null
+++ b/IC_src/mtk/packages/apps/lynq-function-test/src/fota_test.h
@@ -0,0 +1,4 @@
+#ifndef __FOTA_TEST_H__

+#define __FOTA_TEST_H__

+int fota_test(char *api,char *string);

+#endif //__FOTA_TEST_H__
\ No newline at end of file
diff --git a/IC_src/mtk/packages/apps/lynq-function-test/src/function_common.cpp b/IC_src/mtk/packages/apps/lynq-function-test/src/function_common.cpp
new file mode 100644
index 0000000..1771661
--- /dev/null
+++ b/IC_src/mtk/packages/apps/lynq-function-test/src/function_common.cpp
@@ -0,0 +1,188 @@
+/*============================================================================= 

+**     FileName: function_common.cpp

+**     Desc: about function test

+**     Author: Warren

+**     Version: V1.0

+**     LastChange: 2021-02-26 

+**     History: 

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

+/*Get private menu,take only the first two parameters, and return the head pointer of the remaining string*/

+#include <stdio.h>

+#include <string.h>

+#include "function_common.h"

+#include <sys/time.h>

+#include <unistd.h>

+void set_timer(int it_interval_sec, int it_interval_usec,int it_value_sec,int it_value_usec)

+{

+    struct itimerval itv, oldtv;

+    itv.it_interval.tv_sec = it_interval_sec;

+    itv.it_interval.tv_usec = it_interval_usec;

+    itv.it_value.tv_sec = it_value_sec;

+    itv.it_value.tv_usec = it_value_usec;

+    setitimer(ITIMER_REAL, &itv, &oldtv);

+}

+ 

+int sleep_with_restart(int second)

+{

+    int left = second;

+    while (left > 0) 

+    {

+        left = sleep(left);

+    }

+    return 0;

+}

+int millli_sleep_with_restart(int millisecond)

+{

+    int left = millisecond*1000;

+    while (left > 0) 

+    { 

+        left = usleep(left);

+    }

+

+    return 0;

+}

+//Get private menu,take only the first two parameters, and return the head pointer of the remaining string

+char* getMenu(char * str,char *argv[])

+{

+    char* pos = str;

+    int menu = 0;

+    int num = 0;

+    if (str == NULL)

+    {

+        return NULL;

+    }

+    while (1)

+    {

+        menu = 0;

+        if (num == 2)

+        {

+            break;

+        }

+        while (1)

+        {

+            if (*pos == '"')

+            {

+                if (menu == 0)

+                {

+                    menu++;

+                    argv[num++] = pos+1;

+                }

+                else if (menu == 1)

+                {

+                    *pos++ = '\0';

+                    break;

+                }

+                else 

+                {

+                    break;

+                }

+            }

+            pos++;

+        }

+        

+    }

+    printf("moudle = %s\nAPI = %s\n", argv[0], argv[1]);

+    return pos;

+}

+/*parse the parameters,and then stroge every parameter to argv.*/

+/*return the number of parameters.*/

+int getParam(char * str,char *argv[])

+{

+    char* pos = str;

+    int num = 0;

+    if (str == NULL)

+    {

+        return 0;

+    }

+    while (1)

+    {

+        if (*pos == '\0')

+        {

+            break;

+        }

+        while (1)

+        {

+            if (*(pos - 1) == '=' && *pos == '"')// "="" as the basis for starting the parameter.   

+            {

+                argv[num++] = pos+1;

+            }

+            else if (*(pos - 1) == '"' && *pos == '&')// "="" as the basis for the end of the parameter

+            {

+                *(pos - 1) = '\0';

+                pos++;

+                break;

+            }

+            else if (*pos == '\0'&&*(pos-1) == '"')//the string end.

+            {

+                *(pos - 1) = '\0';

+                break;

+            }

+            else if (*pos == '\0')//the string end.

+            {

+                break;

+            }

+            pos++;

+        }

+    }

+  //  for (int i = 0;i < num;i++)

+  //  {

+   //     printf("argv[%d] = %s\n",i,argv[i]);

+   // }

+    return num;

+}

+

+/*remove the escape character '\'*/

+int removeTage(const int length,char* argv[])

+{

+    char* temp = NULL;

+    char* temp1 = NULL;

+    char** pos = argv;

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

+    {

+        temp1 = pos[i];

+        while (1)

+        {

+            if (*pos[i] == '\0')

+            {

+                break;

+            }

+            if ((*pos[i] == '"') && (*(pos[i] - 1) == '\\'))//Remove "\"" when encountering '\'

+            {

+                temp = pos[i];

+                while (1)

+                {

+                    *(pos[i] - 1) = *(pos[i]);

+                    if (*(pos[i]) == '\0')

+                    {

+                        break;

+                    }

+                    pos[i]++;

+                }

+                pos[i] = temp;

+            }

+            pos[i]++;

+        }

+        pos[i] = temp1;

+    }

+    return 0;

+}

+int parseParameters(char *str,char *argv[])

+{

+    int argc = 0;

+    argc = getParam(str,argv);

+    removeTage(argc,argv);

+   // for (int i = 0;i < argc; i++)

+   // {

+  //      printf("param %d = %s\n",i, argv[i]);

+  //  }

+    return 0;

+}

+RIL_COMMAND*find_command (char *name,RIL_COMMAND *Class)

+{

+    register int i;

+    for (i = 0; Class[i].name; i++)

+        if (strcmp (name, Class[i].name) == 0)

+            return (&Class[i]);

+    return ((RIL_COMMAND *)NULL);

+}

+

diff --git a/IC_src/mtk/packages/apps/lynq-function-test/src/function_common.h b/IC_src/mtk/packages/apps/lynq-function-test/src/function_common.h
new file mode 100644
index 0000000..42a0c7d
--- /dev/null
+++ b/IC_src/mtk/packages/apps/lynq-function-test/src/function_common.h
@@ -0,0 +1,44 @@
+/*============================================================================= 

+**     FileName: function_common.h

+**     Desc: about function test

+**     Author: Warren 

+**     Version: V1.0

+**     LastChange: 2021-02-26 

+**     History: 

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

+

+

+#ifndef FUNCTION_COMMON_H

+#define FUNCTION_COMMON_H

+

+#ifdef __cplusplus

+extern "C" {

+#endif

+  #include "liblog/liblog.h"

+  #include "liblog/lynq_deflog.h"

+#ifdef __cplusplus

+}

+#endif

+typedef enum{

+    MENU_INPUT_ERROR=0,

+    MODULE_INPUT_ERROR,

+    API_INPUT_ERROR,

+    INVALID_CMD,

+}COMMAND_ERROR;

+typedef struct {

+    char *name;                    /* User printable name of the function. */

+    int (*func)(char **param); /* Function to call to do the job. */

+    char *doc;

+} RIL_COMMAND;

+RIL_COMMAND*find_command (char *name,RIL_COMMAND *Class);

+

+void set_timer(int it_interval_sec, int it_interval_usec,int it_value_sec,int it_value_usec);

+int sleep_with_restart(int second);

+int millli_sleep_with_restart(int millisecond);

+

+char* getMenu(char * str,char *argv[]);

+int parseParameters(char *str,char *argv[]);

+//int getParam(char * str,char *argv[]);

+//int removeTage(const int length,char* argv[]);

+

+#endif
\ No newline at end of file
diff --git a/IC_src/mtk/packages/apps/lynq-function-test/src/gpio_test.h b/IC_src/mtk/packages/apps/lynq-function-test/src/gpio_test.h
new file mode 100644
index 0000000..204cfe0
--- /dev/null
+++ b/IC_src/mtk/packages/apps/lynq-function-test/src/gpio_test.h
@@ -0,0 +1,12 @@
+#ifndef __LYNQ_GPIO_TEST_H__

+#define __LYNQ_GPIO_TEST_H__

+#define GPIO_MODE "mode"

+#define GPIO_DIR "dir"

+#define GPIO_OUT "out"

+typedef enum {

+   GPIO_SET_SUCCESS  = 0 ,

+   GPIO_PRAME_ERROR = 1,

+   GPIO_SET_ERROR  = 2,

+}GPIO_SET_RESULT;

+int gpio_test(char *api,char *string);

+#endif //__LYNQ_GPIO_TEST_H__
\ No newline at end of file
diff --git a/IC_src/mtk/packages/apps/lynq-function-test/src/gpio_test.tmp b/IC_src/mtk/packages/apps/lynq-function-test/src/gpio_test.tmp
new file mode 100755
index 0000000..ca00017
--- /dev/null
+++ b/IC_src/mtk/packages/apps/lynq-function-test/src/gpio_test.tmp
@@ -0,0 +1,91 @@
+/*============================================================================= 

+**     FileName: gpio_test.cpp

+**     Desc: about function test

+**     Author: zhou

+**     Version: V1.0

+**     LastChange: 2021-03-04 

+**     History: 

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

+#include "function_common.h"

+#include <log/log.h>

+#include "gpio_test.h"

+#include <stdio.h>

+#include <string.h>

+#include <stdlib.h>

+#ifdef __cplusplus

+extern "C" {

+#endif   

+#include "liblynq-driver/libdriver.h"

+#ifdef __cplusplus

+}

+#endif

+int check_mode(const char *mode)

+{

+if(!strcmp(mode, GPIO_DIR))

+{

+  return 1;

+}

+if(!strcmp(mode, GPIO_OUT))

+{

+	return 1;

+}

+if(!strcmp(mode, GPIO_MODE))

+{

+	return 1;	

+}

+  return -1;

+}

+int check_status(int statu)

+{

+    if (statu == 0)

+        return 1;

+    if (statu ==1)

+        return 1;

+    return -1;

+}

+int gpio_test(char *api,char *string) {

+    char *argv[100] = {0};

+    parseParameters(string,argv);

+    if(!strcmp(api, "get")){

+        char output1[1024] = {0};

+        int value = atoi(argv[0]);

+        lynq_get_gpio (value,output1);

+       // printf("Factory_result get %d gpio:%s \n",value,output1)

+        LYVERBLOG("+[gpio][get]: data = %s\n",output1);

+

+    }

+    else if(!strcmp(api, "set")){

+        int gpio_numb = atoi(argv[1]);

+        int gpio_statu = atoi(argv[2]);

+        int check_prame;

+        check_prame = check_mode(argv[0]);

+        if(check_prame == -1)

+        {

+         LYVERBLOG("+[gpio][set]: error num = %d \n",GPIO_PRAME_ERROR);

+        return 0;

+        }

+        check_prame = check_status(gpio_statu);

+        if(check_prame == -1)

+        {

+         LYVERBLOG("+[gpio][set]: error num = %d \n",GPIO_PRAME_ERROR);

+         return 0;

+        }

+        int result = lynq_set_gpio(argv[0], gpio_numb,gpio_statu);

+        if(result == -1)

+        {

+         LYVERBLOG("+[gpio][set]: error num = %d \n",GPIO_SET_ERROR);

+         return 0;

+        }

+        else

+        {

+         LYVERBLOG("+[gpio][set]: ok!!\n",result);

+         return 1;

+        }

+       //  printf("Factory_result gpio %d set state :%d\n",gpio_numb,result);	   

+    }

+    else {

+        LYVERBLOG("+[gpio][lynq_set_gpio]: error num =%d\n",GPIO_PRAME_ERROR);

+    }

+

+    return 0;

+}
\ No newline at end of file
diff --git a/IC_src/mtk/packages/apps/lynq-function-test/src/main.cpp b/IC_src/mtk/packages/apps/lynq-function-test/src/main.cpp
new file mode 100755
index 0000000..4046f9e
--- /dev/null
+++ b/IC_src/mtk/packages/apps/lynq-function-test/src/main.cpp
@@ -0,0 +1,316 @@
+
+/* gets example */
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include "fota_test.h"
+#include "function_common.h"
+#include<unistd.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+//#include "liblynq-broadcast/broadcast_send.h"
+#include <gio/gio.h>
+#include <glib.h>
+//#include "liblynq-driver/libdriver.h"
+
+#ifdef __cplusplus
+}
+#endif
+
+#define BUFFER_SIZE 8192
+#define USER_LOG_TAG "FUNCTION_TEST"
+#define MAX_ARGS 5
+typedef enum {
+    API_MENU = 1,
+    DEMO_MENU,
+}TEST_MAIN_ITEM;
+typedef enum{
+    API_WIFI=0,
+	API_AUDIO,
+        API_FOTA,
+} API_MOUDLE;
+
+
+
+static void getCallback(const char* str_arg, int int_arg )
+{
+    //printf("SignalCallback,str_arg:%s,int_arg:%d\n", str_arg,int_arg);
+    LYVERBLOG("SignalCallback,str_arg:%s,int_arg:%d\n", str_arg,int_arg);
+
+    return;
+}
+
+void hold_on(){
+    char any[5]={ 0 };
+    printf("Press any key to return\n");
+    fgets(any, 5, stdin);
+}
+
+int parse_param(char *cmd, char *argv[], int max_args){
+    char *pos, *pos2;
+    int argc = 0;
+
+    pos = cmd;
+    while (1) {
+        // Trim the space characters.
+        while (*pos == ' ') {
+            pos++;
+        }
+
+        if (*pos == '\0') {
+          break;
+        }
+
+        // One token may start with '"' or other characters.
+        if (*pos == '"' && (pos2 = strchr(pos + 1, '"'))) {
+            argv[argc++] = pos + 1;
+            *pos2 = '\0';
+            pos = pos2 + 1;
+            if (*pos == '\n'){
+                *pos = '\0';
+                pos = pos + 1;
+            }
+        }
+        else {
+            argv[argc++] = pos;
+            while (*pos != '\0' && *pos != ' '&& *pos != '\n') 
+                {
+                    if (*pos == '"' && (pos2 = strchr(pos + 1, '"'))) 
+                    {
+                        pos = pos2 ;
+                    }
+                    else
+                    pos++;
+                }
+            *pos++ = '\0';
+        }
+
+    // Check if the maximum of arguments is reached.
+        if (argc == max_args) {
+            break;
+        }
+    }
+
+    return argc;
+}
+int getRilModule(char *module)
+{
+    if (module==NULL)
+    {
+       //printf("[ERROR] Please input module,and try again!");
+       // LYVERBLOG("+[command error]:error num = %d\n",MENU_INPUT_ERROR);
+        return -1;
+    }
+    if(!strcmp(module,"WIFI"))
+    {
+        return API_WIFI;
+    }
+    else if(!strcmp(module, "fota"))
+    {
+        return API_FOTA;
+    }
+/*
+    else if(!strcmp(module, "AUDIO"))
+    {
+        return API_AUDIO;
+    }
+*/
+    else
+    {
+       LYVERBLOG("+[command error]:error num = %d\n",MENU_INPUT_ERROR);
+       // printf("can not find %s API  module ",module);
+        return -1;
+    }
+    return -1;
+}
+
+int api_start(int argc, char *argv[]){
+    LYDBGLOG("api_start,argc:%d\n",argc);
+    char *menu[2] = {0};// menu[0] is the "moudle",menu[1] is the "API"
+    char* argvHead=NULL;
+    int module = -1;
+    argvHead = getMenu(argv[2],menu);//find the "module" and the "API"
+    module = getRilModule(menu[0]);
+   // if(argvHead == NULL)
+   // {
+    //     printf("pram api error\n");
+    //     return 0;
+   // }
+    switch(module)
+    {
+        /* Add the code of the owner modules below*/
+        case API_AUDIO:
+        {
+            //audio_test(menu[1],argvHead);
+            break;
+        }
+	case API_FOTA:
+	{
+		fota_test(menu[1],argvHead);		
+		break;
+	}
+        case API_WIFI:
+            break;
+        default:
+          //  printf("pram module error\n");
+          LYVERBLOG("+[command error]:error num = %d\n",MENU_INPUT_ERROR);
+
+            break;
+    }
+   // hold_on(); //add by zhouqunchao delete help message
+    return 1;
+}
+
+int function_start(int argc, char *argv[])
+{
+	int select_menu = atoi(argv[0]);
+	int thread = atoi(argv[1]);
+	// printf("select_menu:%d,thread:%d\n",select_menu,thread);
+ 	switch(select_menu)
+	{
+		case API_MENU:
+		{
+			if (thread == 1)//rita add @2021.6.21 for threadhandle test
+			{
+				LYDBGLOG("[%s-%d] argv[2] = [%s]\n", __FUNCTION__, __LINE__, argv[2]);
+				if(strlen(argv[2])){//rita add @2021.6.21 for data error
+					LYDBGLOG("[%s-%d] argv[2] = [%s]\n", __FUNCTION__, __LINE__, argv[2]);
+					//send_broadcast_by_name("function", strlen(argv[2]), argv[2]);
+				}
+				else{
+					LYVERBLOG("+[thhandle]: error num = %d\n", INVALID_CMD);
+					return INVALID_CMD;
+				}
+			}
+			else if(thread ==2){//rita add @2021.6.21 for local test
+				api_start(argc,argv);
+			}
+			else{
+				//printf("thread 1,local 2\n");
+				LYDBGLOG("thread 1,local 2\n");
+			}
+			break;
+		}
+		case DEMO_MENU:
+		{
+			//printf("DEMO_MENU\n");
+			LYDBGLOG("DEMO_MENU\n");
+			break;
+		}
+		default:
+        break;
+    }
+    return 0; 
+}
+
+
+void help_display(){
+    printf("\n");
+    printf("*****************************************************************************\n");
+    printf("0:help ------- help\n");
+    printf("*****************************************************************************\n");
+    printf("1:API TEST\n" );
+    printf("          1-1:Async api-\n" );
+    printf("                        --MQTT\n" );
+    printf("\n");
+    printf("                        --HTTP\n" );
+    printf("          1-2:Sync api-\n" );
+    printf("                        --GPIO\n" );
+    printf("\n");
+    printf("                        --RIL\n" );
+    printf("\n");
+    printf("                        --WIFI\n" );
+    printf("\n");
+    printf("                        --GNSS\n" );
+    printf("\n");
+    printf("                        --SERVICE\n" );
+    printf("*****************************************************************************\n");
+    printf("2:DEMO TEST:Subsequent updates\n" );
+    printf("*****************************************************************************\n");
+    printf("\n");
+    printf("1:API TEST The format is as follows :\n" );
+    printf("{menu}-{mode selection} moudle=\"{moudle}\"&API=\"{api interface}\"&session=\"{session id}\"\"&parameterA=\"{parameter A}\"\n" );
+    /*
+    printf("The main parameters are as follows:\n");
+    printf("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
+    printf("menu:1--API TEST,2--DEMO TEST\n" );
+    printf("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
+    printf("mode selection:1--async api,2--sync api\n" );
+    printf("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
+    printf("moudle:Test module--includes the following modules\n" );
+    printf("RIL, GPIO,MQTT,HTTP,WIFI,GNSS\n" );
+    printf("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
+    printf("api interface:--Interface corresponding to module\n" );
+    printf("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
+    printf("session id:--Used to distinguish different session groups of the same module\n" );
+    printf("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
+    printf("parameter A:--API parameter,Add format {\"&parameter_name=\"{parameter}\"} \n" );
+    printf("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
+    */
+    printf("Select menu:\n");
+}
+void menu_display(){
+    printf("\n");
+    printf("**********************\n");
+    printf("0:help menu\n");
+    printf("1:API TEST\n");
+    printf("2:DEMO TEST\n");
+    printf("**********************\n");
+    printf("\n");
+    printf("Select menu:\n");
+}
+int main()
+{   
+    LYLOGEINIT(USER_LOG_TAG);
+   // LYLOGSET(4);
+
+    /*Check whether the modem works correctly and start the corresponding service*/  //add by liulei
+    char buf[1024]={0};
+
+    while (1) {
+        char *argv[MAX_ARGS];
+        char str[BUFFER_SIZE]={ 0 };
+        menu_display();
+        fgets(str, BUFFER_SIZE, stdin);
+        LYDBGLOG("[%s-%d] str= [%s]\n", __FUNCTION__, __LINE__, str);
+        str[strlen(str)-1]='\0';
+        if(!strcmp(str, "0")){
+           help_display();
+           //hold_on(); //add by zhouqunchao delete help message
+           continue;
+        }
+        if(!strcmp(str,"quit"))
+        {   
+            //system("killall lynq-framework-service");
+           break;
+        }
+        if ((strncmp(str,"1-",2) == 0)||
+           (strncmp(str,"2-",2)== 0))
+        {
+         char* at_cmd = strstr(str, "-");
+         strncpy(at_cmd, " ", 1);
+        LYDBGLOG("[%s-%d] at_cmd = [%s]\n", __FUNCTION__, __LINE__, at_cmd);
+
+	
+         int argc = parse_param(str, argv, MAX_ARGS);
+   //add by zqc  Format error judgment start
+        if(argv[2] == NULL)
+        {
+        LYVERBLOG("+[command error]:error num = %d\n",MENU_INPUT_ERROR);
+        continue;
+        }
+        //add by zqc  Format error judgment end
+         function_start(argc,argv);
+         continue;
+        }
+        else{
+        // printf("pram error\n");
+         LYVERBLOG("+[command error]:error num = %d\n",MENU_INPUT_ERROR);
+         continue;
+        }
+   }
+return 0;
+}
+
diff --git a/IC_src/mtk/packages/apps/lynq-function-test/src/makefile b/IC_src/mtk/packages/apps/lynq-function-test/src/makefile
new file mode 100755
index 0000000..0597818
--- /dev/null
+++ b/IC_src/mtk/packages/apps/lynq-function-test/src/makefile
@@ -0,0 +1,104 @@
+SHELL = /bin/sh
+RM = rm -f
+
+LOCAL_CFLAGS := -Wall \
+                -g -Os \
+                -flto \
+                -DRIL_SHLIB \
+                -DATCI_PARSE \
+                -DKEEP_ALIVE \
+                -D__LINUX_OS__ \
+                -DECALL_SUPPORT
+
+$(warning ################# C2K support: $(RAT_CONFIG_C2K_SUPPORT))
+ifeq ($(strip $(RAT_CONFIG_C2K_SUPPORT)), yes)
+    LOCAL_CFLAGS += -DC2K_SUPPORT
+
+endif
+
+ifeq ($(strip $(MTK_MULTI_SIM_SUPPORT)), dsds)
+    LOCAL_CFLAGS += -DANDROID_SIM_COUNT_2 \
+                     -DANDROID_MULTI_SIM \
+                     -DMODE_DSDS
+endif
+
+ifeq ($(strip $(MTK_MULTI_SIM_SUPPORT)), dsss)
+    LOCAL_CFLAGS += -DMODE_DSSS
+endif
+
+$(warning ################# TARGET_PLATFORM: $(TARGET_PLATFORM))
+ifeq ($(strip $(TARGET_PLATFORM)), mt2731)
+#$(warning #################add for debug $(ROOT), $(includedir))
+$(warning ################# TARGET_PLATFORM_MT2731)
+    LOCAL_CFLAGS += -DTARGET_PLATFORM_MT2731 \
+                    -DMD_93_SUPPORT
+else ifeq ($(strip $(TARGET_PLATFORM)), mt2635)
+$(warning ################# TARGET_PLATFORM_MT2635)
+    LOCAL_CFLAGS += -DTARGET_PLATFORM_MT2635 \
+                    -DMD_90_SUPPORT
+endif
+
+
+LOCAL_PATH   = .
+#CFLAGS = $(LOCAL_CFLAGS) -std=c99 
+#CXXFLAGS = $(LOCAL_CFLAGS) -std=gnu++14
+$(warning ################# ZHOUQUNCHAO ROOT: $(ROOT),includedir:$(includedir),LOCAL_PATH:$(LOCAL_PATH))
+LOCAL_C_INCLUDES = \
+  -I. \
+  -I$(LOCAL_PATH) \
+  -I$(ROOT)$(includedir)/ \
+  -I$(ROOT)$(includedir)/include  \
+  -I$(ROOT)$(includedir)/logger \
+  -I$(ROOT)$(includedir)/liblog \
+  -I$(ROOT)$(includedir)/glib-2.0 \
+  -I$(ROOT)$(libdir)/glib-2.0/include \
+  -I$(ROOT)$(libdir)/gstreamer-1.0/include\
+  -I$(ROOT)$(includedir)/dbus-1.0 \
+  -I$(ROOT)$(libdir)/dbus-1.0/include \
+  -DLIB_GNSS_HAL_DIR='"$(libdir)"'
+
+LOCAL_C_INCLUDES+=$(DNS_FLAGS)
+
+LOCAL_LIBS := \
+    -L. \
+    -ldl \
+    -lstdc++ \
+    -llog \
+    -lcutils \
+    -lutils \
+    -lbinder \
+    -llynq-log \
+    -lpthread \
+    -lrt \
+    -lpal \
+    -lgstreamer-1.0 \
+    -lglib-2.0 \
+    -lgstbase-1.0 \
+    -lgstreamer-1.0 \
+    -lgobject-2.0 \
+    -lgio-2.0 \
+    -ldtmf \
+    -lapn \
+    -ldbus-1 \
+    -llynq-fota \
+    -lnandapi  \
+
+LOCAL_SRC_FILES_CPP = $(wildcard *.cpp)
+LOCAL_SRC_FILES_C = $(wildcard *.c )
+EXECUTABLE = lynq-function-test
+
+OBJECTS=$(LOCAL_SRC_FILES_CPP:.cpp=.o) $(LOCAL_SRC_FILES_C:.c=.o)
+all: $(EXECUTABLE)
+
+$(EXECUTABLE): $(OBJECTS)
+	$(CXX) $(OBJECTS) $(LOCAL_LIBS) $(LOCAL_CFLAGS) $(LOCAL_C_INCLUDES) -o $@
+
+%.o: %.c
+	$(warning ----->build $<)
+	$(CC) $(LOCAL_C_INCLUDES) $(LOCAL_CFLAGS) $(LOCAL_LIBS) -o $@ -c $<
+%.o : %.cpp
+	$(CXX) $(LOCAL_C_INCLUDES) $(LOCAL_CFLAGS) $(LOCAL_LIBS) -o $@ -c $<
+
+.PHONY: clean
+clean:
+	$(RM) $(OBJECTS) $(EXECUTABLE)
diff --git a/IC_src/mtk/packages/apps/lynq-function-test/src/system_test.h b/IC_src/mtk/packages/apps/lynq-function-test/src/system_test.h
new file mode 100644
index 0000000..331da81
--- /dev/null
+++ b/IC_src/mtk/packages/apps/lynq-function-test/src/system_test.h
@@ -0,0 +1,6 @@
+#ifndef __LYNQ_SYSTEM_TEST_H__
+#define __LYNQ_SYSTEM_TEST_H__
+int system_test(char *api,char *string);
+
+#endif //__LYNQ_SYSTEM_TEST_H__
+
diff --git a/IC_src/mtk/packages/apps/lynq-function-test/src/system_test.tmp b/IC_src/mtk/packages/apps/lynq-function-test/src/system_test.tmp
new file mode 100755
index 0000000..155d4f2
--- /dev/null
+++ b/IC_src/mtk/packages/apps/lynq-function-test/src/system_test.tmp
@@ -0,0 +1,82 @@
+
+
+
+/*============================================================================= 
+**     FileName: dhcp_test.cpp
+**     Desc: about function test
+**     Author: grays
+**     Version: V1.0
+**     LastChange: 2021-08-18 
+**     History: 
+=============================================================================*/
+
+
+#include "function_common.h"
+#include <log/log.h>
+#include <unistd.h>
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <fcntl.h>
+#include <pthread.h>
+#include "liblog/liblog.h"
+#include "liblog/lynq_deflog.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif   
+#include "include/lynq-system-own.h"
+#ifdef __cplusplus
+}
+#endif
+
+void* thread(void* arg)
+{
+    #if 1 
+    pthread_detach(pthread_self());
+    int edge=0;
+    while(LYNQ_Lpm_Handler){
+        lynq_lpm_handler(edge);//gpio电平变化则上报
+    }
+    #endif
+    pthread_exit(0);
+}
+
+int system_test(char *api,char *string) {
+    char *argv[100] = {0};
+    pthread_t id;
+    int ret;
+    parseParameters(string,argv);
+    int Flag=0;
+    if(!strcmp(api, "init")){
+        LYNQ_Lpm_Init(lynq_lpm_handler);//初始化lpm,监听gpio电平上报事件
+        ret = pthread_create(&id,NULL,thread,NULL); //创建线程来监听gpio电平变化
+        if(ret != 0)
+        {
+            printf("Create pthread error!\n");
+            exit(1);
+        }
+        sleep(2);
+    }else if(!strcmp(api, "deinit")){
+        LYNQ_Lpm_Deinit();//注销lpm。
+    }else if(!strcmp(api,"adc")){
+        int adc_n = atoi(argv[0]);
+        printf("api = %s adc=%d\n", api,LYNQ_Adc_Show(adc_n));//当前电源电压
+    }else if(!strcmp(api, "suspend")){
+        Flag = atoi(argv[0]);
+        LYNQ_Autosleep_Enable(Flag);//使能系统睡眠
+    }else if(!strcmp(api, "Lock")){
+        LYNQ_SLP_WakeLock_Lock(argv[0]);//创建wakelock锁,此时系统无法进入睡眠
+    }else if(!strcmp(api, "Unlock")){
+        LYNQ_SLP_WakeLock_Unlock(argv[0]);//解锁wakelock,此时系统可进入睡眠
+    }else if(!strcmp(api, "powerdown")){
+        Flag = atoi(argv[0]);
+        LYNQ_Power_Down(Flag);//开关机接口,用于选择关机或重启
+    }else if(!strcmp(api, "changemod")){
+        LYNQ_Power_Mode(argv[0]);//开关机接口,用于选择关机或重启
+    }else {
+       printf("invalid api  \n" );
+    }
+
+    return 0;
+}
diff --git a/IC_src/mtk/packages/apps/lynq-gnss-test/lynq-gnss-test-cb.c b/IC_src/mtk/packages/apps/lynq-gnss-test/lynq-gnss-test-cb.c
new file mode 100755
index 0000000..eda4681
--- /dev/null
+++ b/IC_src/mtk/packages/apps/lynq-gnss-test/lynq-gnss-test-cb.c
@@ -0,0 +1,232 @@
+#include<pthread.h>

+#include<stdio.h>

+#include<unistd.h>

+#include<errno.h>

+#include<string.h>

+#include <time.h>

+

+#include"lynq_gnss.h"

+#include"lynq-gnss-test.h"

+#include"include/lynq_systime.h"

+#include"include/lynq_uci.h"

+

+/*extern struct timespec lynq_gnss_open_tm;

+extern int lynq_ttff_time;

+extern int lynq_test_session_end;*/

+lynq_test_gnss_result lynq_test_result;

+char gnss_ttyCmd[512];

+

+void lynq_test_gps_location_callback(lynq_GpsLocation_ext* location)

+{

+    if(location->legacyLocation.size == sizeof(lynq_GpsLocation_ext))

+    {

+        // printf("===============Update Location Info==================\r\n");

+        // printf("flags:0x%x\r\n", location->legacyLocation.flags);

+        // printf("latitude:%.10lf\r\n", location->legacyLocation.latitude);

+        // printf("longitude:%.10lf\r\n", location->legacyLocation.longitude);

+        // printf("altitude:%.10lf\r\n", location->legacyLocation.altitude);

+        // printf("speed:%f\r\n", location->legacyLocation.speed);

+        // printf("bearing:%f\r\n", location->legacyLocation.bearing);

+        // printf("timestamp:%ld\r\n", location->legacyLocation.timestamp);

+        // printf("horizontalAccuracyMeters:%f\r\n", location->horizontalAccuracyMeters);

+        // printf("verticalAccuracyMeters:%f\r\n", location->verticalAccuracyMeters);

+        // printf("speedAccuracyMetersPerSecond:%f\r\n", location->speedAccuracyMetersPerSecond);

+        // printf("bearingAccuracyDegrees:%f\r\n", location->bearingAccuracyDegrees);

+        memset(&(lynq_test_result.location), 0, sizeof(lynq_GpsLocation_ext));

+        memcpy(&(lynq_test_result.location), location, sizeof(lynq_GpsLocation_ext));

+    }

+    else

+    {

+

+    }

+}

+

+void lynq_test_gps_status_callback(GpsStatus* status)

+{

+    if(status->size == sizeof(GpsStatus))

+    {

+        if(status->status == GPS_STATUS_SESSION_BEGIN)

+        {

+            

+        }

+        if(status->status == GPS_STATUS_SESSION_END)

+        {

+

+        }

+    }

+    else

+    {

+        printf("status error\r\n");

+    }

+}

+

+#define NMEA_ACC "ACCURACY"

+#define NMEA_GSA "GSA"

+#define NMEA_RMC "RMC"

+#define NMEA_GGA "GGA"

+#define NMEA_VTG "VTG"

+#define NMEA_GSV "GSV"

+

+#if 0

+int gnss_set_time_flag=0;

+int update_gnss_time(GpsUtcTime sec) 

+{

+    time_t t;

+    t = sec/1000;

+    stime(&t);

+    return 0;

+} 

+#endif

+

+void lynq_test_gps_nmea_callback(GpsUtcTime timestamp, const char* nmea, int length)

+{

+#if 0

+    char gnss_sync_enable[24] = "";

+    //printf("NMEA report at %ld========\n",timestamp);

+    lynq_get_value("lynq_uci", "lynq_sync_time", "lynq_gnss_sync_time_enable" , gnss_sync_enable);

+    if (1 == atoi(gnss_sync_enable)) {

+        if ((lynq_test_result.fix_type == 3)  && (gnss_set_time_flag == 0)) {

+            update_gnss_time(timestamp);

+            gnss_set_time_flag = 1;

+        }

+    }

+#endif	

+    if(strncmp(nmea+3,NMEA_GSA,strlen(NMEA_GSA))==0)

+    {

+        lynq_test_result.fix_type = *(nmea+9) - '0';

+    }

+    else

+    {

+        

+    }

+    

+    if(strncmp(nmea+3,NMEA_ACC,strlen(NMEA_ACC)) == 0)

+    {

+        lynq_test_result.location.legacyLocation.timestamp= timestamp;

+        //lynq_show_gnss_test_result(&lynq_test_result);

+    }

+    if(strncmp(nmea+3,NMEA_GSA,strlen(NMEA_GSA))==0 || strncmp(nmea+3,NMEA_RMC,strlen(NMEA_RMC)) == 0 || \

+        strncmp(nmea+3,NMEA_GGA,strlen(NMEA_GGA)) == 0 || strncmp(nmea+3,NMEA_VTG,strlen(NMEA_VTG)) == 0|| \

+        strncmp(nmea+3,NMEA_GSV,strlen(NMEA_GSV)) == 0)

+        {

+            printf("%s\r\n",nmea);

+            //sprintf(gnss_ttyCmd,"echo -e \"\\%s\\r\\n\" > /dev/ttyGS0",nmea);

+            //system(gnss_ttyCmd);

+        }

+}

+

+

+

+pthread_t lynq_test_gps_create_thread(const char* name, void (*start)(void *), void* arg)

+{

+    pthread_t ntid = 0;

+    int ret = 0;

+

+    ret = pthread_create(&ntid, NULL, (void *(*)(void *))start, arg);

+

+    if(ret != 0)

+    {

+        printf("thread %s create fail(%s)!\r\n", name, strerror(errno));

+        ntid = 0;

+    }

+    else

+    {

+        printf("tread %s create success!\r\n", name);

+    }

+

+    return ntid;

+}

+

+lynq_gnss_cb lynq_gnss_callbacks = {

+    .size = sizeof(lynq_gnss_cb),

+    .lynq_location_cb =lynq_test_gps_location_callback,

+    .lynq_status_cb = lynq_test_gps_status_callback,

+    .lynq_nmea_cb = lynq_test_gps_nmea_callback,

+    .lynq_create_thread_cb = lynq_test_gps_create_thread,

+};

+

+lynq_gnss_cb* lynq_test_get__gnss_callbacks(void)

+{

+    return &lynq_gnss_callbacks;

+}

+

+

+void lynq_gnss__measurement_callback(GnssData_ext* data) 

+{

+    int i;

+    int meas_cnt;

+    GnssMeasurement_ext* raw_meas;

+    GnssClock_ext* clk;

+    ElapsedRealtime* elap_realtime;

+

+    if (data == NULL) {

+        printf("param error");

+        return;

+    }

+

+    meas_cnt = data->measurement_count;

+    printf("==================== print_gnss_measurement ====================");

+    printf("measurement count is: %d", meas_cnt);

+    for (i = 0; i < meas_cnt; i++) {

+        raw_meas = &(data->measurements[i]);

+        printf("********* measurement message %d *********\r\n", i+1);

+        printf("flags=0x%x\r\n", raw_meas->legacyMeasurement.flags);

+        printf("svid=%d\r\n", raw_meas->legacyMeasurement.svid);

+        printf("constellation=0x%x\r\n", raw_meas->legacyMeasurement.constellation);

+        printf("time_offset_ns=%f\r\n", raw_meas->legacyMeasurement.time_offset_ns);

+        printf("state=0x%x\r\n", raw_meas->legacyMeasurement.state);

+        printf("c_n0_dbhz=%f\r\n", raw_meas->legacyMeasurement.c_n0_dbhz);

+        printf("pseudorange_rate_mps=%f\r\n", raw_meas->legacyMeasurement.pseudorange_rate_mps);

+        printf("pseudorange_rate_uncertainty_mps=%f\r\n", raw_meas->legacyMeasurement.pseudorange_rate_uncertainty_mps);

+        printf("accumulated_delta_range_state=0x%x\r\n", raw_meas->legacyMeasurement.accumulated_delta_range_state);

+        printf("accumulated_delta_range_m=%f\r\n", raw_meas->legacyMeasurement.accumulated_delta_range_m);

+        printf("accumulated_delta_range_uncertainty_m=%f\r\n", raw_meas->legacyMeasurement.accumulated_delta_range_uncertainty_m);

+        printf("carrier_frequency_hz=%f\r\n", raw_meas->legacyMeasurement.carrier_frequency_hz);

+        printf("carrier_phase=%f\r\n", raw_meas->legacyMeasurement.carrier_phase);

+        printf("carrier_phase_uncertainty=%f\r\n", raw_meas->legacyMeasurement.carrier_phase_uncertainty);

+        printf("multipath_indicator=%d\r\n", raw_meas->legacyMeasurement.multipath_indicator);

+        printf("snr_db=%f\r\n", raw_meas->legacyMeasurement.snr_db);

+

+        printf("agc_level_db=%f\r\n", raw_meas->agc_level_db);

+        printf("codeType=%s\r\n", raw_meas->codeType);

+        printf("fullInterSignalBiasNs=%f\r\n", raw_meas->fullInterSignalBiasNs);

+        printf("fullInterSignalBiasUncertaintyNs=%f\r\n", raw_meas->fullInterSignalBiasUncertaintyNs);

+        printf("satelliteInterSignalBiasNs=%f\r\n", raw_meas->satelliteInterSignalBiasNs);

+        printf("satelliteInterSignalBiasUncertaintyNs=%f\r\n", raw_meas->satelliteInterSignalBiasUncertaintyNs);

+        printf("basebandCN0DbHz=%f\r\n", raw_meas->basebandCN0DbHz);

+    }

+

+    clk = &(data->clock);

+    printf("======================= print_gnss_clock =======================");

+    printf("flags=0x%x\r\n", clk->legacyClock.flags);

+    printf("leap_second=%d\r\n", clk->legacyClock.leap_second);

+    printf("time_uncertainty_ns=%f\r\n", clk->legacyClock.time_uncertainty_ns);

+

+    printf("bias_ns=%f\r\n", clk->legacyClock.bias_ns);

+    printf("bias_uncertainty_ns=%f\r\n", clk->legacyClock.bias_uncertainty_ns);

+    printf("drift_nsps=%f\r\n", clk->legacyClock.drift_nsps);

+    printf("drift_uncertainty_nsps=%f\r\n", clk->legacyClock.drift_uncertainty_nsps);

+    printf("hw_clock_discontinuity_count=%d\r\n", clk->legacyClock.hw_clock_discontinuity_count);

+    printf("constellation=%d\r\n", clk->referenceSignalTypeForIsb.constellation);

+    printf("carrierFrequencyHz=%f\r\n", clk->referenceSignalTypeForIsb.carrierFrequencyHz);

+    printf("codeType=%s\r\n", clk->referenceSignalTypeForIsb.codeType);

+

+    elap_realtime = &(data->elapsedRealtime);

+    printf("================= print_gnss_elapsed_real_time =================");

+    printf("flags=0x%x\r\n", elap_realtime->flags);

+    printf("timestampNs=%lld\r\n", elap_realtime->timestampNs);

+    printf("timeUncertaintyNs=%lld\r\n", elap_realtime->timeUncertaintyNs);

+

+    return;

+}

+

+lynq_raw_gnss_cbs lynq_gnss_raw_callbacks = 

+{

+    .size = sizeof(lynq_raw_gnss_cbs),

+    .lynq_measurement_callback = lynq_gnss__measurement_callback,

+};

+

+lynq_raw_gnss_cbs* lynq_get__raw_callbacks(void)

+{

+    return &lynq_gnss_raw_callbacks;

+}

diff --git a/IC_src/mtk/packages/apps/lynq-gnss-test/lynq-gnss-test.c b/IC_src/mtk/packages/apps/lynq-gnss-test/lynq-gnss-test.c
new file mode 100755
index 0000000..e3bb637
--- /dev/null
+++ b/IC_src/mtk/packages/apps/lynq-gnss-test/lynq-gnss-test.c
@@ -0,0 +1,199 @@
+#include <stdarg.h>

+#include <stdio.h>

+#include <stdarg.h>

+#include <unistd.h>

+#include <sys/time.h>

+#include <time.h>

+#include <signal.h>

+#include <string.h>

+#include <errno.h>

+#include <sys/un.h>

+#include <arpa/inet.h>

+#include <dlfcn.h>

+#include <stdlib.h>

+#include <semaphore.h>

+

+#include "lynq_gnss.h"

+#include "liblog/lynq_deflog.h"

+#include "liblog/liblog.h"

+#include "lynq-gnss-test.h"

+

+#define USER_LOG_TAG "LYNQ_GNSS"

+

+lynq_gnss_cb* cbs =NULL;

+lynq_raw_gnss_cbs* raw_cbs = NULL;

+

+sem_t g_lynq_test_exit_sem;

+

+extern lynq_test_gnss_result lynq_test_result;

+

+void lynq_show_gnss_test_result(lynq_test_gnss_result* result)

+{

+    if(NULL != result)

+    {

+        LYVERBLOG("------------------------------------------------------------");

+        LYVERBLOG("fix type: %d",result->fix_type);

+        LYVERBLOG("Flags: 0x%x",result->location.legacyLocation.flags);

+        LYVERBLOG("latitude: %.10lf",result->location.legacyLocation.latitude);

+        LYVERBLOG("longitude: %.10lf",result->location.legacyLocation.longitude);

+        LYVERBLOG("altitude: %.10lf",result->location.legacyLocation.altitude);

+        LYVERBLOG("speed: %fm/s",result->location.legacyLocation.speed);

+        LYVERBLOG("bearing: %f",result->location.legacyLocation.bearing);

+        LYVERBLOG("accuracy: %fm",result->location.horizontalAccuracyMeters);

+        LYVERBLOG("timestamp: %ld",result->location.legacyLocation.timestamp);

+        LYVERBLOG("------------------------------------------------------------");

+    }

+}

+

+// -1 means failure

+int lynq_test_block_here() {

+    if (sem_init(&g_lynq_test_exit_sem, 0, 0) == -1) 

+    {

+        LYVERBLOG("lynq_test_block_here() sem_init failure reason=%s\n", strerror(errno));

+        return -1;

+    }

+    sem_wait(&g_lynq_test_exit_sem);

+    if (sem_destroy(&g_lynq_test_exit_sem) == -1) 

+    {

+        LYVERBLOG("lynq_test_block_here() sem_destroy reason=%s\n", strerror(errno));

+    }

+    LYVERBLOG("lynq_test exit blocking...");

+    return 0;

+}

+

+int main(int argc,char **argv)

+{

+    LYLOGEINIT(USER_LOG_TAG);

+    //registerTriggerCallback(getCallback);

+    //register_key_info();

+    //register_broadcast_send();

+    LYVERBLOG("Log init");

+    int index = 0;

+    int ret_test = 0;

+    unsigned int delete_flags = 0;

+    if (argc == 1)

+    {

+        LYVERBLOG("LYNQ GNSS START");

+        delete_flags = GPS_DELETE_RTI;

+    }

+    else

+    {

+        for (index=0; index<argc; index++)

+        {

+            LYVERBLOG("%s",argv[index]);

+        }

+        if (!strncmp(argv[1],LYNQ_TEST_HOT_START,sizeof(LYNQ_TEST_HOT_START)))

+        {

+            LYVERBLOG("LYNQ GNSS HOT START");

+            delete_flags = GPS_DELETE_RTI;

+        }

+        else if (!strncmp(argv[1],LYNQ_TEST_WARM_START,sizeof(LYNQ_TEST_WARM_START)))

+        {

+            LYVERBLOG("LYNQ GNSS WARM START");

+            delete_flags = GPS_DELETE_EPHEMERIS;

+        }

+        else if (!strncmp(argv[1],LYNQ_TEST_COLD_START,sizeof(LYNQ_TEST_COLD_START)))

+        {

+            LYVERBLOG("LYNQ GNSS COLD START");

+            delete_flags = GPS_DELETE_EPHEMERIS |

+                    GPS_DELETE_POSITION | GPS_DELETE_TIME | GPS_DELETE_IONO |

+                    GPS_DELETE_UTC | GPS_DELETE_HEALTH;

+        }

+        else if (!strncmp(argv[1],LYNQ_TEST_FULL_START,sizeof(LYNQ_TEST_FULL_START)))

+        {

+            LYVERBLOG("LYNQ GNSS FULL START");

+            delete_flags = GPS_DELETE_ALL;

+        }

+        else if (!strncmp(argv[1],LYNQ_TEST_RAW_START,sizeof(LYNQ_TEST_RAW_START)))

+        {

+            LYVERBLOG("LYNQ GNSS MEAS MODE START");

+            cbs = lynq_test_get__gnss_callbacks();

+            if(NULL != cbs)

+            {

+                LYVERBLOG("get cbs successful");

+            }

+            else

+            {

+                LYVERBLOG("cbs get error");

+            }

+            raw_cbs = lynq_get__raw_callbacks();

+            if(NULL == raw_cbs)

+            {

+                LYVERBLOG("raw_cbs get error");

+            }

+            //open GNSS

+            ret_test = lynq_gnss_callback_reg(cbs);  

+            LYVERBLOG("cbs reg ret=%d",ret_test);

+            

+            int init_state = lynq_gnss_init();

+            if(init_state == 0)

+            {

+                LYVERBLOG("gnss init ret_test =%d",init_state);

+            }

+            else

+            {

+                LYVERBLOG("error");

+            }

+            ret_test = lynq_gnss_start_raw_meas_mode(raw_cbs);

+            LYVERBLOG("typethree:start raw meas address %p",raw_cbs);

+

+            LYVERBLOG("raw mode start");

+

+            lynq_test_block_here();

+

+            return 0;

+        }

+        else

+        {

+            LYVERBLOG("invalid in comming start type");

+            return -1;

+        }

+    }

+

+    //pre set

+    // lynq_gnss_set_start_mode(LYNQ_MODE_GPS_GLONASS_BEIDOU);

+

+    // lynq_gnss_debug_switch(LYNQ_SWITCH_ENABLE);

+

+    // lynq_gnss_epo_switch(LYNQ_SWITCH_ENABLE);

+

+    //init

+    LYVERBLOG("pre set successful,%d",ret_test);

+    cbs = lynq_test_get__gnss_callbacks();

+    if(NULL != cbs)

+    {

+        LYVERBLOG("get cbs successful");

+    }

+    else

+    {

+        LYVERBLOG("cbs get error");

+    }

+    //open GNSS

+    ret_test = lynq_gnss_callback_reg(cbs);  

+    LYVERBLOG("cbs reg ret=%d",ret_test);

+    int init_state = lynq_gnss_init();

+    if(init_state == 0)

+    {

+        LYVERBLOG("gnss init ret_test =%d",init_state);

+    }

+    else

+    {

+        LYVERBLOG("error");

+    }

+    

+    lynq_gnss_delete_aiding_data(delete_flags);

+    int start_state = lynq_gnss_start();

+    if(start_state == 0)

+    {

+        LYVERBLOG("gnss init successful,ret_test =%d",start_state);

+    }

+    else

+    {

+        LYVERBLOG("error");

+    }

+    LYVERBLOG("delete_flags:%d",delete_flags);

+

+    lynq_test_block_here();

+

+    return 0;

+}
\ No newline at end of file
diff --git a/IC_src/mtk/packages/apps/lynq-gnss-test/lynq-gnss-test.h b/IC_src/mtk/packages/apps/lynq-gnss-test/lynq-gnss-test.h
new file mode 100755
index 0000000..328e17d
--- /dev/null
+++ b/IC_src/mtk/packages/apps/lynq-gnss-test/lynq-gnss-test.h
@@ -0,0 +1,27 @@
+#ifndef LYNQ_GNSS_TEST_H

+#define LYNQ_GNSS_TEST_H

+

+typedef struct 

+{

+    lynq_GpsLocation_ext location;

+    char utc_time[5];

+	int fix_type;

+}lynq_test_gnss_result;

+

+lynq_gnss_cb* lynq_test_get__gnss_callbacks(void);

+

+lynq_raw_gnss_cbs* lynq_get__raw_callbacks(void);

+

+void lynq_show_gnss_test_result(lynq_test_gnss_result* result);

+

+#define LYNQ_TEST_HOT_START "hot"

+

+#define LYNQ_TEST_WARM_START "warm"

+

+#define LYNQ_TEST_COLD_START "cold"

+

+#define LYNQ_TEST_FULL_START "full"

+

+#define LYNQ_TEST_RAW_START "raw_start"

+

+#endif
\ No newline at end of file
diff --git a/IC_src/mtk/packages/apps/lynq-gnss-test/makefile b/IC_src/mtk/packages/apps/lynq-gnss-test/makefile
new file mode 100755
index 0000000..1facb86
--- /dev/null
+++ b/IC_src/mtk/packages/apps/lynq-gnss-test/makefile
@@ -0,0 +1,91 @@
+SHELL = /bin/sh

+RM = rm -f

+

+LOCAL_CFLAGS := -Wall \

+                -g -Os \

+                -flto \

+                -DRIL_SHLIB \

+                -DATCI_PARSE \

+                -DKEEP_ALIVE \

+                -D__LINUX_OS__ \

+				-D__COMPILE_OPTION__ \

+                -DECALL_SUPPORT

+

+$(warning ################# C2K support: $(RAT_CONFIG_C2K_SUPPORT))

+ifeq ($(strip $(RAT_CONFIG_C2K_SUPPORT)), yes)

+    LOCAL_CFLAGS += -DC2K_SUPPORT

+

+endif

+

+ifeq ($(strip $(MTK_MULTI_SIM_SUPPORT)), dsds)

+    LOCAL_CFLAGS += -DANDROID_SIM_COUNT_2 \

+                     -DANDROID_MULTI_SIM \

+                     -DMODE_DSDS 

+endif

+

+ifeq ($(strip $(MTK_MULTI_SIM_SUPPORT)), dsss)

+    LOCAL_CFLAGS += -DMODE_DSSS

+endif

+

+$(warning ################# TARGET_PLATFORM: $(TARGET_PLATFORM))

+ifeq ($(strip $(TARGET_PLATFORM)), mt2731)

+#$(warning #################add for debug $(ROOT), $(includedir))

+$(warning ################# TARGET_PLATFORM_MT2731)

+    LOCAL_CFLAGS += -DTARGET_PLATFORM_MT2731 \

+                    -DMD_93_SUPPORT

+else ifeq ($(strip $(TARGET_PLATFORM)), mt2635)

+$(warning ################# TARGET_PLATFORM_MT2635)

+    LOCAL_CFLAGS += -DTARGET_PLATFORM_MT2635 \

+                    -DMD_90_SUPPORT

+endif

+

+

+LOCAL_PATH   = .

+#CFLAGS = $(LOCAL_CFLAGS) -std=c99 

+#CXXFLAGS = $(LOCAL_CFLAGS) -std=gnu++14

+$(warning ################# ZHOUQUNCHAO ROOT: $(ROOT),includedir:$(includedir),LOCAL_PATH:$(LOCAL_PATH))

+LOCAL_C_INCLUDES = \

+  -I. \

+  -I$(LOCAL_PATH) \

+  -I$(ROOT)$(includedir)/logger \

+  -I$(ROOT)$(includedir)/liblog \

+  -I$(ROOT)$(includedir)/include  \

+  -I$(ROOT)$(includedir)/gps_hal \

+  -I$(ROOT)$(includedir)/gps_hal/inc \

+  -I$(ROOT)$(includedir)/gps_hal/hardware \

+

+LOCAL_C_INCLUDES+=$(DNS_FLAGS)

+

+LOCAL_LIBS := \

+    -L. \

+    -ldl \

+    -llynq-log \

+	-lrt \

+    -lpthread \

+	-lgnsshal \

+	-llynq-gnss \

+    -llynq-systime \

+    -llynq-uci \

+    #-llynq-tele-ril \

+    

+

+#LOCAL_SRC_FILES_CPP = $(wildcard *.cpp gpio/*.cpp ril/*.cpp)

+#LOCAL_SRC_FILES_C = $(wildcard *.c gps/*.c)

+LOCAL_SRC_FILES_C = $(wildcard *.c wildcard src/*.c)

+EXECUTABLE = lynq-gnss-test

+

+OBJECTS=$(LOCAL_SRC_FILES_C:.c=.o)

+all: $(EXECUTABLE)

+$(warning test)

+$(EXECUTABLE): $(OBJECTS)

+	$(CXX) $(OBJECTS) $(LOCAL_LIBS) $(LOCAL_CFLAGS) $(LOCAL_C_INCLUDES) -o $@

+

+%.o: %.c

+	$(warning ----->build $<)

+	$(CC) $(LOCAL_C_INCLUDES) $(LOCAL_CFLAGS) $(LOCAL_LIBS) -o $@ -c $<

+%.o : %.cpp

+	$(CXX) $(LOCAL_C_INCLUDES) $(LOCAL_CFLAGS) $(LOCAL_LIBS) -o $@ -c $<

+

+.PHONY: clean

+clean:

+	$(RM) $(OBJECTS) $(EXECUTABLE)

diff --git a/IC_src/mtk/packages/apps/lynq-low-power/src/lynq-low-power.sh b/IC_src/mtk/packages/apps/lynq-low-power/src/lynq-low-power.sh
new file mode 100755
index 0000000..2064377
--- /dev/null
+++ b/IC_src/mtk/packages/apps/lynq-low-power/src/lynq-low-power.sh
@@ -0,0 +1,22 @@
+
+#!/bin/bash
+systemctl stop lynq_ril_service.service
+sleep 1
+echo 7 | emdlogger_ctrl
+telephony &
+sleep 1
+sh /usr/bin/demoscript/SM_API/setATCMD.sh AT+ESIMPOWER=0
+sleep 1
+sh /usr/bin/demoscript/DSDS/set_default_sim_all_except_data.sh 1
+sleep 1
+sh /usr/bin/demoscript/Network_API/RadioOn.sh 0
+sleep 1
+sh /usr/bin/demoscript/DSDS/set_default_sim_all_except_data.sh 0
+sleep 1
+sh /usr/bin/demoscript/Network_API/RadioOn.sh 0
+echo reg_netsys_srcclkena_mask_b 0 > /sys/power/spm/suspend_ctrl
+echo reg_netsys_infra_req_mask_b 0 > /sys/power/spm/suspend_ctrl
+echo reg_netsys_apsrc_req_mask_b 0 > /sys/power/spm/suspend_ctrl
+echo reg_netsys_vrf18_req_mask_b 0 > /sys/power/spm/suspend_ctrl
+echo reg_netsys_ddr_en_mask_b 0 > /sys/power/spm/suspend_ctrl
+echo mem > /sys/power/autosleep
diff --git a/IC_src/mtk/packages/apps/lynq-low-power/src/main.cpp b/IC_src/mtk/packages/apps/lynq-low-power/src/main.cpp
new file mode 100755
index 0000000..dc29125
--- /dev/null
+++ b/IC_src/mtk/packages/apps/lynq-low-power/src/main.cpp
@@ -0,0 +1,29 @@
+
+#include <stdio.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <stdint.h>
+#include <include/lynq_sim.h>
+#ifdef __cplusplus
+extern "C" {
+#endif
+int main(void){
+    system("echo \"Sys flight mode\" >/dev/console");
+    //system("source /data/lynq-low-power.sh");
+    lynq_sim_init(2022);
+    int ret = lynq_sim_power(0);
+    printf("ret %d\n", ret);
+    ret = lynq_factory_radio_state(0);
+    printf("ret %d\n", ret);
+    system("echo 7 | emdlogger_ctrl");
+    system("echo reg_netsys_srcclkena_mask_b 0 > /sys/power/spm/suspend_ctrl");
+    system("echo reg_netsys_infra_req_mask_b 0 > /sys/power/spm/suspend_ctrl");
+    system("echo reg_netsys_apsrc_req_mask_b 0 > /sys/power/spm/suspend_ctrl");
+    system("echo reg_netsys_vrf18_req_mask_b 0 > /sys/power/spm/suspend_ctrl");
+    system("echo reg_netsys_ddr_en_mask_b 0 > /sys/power/spm/suspend_ctrl");
+    system("echo mem > /sys/power/autosleep");
+    return 0;
+}
+#ifdef __cplusplus
+}
+#endif 
diff --git a/IC_src/mtk/packages/apps/lynq-low-power/src/makefile b/IC_src/mtk/packages/apps/lynq-low-power/src/makefile
new file mode 100755
index 0000000..59c05f1
--- /dev/null
+++ b/IC_src/mtk/packages/apps/lynq-low-power/src/makefile
@@ -0,0 +1,85 @@
+SHELL = /bin/sh
+RM = rm -f
+
+LOCAL_CFLAGS := -Wall \
+                -g -Os \
+                -flto \
+                -DRIL_SHLIB \
+                -DATCI_PARSE \
+                -DKEEP_ALIVE \
+                -D__LINUX_OS__ \
+                -DECALL_SUPPORT
+
+$(warning ################# C2K support: $(RAT_CONFIG_C2K_SUPPORT))
+ifeq ($(strip $(RAT_CONFIG_C2K_SUPPORT)), yes)
+    LOCAL_CFLAGS += -DC2K_SUPPORT
+
+endif
+
+ifeq ($(strip $(MTK_MULTI_SIM_SUPPORT)), dsds)
+    LOCAL_CFLAGS += -DANDROID_SIM_COUNT_2 \
+                     -DANDROID_MULTI_SIM \
+                     -DMODE_DSDS
+endif
+
+ifeq ($(strip $(MTK_MULTI_SIM_SUPPORT)), dsss)
+    LOCAL_CFLAGS += -DMODE_DSSS
+endif
+
+$(warning ################# TARGET_PLATFORM: $(TARGET_PLATFORM))
+ifeq ($(strip $(TARGET_PLATFORM)), mt2731)
+#$(warning #################add for debug $(ROOT), $(includedir))
+$(warning ################# TARGET_PLATFORM_MT2731)
+    LOCAL_CFLAGS += -DTARGET_PLATFORM_MT2731 \
+                    -DMD_93_SUPPORT
+else ifeq ($(strip $(TARGET_PLATFORM)), mt2635)
+$(warning ################# TARGET_PLATFORM_MT2635)
+    LOCAL_CFLAGS += -DTARGET_PLATFORM_MT2635 \
+                    -DMD_90_SUPPORT
+endif
+
+
+LOCAL_PATH   = .
+#CFLAGS = $(LOCAL_CFLAGS) -std=c99 
+#CXXFLAGS = $(LOCAL_CFLAGS) -std=gnu++14
+$(warning ################# ZHOUQUNCHAO ROOT: $(ROOT),includedir:$(includedir),LOCAL_PATH:$(LOCAL_PATH))
+LOCAL_C_INCLUDES = \
+  -I. \
+  -I$(LOCAL_PATH) \
+  -I$(ROOT)$(includedir)/ \
+  -I$(ROOT)$(includedir)/include  \
+  -I$(ROOT)$(includedir)/libsms \
+  -DLIB_GNSS_HAL_DIR='"$(libdir)"'
+
+LOCAL_C_INCLUDES+=$(DNS_FLAGS)
+
+LOCAL_LIBS := \
+    -L. \
+    -ldl \
+    -lstdc++ \
+    -llog \
+    -lcutils \
+    -lutils \
+    -lbinder \
+    -lpthread \
+    -llynq-sim \
+
+LOCAL_SRC_FILES_CPP = $(wildcard *.cpp gpio/*.cpp ril/*.cpp)
+LOCAL_SRC_FILES_C = $(wildcard *.c gps/*.c)
+EXECUTABLE = lynq-low-power
+
+OBJECTS=$(LOCAL_SRC_FILES_CPP:.cpp=.o) $(LOCAL_SRC_FILES_C:.c=.o)
+all: $(EXECUTABLE)
+
+$(EXECUTABLE): $(OBJECTS)
+	$(CXX) $(OBJECTS) $(LOCAL_LIBS) $(LOCAL_CFLAGS) $(LOCAL_C_INCLUDES) -o $@
+
+%.o: %.c
+	$(warning ----->build $<)
+	$(CC) $(LOCAL_C_INCLUDES) $(LOCAL_CFLAGS) $(LOCAL_LIBS) -o $@ -c $<
+%.o : %.cpp
+	$(CXX) $(LOCAL_C_INCLUDES) $(LOCAL_CFLAGS) $(LOCAL_LIBS) -o $@ -c $<
+
+.PHONY: clean
+clean:
+	$(RM) $(OBJECTS) $(EXECUTABLE)
diff --git a/IC_src/mtk/packages/apps/power-test/LICENSE b/IC_src/mtk/packages/apps/power-test/LICENSE
new file mode 100644
index 0000000..77f59ed
--- /dev/null
+++ b/IC_src/mtk/packages/apps/power-test/LICENSE
@@ -0,0 +1,31 @@
+Copyright Statement:
+
+This software/firmware and related documentation ("MediaTek Software") are
+protected under relevant copyright laws. The information contained herein is
+confidential and proprietary to MediaTek Inc. and/or its licensors. Without
+the prior written permission of MediaTek inc. and/or its licensors, any
+reproduction, modification, use or disclosure of MediaTek Software, and
+information contained herein, in whole or in part, shall be strictly
+prohibited.
+
+MediaTek Inc. (C) 2015. All rights reserved.
+
+BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
+ON AN "AS-IS" BASIS ONLY. MEDIATEK 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 MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH
+RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
+INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK 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 MEDIATEK
+SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE
+RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S
+ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE
+RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE
+MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
+CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
diff --git a/IC_src/mtk/packages/apps/power-test/makefile b/IC_src/mtk/packages/apps/power-test/makefile
new file mode 100644
index 0000000..979de7b
--- /dev/null
+++ b/IC_src/mtk/packages/apps/power-test/makefile
@@ -0,0 +1,47 @@
+SHELL = /bin/sh

+RM = rm -f

+

+LOCAL_CFLAGS := -Wall \

+                -g -Os \

+                -flto \

+                -DRIL_SHLIB \

+                -DATCI_PARSE \

+                -DKEEP_ALIVE \

+                -D__LINUX_OS__ \

+                -DECALL_SUPPORT

+                

+CXXFLAGS = -fpermissive

+LOCAL_PATH   = .

+#CFLAGS = $(LOCAL_CFLAGS) -std=c99 

+#CXXFLAGS = $(LOCAL_CFLAGS) -std=gnu++14

+$(warning ################# ZHOUQUNCHAO ROOT: $(ROOT),includedir:$(includedir),LOCAL_PATH:$(LOCAL_PATH))

+LOCAL_C_INCLUDES = \

+  -I. \

+  -I$(LOCAL_PATH) \

+

+LOCAL_C_INCLUDES+=$(DNS_FLAGS)

+

+LOCAL_LIBS := \

+    -L. \

+    -ldl \

+    -lstdc++ \

+	

+LOCAL_SRC_FILES_CPP = $(wildcard *.cpp)

+LOCAL_SRC_FILES_C = $(wildcard *.c)

+EXECUTABLE = power-test

+

+OBJECTS=$(LOCAL_SRC_FILES_CPP:.cpp=.o) $(LOCAL_SRC_FILES_C:.c=.o)

+all: $(EXECUTABLE)

+

+$(EXECUTABLE): $(OBJECTS)

+	$(CXX) $(OBJECTS) $(LOCAL_LIBS) $(LOCAL_CFLAGS) $(LOCAL_C_INCLUDES) -o $@ 

+

+%.o: %.c

+	$(warning ----->build $<)

+	$(CC) $(LOCAL_C_INCLUDES) $(LOCAL_CFLAGS) $(LOCAL_LIBS) -o $@ -c $<

+%.o : %.cpp

+	$(CXX) $(LOCAL_C_INCLUDES) $(LOCAL_CFLAGS) $(LOCAL_LIBS) -o $@ -c $<

+

+.PHONY: clean

+clean:

+	$(RM) $(OBJECTS) $(EXECUTABLE)

diff --git a/IC_src/mtk/packages/apps/power-test/power-test.c b/IC_src/mtk/packages/apps/power-test/power-test.c
new file mode 100644
index 0000000..94b3f53
--- /dev/null
+++ b/IC_src/mtk/packages/apps/power-test/power-test.c
@@ -0,0 +1,28 @@
+#include <stdio.h>

+#include <string.h>

+#include <stdlib.h>

+

+void lynq_power_mode(char *power_mode)

+{

+    char gyCmd[64] = {0};

+	sprintf(gyCmd,"sh /etc/powerscript/power_mode.sh %s",power_mode);

+	system(gyCmd);

+}

+

+

+int main(int argc,  char *argv[])

+{

+    if(argc==1){

+        printf("pls choose power mode\n");

+        return -1;

+    }

+    if(!strcmp(argv[1],"flight")){

+        lynq_power_mode(argv[1]);

+    }else if(!strcmp(argv[1],"standby")){

+        lynq_power_mode(argv[1]);

+    }else{

+        printf("invalid power mode\n");

+    }

+

+	return 0;

+}
\ No newline at end of file
diff --git a/IC_src/mtk/packages/apps/power-test/powerscript/power_mode.sh b/IC_src/mtk/packages/apps/power-test/powerscript/power_mode.sh
new file mode 100644
index 0000000..7d2ed29
--- /dev/null
+++ b/IC_src/mtk/packages/apps/power-test/powerscript/power_mode.sh
@@ -0,0 +1,25 @@
+#!/bin/sh
+
+case "$1" in
+	"flight")
+		echo "Sys flight mode" >/dev/console
+        echo 11 | emdlogger_ctrl  ##set log status
+		sleep 1	                 
+        mdlogctlstop              ##stop modem log
+        echo mem > /sys/power/autosleep  ##set autosleep modem
+        /usr/bin/telephony &				##initialize Ril function.
+        sleep 5
+        sh/usr/bin/demoscript/DSDS/set_default_sim_all_except_data.sh 0			##switch sim card 0
+        echo "RIL_REQUEST_RADIO_POWER 0" > dev/udp/127.0.0.1/8000					##turn off radio off sim card 0
+        sh/usr/bin/demoscript/DSDS/set_default_sim_all_except_data.sh 1				##switch sim card 1
+        echo "RIL_REQUEST_RADIO_POWER 0" >/dev/udp/127.0.0.1/8000				##turn off radio off sim card 1
+	;;
+
+	"standby")
+		echo "Sys standby mode" >/dev/console
+	;;
+
+	*)
+		echo $0 'power          - start system'
+		;;
+esac
\ No newline at end of file
diff --git a/IC_src/mtk/packages/apps/power-test/powerscript/standby_mode.sh b/IC_src/mtk/packages/apps/power-test/powerscript/standby_mode.sh
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/IC_src/mtk/packages/apps/power-test/powerscript/standby_mode.sh