Merge "[Bugfix][T106BUG-48] Resolve setting DTMF to return 8004 error"
diff --git a/cap/zx297520v3/sources/meta-zxic-custom/conf/distro/vehicle_dc.conf b/cap/zx297520v3/sources/meta-zxic-custom/conf/distro/vehicle_dc.conf
index d5acc77..d8c6a80 100755
--- a/cap/zx297520v3/sources/meta-zxic-custom/conf/distro/vehicle_dc.conf
+++ b/cap/zx297520v3/sources/meta-zxic-custom/conf/distro/vehicle_dc.conf
@@ -225,6 +225,8 @@
 	service \
 	service-test \
         lynq-ril-service \
+        lynq-qser-sim-demo \
+        lynq-qser-sms-demo \
         uci \
         gdb \
         mobiletek-tester-rdit \
diff --git a/cap/zx297520v3/sources/meta-zxic-custom/conf/distro/vehicle_dc_ref.conf b/cap/zx297520v3/sources/meta-zxic-custom/conf/distro/vehicle_dc_ref.conf
index e67c8a4..8d07dc3 100755
--- a/cap/zx297520v3/sources/meta-zxic-custom/conf/distro/vehicle_dc_ref.conf
+++ b/cap/zx297520v3/sources/meta-zxic-custom/conf/distro/vehicle_dc_ref.conf
@@ -193,6 +193,8 @@
         liblynq-qser-fota \
         libpoweralarm \
         liblynq-systime \
+        liblynq-autosuspend \
+        liblynq-qser-autosuspend \
 	"
 
 zxic_lib += "${@bb.utils.contains('CONFIG_TEL_API_SUPPORT', 'RIL', 'libril', 'libtelsvr', d)}"
@@ -263,6 +265,10 @@
         poweralarm-demo \
         lynq-systime-demo \
         lynq-fota-backup \
+        lynq-qser-sim-demo \
+        lynq-qser-sms-demo \
+        lynq-qser-data-demo \
+        lynq-autosuspend \
         "
 
 zxic_app_open += "${@bb.utils.contains('CONFIG_TEL_API_SUPPORT', 'RIL', 'rild', '', d)}"
diff --git a/cap/zx297520v3/sources/meta-zxic-custom/recipes-core/images/files/zx297520v3/vehicle_dc_ref/fs/normal/rootfs/etc/init.d/zcatlog_config.sh b/cap/zx297520v3/sources/meta-zxic-custom/recipes-core/images/files/zx297520v3/vehicle_dc_ref/fs/normal/rootfs/etc/init.d/zcatlog_config.sh
index 064dd2b..604cd22 100755
--- a/cap/zx297520v3/sources/meta-zxic-custom/recipes-core/images/files/zx297520v3/vehicle_dc_ref/fs/normal/rootfs/etc/init.d/zcatlog_config.sh
+++ b/cap/zx297520v3/sources/meta-zxic-custom/recipes-core/images/files/zx297520v3/vehicle_dc_ref/fs/normal/rootfs/etc/init.d/zcatlog_config.sh
@@ -1,5 +1,9 @@
 #!/bin/sh
 
+if [ ! -f "/mnt/userdata/config" ];then
+	cp -R /etc/config /mnt/userdata/
+fi
+
 # 0 for usb, 1 for net
 if [ -e /proc/sys/zcatkern/log_com_mode ]; then
   zcat_com_mode=`nv get zcat_mode`
diff --git a/cap/zx297520v3/sources/meta-zxic-custom/recipes-lynq/liblynq-autosuspend/liblynq-autosuspend.bb b/cap/zx297520v3/sources/meta-zxic-custom/recipes-lynq/liblynq-autosuspend/liblynq-autosuspend.bb
new file mode 100644
index 0000000..fc81884
--- /dev/null
+++ b/cap/zx297520v3/sources/meta-zxic-custom/recipes-lynq/liblynq-autosuspend/liblynq-autosuspend.bb
@@ -0,0 +1,53 @@
+#inherit externalsrc package
+
+DESCRIPTION = "liblynq-autosuspend"
+LICENSE = "CLOSED"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=b1e07e8d88e26263e71d3a9e2aa9a2ff"
+DEPENDS += "libbsp liblynq-log"
+#inherit workonsrc
+WORKONSRC = "${TOPDIR}/../src/lynq/lib/liblynq-autosuspend"
+FILESEXTRAPATHS_prepend :="${TOPDIR}/../src/lynq/lib/:"
+SRC_URI = " \
+          file://liblynq-autosuspend \
+          "
+
+SRC-DIR = "${S}/../liblynq-autosuspend"
+TARGET_CC_ARCH += "${LDFLAGS}"
+BB_INCLUDE_ADD = "--sysroot=${STAGING_DIR_HOST}"
+BB_LDFLAGS_ADD = "--sysroot=${STAGING_DIR_HOST} -Wl,--hash-style=gnu"
+#Parameters passed to do_compile()
+EXTRA_OEMAKE = "'TARGET_PLATFORM = ${TARGET_PLATFORM}'"
+
+FILES_${PN} = "${base_libdir}/*.so \
+               ${base_bindir}\
+               ${base_sbindir} \
+               /etc/dbus-1/system.d/"
+FILES_${PN}-dev = "/test \
+                   ${includedir}"
+FILES_${PN}-doc = "/doc"
+FILES_${PN}-dbg ="${base_bindir}/.debug \
+                  ${base_libdir}/.debug \
+                  ${base_sbindir}/.debug"
+INSANE_SKIP_${PN} += "already-stripped"
+INSANE_SKIP_${PN} += "installed-vs-shipped"
+#INHIBIT_PACKAGE_STRIP = "1"
+do_compile () {
+	if [ "${PACKAGE_ARCH}" = "cortexa7hf-vfp-vfpv4-neon" ]; then
+		oe_runmake all -C ${SRC-DIR} ROOT=${STAGING_DIR_HOST} OFLAGS="--sysroot=${STAGING_DIR_HOST} -Os -mfpu=neon-vfpv4 -mhard-float -Wl,--hash-style=gnu"
+	elif [ "${PACKAGE_ARCH}" = "cortexa7hf-neon-vfpv4" ]; then
+		oe_runmake all -C ${SRC-DIR} ROOT=${STAGING_DIR_HOST} OFLAGS="--sysroot=${STAGING_DIR_HOST} -Os -mfpu=neon-vfpv4 -mhard-float -Wl,--hash-style=gnu"
+	elif [ "${PACKAGE_ARCH}" = "cortexa53hf-neon-fp-armv8" ]; then
+		oe_runmake all -C ${SRC-DIR} ROOT=${STAGING_DIR_HOST} OFLAGS="--sysroot=${STAGING_DIR_HOST} -Os -mfpu=neon-vfpv4 -mhard-float -Wl,--hash-style=gnu -mhard-float -mfpu=neon-fp-armv8 -mfloat-abi=hard -mcpu=cortex-a53 -mtune=cortex-a53"
+	else
+		oe_runmake all -C ${SRC-DIR} ROOT=${STAGING_DIR_HOST} OFLAGS="--sysroot=${STAGING_DIR_HOST} -Os -Wl,--hash-style=gnu -DTELEPHONYWARE"
+	fi
+}
+
+do_install() {
+    oe_runmake install -C ${SRC-DIR} ROOT=${D}
+    if [ -d "${WORKONSRC}" ] ; then
+        install -d ${D}${includedir}
+        cp -af ${SRC-DIR}/include/libauto/ ${D}${includedir}/libauto
+    fi
+}
+
diff --git a/cap/zx297520v3/sources/meta-zxic-custom/recipes-lynq/liblynq-log/liblynq-log.bb b/cap/zx297520v3/sources/meta-zxic-custom/recipes-lynq/liblynq-log/liblynq-log.bb
index cf8b12d..3400fdd 100755
--- a/cap/zx297520v3/sources/meta-zxic-custom/recipes-lynq/liblynq-log/liblynq-log.bb
+++ b/cap/zx297520v3/sources/meta-zxic-custom/recipes-lynq/liblynq-log/liblynq-log.bb
@@ -6,7 +6,7 @@
 LICENSE = "CLOSED"

 LIC_FILES_CHKSUM = "file://LICENSE;md5=e1696b147d49d491bcb4da1a57173fff"

 #DEPENDS += "platform-libs libpal nandapi liblynq-uci"

-DEPENDS += "liblynq-uci libbinder"

+DEPENDS += "${@bb.utils.contains('TARGET_PLATFORM', 'T106', "libnvram", '', d)} liblynq-uci libbinder"

 #inherit workonsrc

 WORKONSRC = "${TOPDIR}/../src/lynq/lib/liblynq-log"

 FILESEXTRAPATHS_prepend :="${TOPDIR}/../src/lynq/lib/:"

diff --git a/cap/zx297520v3/sources/meta-zxic-custom/recipes-lynq/liblynq-qser-autosuspend/liblynq-qser-autosuspend.bb b/cap/zx297520v3/sources/meta-zxic-custom/recipes-lynq/liblynq-qser-autosuspend/liblynq-qser-autosuspend.bb
new file mode 100644
index 0000000..375742d
--- /dev/null
+++ b/cap/zx297520v3/sources/meta-zxic-custom/recipes-lynq/liblynq-qser-autosuspend/liblynq-qser-autosuspend.bb
@@ -0,0 +1,52 @@
+#inherit externalsrc package
+
+DESCRIPTION = "liblynq-qser-autosuspend"
+LICENSE = "CLOSED"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=e1696b147d49d491bcb4da1a57173fff"
+
+DEPENDS += "${@bb.utils.contains('TARGET_PLATFORM', 'mt2735', 'audio-mixer-ctrl streamer1.0', '', d)}  liblynq-autosuspend liblynq-log"
+#inherit workonsrc
+WORKONSRC = "${TOPDIR}/../src/lynq/lib/liblynq-qser-autosuspend/"
+FILESEXTRAPATHS_prepend :="${TOPDIR}/../src/lynq/lib/:"
+SRC_URI = " \
+          file://liblynq-qser-autosuspend\
+          "
+
+SRC-DIR = "${S}/../liblynq-qser-autosuspend"
+TARGET_CC_ARCH += "${LDFLAGS}"
+BB_INCLUDE_ADD = "--sysroot=${STAGING_DIR_HOST}"
+BB_LDFLAGS_ADD = "--sysroot=${STAGING_DIR_HOST} -Wl,--hash-style=gnu"
+#Parameters passed to do_compile()
+FILES_${PN} = "${base_libdir}/*.so "
+
+FILES_${PN}-dev = "/test \
+                   ${includedir}"
+
+FILES_${PN}-doc = "/doc"
+
+FILES_${PN}-dbg ="${base_bindir}/.debug \
+                  ${base_libdir}/.debug \
+                  ${base_sbindir}/.debug"
+
+INSANE_SKIP_${PN} += "already-stripped"
+INSANE_SKIP_${PN} += "installed-vs-shipped"
+
+
+#INHIBIT_PACKAGE_STRIP = "1"
+do_compile () {
+		oe_runmake all -C ${SRC-DIR} ROOT=${STAGING_DIR_HOST} OFLAGS="--sysroot=${STAGING_DIR_HOST} -Os -Wl,--hash-style=gnu"
+}
+
+do_install () {
+    oe_runmake install -C ${SRC-DIR} ROOT=${D}
+	
+    if [ -d "${WORKONSRC}" ] ; then
+        install -d ${D}${includedir}/
+        cp -af ${SRC-DIR}/include/ ${D}${includedir}/
+    fi 
+}
+
+addtask bachclean
+do_bachclean () {
+    oe_runmake clean
+}
diff --git a/cap/zx297520v3/sources/meta-zxic-custom/recipes-lynq/lynq-autosuspend/files/main.c b/cap/zx297520v3/sources/meta-zxic-custom/recipes-lynq/lynq-autosuspend/files/main.c
index d4e6960..f706c9f 100755
--- a/cap/zx297520v3/sources/meta-zxic-custom/recipes-lynq/lynq-autosuspend/files/main.c
+++ b/cap/zx297520v3/sources/meta-zxic-custom/recipes-lynq/lynq-autosuspend/files/main.c
@@ -489,3 +489,6 @@
     
  
 }
+
+DEFINE_LYNQ_LIB_LOG(LYNQ_AUTOSUSPEND)
+
diff --git a/cap/zx297520v3/sources/meta-zxic-custom/recipes-lynq/lynq-autosuspend/lynq-autosuspend.bb b/cap/zx297520v3/sources/meta-zxic-custom/recipes-lynq/lynq-autosuspend/lynq-autosuspend.bb
index c646163..23076f4 100755
--- a/cap/zx297520v3/sources/meta-zxic-custom/recipes-lynq/lynq-autosuspend/lynq-autosuspend.bb
+++ b/cap/zx297520v3/sources/meta-zxic-custom/recipes-lynq/lynq-autosuspend/lynq-autosuspend.bb
@@ -15,9 +15,7 @@
            file://makefile \
 "
 
-EXTRA_OEMAKE = "'RAT_CONFIG_C2K_SUPPORT = ${RAT_CONFIG_C2K_SUPPORT}'\
-                'MTK_MULTI_SIM_SUPPORT = ${MTK_MULTI_SIM_SUPPORT}'\
-                'TARGET_PLATFORM = ${TARGET_PLATFORM}'"
+EXTRA_OEMAKE = "'TARGET_PLATFORM = ${TARGET_PLATFORM}'"
 
 TARGET_CC_ARCH += "${LDFLAGS}"
 
@@ -30,11 +28,6 @@
 
 OBJECTS = "$(SOURCES:.c=.o)"
 
-EXTRA_OEMAKE += "'MOBILETEK_SUSPEND_CFG = ${MOBILETEK_SUSPEND_CFG}'\
-                 'TARGET_PLATFORM = ${TARGET_PLATFORM}'\
-                 'MTK_LED_SUPPORT = ${MTK_LED_SUPPORT}'\
-                 'TARGET_PLATFORM = ${TARGET_PLATFORM}'"
-
 EXECUTABLE = "autosuspend"
 S = "${WORKDIR}"
 TARGET_CC_ARCH += "${LDFLAGS}"
diff --git a/cap/zx297520v3/sources/meta-zxic-custom/recipes-lynq/lynq-qser-autosuspend-demo/lynq-qser-autosuspend-demo.bb b/cap/zx297520v3/sources/meta-zxic-custom/recipes-lynq/lynq-qser-autosuspend-demo/lynq-qser-autosuspend-demo.bb
new file mode 100644
index 0000000..ab8d052
--- /dev/null
+++ b/cap/zx297520v3/sources/meta-zxic-custom/recipes-lynq/lynq-qser-autosuspend-demo/lynq-qser-autosuspend-demo.bb
@@ -0,0 +1,40 @@
+inherit externalsrc package
+DESCRIPTION = "autosuspend-client demo"
+
+LICENSE = "MobileTekProprietary"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=4f60c98fa94e02f659ef5939f67fa8ae"
+#DEPENDS = "platform-libs"
+
+
+inherit workonsrc
+WORKONSRC = "${TOPDIR}/../src/lynq/packages/apps/lynq-qser-autosuspend-demo"
+FILESEXTRAPATHS_prepend :="${TOPDIR}/../src/lynq/packages/apps:"
+SRC_URI = " \
+          file://lynq-qser-autosuspend-demo \
+          "
+
+SRC-DIR = "${S}/../lynq-qser-autosuspend-demo"
+TARGET_CC_ARCH += "${LDFLAGS}"
+
+SYSTEMD_PACKAGES = "${PN}"
+#Parameters passed to do_compile()
+EXTRA_OEMAKE = "'TARGET_PLATFORM = ${TARGET_PLATFORM}'\"
+EXTRA_OEMAKE += "'MOBILETEK_RIL_CFG = ${MOBILETEK_RIL_CFG}'"
+
+EXTRA_OEMAKE += "'MOBILETEK_FOTA_CFG = ${MOBILETEK_FOTA_CFG}'"
+
+#INHIBIT_PACKAGE_STRIP = "1"
+do_compile () {
+	if test "${PACKAGE_ARCH}" = "cortexa7hf-vfp-vfpv4-neon" || test "${PACKAGE_ARCH}" = "cortexa7hf-neon-vfpv4"; then
+		oe_runmake all -C ${SRC-DIR} ROOT=${STAGING_DIR_HOST} OFLAGS="--sysroot=${STAGING_DIR_HOST} -mhard-float"
+	else
+		oe_runmake all -C ${SRC-DIR} ROOT=${STAGING_DIR_HOST} OFLAGS="--sysroot=${STAGING_DIR_HOST}"
+	fi
+}
+
+
+do_install() {
+	install -d ${D}${bindir}/
+	install -m 0755 ${SRC-DIR}/lynq-qser-autosuspend-demo ${D}${bindir}/
+	install -d ${D}${includedir}
+}
diff --git a/cap/zx297520v3/sources/meta-zxic-custom/recipes-lynq/lynq-qser-data-demo/files/lynq-qser-data-demo.cpp b/cap/zx297520v3/sources/meta-zxic-custom/recipes-lynq/lynq-qser-data-demo/files/lynq-qser-data-demo.cpp
new file mode 100755
index 0000000..340e57d
--- /dev/null
+++ b/cap/zx297520v3/sources/meta-zxic-custom/recipes-lynq/lynq-qser-data-demo/files/lynq-qser-data-demo.cpp
@@ -0,0 +1,195 @@
+#include <stdio.h>

+#include <stdlib.h>

+#include <string.h>

+#include <sys/socket.h>

+#include <netinet/in.h>

+#include <arpa/inet.h>

+#include <dlfcn.h>

+#include <errno.h>

+#include <sys/un.h>

+#include <ctype.h>

+#include <unistd.h>

+#include <include/lynq-qser-data.h>

+

+#define MAX_COMMAND_LEN 10

+

+

+void evt_cb(qser_data_call_state_s *state);

+int qser_init_data();

+int qser_deinit_data();

+int data_demo_auto_test(char *apn_name1, char *apn_name2);

+

+qser_data_call_state_s state = {0};

+

+void delete_enter(char data[])

+{

+    char *find = strchr(data, '\n');

+    if(find)

+        *find = '\0';

+    return ;

+}

+void printf_help(void)

+{

+    printf("*******************************User Guide*************************************************\n");

+    printf("usage: lynq-qser-data-demo <apn_name> <apn_type>\n");

+    printf("Example: lynq-qser-data-demo cmwap lynq_apn1\n");

+    printf("*******************************************************************************************\n");

+    return;

+}

+

+/**

+ * @brief qser data call demo entry function. 

+ *

+ * @detail This example will take a complete data process 

+ *         and show you how to call the API in liblynq-qser-data.

+ */

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

+{

+    int i, ret;

+

+    printf("[%s] [%d] entry !\n", __FUNCTION__, __LINE__);

+    printf("[DATA_DEMO]lynq-qser-data-demo entry !\n");

+

+	if(argc != 3)

+    {

+        printf_help();

+        exit(EXIT_FAILURE);

+    }

+

+	//do initialization

+    ret = qser_data_call_init(evt_cb);

+    if(0 != ret)

+    {

+        printf("initial failed !\n");

+	    return -1;

+    }

+

+	data_demo_auto_test(argv[1], argv[2]);

+	qser_data_call_destroy();

+    

+	return 0;

+}

+

+//demo示例拨两路apn,一路使用默认apn配置拨号访问公网,另一路建议为私网配置

+int data_demo_auto_test(char *apn_name1, char *apn_type)

+{

+	int ret = 0;

+	char command[MAX_COMMAND_LEN] = {'\0'};

+	bool apn_test1_need_insert = true;

+	unsigned char profile_idx_char1;

+	qser_apn_add_s apn_test1 = {QSER_APN_PDP_TYPE_IPV4V6, QSER_APN_AUTH_PROTO_DEFAULT, NULL, NULL, NULL, NULL};

+	qser_data_call_s apn_normal_datacall;

+	qser_data_call_s apn_test1_datacall;

+    qser_data_call_error_e err = QSER_DATA_CALL_ERROR_NONE;

+	

+	memcpy(apn_test1.apn_type,apn_type,QSER_APN_NAME_SIZE);

+	memcpy(apn_test1.apn_name,apn_name1,QSER_APN_NAME_SIZE);

+

+	//1、检查apn是否存在

+	qser_apn_info_list_s apn_list = {0};

+    ret = qser_apn_get_list(&apn_list);

+	if(ret != 0)

+	{

+		printf("\n get apn list error\n");

+		return -1;

+	}

+    for(int i = 0; i < apn_list.cnt; i++)

+    {

+        printf("data_demo_auto_test: pdp_type=%d, auth_proto=%d, apn_name=%s, username=%s, password=%s, apn_type=%s\n"

+            ,apn_list.apn[i].pdp_type, apn_list.apn[i].auth_proto, apn_list.apn[i].apn_name, apn_list.apn[i].username, apn_list.apn[i].password, apn_list.apn[i].apn_type);

+		

+		if( apn_list.apn[i].pdp_type == apn_test1.pdp_type 

+			&& apn_list.apn[i].auth_proto == apn_test1.auth_proto

+			&& (strcmp(apn_list.apn[i].apn_name, apn_test1.apn_name) == 0)

+			&& (strcmp(apn_list.apn[i].username, apn_test1.username) == 0)

+			&& (strcmp(apn_list.apn[i].password, apn_test1.password) == 0)

+			&& (strcmp(apn_list.apn[i].apn_type, apn_test1.apn_type) == 0)

+			)

+		{

+			profile_idx_char1 = apn_list.apn[i].profile_idx;

+			apn_test1_need_insert = false;

+		}

+	}

+	//2、若不存在,插入apn

+	if(apn_test1_need_insert)

+	{

+		ret = qser_apn_add(&apn_test1, &profile_idx_char1);

+		if(ret != 0)

+		{

+			printf("\n add apn error\n");

+			return -1;

+		}

+	}

+	//3、拨号

+	apn_normal_datacall.profile_idx = 0;//默认apn profile_idx

+	apn_test1_datacall.profile_idx = profile_idx_char1;

+	//拨号时实际使用的ip_name,userdata,password等配置以apn信息中的为准,不使用datacall中的配置

+	ret = qser_data_call_start(&apn_normal_datacall, &err);//默认apn拨号

+	if(ret != 0)

+	{

+		printf("\nERROR: setup data call fail!!!\n");

+		return -1;

+	}

+

+	ret = qser_data_call_start(&apn_test1_datacall, &err);

+	if(ret != 0)

+	{

+		printf("\nERROR: setup data call fail!!!\n");

+		return -1;

+	}

+

+	printf("\n[DATA_DEMO]Enter --exit to exit data demo\n");

+	while(1)

+	{

+		fgets(command , MAX_COMMAND_LEN, stdin);

+		delete_enter(command);

+		if(strcmp(command,"--exit") == 0)

+		{

+			break;

+		}

+		else

+		{

+			printf("\n[DATA_DEMO]Enter --exit to  deactive data call and exit data demo\n");

+		}

+	}

+

+	//4、去激活

+	//去激活时有效入参仅为profile_idx

+	ret = qser_data_call_stop(apn_normal_datacall.profile_idx, apn_normal_datacall.ip_family, &err);

+	if(ret < 0)

+	{

+		printf("\nERROR: deactive data call fail!!!\n");

+		return -1;

+	}

+	ret = qser_data_call_stop(apn_test1_datacall.profile_idx, apn_test1_datacall.ip_family, &err);

+	if(ret < 0)

+	{

+		printf("\nERROR: deactive data call fail!!!\n");

+		return -1;

+	}

+	return 0;

+}

+void evt_cb(qser_data_call_state_s *state)

+{

+    char buf_ip[64] = {0};

+    char buf_gateway[64] = {0};

+    char buf_pri_dns[64] = {0};

+    char buf_sec_dns[64] = {0};

+    printf("DATA_DEMO_CALL_BACK: profile_idx=%d, name=%s, ip_family=%d, state=%d, error=%d\n"

+        , state->profile_idx, state->name, state->ip_family, state->state, state->err);

+    printf("DATA_DEMO_CALL_BACK: v4.ip=%s\n"

+        , inet_ntoa(state->v4.ip));

+    printf("DATA_DEMO_CALL_BACK: v4.gateway=%s\n"

+        , inet_ntoa(state->v4.gateway));

+    printf("DATA_DEMO_CALL_BACK: v4.pri_dns=%s, v4.sec_dns=%s\n"

+        , inet_ntoa(state->v4.pri_dns));

+    printf("DATA_DEMO_CALL_BACK: v4.sec_dns=%s\n"

+        , inet_ntoa(state->v4.sec_dns));

+    inet_ntop(AF_INET6, &(state->v6.ip), buf_ip, sizeof(buf_ip));

+    inet_ntop(AF_INET6, &(state->v6.gateway), buf_gateway, sizeof(buf_gateway));

+    inet_ntop(AF_INET6, &(state->v6.pri_dns), buf_pri_dns, sizeof(buf_pri_dns));

+    inet_ntop(AF_INET6, &(state->v6.sec_dns), buf_sec_dns, sizeof(buf_sec_dns));

+    printf("DATA_DEMO_CALL_BACK: v6.ip=%s, v6.gateway=%s, v6.pri_dns=%s, v6.sec_dns=%s\n"

+        , buf_ip, buf_gateway, buf_pri_dns, buf_sec_dns);

+	//后续对回调函数中返回值的处理建议放在其它线程中进行,避免阻塞在回调函数中影响后续消息上报

+}

diff --git a/cap/zx297520v3/sources/meta-zxic-custom/recipes-lynq/lynq-qser-data-demo/files/makefile b/cap/zx297520v3/sources/meta-zxic-custom/recipes-lynq/lynq-qser-data-demo/files/makefile
new file mode 100755
index 0000000..c48324c
--- /dev/null
+++ b/cap/zx297520v3/sources/meta-zxic-custom/recipes-lynq/lynq-qser-data-demo/files/makefile
@@ -0,0 +1,53 @@
+SHELL = /bin/sh

+RM = rm -f

+

+LOCAL_CFLAGS := -Wall \

+                -std=gnu++14 \

+                -g -Os \

+                -flto \

+                -fpermissive \

+

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

+LOCAL_CFLAGS += -DBINDER_IPC_32BIT=1 -DHAVE_ENDIAN_H -DHAVE_PTHREADS -DHAVE_SYS_UIO_H -DHAVE_POSIX_FILEMAP -DHAVE_STRLCPY -DHAVE_PRCTL -DHAVE_MEMSET16 -DHAVE_MEMSET32 -DANDROID_SMP=0

+endif

+

+LOCAL_CFLAGS += -Werror=format-security

+

+$(warning ################# rock ROOT: $(ROOT),includedir:$(includedir),)

+

+LOCAL_PATH   = .

+

+LOCAL_C_INCLUDES = \

+  -I. \

+  -I$(LOCAL_PATH)/include/ \

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

+

+

+LOCAL_LIBS := \

+    -L. \

+    -ldl \

+    -lstdc++ \

+    -lpthread \

+    -llynq-qser-data \

+

+

+

+SOURCES = lynq-qser-data-demo.cpp

+

+EXECUTABLE = lynq-qser-data-demo

+

+OBJECTS=$(SOURCES:.cpp=.o)

+

+all: $(EXECUTABLE) 

+

+$(EXECUTABLE): $(OBJECTS)

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

+

+%.o : %.cpp

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

+

+.PHONY: clean

+clean:

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

+	$(RM) $(OBJECTS_TOOL) $(EXECUTABLE)

+

diff --git a/cap/zx297520v3/sources/meta-zxic-custom/recipes-lynq/lynq-qser-data-demo/lynq-qser-data-demo.bb b/cap/zx297520v3/sources/meta-zxic-custom/recipes-lynq/lynq-qser-data-demo/lynq-qser-data-demo.bb
new file mode 100755
index 0000000..9bd06ba
--- /dev/null
+++ b/cap/zx297520v3/sources/meta-zxic-custom/recipes-lynq/lynq-qser-data-demo/lynq-qser-data-demo.bb
@@ -0,0 +1,31 @@
+#inherit externalsrc package
+#inherit externalsrc package systemd
+DESCRIPTION = "lynq-qser-data-demo"
+LICENSE = "CLOSED"
+LICENSE = "CLOSED"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=b1e07e8d88e26263e71d3a9e2aa9a2ff"
+SRC_URI = "file://lynq-qser-data-demo.cpp \
+           file://makefile \
+"
+DEPENDS += "liblynq-qser-data"
+
+SRC-DIR = "${S}/../lynq-qser-data-demo"
+FILES_${PN} += "${bindir}/"
+TARGET_CC_ARCH += "${LDFLAGS}"
+SYSTEMD_PACKAGES = "${PN}"
+S = "${WORKDIR}"
+#INHIBIT_PACKAGE_STRIP = "1"
+do_compile () {
+	if test "${PACKAGE_ARCH}" = "cortexa7hf-vfp-vfpv4-neon" || test "${PACKAGE_ARCH}" = "cortexa7hf-neon-vfpv4"; then
+		oe_runmake all ROOT=${STAGING_DIR_HOST} OFLAGS="--sysroot=${STAGING_DIR_HOST} -mhard-float"
+	else
+		oe_runmake all ROOT=${STAGING_DIR_HOST} OFLAGS="--sysroot=${STAGING_DIR_HOST}"
+	fi
+}
+
+
+do_install() {
+
+	install -d ${D}${bindir}/
+	install -m 0755 ${S}/lynq-qser-data-demo ${D}${bindir}/
+}
diff --git a/cap/zx297520v3/sources/meta-zxic-custom/recipes-lynq/lynq-qser-network-demo/files/lynq-qser-network-demo.cpp b/cap/zx297520v3/sources/meta-zxic-custom/recipes-lynq/lynq-qser-network-demo/files/lynq-qser-network-demo.cpp
index e3c672c..dabfb0e 100755
--- a/cap/zx297520v3/sources/meta-zxic-custom/recipes-lynq/lynq-qser-network-demo/files/lynq-qser-network-demo.cpp
+++ b/cap/zx297520v3/sources/meta-zxic-custom/recipes-lynq/lynq-qser-network-demo/files/lynq-qser-network-demo.cpp
@@ -323,8 +323,8 @@
             QSER_NW_CONFIG_INFO_T     t_info = {0};

             

             int mask = 0;

-            printf("please input event mask hex(TDSCDMA | LTE | EVDO | CDMA | WCDMA | GSM): \n");

-            scanf("%x", &mask);

+            printf("please input decimal format number,  whose hex format is (TDSCDMA | LTE | EVDO | CDMA | WCDMA | GSM) : \n");

+            scanf("%d", &mask);

             t_info.preferred_nw_mode = mask;

             

             ret = qser_nw_set_config_p(h_nw, &t_info);

diff --git a/cap/zx297520v3/sources/meta-zxic-custom/recipes-lynq/lynq-qser-sim-demo/files/lynq-qser-sim-demo.cpp b/cap/zx297520v3/sources/meta-zxic-custom/recipes-lynq/lynq-qser-sim-demo/files/lynq-qser-sim-demo.cpp
new file mode 100755
index 0000000..abcea42
--- /dev/null
+++ b/cap/zx297520v3/sources/meta-zxic-custom/recipes-lynq/lynq-qser-sim-demo/files/lynq-qser-sim-demo.cpp
@@ -0,0 +1,436 @@
+#include <stdlib.h>

+#include <stdio.h>

+#include <string.h>

+#include <sys/types.h>

+#include <pthread.h>

+#include <unistd.h>

+#include <dlfcn.h>

+#include <stdint.h>

+

+#include"lynq-qser-sim-demo.h"

+

+

+#define BUF_SIZE 32

+#define BUF_PIN 8

+

+typedef uint32_t sim_client_handle_type;

+

+sim_client_handle_type  ph_sim = 2023;

+sim_client_handle_type  h_sim = 2023;

+int flag_init = 0;

+

+int (*qser_sim_client_init)(sim_client_handle_type  *ph_sim);

+int (*qser_sim_client_deinit)(sim_client_handle_type h_sim);

+int (*qser_sim_getimsi)(

+    sim_client_handle_type          h_sim,

+    QSER_SIM_APP_ID_INFO_T            *pt_info,   ///< [IN] The SIM identifier info.

+    char                            *imsi,      ///< [OUT] IMSI buffer

+    size_t                          imsiLen     ///< [IN] IMSI buffer length

+);

+

+int (*qser_sim_geticcid)

+(

+    sim_client_handle_type          h_sim,

+    QSER_SIM_SLOT_ID_TYPE_T     simId,     ///< [IN] The SIM identifier.

+    char                            *iccid,    ///< [OUT] ICCID

+    size_t                          iccidLen   ///< [IN] ICCID buffer length

+);

+

+int (*qser_sim_getphonenumber)

+(

+    sim_client_handle_type          h_sim,

+    QSER_SIM_APP_ID_INFO_T            *pt_info,   ///< [IN] The SIM identifier.

+    char                            *phone_num, ///< [OUT] phone number

+    size_t                          phoneLen    ///< [IN] phone number buffer length

+);

+int (*qser_sim_verifypin)(sim_client_handle_type h_sim, QSER_SIM_VERIFY_PIN_INFO_T *pt_info);

+int (*qser_sim_changepin)(sim_client_handle_type h_sim, QSER_SIM_CHANGE_PIN_INFO_T *pt_info);

+int (*qser_sim_unblockpin)(sim_client_handle_type h_sim, QSER_SIM_UNBLOCK_PIN_INFO_T *pt_info);

+int (*qser_sim_enablepin)(sim_client_handle_type h_sim, QSER_SIM_ENABLE_PIN_INFO_T *pt_info);

+int (*qser_sim_disablepin)(sim_client_handle_type h_sim, QSER_SIM_DISABLE_PIN_INFO_T *pt_info);

+int (*qser_sim_getcardstatus)(sim_client_handle_type h_sim, QSER_SIM_SLOT_ID_TYPE_T simId, QSER_SIM_CARD_STATUS_INFO_T *pt_info);

+

+

+typedef struct

+{

+    int  cmdIdx;

+    const char *funcName;

+} st_api_test_case;

+    

+//for server test

+st_api_test_case at_api_testcases[] = 

+{

+    {0,   "qser_sim_init"},

+    {1,   "qser_get_imsi"},

+    {2,   "qser_get_iccid"},

+    {3,   "qser_get_phonenumber"},

+    {4,   "qser_verify_pin"},

+    {5,   "qser_change_pin"},

+    {6,   "qser_unlock_pin"},

+    {7,   "qser_enable_pin"},

+    {8,   "qser_disable_pin"},

+    {9,   "qser_get_sim_status"},

+    {10,   "qser_deinit_sim"},

+    {-1,    NULL}

+};

+

+void print_help(void)

+{

+    int i;

+    printf("Supported test cases:\n");

+    for(i = 0; ; i++)

+    {

+        if(at_api_testcases[i].cmdIdx == -1)

+        {

+            break;

+        }

+        printf("%d:\t%s\n", at_api_testcases[i].cmdIdx, at_api_testcases[i].funcName);

+    }

+}

+

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

+{

+    int cmdIdx = 0;

+    int res    = 0;

+    

+    const char *lynq_libpath_sim = "/lib/liblynq-qser-sim.so";

+    void *dlHandle_sim = dlopen(lynq_libpath_sim, RTLD_NOW);

+    if (dlHandle_sim == NULL) 

+    {

+        printf("dlopen dlHandle_sim failed: %s\n", dlerror());

+        exit(EXIT_FAILURE);

+    }

+

+    print_help();

+    while(1)

+    {

+        printf("\nplease input cmd index(-1 exit): ");

+        scanf("%d", &cmdIdx);

+        if(cmdIdx == -1)

+        {

+            break;

+        }

+

+        switch(cmdIdx)

+        {

+            //"qser_sim_init"

+            case 0:

+            {

+                if(flag_init == 1)

+                {

+                   printf("init is already\n"); 

+                   break;

+                }

+                else{

+                    //int token;

+                    //printf("input token\n");

+                    //scanf("%d", &token);

+                    qser_sim_client_init = (int(*)(sim_client_handle_type  *ph_sim))dlsym(dlHandle_sim,"qser_sim_client_init");

+                    if(NULL != qser_sim_client_init)

+                    {

+                        res = qser_sim_client_init(&ph_sim);

+                        if(res == 0)

+                        {

+                            printf("Run qser_sim_client_init\n");

+                            flag_init = 1;

+                        }else{

+                            printf("qser_sim_client_init error\n");

+                        }

+                    }else{

+                        printf("qser_sim_client_init dlsym error\n");

+                    }

+                    break;

+                }

+            }

+    

+            //"qser_sim_getimsi"

+            case 1:

+            {

+                if(flag_init == 0){

+                    printf("must init first\n");

+                }

+                else{

+                    char imsi[BUF_SIZE] = {0};

+                    QSER_SIM_APP_ID_INFO_T pt_info;

+                    qser_sim_getimsi = (int(*)(sim_client_handle_type h_sim, QSER_SIM_APP_ID_INFO_T *pt_info, char *imsi, size_t imsiLen))dlsym(dlHandle_sim,"qser_sim_getimsi");

+                    if(NULL != qser_sim_getimsi)

+                    {

+                        res = qser_sim_getimsi(h_sim, &pt_info, imsi, 0);

+                        if(res == 0)

+                        {

+                            printf("imsi is %s!!!\n",imsi);

+                        }else{

+                            printf("get imsi error, res = %d\n", res);

+                        }

+                    }else{

+                        printf("qser_sim_getimsi dlsym error\n");

+                    }

+                }

+                break;

+            }

+

+            //"qser_get_iccid"

+            case 2:

+            {

+                if(flag_init == 0){

+                    printf("must init first\n");

+                }

+                else{

+                    char iccid[BUF_SIZE] = {0};

+                     qser_sim_geticcid = (int(*)(sim_client_handle_type h_sim, QSER_SIM_SLOT_ID_TYPE_T simId, char *iccid, size_t iccidLen))dlsym(dlHandle_sim,"qser_sim_geticcid");

+                    if(NULL != qser_sim_geticcid)

+                    {

+                        res = qser_sim_geticcid(h_sim, QSER_SIM_SLOT_ID_1, iccid, 0);

+                        if(res == 0)

+                        {

+                            printf("get iccid success!!! iccid is %s\n",iccid);

+                        }else{

+                            printf("get iccid error, res = %d\n", res);

+                        }

+                    }else{

+                        printf("qser_sim_geticcid dlsym error\n");

+                    }

+                }

+                break;

+            }

+            //qser_get_phonenumber

+            case 3:

+            {

+                if(flag_init == 0){

+                    printf("must init first\n");

+                }

+                else{

+                    char phonenumber[BUF_SIZE] = "";

+                    QSER_SIM_APP_ID_INFO_T pt_info;

+                    qser_sim_getphonenumber = (int(*)(sim_client_handle_type h_sim, QSER_SIM_APP_ID_INFO_T *pt_info, char *phone_num, size_t phoneLen))dlsym(dlHandle_sim,"qser_sim_getphonenumber");

+                    if(NULL != qser_sim_getphonenumber)

+                    {

+                        res = qser_sim_getphonenumber(h_sim, &pt_info, phonenumber, 0);

+                        if(res == 0)

+                        {

+                            printf("get phonenumber success!!! phonenumber is %s\n",phonenumber);

+                        }else{

+                            printf("get phonenumber error, res = %d\n", res);

+                        }

+                    }else{

+                        printf("qser_sim_getphonenumber dlsym error\n");

+                    }

+                }

+                break;

+           }

+            //qser_verify_pin

+            case 4:

+            {

+                if(flag_init == 0){

+                    printf("must init first\n");

+                }

+                else{

+                    char pin[BUF_PIN] = {0};

+                    QSER_SIM_VERIFY_PIN_INFO_T pt_info;

+                    printf("input pin\n");

+                    scanf("%s", pin);

+                    strncpy(pt_info.pin_value, pin, BUF_PIN);

+                    printf("pin_value = %s , pin = %s\n", pt_info.pin_value, pin);

+                    

+                    qser_sim_verifypin = (int(*)(sim_client_handle_type h_sim, QSER_SIM_VERIFY_PIN_INFO_T *pt_info))dlsym(dlHandle_sim,"qser_sim_verifypin");

+                    if(NULL != qser_sim_verifypin)

+                    {

+                        res = qser_sim_verifypin(h_sim, &pt_info);

+                        if(res == 0)

+                        {

+                            printf("verify pin success!!!\n");

+                        }else{

+                            printf("verify pin error, res = %d\n", res);

+                        }

+                    }else{

+                        printf("qser_sim_verifypin dlsym error\n");

+                    }

+                }

+                break;

+            }

+            //qser_change_pin

+            case 5:

+            {

+                if(flag_init == 0){

+                    printf("must init first\n");

+                }

+                else{

+                    char old_pin[BUF_PIN] = {0};

+                    QSER_SIM_CHANGE_PIN_INFO_T pt_info;

+                    printf("input old pin\n");

+                    scanf("%s", old_pin);

+                    char new_pin[BUF_PIN] = {0};

+                    printf("input new pin\n");

+                    scanf("%s", new_pin);

+                    strncpy(pt_info.old_pin_value, old_pin, BUF_PIN);

+                    strncpy(pt_info.new_pin_value, new_pin, BUF_PIN);

+                    printf("pt_info.old_pin_value = %s, old_pin = %s\n", pt_info.old_pin_value, old_pin);

+                    printf("pt_info.new_pin_value = %s, new_pin = %s\n", pt_info.new_pin_value, new_pin);

+

+                    qser_sim_changepin = (int(*)(sim_client_handle_type h_sim, QSER_SIM_CHANGE_PIN_INFO_T *pt_info))dlsym(dlHandle_sim,"qser_sim_changepin");

+                    if(NULL != qser_sim_changepin)

+                    {

+                        res = qser_sim_changepin(h_sim, &pt_info);

+                        if(res == 0)

+                        {

+                            printf("change pin success!!!\n");

+                        }else{

+                            printf("change pin error, res = %d\n", res);

+                        }

+                    }else{

+                        printf("lynq_change_pin dlsym error\n");

+                    }

+                }

+                break;

+            }

+            //qser_unlock_pin

+            case 6:

+            {

+                if(flag_init == 0){

+                    printf("must init first\n");

+                }

+                else{

+                    char puk[BUF_PIN] = {0};

+                    QSER_SIM_UNBLOCK_PIN_INFO_T pt_info;

+                    printf("input  puk\n");

+                    scanf("%s", puk);

+                    char new_pin[BUF_PIN] = {0};

+                    printf("input new pin\n");

+                    scanf("%s", new_pin);

+

+                    strncpy(pt_info.puk_value, puk, BUF_PIN);

+                    strncpy(pt_info.new_pin_value, new_pin, BUF_PIN);

+                    printf("pt_info.puk_value = %s, puk = %s\n", pt_info.puk_value, puk);

+                    printf("pt_info.new_pin_value = %s, new_pin = %s\n", pt_info.new_pin_value, new_pin);

+                    

+                    qser_sim_unblockpin = (int(*)(sim_client_handle_type h_sim, QSER_SIM_UNBLOCK_PIN_INFO_T *pt_info))dlsym(dlHandle_sim,"qser_sim_unblockpin");

+                    if(NULL != qser_sim_unblockpin)

+                    {

+                        res = qser_sim_unblockpin(h_sim, &pt_info);

+                        if(res == 0)

+                        {

+                            printf("unlock pin success!!!\n");

+                        }else{

+                            printf("unlock pin error, res = %d\n", res);

+                        }

+                    }else{

+                        printf("qser_sim_unblockpin dlsym error\n");

+                    }

+                }

+                break;

+            }

+            //qser_enable_pin

+            case 7:

+           {   

+                if(flag_init == 0){

+                    printf("must init first\n");

+                }

+                else{

+                    char pin[BUF_PIN] = {0};

+                    QSER_SIM_ENABLE_PIN_INFO_T pt_info;

+                    printf("input pin\n");

+                    scanf("%s", pin);

+                    strncpy(pt_info.pin_value, pin, BUF_PIN);

+                    

+                    qser_sim_enablepin = (int(*)(sim_client_handle_type h_sim, QSER_SIM_ENABLE_PIN_INFO_T *pt_info))dlsym(dlHandle_sim,"qser_sim_enablepin");

+                    if(NULL != qser_sim_enablepin)

+                    {

+                        res = qser_sim_enablepin(h_sim, &pt_info);

+                        if(res == 0)

+                        {

+                            printf("pin enabled!!!\n");

+                        }else{

+                            printf("pin enable error, res =%d\n", res);

+                        }

+                    }else{

+                        printf("qser_sim_enablepin dlsym error\n");

+                    }                                    

+                }

+                break;

+            }

+            //qser_disable_pin

+            case 8:

+            {

+                if(flag_init == 0){

+                    printf("must init first\n");

+                }

+                else{

+                    char pin[BUF_PIN] = {0};

+                    QSER_SIM_ENABLE_PIN_INFO_T pt_info;

+                    printf("input pin\n");

+                    scanf("%s", pin);

+                    strncpy(pt_info.pin_value, pin, BUF_PIN);

+                    

+                    qser_sim_disablepin = (int(*)(sim_client_handle_type h_sim, QSER_SIM_DISABLE_PIN_INFO_T *pt_info))dlsym(dlHandle_sim,"qser_sim_disablepin");

+                    if(NULL != qser_sim_disablepin)

+                    {

+                        res = qser_sim_disablepin(h_sim, &pt_info);

+                        if(res == 0)

+                        {

+                            printf("pin disnabled!!!\n");

+                        }else{

+                            printf("pin disable error,res = %d\n", res);

+                        }

+                    }else{

+                        printf("qser_sim_disablepin dlsym error\n");

+                    }

+                }

+                break;

+            }

+            //qser_get_sim_status   

+            case 9:

+            {

+                if(flag_init == 0){

+                    printf("must init first\n");

+                }

+                else{

+                    QSER_SIM_CARD_STATUS_INFO_T pt_info;

+                    

+                    qser_sim_getcardstatus = (int(*)(sim_client_handle_type h_sim, QSER_SIM_SLOT_ID_TYPE_T simId, QSER_SIM_CARD_STATUS_INFO_T *pt_info))dlsym(dlHandle_sim,"qser_sim_getcardstatus");

+                    if(NULL != qser_sim_getcardstatus)

+                    {

+                        res = qser_sim_getcardstatus(h_sim, QSER_SIM_SLOT_ID_1, &pt_info);

+                        if(res == 0)

+                        {

+                            printf("state is %d !!!\n",pt_info.e_card_state);

+                        }else{

+                            printf("get imsi error,res = %d\n", res);

+                        }

+                    }else{

+                        printf("qser_sim_getcardstatus dlsym error\n");

+                    }

+                }

+                break;

+            }

+            //qser_deinit_sim

+            case 10:

+            {

+                qser_sim_client_deinit = (int(*)(sim_client_handle_type h_sim))dlsym(dlHandle_sim,"qser_sim_client_deinit");

+                if(NULL != qser_sim_client_deinit)

+                {

+                    res = qser_sim_client_deinit(h_sim);

+                    if(res == 0)

+                    {

+                        printf("sim deinit success is!!!\n");

+                    }else{

+                        printf("get imsi error, res = %d\n", res);

+                    }

+                }else{

+                    printf("qser_sim_client_deinit dlsym error\n");

+                }

+                flag_init = 0;

+                break;

+            }

+            default:

+                print_help();

+                break;

+        }

+            

+    }

+    

+   return 0;

+

+    

+}

+

+

diff --git a/cap/zx297520v3/sources/meta-zxic-custom/recipes-lynq/lynq-qser-sim-demo/files/lynq-qser-sim-demo.h b/cap/zx297520v3/sources/meta-zxic-custom/recipes-lynq/lynq-qser-sim-demo/files/lynq-qser-sim-demo.h
new file mode 100755
index 0000000..cdd905d
--- /dev/null
+++ b/cap/zx297520v3/sources/meta-zxic-custom/recipes-lynq/lynq-qser-sim-demo/files/lynq-qser-sim-demo.h
@@ -0,0 +1,167 @@
+#define QSER_SIM_IMSI_LEN_MAX     16  /**  Maximum length of IMSI data. */

+#define QSER_SIM_ICCID_LEN_MAX    20  /**  Maximum length of ICCID data. */

+

+

+typedef enum 

+{

+    E_QSER_SUCCESS                        = 0,    /**<  Success. */

+    E_QSER_ERROR_BADPARM                  = 4,    /**<  Bad parameter. */

+}E_QSER_ERROR_CODE_T;

+

+typedef enum 

+{

+    QSER_SIM_SLOT_ID_1          = 0xB01,    /**< Identify card in slot 1.  */

+    QSER_SIM_SLOT_ID_2          = 0xB02,    /**< Identify card in slot 2.  */

+}QSER_SIM_SLOT_ID_TYPE_T;

+

+typedef enum 

+{

+    QSER_SIM_APP_TYPE_UNKNOWN   = 0xB00,    /**<  Unknown application type  */

+    QSER_SIM_APP_TYPE_3GPP      = 0xB01,    /**< Identify the SIM/USIM application on the card.  */

+    QSER_SIM_APP_TYPE_3GPP2     = 0xB02,    /**< Identify the RUIM/CSIM application on the card.  */

+    QSER_SIM_APP_TYPE_ISIM      = 0xB03,    /**< Identify the ISIM application on the card.  */

+}QSER_SIM_APP_TYPE_T;

+

+typedef struct 

+{

+    QSER_SIM_SLOT_ID_TYPE_T     e_slot_id;  /**< Indicates the slot to be used. */

+    QSER_SIM_APP_TYPE_T         e_app;      /**< Indicates the type of the application. */

+}QSER_SIM_APP_ID_INFO_T;  /* Type */

+

+#define QSER_SIM_PIN_LEN_MAX  8   /**  Maximum length of PIN data. */

+

+typedef enum 

+{

+    QSER_SIM_PIN_ID_1 = 0xB01,  /**< Level 1 user verification.  */

+    QSER_SIM_PIN_ID_2 = 0xB02,  /**< Level 2 user verification.  */

+}QSER_SIM_PIN_ID_TYPE_T;

+

+typedef struct 

+{

+    QSER_SIM_APP_ID_INFO_T        app_info;                           /**< Application identification information. */

+    QSER_SIM_PIN_ID_TYPE_T  pin_id;                             /**< PIN ID. */

+    uint32_t                    pin_value_len;                      /**< Must be set to the number of elements in pin_value. */

+    char                        pin_value[QSER_SIM_PIN_LEN_MAX];  /*  Value of the PIN */

+}QSER_SIM_VERIFY_PIN_INFO_T;

+

+typedef struct 

+{

+    QSER_SIM_APP_ID_INFO_T        app_info;                               /**< Application identification information. */

+    QSER_SIM_PIN_ID_TYPE_T  pin_id;                                 /**< PIN ID. */

+    uint32_t                    old_pin_value_len;                      /**< Must be set to the number of elements in old_pin_value. */

+    char                        old_pin_value[QSER_SIM_PIN_LEN_MAX];  /**< Value of the old PIN as a sequence of ASCII characters. */

+    uint32_t                    new_pin_value_len;                      /**< Must be set to the number of elements in new_pin_value. */

+    char                        new_pin_value[QSER_SIM_PIN_LEN_MAX];  /**< Value of the new PIN as a sequence of ASCII characters. */

+}QSER_SIM_CHANGE_PIN_INFO_T;

+

+typedef struct 

+{

+    QSER_SIM_APP_ID_INFO_T        app_info;                               /**< Application identification information. */

+    QSER_SIM_PIN_ID_TYPE_T  pin_id;                                 /**< PIN ID. */

+    uint32_t                    puk_value_len;                          /**< Must be set to the number of elements in puk_value. */

+    char                        puk_value[QSER_SIM_PIN_LEN_MAX];      /**< Value of the PUK as a sequence of ASCII characters. */

+    uint32_t                    new_pin_value_len;                      /**< Must be set to the number of elements in new_pin_value. */

+    char                        new_pin_value[QSER_SIM_PIN_LEN_MAX];  /**< Value of the new PIN as a sequence of ASCII characters. */

+}QSER_SIM_UNBLOCK_PIN_INFO_T;

+

+/** Enables the PIN on an application. */

+typedef  QSER_SIM_VERIFY_PIN_INFO_T QSER_SIM_ENABLE_PIN_INFO_T; //Same 

+

+/** Disables the PIN of an application, */

+typedef  QSER_SIM_VERIFY_PIN_INFO_T QSER_SIM_DISABLE_PIN_INFO_T; //Same 

+

+

+typedef enum 

+{

+    QSER_SIM_PERSO_FEATURE_TYPE_UNKNOWN                 = 0xB00, /**<  Unknown personalization feature.  */

+    QSER_SIM_PERSO_FEATURE_TYPE_3GPP_NETWORK            = 0xB01, /**<  Featurization based on 3GPP MCC and MNC.  */

+    QSER_SIM_PERSO_FEATURE_TYPE_3GPP_NETWORK_SUBSET     = 0xB02, /**<  Featurization based on 3GPP MCC, MNC, and IMSI digits 6 and 7.  */

+    QSER_SIM_PERSO_FEATURE_TYPE_3GPP_SERVICE_PROVIDER   = 0xB03, /**<  Featurization based on 3GPP MCC, MNC, and GID1.  */

+    QSER_SIM_PERSO_FEATURE_TYPE_3GPP_CORPORATE          = 0xB04, /**<  Featurization based on 3GPP MCC, MNC, GID1, and GID2.  */

+    QSER_SIM_PERSO_FEATURE_TYPE_3GPP_SIM                = 0xB05, /**<  Featurization based on the 3GPP IMSI.  */

+    QSER_SIM_PERSO_FEATURE_TYPE_3GPP2_NETWORK_TYPE_1    = 0xB06, /**<  Featurization based on 3GPP2 MCC and MNC.  */

+    QSER_SIM_PERSO_FEATURE_TYPE_3GPP2_NETWORK_TYPE_2    = 0xB07, /**<  Featurization based on 3GPP2 IRM code.  */

+    QSER_SIM_PERSO_FEATURE_TYPE_3GPP2_RUIM              = 0xB08, /**<  Featurization based on 3GPP2 IMSI_M.  */

+}QSER_SIM_PERSO_FEATURE_TYPE_T;

+

+typedef enum 

+{

+    QSER_SIM_CARD_STATE_UNKNOWN                     = 0xB01,    /**< Card state unknown. */

+    QSER_SIM_CARD_STATE_ABSENT                      = 0xB02,    /**< Card is absent. */

+    QSER_SIM_CARD_STATE_PRESENT                     = 0xB03,    /**< Card is present. */

+    QSER_SIM_CARD_STATE_ERROR_UNKNOWN               = 0xB04,    /**< Unknown error state. */

+    QSER_SIM_CARD_STATE_ERROR_POWER_DOWN            = 0xB05,    /**< Power down. */

+    QSER_SIM_CARD_STATE_ERROR_POLL_ERROR            = 0xB06,    /**< Poll error. */

+    QSER_SIM_CARD_STATE_ERROR_NO_ATR_RECEIVED       = 0xB07,    /**<  Failed to receive an answer to reset.  */

+    QSER_SIM_CARD_STATE_ERROR_VOLT_MISMATCH         = 0xB08,    /**< Voltage mismatch. */

+    QSER_SIM_CARD_STATE_ERROR_PARITY_ERROR          = 0xB09,    /**< Parity error. */

+    QSER_SIM_CARD_STATE_ERROR_SIM_TECHNICAL_PROBLEMS= 0xB0A,    /**< Card returned technical problems. */

+}QSER_SIM_CARD_STATE_TYPE_T;  /**< Card state. */

+

+typedef enum 

+{

+    QSER_SIM_CARD_TYPE_UNKNOWN  = 0xB00,    /**<  Unidentified card type.  */

+    QSER_SIM_CARD_TYPE_ICC      = 0xB01,    /**<  Card of SIM or RUIM type.  */

+    QSER_SIM_CARD_TYPE_UICC     = 0xB02,    /**<  Card of USIM or CSIM type.  */

+}QSER_SIM_CARD_TYPE_T;

+

+typedef enum 

+{

+    QSER_SIM_PROV_STATE_NONE    = 0xB00,    /**<  Nonprovisioning.  */

+    QSER_SIM_PROV_STATE_PRI     = 0xB01,    /**<  Primary provisioning subscription.  */

+    QSER_SIM_PROV_STATE_SEC     = 0xB02,    /**<  Secondary provisioning subscription.  */

+}QSER_SIM_SUBSCRIPTION_TYPE_T;

+

+typedef enum 

+{

+    QSER_SIM_APP_STATE_UNKNOWN                  = 0xB00,    /**< Application state unknown. */

+    QSER_SIM_APP_STATE_DETECTED                 = 0xB01,    /**<  Detected state.  */

+    QSER_SIM_APP_STATE_PIN1_REQ                 = 0xB02,    /**<  PIN1 required.  */

+    QSER_SIM_APP_STATE_PUK1_REQ                 = 0xB03,    /**<  PUK1 required.  */

+    QSER_SIM_APP_STATE_INITALIZATING            = 0xB04,    /**<  Initializing.  */

+    QSER_SIM_APP_STATE_PERSO_CK_REQ             = 0xB05,    /**<  Personalization control key required.  */

+    QSER_SIM_APP_STATE_PERSO_PUK_REQ            = 0xB06,    /**<  Personalization unblock key required.  */

+    QSER_SIM_APP_STATE_PERSO_PERMANENTLY_BLOCKED= 0xB07,    /**<  Personalization is permanently blocked.  */

+    QSER_SIM_APP_STATE_PIN1_PERM_BLOCKED        = 0xB08,    /**<  PIN1 is permanently blocked.  */

+    QSER_SIM_APP_STATE_ILLEGAL                  = 0xB09,    /**<  Illegal application state.  */

+    QSER_SIM_APP_STATE_READY                    = 0xB0A,    /**<  Application ready state.  @newpage */

+}QSER_SIM_APP_STATE_TYPE_T;

+

+typedef enum 

+{

+    QSER_SIM_PIN_STATE_UNKNOWN                  = 0xB01,    /**< Unknown PIN state. */

+    QSER_SIM_PIN_STATE_ENABLED_NOT_VERIFIED     = 0xB02,    /**<  PIN required, but has not been verified.  */

+    QSER_SIM_PIN_STATE_ENABLED_VERIFIED         = 0xB03,    /**<  PIN required and has been verified.  */

+    QSER_SIM_PIN_STATE_DISABLED                 = 0xB04,    /**<  PIN not required.  */

+    QSER_SIM_PIN_STATE_BLOCKED                  = 0xB05,    /**<  PIN verification has failed too many times and is blocked. Recoverable through PUK verification.  */

+    QSER_SIM_PIN_STATE_PERMANENTLY_BLOCKED      = 0xB06,    /**<  PUK verification has failed too many times and is not recoverable.  */

+}QSER_SIM_PIN_STATE_TYPE_T;

+

+typedef struct 

+{

+    QSER_SIM_SUBSCRIPTION_TYPE_T      subscription;           /**<   Type of subscription (i.e., primary, secondary, etc.). */

+    QSER_SIM_APP_STATE_TYPE_T         app_state;              /**<   Current state of the application. */

+    QSER_SIM_PERSO_FEATURE_TYPE_T   perso_feature;          /**<   Current personalization state and feature enabled. */

+    uint8_t                             perso_retries;          /**<   Number of personalization retries. */

+    uint8_t                             perso_unblock_retries;  /**<   Number of personalization unblock retries. */

+    QSER_SIM_PIN_STATE_TYPE_T         pin1_state;             /**<   Current PIN 1 state. */

+    uint8_t                             pin1_num_retries;       /**<   Number of PIN 1 retries. */

+    uint8_t                             puk1_num_retries;       /**<   Number of PUK 1 retries. */

+    QSER_SIM_PIN_STATE_TYPE_T         pin2_state;             /**<   Current PIN 2 state. */

+    uint8_t                             pin2_num_retries;       /**<   Number of PIN 2 retries. */

+    uint8_t                             puk2_num_retries;       /**<   Number of PUK 2 retries. */

+}QSER_SIM_CARD_APP_INFO_T;

+

+typedef struct 

+{

+    QSER_SIM_CARD_APP_INFO_T          app_3gpp;               /**<   Stores 3GPP application information. */

+    QSER_SIM_CARD_APP_INFO_T          app_3gpp2;              /**<   Stores 3GPP2 application information. */

+    QSER_SIM_CARD_APP_INFO_T          app_isim;               /**<   Stores ISIM application information. */

+}QSER_SIM_CARD_ALL_APP_INFO_T;

+

+typedef struct 

+{

+    QSER_SIM_CARD_STATE_TYPE_T      e_card_state;/**<   Current card and card error state. */

+    QSER_SIM_CARD_TYPE_T            e_card_type; /**<   Card type. */

+    QSER_SIM_CARD_ALL_APP_INFO_T      card_app_info; /**<   Stores all relevant application information. */

+}QSER_SIM_CARD_STATUS_INFO_T;

diff --git a/cap/zx297520v3/sources/meta-zxic-custom/recipes-lynq/lynq-qser-sim-demo/lynq-qser-sim-demo.bb b/cap/zx297520v3/sources/meta-zxic-custom/recipes-lynq/lynq-qser-sim-demo/lynq-qser-sim-demo.bb
new file mode 100755
index 0000000..391a5f9
--- /dev/null
+++ b/cap/zx297520v3/sources/meta-zxic-custom/recipes-lynq/lynq-qser-sim-demo/lynq-qser-sim-demo.bb
@@ -0,0 +1,33 @@
+# Package summary
+SUMMARY = "lynq-qser-sim-demo"
+# License, for example MIT
+LICENSE = "MIT"
+# License checksum file is always required
+LIC_FILES_CHKSUM = "file://${COREBASE}/meta/files/common-licenses/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302"
+		  
+SRC_URI = "file://lynq-qser-sim-demo.h file://lynq-qser-sim-demo.cpp"
+
+SRC-DIR = "${S}/../lynq-qser-sim-demo"
+TARGET_CC_ARCH += "${LDFLAGS}"
+
+#Parameters passed to do_compile()
+EXTRA_OEMAKE = "'TARGET_PLATFORM = ${TARGET_PLATFORM}'\"
+EXTRA_OEMAKE += "'MOBILETEK_RIL_CFG = ${MOBILETEK_RIL_CFG}'"
+
+LOCAL_C_INCLUDES = "-I."
+
+LOCAL_LIBS = "-L. -ldl -lstdc++"
+
+#INHIBIT_PACKAGE_STRIP = "1"
+S = "${WORKDIR}"
+
+#INHIBIT_PACKAGE_STRIP = "1"
+do_compile () {
+
+	${CXX} -Wall lynq-qser-sim-demo.cpp ${LOCAL_LIBS} ${LOCAL_C_INCLUDES} -o lynq-qser-sim-demo
+}
+
+do_install() {
+	install -d ${D}${bindir}/
+	install -m 0755 ${S}/lynq-qser-sim-demo ${D}${bindir}/
+}
diff --git a/cap/zx297520v3/sources/meta-zxic-custom/recipes-lynq/lynq-qser-sms-demo/files/lynq-qser-sms-demo.cpp b/cap/zx297520v3/sources/meta-zxic-custom/recipes-lynq/lynq-qser-sms-demo/files/lynq-qser-sms-demo.cpp
new file mode 100755
index 0000000..16be058
--- /dev/null
+++ b/cap/zx297520v3/sources/meta-zxic-custom/recipes-lynq/lynq-qser-sms-demo/files/lynq-qser-sms-demo.cpp
@@ -0,0 +1,287 @@
+#include <stdlib.h>

+#include <stdio.h>

+#include <string.h>

+#include <sys/types.h>

+#include <pthread.h>

+#include <unistd.h>

+#include <dlfcn.h>

+#include <stdint.h>

+

+#include"lynq-qser-sms-demo.h"

+

+

+#define SMS_BUF  64

+#define MSG_BUF  100

+

+int flag_init = 0;

+

+typedef uint32_t sim_client_handle_type;

+sms_client_handle_type  ph_sms = 2022;

+sms_client_handle_type  h_sms = 2022;

+

+

+int (*qser_sms_client_init)(sms_client_handle_type  *ph_sms);

+int (*qser_sms_client_deinit)(sms_client_handle_type h_sms);

+int (*qser_sms_send_sms)(sms_client_handle_type h_sms, QSER_sms_info_t *pt_sms_info);

+int (*qser_sms_addrxmsghandler)(QSER_SMS_RxMsgHandlerFunc_t handlerPtr, void* contextPtr);

+int (*qser_sms_deletefromstorage)(sms_client_handle_type  h_sms, QSER_sms_storage_info_t  *pt_sms_storage);

+int (*qser_sms_getsmscenteraddress)(sms_client_handle_type h_sms, QSER_sms_service_center_cfg_t *set_sca_cfg);

+int (*qser_sms_setsmscenteraddress)(sms_client_handle_type h_sms, QSER_sms_service_center_cfg_t *get_sca_cfg);

+

+

+typedef struct

+{

+    int  cmdIdx;

+    const char *funcName;

+} st_api_test_case;

+    

+//for server test

+st_api_test_case at_api_testcases[] = 

+{

+    {0,   "qser_sms_client_init"},

+    {1,   "qser_sms_client_deinit"},

+    {2,   "qser_sms_send_sms"},

+    {3,   "qser_sms_addrxmsghandler"},

+    {4,   "qser_sms_deletefromstorage"},

+    {5,   "qser_sms_getsmscenteraddress"},

+    {6,   "qser_sms_setsmscenteraddress"},

+    {-1,    NULL}

+};

+

+void print_help(void)

+{

+    int i;

+    printf("Supported test cases:\n");

+    for(i = 0; ; i++)

+    {

+        if(at_api_testcases[i].cmdIdx == -1)

+        {

+            break;

+        }

+        printf("%d:\t%s\n", at_api_testcases[i].cmdIdx, at_api_testcases[i].funcName);

+    }

+}

+

+void qser_sms_handler(QSER_SMS_MsgRef msgRef, void* contextPtr) {

+    printf("[%s-%d] sms handler, msgRef->sms_data = %s\n", __FUNCTION__, __LINE__, msgRef->sms_data);

+}

+

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

+{

+    int cmdIdx = 0;

+    int ret    = 0;

+    

+    const char *lynq_libpath_sms = "/lib/liblynq-qser-sms.so";

+    void *dlHandle_sms = dlopen(lynq_libpath_sms, RTLD_NOW);

+    if (dlHandle_sms == NULL) 

+    {

+        printf("dlopen dlHandle_sms failed: %s\n", dlerror());

+        exit(EXIT_FAILURE);

+    }

+

+    print_help();

+    while(1)

+    {

+        printf("\nplease input cmd index(-1 exit): ");

+        scanf("%d", &cmdIdx);

+        if(cmdIdx == -1)

+        {

+            break;

+        }

+

+        switch(cmdIdx)

+        {

+            //"qser_sms_client_init"

+            case 0:

+            {

+                if(flag_init == 1)

+                {

+                   printf("init is already\n"); 

+                   break;

+                }

+                else{

+                    //int token;

+                    printf("input token\n");

+                    //scanf("%d", &token);

+

+                    qser_sms_client_init = (int(*)(sms_client_handle_type  *ph_sms))dlsym(dlHandle_sms,"qser_sms_client_init");

+                    if(NULL != qser_sms_client_init)

+                    {

+                        ret = qser_sms_client_init(&ph_sms);

+                        if(ret == 0)

+                        {

+                            printf("Run qser_sms_client_init\n");

+                             flag_init = 1;

+                        }else{

+                            printf("qser_sim_client_init error\n");

+                        }

+                     }else{

+                            printf("qser_sim_client_init dlsym error\n");

+                     }

+                     break;

+                    }

+                }

+            //"qser_sms_client_deinit"

+            case 1:

+            {

+                 if(flag_init == 0){

+                    printf("must init first\n");

+                }

+                else{

+                    qser_sms_client_deinit = (int (*)(sms_client_handle_type h_sms))dlsym(dlHandle_sms,"qser_sms_client_deinit");

+                    if(NULL != qser_sms_client_deinit)

+                    {

+                        ret = qser_sms_client_deinit(h_sms);

+                        if(ret == 0)

+                        {

+                            printf("sms deinit success");

+                        }else{

+                            printf("sms deinit error, ret = %d\n", ret);

+                        }

+                    }else{

+                        printf("qser_sms_client_deinit dlsym error\n");

+                    }

+                }

+                break;

+            }

+            //"qser_sms_send_sms"

+            case 2:

+            {

+                 if(flag_init == 0){

+                    printf("must init first\n");

+                }

+                else{

+                    char telephony_num[SMS_BUF] = {};

+                    char msg[MSG_BUF] = {};

+                    QSER_sms_info_t  pt_sms_info;

+                    sprintf(telephony_num,"10086");

+                    sprintf(msg,"hello");

+                    strncpy(pt_sms_info.src_addr, telephony_num, SMS_BUF);

+                    strncpy(pt_sms_info.sms_data, msg, MSG_BUF);

+                    pt_sms_info.format = QSER_SMS_8BIT;

+                    printf("[%s,%d]  src_addr=%s, telephony_num = %s\n",__FUNCTION__,__LINE__, pt_sms_info.src_addr, telephony_num);

+                    printf("[%s,%d]  sms_data=%s, msg = %s\n",__FUNCTION__,__LINE__, pt_sms_info.sms_data, msg);

+

+                    qser_sms_send_sms = (int (*)(sms_client_handle_type h_sms, QSER_sms_info_t *pt_sms_info))dlsym(dlHandle_sms,"qser_sms_send_sms");

+                    if(NULL != qser_sms_send_sms)

+                    {

+                        ret = qser_sms_send_sms(h_sms, &pt_sms_info);

+                        if(ret == 0)

+                        {

+                            printf("send sms success");

+                        }else{

+                            printf("send sms error, ret = %d\n", ret);

+                        }

+                    }else{

+                        printf("qser_sms_send_sms dlsym error\n");

+                    }

+                }

+                break;

+            }

+            //"qser_sms_addrxmsghandler"

+            case 3:

+            {

+                 if(flag_init == 0){

+                    printf("must init first\n");

+                }

+                else{

+

+                    qser_sms_addrxmsghandler = (int(*)(QSER_SMS_RxMsgHandlerFunc_t handlerPtr, void* contextPtr))dlsym(dlHandle_sms,"qser_sms_addrxmsghandler");

+

+                    if(NULL != qser_sms_addrxmsghandler)

+                    {

+                        ret = qser_sms_addrxmsghandler(qser_sms_handler, NULL);

+                        if(ret == 0)

+                        {

+                            printf("qser_sms_addrxmsghandler success");

+                        }else{

+                            printf("qser_sms_addrxmsghandler error, ret = %d\n", ret);

+                        }

+                    }else{

+                        printf("qser_sms_addrxmsghandler dlsym error\n");

+                    }

+                }

+                break;

+            }

+            //"qser_sms_deletefromstorage"

+            case 4:

+            {

+                 if(flag_init == 0){

+                    printf("must init first\n");

+                }

+                else{

+                    QSER_sms_storage_info_t  pt_sms_storage;

+                    pt_sms_storage.storage_idx = 1;

+                    qser_sms_deletefromstorage = (int (*)(sms_client_handle_type  h_sms, QSER_sms_storage_info_t  *pt_sms_storage))dlsym(dlHandle_sms,"qser_sms_deletefromstorage");

+                    if(NULL != qser_sms_deletefromstorage)

+                    {

+                        ret = qser_sms_deletefromstorage(h_sms, &pt_sms_storage);

+                        if(ret == 0)

+                        {

+                            printf("ret= %d\n",ret);

+                        }else{

+                            printf("del sms error, ret = %d\n", ret);

+                        }

+                    }else{

+                        printf("qser_sms_deletefromstorage dlsym error\n");

+                    }

+                }

+                break;

+            }

+             //"qser_sms_getsmscenteraddress"

+            case 5:

+            {

+                if(flag_init == 0){

+                    printf("must init first\n");

+                }

+                else{ 

+                    QSER_sms_service_center_cfg_t get_sca_cfg;

+                    qser_sms_getsmscenteraddress = (int (*)(sms_client_handle_type h_sms, QSER_sms_service_center_cfg_t *get_sca_cfg))dlsym(dlHandle_sms,"qser_sms_getsmscenteraddress");

+                    if(NULL != qser_sms_getsmscenteraddress)

+                    {

+                        ret = qser_sms_getsmscenteraddress(h_sms, &get_sca_cfg);

+                        if(ret == 0)

+                        {

+                            printf("get smsc success,service_center_addr = %s\n",get_sca_cfg.service_center_addr);

+                        }else{

+                            printf("get smsc error, ret = %d\n", ret);

+                        }

+                    }else{

+                        printf("qser_sms_getsmscenteraddress dlsym error\n");

+                    }

+                }

+                break;

+            }

+             //"qser_sms_setsmscenteraddress"

+            case 6:

+            {

+                if(flag_init == 0){

+                    printf("must init first\n");

+                }

+                else{ 

+                    QSER_sms_service_center_cfg_t set_sca_cfg;

+                    strncpy(set_sca_cfg.service_center_addr, "+8613800230500", 14);

+                    qser_sms_setsmscenteraddress = (int (*)(sms_client_handle_type h_sms, QSER_sms_service_center_cfg_t *set_sca_cfg))dlsym(dlHandle_sms,"qser_sms_setsmscenteraddress");

+                    if(NULL != qser_sms_setsmscenteraddress)

+                    {

+                        ret = qser_sms_setsmscenteraddress(h_sms, &set_sca_cfg);

+                        if(ret == 0)

+                        {

+                            printf("set smsc success");

+                        }else{

+                            printf("set smsc error, ret = %d\n", ret);

+                        }

+                    }else{

+                        printf("qser_sms_setsmscenteraddress dlsym error\n");

+                    }

+                }

+                break;

+            }

+            default:

+                print_help();

+                break;

+        }           

+    }

+    

+   return 0;

+}

diff --git a/cap/zx297520v3/sources/meta-zxic-custom/recipes-lynq/lynq-qser-sms-demo/files/lynq-qser-sms-demo.h b/cap/zx297520v3/sources/meta-zxic-custom/recipes-lynq/lynq-qser-sms-demo/files/lynq-qser-sms-demo.h
new file mode 100755
index 0000000..500d946
--- /dev/null
+++ b/cap/zx297520v3/sources/meta-zxic-custom/recipes-lynq/lynq-qser-sms-demo/files/lynq-qser-sms-demo.h
@@ -0,0 +1,168 @@
+#define MIN_MSM_PARAM_NUM 4

+#define MIN_IMS_MSM_PARAM_NUM 6

+#define MIN_WRITMSM_PARAM_NUM 5

+#define MSG_MAX_LEN 1024

+#define TELEPHONNUM_LEN 64

+#define STORAGSMS_MAX_SIZE 128

+#define SMSC_MAX_LEN 22

+#define SMS_NUM_MAX 255

+

+typedef unsigned short uint16_t;

+typedef unsigned int uint32_t;

+typedef uint32_t sms_client_handle_type;

+

+/**  Maximum length of an SMS. */

+#define QSER_SMS_MAX_MT_MSG_LENGTH    1440

+

+/**  Maximum string length. */

+#define QSER_SMS_MAX_ADDR_LENGTH      252

+

+/**  Maximum string length. */

+#define QSER_SMS_MAX_SCA_TYPLENGTH 3

+

+typedef enum   

+{    

+    QSER_SMS_7BIT        = 0,

+    QSER_SMS_8BIT     = 1,

+    QSER_SMS_UCS2            = 2,

+    //<2017/12/28-QCM9XOL00004C001-P01-Vicent.Gao, <[SMS] Segment 1==> CharSet to Alpha implementation.>

+    QSER_SMS_IRA             = 3,

+    //>2017/12/28-QCM9XOL00004C001-P01-Vicent.Gao

+

+}QSER_SMS_T;   

+

+typedef enum   

+{    

+    QSER_SMS_MO               = 0,    ///< SMS mobile terminated message.  

+    QSER_SMS_MT               = 1,    ///< SMS mobile originated message. 

+    QSER_SMS_BROADCAST_MT      = 2     ///< SMS Cell Broadcast message.   

+}QSER_SMS_TYPT; 

+

+typedef enum 

+{

+    QSER_SMS_STORAGTYPNONE      = -1,   /**<  Message no need to store. */

+    QSER_SMS_STORAGTYPUIM       = 0,    /**<  Message store to UIM. */

+    QSER_SMS_STORAGTYPNV        = 1,    /**<  Message store to NV. */

+    QSER_SMS_STORAGTYPDB     = 2,    /**<  Message store to NV. */

+}QSER_SMS_STORAGTYPT;

+

+typedef enum 

+{

+    QSER_SMS_MESSAGMODUNKNOWN   = -1,   /**<  Message type CDMA */

+    QSER_SMS_MESSAGMODCDMA      = 0,    /**<  Message type CDMA */

+    QSER_SMS_MESSAGMODGW        = 1,    /**<  Message type GW. */

+}QSER_SMS_MODTYPT;

+

+typedef struct 

+ {

+    uint8_t total_segments;     /**<     The number of long  short message*/

+    uint8_t seg_number;         /**<     Current number.*/

+	uint8_t referencnumber;   /**< referencnumber.*/

+}QSER_sms_user_data_head_t; 

+

+typedef struct

+{

+    /* If sms is stored, it won't parse, you need read it by yourself */

+    QSER_SMS_STORAGTYPT storage;                          ///specify where stored this msg

+    

+    QSER_SMS_T       format;

+    QSER_SMS_TYPT         type;

+    char                    src_addr[QSER_SMS_MAX_ADDR_LENGTH]; ///Telephone number string.  

+    int                     sms_data_len;

+    char                    sms_data[QSER_SMS_MAX_MT_MSG_LENGTH];   ///SMS content, data format depends on format

+    char                    timestamp[21];                      ///Message time stamp (in text mode). string format: "yy/MM/dd,hh:mm:ss+/-TimeZone" 

+    uint8_t                 user_data_head_valid;               //indicate whether long sms. TRUE-long sms; FALSE-short message;

+    QSER_sms_user_data_head_t  user_data_head;                    //long sms user data head info.

+    QSER_SMS_MODTYPT    mode;                             ///specify where stored this msg cdma or gw area

+    uint32_t                storage_index;                      ///storage index, -1 means not store

+} QSER_sms_info_t;

+     

+typedef struct

+{

+    QSER_SMS_STORAGTYPT storage;

+    QSER_SMS_MODTYPT    mode;

+    uint32_t                storage_idx;

+} QSER_sms_storage_info_t;

+

+typedef enum 

+{

+    QSER_SMS_UNKNOWN            = -1, 

+    QSER_SMS_DISCARD            = 0x00, /*  Incoming messages for this route are discarded by the WMS service without 

+                                            notifying QMI_WMS clients */

+    QSER_SMS_STORAND_NOTIFY   = 0x01, /*  Incoming messages for this route are stored to the specified device 

+                                            memory, and new message notifications */

+    QSER_SMS_TRANSFER_ONLY      = 0x02, /*  Incoming messages for this route are transferred to the client, and the

+                                            client is expected to send ACK to the network */

+    QSER_SMS_TRANSFER_AND_ACK   = 0x03, /*  Incoming messages for this route are transferred to the client, and ACK is

+                                            sent to the network */

+}QSER_SMS_RECEPTION_ACTION_TYPT;

+

+#define QSER_WMS_MESSAGLENGTH_MAX 255

+

+typedef enum 

+ {

+    QSER_WMS_MESSAGCDMA            = 0x00,     //- 0x00 -- MESSAGCDMA -- CDMA \n 

+    QSER_WMS_MESSAGGW_PP           = 0x06,     //- 0x06 -- MESSAGGW_PP -- GW_PP

+}QSER_WMS_MESSAGTYPE;

+

+

+typedef struct

+ {

+  QSER_WMS_MESSAGTYPE format;

+  uint32_t raw_messaglen;                             /**< Must be set to # of elements in raw_message */

+  uint8_t raw_message[QSER_WMS_MESSAGLENGTH_MAX];       /**< Raw message data*/

+}QSER_wms_send_raw_message_data_t; 

+

+typedef enum

+{

+  QSER_WMS_TL_CAUSCODADDR_VACANT                        = 0x00, 

+  QSER_WMS_TL_CAUSCODADDR_TRANSLATION_FAILURE           = 0x01, 

+  QSER_WMS_TL_CAUSCODNETWORK_RESOURCSHORTAGE          = 0x02, 

+  QSER_WMS_TL_CAUSCODNETWORK_FAILURE                    = 0x03, 

+  QSER_WMS_TL_CAUSCODINVALID_TELESERVICID             = 0x04, 

+  QSER_WMS_TL_CAUSCODNETWORK_OTHER                      = 0x05, 

+  QSER_WMS_TL_CAUSCODNO_PAGRESPONSE                   = 0x20, 

+  QSER_WMS_TL_CAUSCODDEST_BUSY                          = 0x21, 

+  QSER_WMS_TL_CAUSCODNO_ACK                             = 0x22, 

+  QSER_WMS_TL_CAUSCODDEST_RESOURCSHORTAGE             = 0x23, 

+  QSER_WMS_TL_CAUSCODSMS_DELIVERY_POSTPONED             = 0x24, 

+  QSER_WMS_TL_CAUSCODDEST_OUT_OF_SERV                   = 0x25, 

+  QSER_WMS_TL_CAUSCODDEST_NOT_AT_ADDR                   = 0x26, 

+  QSER_WMS_TL_CAUSCODDEST_OTHER                         = 0x27, 

+  QSER_WMS_TL_CAUSCODRADIO_IF_RESOURCSHORTAGE         = 0x40, 

+  QSER_WMS_TL_CAUSCODRADIO_IF_INCOMPATABILITY           = 0x41, 

+  QSER_WMS_TL_CAUSCODRADIO_IF_OTHER                     = 0x42, 

+  QSER_WMS_TL_CAUSCODENCODING                           = 0x60, 

+  QSER_WMS_TL_CAUSCODSMS_ORIG_DENIED                    = 0x61, 

+  QSER_WMS_TL_CAUSCODSMS_TERM_DENIED                    = 0x62, 

+  QSER_WMS_TL_CAUSCODSUPP_SERV_NOT_SUPP                 = 0x63, 

+  QSER_WMS_TL_CAUSCODSMS_NOT_SUPP                       = 0x64, 

+  QSER_WMS_TL_CAUSCODMISSING_EXPECTED_PARAM             = 0x65, 

+  QSER_WMS_TL_CAUSCODMISSING_MAND_PARAM                 = 0x66, 

+  QSER_WMS_TL_CAUSCODUNRECOGNIZED_PARAM_VAL             = 0x67, 

+  QSER_WMS_TL_CAUSCODUNEXPECTED_PARAM_VAL               = 0x68, 

+  QSER_WMS_TL_CAUSCODUSER_DATA_SIZERR                 = 0x69, 

+  QSER_WMS_TL_CAUSCODGENERAL_OTHER                      = 0x6A, 

+}QSER_WMS_TL_CAUSCODTYPE;

+

+

+

+typedef struct

+ {

+  uint16_t                              messagid;            /*  Message ID */

+  uint8_t                               causcodvalid;      /**< Must be set to true if causcode is being passed */

+  QSER_WMS_TL_CAUSCODTYPE           causcode;  

+}QSER_wms_raw_send_resp_t;

+

+typedef struct 

+ {

+  char service_center_addr[QSER_SMS_MAX_ADDR_LENGTH + 1];         /**<   Address of the service center.*/

+  uint8_t service_center_addr_typvalid;

+  char service_center_addr_type[QSER_SMS_MAX_SCA_TYPLENGTH + 1];    /**<   129 if the SMSC address does not start with a "+" characte;

+                                                                           145 if the SMSC address starts with a "+" character*/

+}QSER_sms_service_center_cfg_t;

+

+typedef QSER_sms_info_t       QSER_SMS_Msg_t; 

+typedef QSER_sms_info_t*      QSER_SMS_MsgRef; 

+typedef void (*QSER_SMS_RxMsgHandlerFunc_t)(QSER_SMS_MsgRef msgRef, void* contextPtr);

+

diff --git a/cap/zx297520v3/sources/meta-zxic-custom/recipes-lynq/lynq-qser-sms-demo/lynq-qser-sms-demo.bb b/cap/zx297520v3/sources/meta-zxic-custom/recipes-lynq/lynq-qser-sms-demo/lynq-qser-sms-demo.bb
new file mode 100755
index 0000000..45430ac
--- /dev/null
+++ b/cap/zx297520v3/sources/meta-zxic-custom/recipes-lynq/lynq-qser-sms-demo/lynq-qser-sms-demo.bb
@@ -0,0 +1,33 @@
+# Package summary
+SUMMARY = "lynq-qser-sms-demo"
+# License, for example MIT
+LICENSE = "MIT"
+# License checksum file is always required
+LIC_FILES_CHKSUM = "file://${COREBASE}/meta/files/common-licenses/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302"
+		  
+SRC_URI = "file://lynq-qser-sms-demo.h file://lynq-qser-sms-demo.cpp"
+
+SRC-DIR = "${S}/../lynq-qser-sim-demo"
+TARGET_CC_ARCH += "${LDFLAGS}"
+
+#Parameters passed to do_compile()
+EXTRA_OEMAKE = "'TARGET_PLATFORM = ${TARGET_PLATFORM}'\"
+EXTRA_OEMAKE += "'MOBILETEK_RIL_CFG = ${MOBILETEK_RIL_CFG}'"
+
+LOCAL_C_INCLUDES = "-I."
+
+LOCAL_LIBS = "-L. -ldl -lstdc++"
+
+#INHIBIT_PACKAGE_STRIP = "1"
+S = "${WORKDIR}"
+
+#INHIBIT_PACKAGE_STRIP = "1"
+do_compile () {
+
+	${CXX} -Wall lynq-qser-sms-demo.cpp ${LOCAL_LIBS} ${LOCAL_C_INCLUDES} -o lynq-qser-sms-demo
+}
+
+do_install() {
+	install -d ${D}${bindir}/
+	install -m 0755 ${S}/lynq-qser-sms-demo ${D}${bindir}/
+}
diff --git a/cap/zx297520v3/sources/meta-zxic-custom/recipes-lynq/lynq-qser-voice-demo/files/lynq-qser-voice-demo.cpp b/cap/zx297520v3/sources/meta-zxic-custom/recipes-lynq/lynq-qser-voice-demo/files/lynq-qser-voice-demo.cpp
index 5f421c9..81185d9 100755
--- a/cap/zx297520v3/sources/meta-zxic-custom/recipes-lynq/lynq-qser-voice-demo/files/lynq-qser-voice-demo.cpp
+++ b/cap/zx297520v3/sources/meta-zxic-custom/recipes-lynq/lynq-qser-voice-demo/files/lynq-qser-voice-demo.cpp
@@ -22,6 +22,8 @@
     {1,   "qser_voice_call_start"},

     {2,   "qser_voice_call_end"},

     {3,   "qser_voice_call_answer"},

+    {4,   "qser_voice_set_speech_volume"},

+    {5,   "qser_voice_get_speech_volume"},

     {-1,    NULL}

 };

 

@@ -44,6 +46,8 @@
 

 int (*qser_voice_call_end)(voice_client_handle_type ,int );

 int (*qser_voice_call_answer)(voice_client_handle_type ,int  );

+int (*qser_voice_set_speech_volume)(const int volume);

+int (*qser_voice_get_speech_volume)(int *volume);

 

 void *dlHandle_call = NULL;

 

@@ -133,27 +137,40 @@
     }

 

     qser_voice_call_removestatehandle = (int (*)(voice_client_handle_type))dlsym(dlHandle_call,"qser_voice_call_removestatehandle");

-     if(qser_voice_call_removestatehandle == NULL) 

+    if(qser_voice_call_removestatehandle == NULL) 

     {

         printf("qser_voice_call_removestatehandle not defined or exported in %s\n", lynqLibPath_Call);

         return -1;

     }

 

-    ret = qser_voice_call_client_init(&h_voice);

-    if(ret != 0 && ret != 1)

+    qser_voice_set_speech_volume = (int (*)(const int ))dlsym(dlHandle_call,"qser_voice_set_speech_volume");

+    if(qser_voice_set_speech_volume == NULL)    

     {

-        printf("qser_voice_call_client_init FAIL.%d\n");

+            printf("qser_voice_set_speech_volume not defined or exported in %s\n", lynqLibPath_Call);

+            return -1;

+    }

+

+    qser_voice_get_speech_volume = (int (*)(int* ))dlsym(dlHandle_call,"qser_voice_get_speech_volume");

+    if(qser_voice_get_speech_volume == NULL)    

+    {

+            printf("qser_voice_get_speech_volume not defined or exported in %s\n", lynqLibPath_Call);

+            return -1;

+    }

+    

+    ret = qser_voice_call_client_init(&h_voice);

+    if(ret != 0 )

+    {

+        printf("qser_voice_call_client_init FAIL\n");

         return -1;

     }

 

     ret = qser_voice_call_addstatehandler(h_voice, yk_voice_call_cb_func, &voice_call_id);

-    if(ret != 0 && ret != 1)

+    if(ret != 0)

     {

-        printf("qser_voice_call_addstatehandler FAIL.%d\n");

+        printf("qser_voice_call_addstatehandler FAIL\n");

         return -1;

     }

 

-    printf("qser_voice_call_addstatehandler ret = %d\n", ret);

 

     print_help();

     while(1)

@@ -206,6 +223,27 @@
                 printf(" ret = %d\n", ret);

                 break;

             }

+            

+            case 4:

+            {

+                int volume = 0;

+                printf("Please set speech volume:0-5 level\n");

+                scanf("%d",&volume);

+                ret = qser_voice_set_speech_volume(volume);

+                printf("ret is %d\n",ret);

+                break;

+

+            }

+

+            case 5:

+            {

+                int volume = -1;

+                printf("Enter get speech volume\n");

+                ret = qser_voice_get_speech_volume(&volume);

+                printf("ret is %d,get volume is %d\n",ret,volume);

+                break;

+

+            }

             default:

                 print_help();

                 break;

@@ -216,7 +254,7 @@
     ret = qser_voice_call_removestatehandle(h_voice);

     if(ret != 0 && ret != 1)

     {

-        printf("qser_voice_call_removestatehandle FAIL.%d\n");

+        printf("qser_voice_call_removestatehandle FAIL!!!\n");

         return -1;

     }

     printf("qser_voice_call_removestatehandle ret = %d\n", ret);

@@ -225,7 +263,7 @@
     ret = qser_voice_call_client_deinit(h_voice);

     if(ret != 0)

     {

-        printf("qser_voice_call_client_deinit FAIL.%d\n",ret);

+        printf("qser_voice_call_client_deinit FAIL\n");

         return -1;

     }

     printf("qser_voice_call_client_deinit ret = %d, with h_voice=%d\n", ret, h_voice);

diff --git a/cap/zx297520v3/sources/meta-zxic-custom/recipes-lynq/lynq-ril-service/lynq-ril-service.bb b/cap/zx297520v3/sources/meta-zxic-custom/recipes-lynq/lynq-ril-service/lynq-ril-service.bb
index c05ec76..641ebb7 100755
--- a/cap/zx297520v3/sources/meta-zxic-custom/recipes-lynq/lynq-ril-service/lynq-ril-service.bb
+++ b/cap/zx297520v3/sources/meta-zxic-custom/recipes-lynq/lynq-ril-service/lynq-ril-service.bb
@@ -3,7 +3,7 @@
 DESCRIPTION = "lynq ril service"
 LICENSE = "CLOSED"
 LIC_FILES_CHKSUM = "file://LICENSE;md5=b1e07e8d88e26263e71d3a9e2aa9a2ff"
-DEPENDS += "${@bb.utils.contains('TARGET_PLATFORM', 'mt2735', 'audio-mixer-ctrl streamer1.0', '', d)} libapn libpal libvendor-ril libbinder glib-2.0 dbus liblynq-log liblynq-uci liblynq-shm"
+DEPENDS += "${@bb.utils.contains('TARGET_PLATFORM', 'mt2735', 'audio-mixer-ctrl streamer1.0', '', d)} libapn libpal libvendor-ril libbinder glib-2.0 dbus liblynq-log liblynq-uci liblynq-shm libmedia"
 #inherit workonsrc
 WORKONSRC = "${TOPDIR}/../src/lynq/framework/lynq-ril-service/src"
 FILESEXTRAPATHS_prepend :="${TOPDIR}/../src/lynq/framework/:"
diff --git a/cap/zx297520v3/sources/meta-zxic-custom/recipes-lynq/uci/files/uci.patch b/cap/zx297520v3/sources/meta-zxic-custom/recipes-lynq/uci/files/uci.patch
new file mode 100644
index 0000000..2787896
--- /dev/null
+++ b/cap/zx297520v3/sources/meta-zxic-custom/recipes-lynq/uci/files/uci.patch
@@ -0,0 +1,13 @@
+diff --git a/uci.h b/uci.h
+index d0374f2..8ed49d9 100644
+--- a/uci.h
++++ b/uci.h
+@@ -36,7 +36,7 @@ extern "C" {
+ #include <stdint.h>
+ #include <stddef.h>
+ 
+-#define UCI_CONFDIR "/etc/config"
++#define UCI_CONFDIR "/mnt/userdata/config"
+ #define UCI_SAVEDIR "/tmp/.uci"
+ #define UCI_DIRMODE 0700
+ #define UCI_FILEMODE 0600
diff --git a/cap/zx297520v3/sources/meta-zxic-custom/recipes-lynq/uci/uci_git.bb b/cap/zx297520v3/sources/meta-zxic-custom/recipes-lynq/uci/uci_git.bb
index a3abe4c..00e1f42 100755
--- a/cap/zx297520v3/sources/meta-zxic-custom/recipes-lynq/uci/uci_git.bb
+++ b/cap/zx297520v3/sources/meta-zxic-custom/recipes-lynq/uci/uci_git.bb
@@ -5,6 +5,7 @@
 
 SRC_URI = " \
     git://git.openwrt.org/project/uci.git \
+    file://uci.patch \
 "
 
 SRCREV = "415f9e48436d29f612348f58f546b3ad8d74ac38"
diff --git a/cap/zx297520v3/src/lynq/framework/lynq-ril-service/src/cc.cpp b/cap/zx297520v3/src/lynq/framework/lynq-ril-service/src/cc.cpp
index e2885d0..cdb28f1 100755
--- a/cap/zx297520v3/src/lynq/framework/lynq-ril-service/src/cc.cpp
+++ b/cap/zx297520v3/src/lynq/framework/lynq-ril-service/src/cc.cpp
@@ -63,6 +63,14 @@
     #include "mixer_ctrl.h"
 }
 #endif //LYNQ_CC_SUPPORT
+
+#ifdef  MOBILETEK_TARGET_PLATFORM_T106
+
+extern "C" {
+        #include "sc_voice_api.h"
+}
+#endif
+
 #undef LOG_TAG
 #define LOG_TAG "LYNQ_RIL_CC"
 
@@ -97,6 +105,12 @@
 #define MIN_VOLUME (1)
 #endif
 
+#ifdef  MOBILETEK_TARGET_PLATFORM_T106
+#define MAX_VOLUME (5)
+#define MIN_VOLUME (0)
+#endif
+
+
 #ifdef TARGET_PLATFORM_MT2635
 #define MAX_VOLUME (17)
 #define MIN_VOLUME (-23)
@@ -255,8 +269,17 @@
 int mixer_set_volume(int value)
 {
     RLOGD("lynq this is function:%s,line%d",__FUNCTION__,__LINE__);
-    #if LYNQ_CC_SUPPORT
+
     int ret;
+#ifdef  MOBILETEK_TARGET_PLATFORM_T106
+    ret = sc_audio_set_rx_voice_vol(value);
+    if(ret != 0)
+    {
+        printf("set tx voice vol failed\n");
+        return -1;
+    }
+    RLOGD("Set speech volume success !!!");
+#else
     if (get_audio_path() == 0) {
         ret = set_mixer_ctrl_volume_value(g_mixer_name_volume, value);
     } else {
@@ -264,14 +287,28 @@
     }
     if (ret)
         RLOGE("set_mixer_ctrl_volume_value_int err: %d", ret);
+#endif
     return ret;
-    #endif //LYNQ_CC_SUPPORT
-    return 0;//LYNQ_CC_SUPPORT
+    
 }
 long int mixer_get_volume()
 {
     RLOGD("lynq this is function:%s,line%d",__FUNCTION__,__LINE__);
-    #if LYNQ_CC_SUPPORT
+    
+#ifdef  MOBILETEK_TARGET_PLATFORM_T106
+    int value = 0;
+    int ret = 0;
+    ret = sc_audio_get_rx_voice_vol(&value);
+    if(ret != 0)
+    {
+        printf("Get sc_audio_get_tx_voice_vol failed \n");
+        return -1;
+
+    }
+    RLOGD("Get speech volume success !!!");
+    return (long int)value;
+    
+#else
     long int vol_value;
     if (get_audio_path() == 0) {
         vol_value = get_mixer_ctrl_volume_value(g_mixer_name_volume);
@@ -280,8 +317,7 @@
     }
     RLOGD("The ctrl \"%s\" is set to %ld", g_mixer_name_volume, vol_value);
     return vol_value;
-    #endif //LYNQ_CC_SUPPORT
-    return 0;//LYNQ_CC_SUPPORT
+#endif
 }
 
 #if LYNQ_CC_SUPPORT
@@ -898,11 +934,37 @@
 int setSpeechVolume(int argc, char **argv, RIL_SOCKET_ID socket_id, RequestInfo *pRI)
 {
     RLOGD("lynq this is function:%s,line%d",__FUNCTION__,__LINE__);
-    #if LYNQ_CC_SUPPORT
     android::Parcel p;
     int setValue = 0;
     RLOGD("setSpeechVolume start!");
+    
+#ifdef  MOBILETEK_TARGET_PLATFORM_T106
+    if(argc < 2) 
+    {
+        android::lynqAssemblyParcelheader(p,socket_id,pRI->uToken,LYNQ_REQUEST_SET_SPEECH_VOLUME,0,2);
+        android::LYNQ_RIL_respSocket(p,pRI);
+        free(pRI);
+        RLOGW("Warning: no set volume value!");
+        return -1;
+    }
 
+    setValue = atoi(argv[1]);
+    RLOGD("set Speech Volume value is %d!",setValue);
+
+    if(setValue < MIN_VOLUME || setValue > MAX_VOLUME) 
+    {
+            RLOGW("Warning: set volume value is over-range!");
+            android::lynqAssemblyParcelheader(p,socket_id,pRI->uToken,LYNQ_REQUEST_SET_SPEECH_VOLUME,0,2);
+            android::LYNQ_RIL_respSocket(p,pRI);
+            free(pRI);
+            return -1;
+    }
+    mixer_set_volume(setValue);
+    android::lynqAssemblyParcelheader(p,socket_id,pRI->uToken,LYNQ_REQUEST_SET_SPEECH_VOLUME,0,0);
+    printf(">>>>set speech Volume<<<< success value is %d!\n",setValue);
+    android::LYNQ_RIL_respSocket(p,pRI);
+    printf("Set speechVolume done!!!\n");
+#else
     if(argc < 2) {
         android::lynqAssemblyParcelheader(p,socket_id,pRI->uToken,LYNQ_REQUEST_SET_SPEECH_VOLUME,0,2);
         android::LYNQ_RIL_respSocket_sp(p,pRI);
@@ -936,15 +998,15 @@
     printf(">>>>set speech Volume<<<< success value is %d!\n",setValue);
     /*Warren add for t800 ril service 2021/12/23 end*/
     android::LYNQ_RIL_respSocket_sp(p,pRI);
+#endif     
+
     free(pRI);
     return 0;
-    #endif //LYNQ_CC_SUPPORT
-    return 0;//LYNQ_CC_SUPPORT
 }
 int getSpeechVolume(int argc, char **argv, RIL_SOCKET_ID socket_id, RequestInfo *pRI)
 {
     RLOGD("lynq this is function:%s,line%d",__FUNCTION__,__LINE__);
-    #if LYNQ_CC_SUPPORT
+    
     android::Parcel p;
     printf("WARREN TEST001!!!\n");
     int volumn = mixer_get_volume();
@@ -959,15 +1021,19 @@
         android::lynqAssemblyParcelheader(p,socket_id,pRI->uToken,LYNQ_REQUEST_GET_SPEECH_VOLUME,0,0);
         /*Warren add for t800 ril service 2021/12/23 end*/
     }
-    printf("current Speech Volume is%d",volumn);
+#ifdef MOBILETEK_TARGET_PLATFORM_T106
+    p.writeInt32(1);
     p.writeInt32(volumn);
+ #else
+    p.writeInt32(volumn);
+ #endif 
     android::LYNQ_RIL_respSocket(p,(void *)pRI);
-    if(pRI) {
+    if(pRI) 
+    {
         free(pRI);
     }
+    
     return 0;
-    #endif //LYNQ_CC_SUPPORT
-    return 0;//LYNQ_CC_SUPPORT
 }
 int setDtmfVolume(int argc, char **argv, RIL_SOCKET_ID socket_id, RequestInfo *pRI)
 {
diff --git a/cap/zx297520v3/src/lynq/framework/lynq-ril-service/src/data/data.cpp b/cap/zx297520v3/src/lynq/framework/lynq-ril-service/src/data/data.cpp
index 673960a..fbeaefe 100755
--- a/cap/zx297520v3/src/lynq/framework/lynq-ril-service/src/data/data.cpp
+++ b/cap/zx297520v3/src/lynq/framework/lynq-ril-service/src/data/data.cpp
@@ -789,6 +789,7 @@
                 p.writeInt32(0);//status
                 p.writeInt32(-1);//suggestedRetryTime
                 p.writeInt32(lynq_apn_cid_table[i].cid);//cid
+                writeStringToParcel(p, lynq_apn_cid_table[i].ifaceName);//ifname
                 android::LYNQ_RIL_respSocket(p, (void *)pRI);
                 RLOGD("cid:%d,apn:%s,apntype:%s", lynq_apn_cid_table[i].cid, lynq_apn_cid_table[i].apn, lynq_apn_cid_table[i].apntype);
                 return -1;
diff --git a/cap/zx297520v3/src/lynq/framework/lynq-ril-service/src/main.cpp b/cap/zx297520v3/src/lynq/framework/lynq-ril-service/src/main.cpp
index 5c1f922..b946904 100755
--- a/cap/zx297520v3/src/lynq/framework/lynq-ril-service/src/main.cpp
+++ b/cap/zx297520v3/src/lynq/framework/lynq-ril-service/src/main.cpp
@@ -32,6 +32,7 @@
 #include <errno.h>
 #include <vendor-ril/telephony/ril.h>
 #include <log/log.h>
+#include <liblog/lynq_deflog.h>
 #include <sys/file.h>
 #include <sys/stat.h>
 #include <sys/types.h>
@@ -210,3 +211,6 @@
     }
     close(lock_file);
 }
+
+DEFINE_LYNQ_EXE_LOG(LYNQ_RIL_SERVICE)
+
diff --git a/cap/zx297520v3/src/lynq/framework/lynq-ril-service/src/makefile b/cap/zx297520v3/src/lynq/framework/lynq-ril-service/src/makefile
index 1ad54c8..746c615 100755
--- a/cap/zx297520v3/src/lynq/framework/lynq-ril-service/src/makefile
+++ b/cap/zx297520v3/src/lynq/framework/lynq-ril-service/src/makefile
@@ -12,10 +12,12 @@
 
 ifeq ($(strip $(TARGET_PLATFORM)), T106)
     LOCAL_CFLAGS += -DMOBILETEK_TARGET_PLATFORM_T106
+    LOCAL_CFLAGS += -DUSE_CAP_SUPPORT
 endif
 
 ifeq ($(strip $(MOBILETEK_FOTA_CFG)), PLATFORM)
     LOCAL_CFLAGS += -DMOBILETEK_FOTA_CFG
+
 endif
 
 ifeq ($(strip $(MOBILETEK_FOTA_CFG)), GSW)
@@ -141,6 +143,7 @@
     -lsqlite3 \
     -llynq-uci \
     -llynq-shm  \
+    -lmedia \
 
 ifeq ($(strip $(TARGET_PLATFORM)), mt2735)
 LOCAL_LIBS += -luciwrapper -luciwrapper -lgstbase-1.0 -llynq-protcl -llynq-thermal -llynq-systime  -lnandapi -ldtmf -lasound -lgstreamer-1.0 -lmtk_audio_mixer_ctrl -lpower
diff --git a/cap/zx297520v3/src/lynq/lib/liblynq-autosuspend/LICENSE b/cap/zx297520v3/src/lynq/lib/liblynq-autosuspend/LICENSE
new file mode 100644
index 0000000..605b7ea
--- /dev/null
+++ b/cap/zx297520v3/src/lynq/lib/liblynq-autosuspend/LICENSE
@@ -0,0 +1,31 @@
+Copyright Statement:
+
+This software/firmware and related documentation ("MobileTek Software") are
+protected under relevant copyright laws. The information contained herein is
+confidential and proprietary to MobileTek Inc. and/or its licensors. Without
+the prior written permission of MobileTek inc. and/or its licensors, any
+reproduction, modification, use or disclosure of MobileTek Software, and
+information contained herein, in whole or in part, shall be strictly
+prohibited.
+
+MobileTek Inc. (C) 2015. All rights reserved.
+
+BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MobileTek SOFTWARE")
+RECEIVED FROM MobileTek AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
+ON AN "AS-IS" BASIS ONLY. MobileTek EXPRESSLY DISCLAIMS ANY AND ALL
+WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
+WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+NONINFRINGEMENT. NEITHER DOES MobileTek PROVIDE ANY WARRANTY WHATSOEVER WITH
+RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
+INCORPORATED IN, OR SUPPLIED WITH THE MobileTek SOFTWARE, AND RECEIVER AGREES
+TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
+RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
+OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MobileTek
+SOFTWARE. MobileTek SHALL ALSO NOT BE RESPONSIBLE FOR ANY MobileTek SOFTWARE
+RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MobileTek'S
+ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MobileTek SOFTWARE
+RELEASED HEREUNDER WILL BE, AT MobileTek'S OPTION, TO REVISE OR REPLACE THE
+MobileTek SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
+CHARGE PAID BY RECEIVER TO MobileTek FOR SUCH MobileTek SOFTWARE AT ISSUE.
diff --git a/cap/zx297520v3/src/lynq/lib/liblynq-autosuspend/include/libauto/lynq_autosuspend.h b/cap/zx297520v3/src/lynq/lib/liblynq-autosuspend/include/libauto/lynq_autosuspend.h
new file mode 100644
index 0000000..efd1219
--- /dev/null
+++ b/cap/zx297520v3/src/lynq/lib/liblynq-autosuspend/include/libauto/lynq_autosuspend.h
@@ -0,0 +1,37 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <errno.h>
+#include <string.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <sys/un.h>
+#include <unistd.h>
+#include <dlfcn.h>
+#include <pthread.h>
+#include <stdbool.h>
+#include <time.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+struct time_info_t
+{
+    long sleep_start_time;
+    long wakeup_time;
+};
+
+int lynq_autosleep_enable(void);
+int lynq_autosleep_disable(void);
+int lynq_wait_wakeup_event(long *sleep_start_time, long * wakeup_time);
+
+#ifdef MOBILETEK_TARGET_PLATFORM_T106
+int lynq_set_lpmode(int lp_mode);
+int release_wake_lock(char *name);
+int acquire_wake_lock(int lock, char *name);
+#endif
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/cap/zx297520v3/src/lynq/lib/liblynq-autosuspend/lynq-autosuspend.cpp b/cap/zx297520v3/src/lynq/lib/liblynq-autosuspend/lynq-autosuspend.cpp
new file mode 100644
index 0000000..54c88fd
--- /dev/null
+++ b/cap/zx297520v3/src/lynq/lib/liblynq-autosuspend/lynq-autosuspend.cpp
@@ -0,0 +1,445 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <errno.h>
+#include <string.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <sys/un.h>
+#include <unistd.h>
+#include <dlfcn.h>
+#include <pthread.h>
+#include <stdbool.h>
+#include <time.h>
+#include "include/libauto/lynq_autosuspend.h"
+#ifdef MOBILETEK_TARGET_PLATFORM_T106
+#include <sc_bsp.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+#define LOG_TAG "libautosuspend"
+// #include <liblog/lynq_deflog.h>
+#include <log/log.h>
+#define SERVER_CMD_PATH "/tmp/autosuspend.cmd.server"
+#define SERVER_DATA_PATH "/tmp/autosuspend.data.server"
+// #define CLIENT_PATH "/tmp/autosuspend.client"
+static int client_sock_fd;
+static int client_data_sock_fd;
+static bool libautosuspend_inited;
+bool feedback_flag = true; //add for after sleeping once calling lynq_wailt_wakeup_event does not return sleep time
+// static bool libautosuspend_enabled;
+// static pthread_mutex_t get_feedback_mutex = PTHREAD_MUTEX_INITIALIZER;
+// static pthread_cond_t get_feedback_cond = PTHREAD_COND_INITIALIZER;
+static pthread_mutex_t client_fd_mutex = PTHREAD_MUTEX_INITIALIZER;
+static pthread_mutex_t client_data_fd_mutex = PTHREAD_MUTEX_INITIALIZER;
+static pthread_mutex_t feedback_got_mutex = PTHREAD_MUTEX_INITIALIZER;
+static pthread_cond_t feedback_got_cond = PTHREAD_COND_INITIALIZER;
+
+static struct time_info_t time_info_client; 
+static ssize_t Read(int fd, void *ptr, size_t nbytes)
+{
+    ssize_t n;
+    
+    while((n = read(fd, ptr, nbytes)) == -1)
+    {
+       //printf("READ,%d\n",fd);
+        if (errno == EINTR)
+        {    
+            printf("read error eintr\n");
+            continue;
+        }
+        else if(errno == EAGAIN || errno == EWOULDBLOCK)
+        {
+            printf("read time out\n");
+            return -2;
+        }
+        else
+        {
+            printf("read error\n");
+            return -1;
+        }
+    }
+    //sleep(2);
+    //printf("READ1,%d\n", fd);
+    return n;
+}
+static ssize_t Write(int fd, const void *ptr, size_t nbytes)
+{
+    ssize_t n;
+    while((n = write(fd, ptr, nbytes)) == -1)
+    {
+        if (errno == EINTR)
+            continue;
+        else if(errno == EPIPE)
+        {
+            printf("write error epipe\n");
+            return -1;
+        }  
+        else
+            return -1;
+    }
+    return n;
+}
+static int Close(int fd)
+{
+    if (Close(fd) == -1)
+    {
+        printf("Close error\n");
+        return -1;
+    }
+    return 0;
+}
+static int connect_to_server(int *cfd, char *client_path, char *server_path)
+{
+    int rc;
+    struct sockaddr_un server_sockaddr; 
+    struct sockaddr_un client_sockaddr; 
+    printf("Start bind and connect to the service.\n");
+    /**************************************/
+    /* Create a UNIX domain stream socket */
+    /**************************************/
+    *cfd = socket(AF_UNIX, SOCK_STREAM, 0);
+    if (*cfd == -1) {
+        printf("SOCKET ERROR ");
+        return -1;
+    }
+    /***************************************/
+    /* Set up the UNIX sockaddr structure  */
+    /* by using AF_UNIX for the family and */
+    /* giving it a filepath to bind to.    */
+    /*                                     */
+    /* Unlink the file so the bind will    */
+    /* succeed, then bind to that file.    */
+    /***************************************/
+    client_sockaddr.sun_family = AF_UNIX;  
+    strcpy(client_sockaddr.sun_path, client_path); 
+    
+    unlink(client_sockaddr.sun_path);
+    rc = bind(*cfd, (struct sockaddr *) &client_sockaddr, sizeof(client_sockaddr));
+    if (rc == -1){
+        printf("BIND ERROR ");
+        Close(*cfd);
+        return -1;
+    }
+        
+    /***************************************/
+    /* Set up the UNIX sockaddr structure  */
+    /* for the server socket and connect   */
+    /* to it.                              */
+    /***************************************/
+    server_sockaddr.sun_family = AF_UNIX;
+    
+    strcpy(server_sockaddr.sun_path, server_path);
+    rc = connect(*cfd, (struct sockaddr *) &server_sockaddr, sizeof(client_sockaddr));
+    if(rc == -1){
+        printf("CONNECT ERROR ");
+        Close(*cfd);
+        return -3;
+    }
+    return 0;
+    
+}
+static void *deal_get_feedback(void *sockfd)
+{
+    int rc;
+    int client_sock = *((int *)sockfd);
+    // pthread_mutex_lock(&feedback_got_mutex);
+    
+    while (1)
+    {
+        // printf("deal_get_feedback thread wait.\n");
+        // pthread_cond_wait(&get_feedback_cond,&get_feedback_mutex);
+        printf("start get feedback from the service.\n");
+        pthread_mutex_lock(&feedback_got_mutex);
+        memset(&time_info_client,0,sizeof(struct time_info_t));
+        rc = Read(client_sock,&time_info_client,sizeof(struct time_info_t));
+        if(rc == -1)
+        {           
+            printf("client read wakeup_feedback struct fail.\n");
+            Close(client_sock);
+            pthread_mutex_unlock(&feedback_got_mutex);
+            break ;
+        }
+        else if(rc == -2)
+        {
+            printf("client read wakeup_feedback struct timeout.\n");
+            pthread_mutex_unlock(&feedback_got_mutex);
+            continue;
+        }
+        printf("system sleep_start timestamps : %ld ms\n",time_info_client.sleep_start_time);
+        printf("system wakeup timestamps : %ld ms\n",time_info_client.wakeup_time);
+        // pthread_cond_broadcast(&feedback_got_cond);
+        pthread_mutex_unlock(&feedback_got_mutex);
+        usleep(10000);  //给libautosuspend_get_feedback函数时间进入wait,不可删除,但可以减少
+        pthread_cond_broadcast(&feedback_got_cond);
+        usleep(10000); //希望多给libautosuspend_get_feedback函数拿到锁的机会,不可删除,但可以减少
+        
+    }
+    
+}
+static int libautosuspend_init()
+{
+    if (libautosuspend_inited)
+    {
+        return 0;
+    }
+    printf("Start libautosuspend_init.\n");
+    char client_cmd_path[40];
+    char client_data_path[40];
+    sprintf(client_cmd_path,"/tmp/autosuspend.%d.cmd.client",(int)getpid());
+    sprintf(client_data_path,"/tmp/autosuspend.%d.data.client",(int)getpid());
+    pthread_mutex_lock(&client_fd_mutex);
+    if(connect_to_server(&client_sock_fd,client_cmd_path,SERVER_CMD_PATH) < 0)
+    {
+        printf("cmd channel connect error.\n");
+        pthread_mutex_unlock(&client_fd_mutex);
+        return -1;
+    }
+    if(connect_to_server(&client_data_sock_fd,client_data_path,SERVER_DATA_PATH) < 0)
+    {
+        printf("data channel connect error.\n");
+        pthread_mutex_unlock(&client_fd_mutex);
+        return -1;
+    }
+    pthread_t feedback_tid;
+    pthread_create(&feedback_tid,NULL,deal_get_feedback,(void*)&client_data_sock_fd);
+    pthread_detach(feedback_tid);
+    libautosuspend_inited = true;
+    pthread_mutex_unlock(&client_fd_mutex);
+    
+    return 0;
+    
+}
+static int send_cmd(char * value,int len)
+{
+    int rc;
+    if(value == NULL)
+    {
+       return -1;
+    }
+    
+    /************************************/
+    /* Copy the data to the buffer and  */
+    /* send it to the server socket.    */
+    /************************************/
+    // strcpy(buf, DATA);
+    printf("Sending data...\n");
+    rc = send(client_sock_fd, value, len, 0);
+    if (rc == -1) {
+        printf("SEND ERROR ");
+        Close(client_sock_fd);
+        return -2;
+    }   
+    else {
+        printf("Data sent: %s\n",value);
+    }
+    // Close(client_sock);
+    return rc;
+}
+int lynq_autosleep_enable(void)
+{
+    char value[15]="enable";
+    char res[15];
+    if(libautosuspend_init() != 0)
+    {
+        return -1;
+    }
+    // if(libautosuspend_enabled)
+    // {
+    //     return 0;
+    // }
+    pthread_mutex_lock(&client_fd_mutex);
+    int rc = send_cmd(value,strlen(value));
+    if(rc < 0)
+    {
+        printf("libautosuspend send enable cmd fail.\n");
+        pthread_mutex_unlock(&client_fd_mutex);
+        return -1;
+    }
+    // if(Read(client_sock_fd,res,sizeof(res)) <= 0)
+    // {
+    //     printf("libautosuspend get respond fail.\n");
+    //     pthread_mutex_unlock(&client_fd_mutex);
+    //     return -1;
+    // }
+    // printf("libautosuspend get respond : %s.\n",res);
+    // if(strcmp(res,"enabled") != 0)
+    // {
+    //     pthread_mutex_unlock(&client_fd_mutex);
+    //     return -1;
+    // }
+    // libautosuspend_enabled = true;
+    pthread_mutex_unlock(&client_fd_mutex);
+    return 1;
+  
+}
+int lynq_autosleep_disable(void)
+{
+    char value[15]="disable";
+    char res[15];
+    if(libautosuspend_init() != 0)
+    {
+        return -1;
+    }
+    // if(!libautosuspend_enabled)
+    // {
+    //     return 0;
+    // }
+    pthread_mutex_lock(&client_fd_mutex);
+    int rc = send_cmd(value,strlen(value));
+    if(rc < 0)
+    {
+        printf("libautosuspend send disable cmd fail.\n");
+        pthread_mutex_unlock(&client_fd_mutex);
+        return -1;
+    }
+    // if(Read(client_sock_fd,res,sizeof(res)) <= 0)
+    // {
+    //     printf("libautosuspend get respond fail.\n");
+    //     pthread_mutex_unlock(&client_fd_mutex);
+    //     return -1;
+    // }
+    // printf("libautosuspend get respond : %s.\n",res);
+    // if(strcmp(res,"disabled") != 0)
+    // {
+    //     pthread_mutex_unlock(&client_fd_mutex);
+    //     return -1;
+    // }
+    // libautosuspend_enabled = false;
+    pthread_mutex_unlock(&client_fd_mutex);
+    return 1;
+}
+int libautosuspend_get_feedback(struct time_info_t *time_info)
+{
+    // char value[15]="feedback";
+    // char res[15];    
+    // if(!libautosuspend_enabled)
+    // {
+    //     printf("system autosuspend disabled, can not get wakeup feedback.\n");
+    //     return -1;
+    // }
+    printf("start get feedback from the service.\n");
+    memset(time_info,0,sizeof(struct time_info_t));
+    // if(timeout == NULL)
+    // {
+    //     printf("client set timeout for receiving wakeup_feedback: NULL.\n");
+    // }
+    // else
+    // {
+    //     struct timeval recv_timeout = {(*timeout),0};
+    //     pthread_mutex_lock(&client_data_fd_mutex);
+    //     if(setsockopt(client_data_sock_fd,SOL_SOCKET,SO_RCVTIMEO,(char*)&recv_timeout,sizeof(struct timeval)) == -1)
+    //     {
+    //         printf("client set timeout for receiving wakeup_feedback: error.\n");
+    //         pthread_mutex_unlock(&client_data_fd_mutex);
+    //         return -1;
+    //     }
+            
+    //     printf("client set timeout for receiving wakeup_feedback: %d s.\n",(*timeout));
+    //     pthread_mutex_unlock(&client_data_fd_mutex);
+        
+    // }
+    // int rc = send_cmd(value,strlen(value));
+    // if(rc < 0)
+    // {
+    //     printf("libautosuspend send feedback cmd fail.\n");
+    //     pthread_mutex_unlock(&client_fd_mutex);
+    //     return -1;
+    // }
+    // if(Read(client_data_sock_fd,time_info,sizeof(struct time_info_t)) <= 0)
+    // {
+    //     printf("libautosuspend_get_feedback fail.\n");
+    //     pthread_mutex_unlock(&client_fd_mutex);
+    //     return -1;
+    // }
+    printf("libautosuspend_get_feedback wait.\n");
+    pthread_mutex_lock(&feedback_got_mutex);
+    pthread_cond_wait(&feedback_got_cond,&feedback_got_mutex);
+    memcpy(time_info,&time_info_client,sizeof(struct time_info_t));
+    printf("libautosuspend_get_feedback success.\n");
+    pthread_mutex_unlock(&feedback_got_mutex);
+    // printf("[client] system sleep_start timestamps : %ld ms\n",time_info.sleep_start_time);
+    // printf("[client] system wakeup timestamps : %ld ms\n",time_info.wakeup_time);
+    return 0;
+}
+int lynq_wait_wakeup_event(long *sleep_start_time, long * wakeup_time)
+{
+   int *socket_timeout = NULL;
+   struct time_info_t time_info;
+   int ret = 0;
+   /*add for after sleeping once calling lynq_wailt_wakeup_event does not return sleep time start*/
+   if(feedback_flag == true)
+   {
+       if(libautosuspend_init() != 0)
+       {
+           return -1;
+       }
+   }
+   feedback_flag = false; 
+   /*add for after sleeping once calling lynq_wailt_wakeup_event does not return sleep time end*/
+   memset(&time_info,0,sizeof(struct time_info_t));
+   if(sleep_start_time == NULL || wakeup_time == NULL )
+   {
+      printf("lynq_wait_wakeup_event input errors.\n");
+      return -1;
+   }
+   ret=libautosuspend_get_feedback(&time_info);
+   if(ret == 0)
+   {
+     *sleep_start_time = time_info.sleep_start_time;
+     *wakeup_time = time_info.wakeup_time;
+     return 0;
+   }
+   else
+   {
+      return -1;
+   }
+   
+}
+#ifdef MOBILETEK_TARGET_PLATFORM_T106
+int acquire_wake_lock(int lock, char *name)
+{
+    int ret;
+    printf("Get param:%s \n", name);
+    ret = sc_pm_wakelock_lock(name);
+    if (ret)
+    {
+        printf("do_wakelock failed, err:%d", ret);
+        return ret;
+    }
+    printf("do_wakelock succeed\n");
+    return ret;
+}
+int release_wake_lock(char *name)
+{
+    int ret;
+    printf("Get param:%s \n", name);
+    ret = sc_pm_wakelock_unlock(name);
+    if (ret)
+    {
+        printf("do_wakeunlock failed, err:%d", ret);
+        return ret;
+    }
+    printf("do_wakeunlock succeed\n");
+    return ret;
+}
+int lynq_set_lpmode(int lp_mode)
+{
+    int ret;
+    printf("Get param:%d \n", lp_mode);
+    ret = sc_pm_set_lp_mode(lp_mode);
+    if (ret) {
+        printf("do_set_lpmode failed, err:%d", ret);
+        exit(1);
+    }
+    printf("do_set_lpmode succeed\n");
+    return ret;
+}
+#endif
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/cap/zx297520v3/src/lynq/lib/liblynq-autosuspend/lynq_autosuspend.h b/cap/zx297520v3/src/lynq/lib/liblynq-autosuspend/lynq_autosuspend.h
new file mode 100644
index 0000000..efd1219
--- /dev/null
+++ b/cap/zx297520v3/src/lynq/lib/liblynq-autosuspend/lynq_autosuspend.h
@@ -0,0 +1,37 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <errno.h>
+#include <string.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <sys/un.h>
+#include <unistd.h>
+#include <dlfcn.h>
+#include <pthread.h>
+#include <stdbool.h>
+#include <time.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+struct time_info_t
+{
+    long sleep_start_time;
+    long wakeup_time;
+};
+
+int lynq_autosleep_enable(void);
+int lynq_autosleep_disable(void);
+int lynq_wait_wakeup_event(long *sleep_start_time, long * wakeup_time);
+
+#ifdef MOBILETEK_TARGET_PLATFORM_T106
+int lynq_set_lpmode(int lp_mode);
+int release_wake_lock(char *name);
+int acquire_wake_lock(int lock, char *name);
+#endif
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/cap/zx297520v3/src/lynq/lib/liblynq-autosuspend/makefile b/cap/zx297520v3/src/lynq/lib/liblynq-autosuspend/makefile
new file mode 100644
index 0000000..b97b48c
--- /dev/null
+++ b/cap/zx297520v3/src/lynq/lib/liblynq-autosuspend/makefile
@@ -0,0 +1,74 @@
+SHELL = /bin/sh
+RM = rm -f
+
+LOCAL_CFLAGS := -Wall \
+                -std=c++11 \
+                -g -Os \
+                -flto \
+                -fPIC \
+                -fpermissive \
+
+
+ifeq ($(strip $(TARGET_PLATFORM)), T106)
+    LOCAL_CFLAGS += -DBINDER_IPC_32BIT=1 -DHAVE_ENDIAN_H -DHAVE_PTHREADS -DHAVE_SYS_UIO_H -DHAVE_POSIX_FILEMAP -DHAVE_STRLCPY -DHAVE_PRCTL -DHAVE_MEMSET16 -DHAVE_MEMSET32 -DANDROID_SMP=0
+endif
+
+ifeq ($(strip $(TARGET_PLATFORM)), T106)
+    LOCAL_CFLAGS += -DMOBILETEK_TARGET_PLATFORM_T106
+endif
+
+
+
+$(warning ################# lynq autosuspend API ROOT: $(ROOT),includedir:$(includedir))
+LOCAL_PATH   = .
+
+LOCAL_C_INCLUDES = \
+  -I. \
+  -I$(LOCAL_PATH)/include/libauto \
+  -I$(ROOT)$(includedir)/logger \
+  -I$(ROOT)$(includedir)/liblog \
+
+
+
+LOCAL_LIBS := \
+    -L. \
+    -ldl \
+    -lstdc++ \
+    -llog \
+    -lcutils \
+    -lpthread \
+    -llynq-log \
+    -lbsp \
+
+SOURCES = $(wildcard *.cpp)
+
+EXECUTABLE = liblynq-autosuspend.so
+
+OBJECTS=$(SOURCES:.cpp=.o)
+
+
+.PHONY: build clean install pack_rootfs 
+all: build
+$(EXECUTABLE): $(OBJECTS)
+	$(CXX) -shared -Wl,--no-undefined $(OBJECTS) $(LOCAL_LIBS) $(LOCAL_CFLAGS) $(LOCAL_C_INCLUDES) -o $@
+
+%.o : %.cpp
+	$(CXX) $(LOCAL_C_INCLUDES) $(LOCAL_CFLAGS) $(LOCAL_LIBS) -o $@ -c $<
+
+build:  $(EXECUTABLE)
+	$(warning ########## build $(EXECUTABLE)  ##########)
+install:
+	mkdir -p $(ROOT)$(base_libdir)/
+	install $(EXECUTABLE) $(ROOT)$(base_libdir)/
+	mkdir -p $(ROOT)$(includedir)/$(NAME)/sdk
+pack_rootfs:
+	mkdir -p $(PACK_INITRAMFS_TO)$(base_libdir)/
+	cp -af $(EXECUTABLE) $(PACK_INITRAMFS_TO)$(base_libdir)/
+	$(CROSS)strip $(PACK_INITRAMFS_TO)$(base_libdir)/$(EXECUTABLE)
+	mkdir -p $(PACK_TO)$(base_libdir)/
+	cp -af $(EXECUTABLE) $(PACK_TO)$(base_libdir)/
+	$(CROSS)strip $(PACK_TO)$(base_libdir)/$(EXECUTABLE)
+.PHONY: clean
+clean:
+	$(RM) $(OBJECTS) $(EXECUTABLE)
+	-find . -name "*.o" -delete
diff --git a/cap/zx297520v3/src/lynq/lib/liblynq-call/lynq_call.cpp b/cap/zx297520v3/src/lynq/lib/liblynq-call/lynq_call.cpp
index b775838..b40f6c1 100755
--- a/cap/zx297520v3/src/lynq/lib/liblynq-call/lynq_call.cpp
+++ b/cap/zx297520v3/src/lynq/lib/liblynq-call/lynq_call.cpp
@@ -26,6 +26,11 @@
 #define CALL_ON  (1)

 #define USER_LOG_TAG "LYNQ_CALL"

 

+#ifdef MOBILETEK_TARGET_PLATFORM_T106

+#define MIN_VOLUME 0

+#define MAX_VOLUME 5

+#endif 

+

 using ::android::Parcel;

 

 /**

@@ -1359,12 +1364,24 @@
             return 0;

         }

     }

+    

+#ifdef MOBILETEK_TARGET_PLATFORM_T106

     else if (set==LYNQ_E_VOLUMN_SET_SPEECH)

     {

-        if(volume < 1 ||volume >7){

+        if(volume < MIN_VOLUME || volume > MAX_VOLUME)

+        {

             return 0;

         }

     }

+#else 

+    else if (set==LYNQ_E_VOLUMN_SET_SPEECH)

+        {

+            if(volume < 1 ||volume >7){

+                return 0;

+            }

+        }

+#endif

+

     return 1;

 }

 int lynq_set_DTMF_volume(const int volume)

@@ -1503,6 +1520,8 @@
     }

 }

 

+DEFINE_LYNQ_LIB_LOG(LYNQ_CALL)

+

 #if 0

 int main(int argc,char **argv)

 {

diff --git a/cap/zx297520v3/src/lynq/lib/liblynq-data/include/libdata/lynq_data.h b/cap/zx297520v3/src/lynq/lib/liblynq-data/include/libdata/lynq_data.h
index 99da6ec..1ee15ba 100755
--- a/cap/zx297520v3/src/lynq/lib/liblynq-data/include/libdata/lynq_data.h
+++ b/cap/zx297520v3/src/lynq/lib/liblynq-data/include/libdata/lynq_data.h
@@ -9,9 +9,9 @@
 #define LYNQ_APN_MAX_LEN 50
 #define LYNQ_TYPE_MAX_LEN 50
 #define LYNQ_ADDRESSES_MAX_LEN 100
-#define LYNQ_DNSES_MAX_LEN 50
+#define LYNQ_DNSES_MAX_LEN 256
 #define LYNQ_GATEWAYS_MAX_LEN 50
-#define LYNQ_PCSCF_MAX_LEN 50
+#define LYNQ_PCSCF_MAX_LEN 256
 #define LYNQ_APN_TYPE_MAX_LEN 50
 #define LYNQ_PDP_ADDR_MAX_LEN 64
 #define LYNQ_DNS_ADDR_MAX_LEN 256
@@ -74,6 +74,7 @@
 int lynq_modify_apn_db(const int cmd,char *id,char *mcc,char *mnc,char *apn,char *apntype,char *user,char *password,char *normalprotocol,char *roamingprotocol,char *carrier,char *out);
 int lynq_reset_apn(char *result);
 int lynq_get_apn_table(int *size,lynq_apn_info **list);
+void lynq_release_wait_data_call();
 
 #ifdef __cplusplus
 }
diff --git a/cap/zx297520v3/src/lynq/lib/liblynq-data/lynq_data.cpp b/cap/zx297520v3/src/lynq/lib/liblynq-data/lynq_data.cpp
index f35562b..49363ad 100755
--- a/cap/zx297520v3/src/lynq/lib/liblynq-data/lynq_data.cpp
+++ b/cap/zx297520v3/src/lynq/lib/liblynq-data/lynq_data.cpp
@@ -896,6 +896,11 @@
     Global_uToken = uToken;
     LYLOGSET(LOG_INFO);
     LYLOGEINIT(USER_LOG_TAG);
+    data_waiting_status = 0;
+    data_invaild_error = 0;
+    data_timelimit = 0;
+    lynq_data_call_change_id = -1;
+
     result = lynq_socket_client_start();
     pthread_mutex_init(&g_lynq_data_sendto_mutex, NULL);
     if(result!=0)
@@ -950,6 +955,7 @@
     pthread_mutex_lock(&s_lynq_urc_vector_mutex);
     s_data_urc_wait_list.clear();
     pthread_mutex_unlock(&s_lynq_urc_vector_mutex);
+    LYINFLOG("[%s] end [%d]",__FUNCTION__,__LINE__);
     return 0;
 }
 int lynq_setup_data_call(int *handle)
@@ -1084,7 +1090,9 @@
     pthread_mutex_unlock(&g_lynq_data_sendto_mutex);
     JumpHeader(p,&resp_type,&request,&slot_id,&error);
     LYINFLOG("resp_type=%d,request=%d,slot_id=%d,error_code=%d",resp_type,request,slot_id,error);
+#ifndef MOBILETEK_TARGET_PLATFORM_T106
     cleanOnceApnTable(lynq_data_call_id);
+#endif
     printf_apn_table_debug(__FUNCTION__,__LINE__);
     return error;
 }
@@ -1108,12 +1116,12 @@
     int cid = -1;
     int active = -1;
     int utoken = -1;
-    char ifaceName[LYNQ_IFACE_NAME_MAX_LEN];
-    char type[LYNQ_TYPE_MAX_LEN];
-    char addresses[LYNQ_ADDRESSES_MAX_LEN];
-    char dnses[LYNQ_DNSES_MAX_LEN];
-    char gateways[LYNQ_GATEWAYS_MAX_LEN];
-    char pcscf[LYNQ_PCSCF_MAX_LEN];
+    char ifaceName[LYNQ_IFACE_NAME_MAX_LEN] = {0};
+    char type[LYNQ_TYPE_MAX_LEN] = {0};
+    char addresses[LYNQ_ADDRESSES_MAX_LEN] = {0};
+    char dnses[LYNQ_DNSES_MAX_LEN] = {0};
+    char gateways[LYNQ_GATEWAYS_MAX_LEN] = {0};
+    char pcscf[LYNQ_PCSCF_MAX_LEN] = {0};
 
     char *tmp_msg = NULL;
     int len = 0;
@@ -1189,16 +1197,19 @@
                 return error;
             }
         }
-//version != 0 || slot < 0, the cid out of lynq_apn_table, need add a new item
-        p.readInt32(&active);
-
-        tmp_msg = strdupReadString(p);
-        len = strlen(tmp_msg);
-        if(len < LYNQ_TYPE_MAX_LEN-1)
+//the cid out of lynq_apn_table, need add a new item
+        if(version != 0)
         {
-            memcpy(type,tmp_msg,len+1);
+            p.readInt32(&active);
+
+            tmp_msg = strdupReadString(p);
+            len = strlen(tmp_msg);
+            if(len < LYNQ_TYPE_MAX_LEN-1)
+            {
+                memcpy(type,tmp_msg,len+1);
+            }
+            free(tmp_msg);
         }
-        free(tmp_msg);
         tmp_msg = strdupReadString(p);
         len = strlen(tmp_msg);
         if(len < LYNQ_IFACE_NAME_MAX_LEN-1)
@@ -1224,6 +1235,7 @@
         *handle = lynq_data_call_id;
         lynq_apn_table[lynq_data_call_id].cid = cid;
         memcpy(lynq_apn_table[lynq_data_call_id].ifaceName, ifaceName, strlen(ifaceName) + 1);
+        memcpy(lynq_apn_table[lynq_data_call_id].apn, apn, strlen(apn) + 1);
         memcpy(lynq_apn_table[lynq_data_call_id].apnType, apnType, strlen(apnType) + 1);
         lynq_apn_table[lynq_data_call_id].hasUsed = 1;
         printf_apn_table();
@@ -1542,15 +1554,20 @@
 {
     if (data_waiting_status == 1)
     {
-        LYDBGLOG("some thread is waiting");
+        LYINFLOG("some thread is waiting");
         return -3;
     }
-    LYDBGLOG("is empty :%d",s_data_urc_wait_list.empty());
+    LYINFLOG("is empty :%d",s_data_urc_wait_list.empty());
     if (s_data_urc_wait_list.empty())
     {
-        LYDBGLOG("start wait");
+        LYINFLOG("start wait");
         data_waiting_status = 1;
         waitPdnChange();
+        if(g_lynq_data_init_flag == 0)
+        {
+            LYINFLOG("has deinit, need exit");
+            return -1;
+        }
     }
     data_waiting_status = 0;
     for(std::vector<int>::iterator i = s_data_urc_wait_list.begin(); i != s_data_urc_wait_list.end(); i++)
@@ -1978,3 +1995,10 @@
     return 0;
 }
 /*Typethree add for T800 platform 2022/04/21 end*/
+void lynq_release_wait_data_call()
+{
+    pthread_cond_signal(&s_lynq_urc_vector_cond);
+}
+
+DEFINE_LYNQ_LIB_LOG(LYNQ_DATA)
+
diff --git a/cap/zx297520v3/src/lynq/lib/liblynq-data/lynq_data_urc.cpp b/cap/zx297520v3/src/lynq/lib/liblynq-data/lynq_data_urc.cpp
index 3935fbd..0e68559 100755
--- a/cap/zx297520v3/src/lynq/lib/liblynq-data/lynq_data_urc.cpp
+++ b/cap/zx297520v3/src/lynq/lib/liblynq-data/lynq_data_urc.cpp
@@ -149,6 +149,12 @@
         while(s_urc_recv_parcel_list.empty())
         {
             pthread_cond_wait(&s_lynq_urc_process_cond,&s_lynq_urc_process_mutex);
+            if(data_urc_process_status == 0)
+            {
+                pthread_mutex_unlock(&s_lynq_urc_process_mutex);
+                LYINFLOG("thread_urc_process ready to exit");
+                return NULL;
+            }
         }
         iter=s_urc_recv_parcel_list.begin();
         urc_p = (*iter);
@@ -253,19 +259,13 @@
     pthread_mutex_lock(&s_lynq_urc_mutex);
 
     data_urc_process_status = 0;
-    if (data_urc_process_tid != -1)
-    {
-        ret = pthread_cancel(data_urc_process_tid);
-        LYDBGLOG("pthread cancel ret = %d",ret);
-    }
+
     pthread_mutex_unlock(&s_lynq_urc_mutex);
     pthread_mutex_unlock(&s_lynq_urc_process_mutex);
-
+    
     if (data_urc_process_tid != -1)
     {
-        ret = pthread_join(data_urc_process_tid,NULL);
-        LYDBGLOG("pthread join ret = %d",ret);
-        data_urc_process_tid = -1;
+        pthread_cond_broadcast(&s_lynq_urc_process_cond);
     }
 }
 
@@ -332,14 +332,14 @@
     lynq_socket_recv_stop();
     lynq_urc_recv_thread_stop();
     lynq_urc_process_thread_stop();
-
     pthread_mutex_lock(&s_lynq_urc_process_mutex);
+    //LYINFLOG("after pthread_mutex_lock(&s_lynq_urc_process_mute)\n");
     std::list<Parcel*>::iterator iter;
     for (iter=s_urc_recv_parcel_list.begin();iter!=s_urc_recv_parcel_list.end();++iter)
     {
         delete(*iter);
     }
-    s_urc_recv_parcel_list.clear(); 
+    s_urc_recv_parcel_list.clear();
     pthread_mutex_unlock(&s_lynq_urc_process_mutex);
 
     ril_deinit_mem();
diff --git a/cap/zx297520v3/src/lynq/lib/liblynq-log/include/liblog/liblog.h b/cap/zx297520v3/src/lynq/lib/liblynq-log/include/liblog/liblog.h
index 03b183a..57c9c98 100755
--- a/cap/zx297520v3/src/lynq/lib/liblynq-log/include/liblog/liblog.h
+++ b/cap/zx297520v3/src/lynq/lib/liblynq-log/include/liblog/liblog.h
@@ -5,14 +5,6 @@
 extern "C" {
 #endif
 
-#define LOG_ENABLE  1      
-
-//#if LOG_ENABLE
-#if LOG_ENABLE
-
-#define ENABLE(X)               (1<<(X))
-#define LOG_LEVEL_ENABLE      	  ENABLE(LOG_VERBOSE)
-
 typedef enum
 {
     LOG_VERBOSE = 0,   
@@ -23,15 +15,9 @@
     LOG_LEVEL_MAX
 }log_level_enum;
 
-const static char * LogLevelNameInfoTable[LOG_LEVEL_MAX] =
-{
-    "[VERBOSE]","[ERROR]","[WARNING]","[INFO]","[DEBUG]" //lt add @2021.7.22 for []
-};
-#endif //LOG_ENABLE
-
 void lynq_log_global_output(log_level_enum Level,const char *format,...);
-void lynq_log_configuration_set(char *log_name,char log_data_arr);
-void lynq_log_configuration_init(char *log_name);
+void lynq_log_configuration_init(const char *log_name);
+const char* lynq_read_log_version();
 #ifdef __cplusplus
 }
 #endif
diff --git a/cap/zx297520v3/src/lynq/lib/liblynq-log/include/liblog/lynq_deflog.h b/cap/zx297520v3/src/lynq/lib/liblynq-log/include/liblog/lynq_deflog.h
index 667ae1a..3fecfc7 100755
--- a/cap/zx297520v3/src/lynq/lib/liblynq-log/include/liblog/lynq_deflog.h
+++ b/cap/zx297520v3/src/lynq/lib/liblynq-log/include/liblog/lynq_deflog.h
@@ -6,36 +6,68 @@
 extern "C" {

 #endif

 

-void lynq_log_configuration_init(char *log_name);

-void lynq_log_configuration_set(char *log_name,char log_data_arr);

-void lynq_log_verbose(const char *format,...);

-void lynq_log_error(const char *format,...);

-void lynq_log_warning(const char *format,...);

-void lynq_log_info(const char *format,...);

-void lynq_log_debug(const char *format,...);

+typedef void (*LYNQ_WRITE_LOG_PTR)(log_level_enum level, const char *format, ...);

+extern LYNQ_WRITE_LOG_PTR lynq_write_log;

+LYNQ_WRITE_LOG_PTR lynq_log_function_init(const char *log_name);

 

+int lynq_syslog_set_file_size(int value);

+int lynq_syslog_get_file_size(void);

+int lynq_syslog_set_file_rotate(int value);

+int lynq_syslog_get_file_rotate(void);

 

-#ifndef USER_LOG_TAG 

-#define LYVERBLOG(X...)  lynq_log_global_output(LOG_VERBOSE,X)

-#define LYERRLOG(X...)  lynq_log_global_output(LOG_ERROR,X)

-#define LYWARNLOG(X...)  lynq_log_global_output(LOG_WARNING,X)

-#define LYINFLOG(X...)  lynq_log_global_output(LOG_INFO,X)

-#define LYDBGLOG(X...)  lynq_log_global_output(LOG_DEBUG,X)

-#define LYLOGSET(a) lynq_log_configuration_set(USER_LOG_TAG,a)

-#define LYLOGEINIT(Y) lynq_log_configuration_init(Y)

-#else

-#define LYVERBLOG(X...)  

-#define LYERRLOG(X...)  

-#define LYWARNLOG(X...)  

-#define LYINFLOG(X...)  

-#define LYDBGLOG(X...)  

-#define LYLOGSET(a)

-#define LYLOGEINIT(Y)

-#endif

-

-char* lynq_read_log_version();

 #ifdef __cplusplus

 }

 #endif

 

-#endif  //__LYNQ_DEFLOG_H__
\ No newline at end of file
+#define lynq_log_verbose(...)  do { lynq_write_log(LOG_VERBOSE,__VA_ARGS__);} while (0)

+#define lynq_log_error(...)  do {lynq_write_log(LOG_ERROR,__VA_ARGS__);} while (0)

+#define lynq_log_warning(...)  do {lynq_write_log(LOG_WARNING,__VA_ARGS__);} while (0)

+#define lynq_log_info(...)  do {lynq_write_log(LOG_INFO,__VA_ARGS__);} while (0)

+#define lynq_log_debug(...)  do {lynq_write_log(LOG_DEBUG,__VA_ARGS__);} while (0)

+

+#define LYVERBLOG(...)  do {lynq_write_log(LOG_VERBOSE,__VA_ARGS__);} while (0)

+#define LYERRLOG(...)  do {lynq_write_log(LOG_ERROR,__VA_ARGS__);} while (0)

+#define LYWARNLOG(...)  do {lynq_write_log(LOG_WARNING,__VA_ARGS__);} while(0)

+#define LYINFLOG(...)  do {lynq_write_log(LOG_INFO,__VA_ARGS__);} while (0)

+#define LYDBGLOG(...)  do {lynq_write_log(LOG_DEBUG,__VA_ARGS__);} while (0)

+

+// just for comcompatibility, do nothing

+#define LYLOGSET(a) do{;}while(0)

+#define LYLOGEINIT(Y) do{;}while(0)

+

+#ifndef ALOGV

+#define ALOGV(...) do {lynq_write_log(LOG_VERBOSE,__VA_ARGS__);} while (0)

+#endif

+

+#ifndef ALOGE

+#define ALOGE(...) do {lynq_write_log(LOG_ERROR,__VA_ARGS__);} while (0)

+#endif

+

+#ifndef ALOGW

+#define ALOGW(...) do {lynq_write_log(LOG_WARNING,__VA_ARGS__);} while (0)

+#endif

+

+#ifndef ALOGI

+#define ALOGI(...) do {lynq_write_log(LOG_INFO,__VA_ARGS__);} while (0)

+#endif

+

+#ifndef ALOGD

+#define ALOGD(...) do {lynq_write_log(LOG_DEBUG,__VA_ARGS__);} while (0)

+#endif

+

+#define DEFINE_LYNQ_LIB_LOG(tag) \

+    LYNQ_WRITE_LOG_PTR __attribute__ ((visibility ("hidden"))) lynq_write_log = NULL; \

+    void __attribute__((constructor)) tag##_init() \

+    { \

+        lynq_write_log = lynq_log_function_init(#tag); \

+    }

+

+#define DEFINE_LYNQ_EXE_LOG(tag) \

+    LYNQ_WRITE_LOG_PTR __attribute__ ((visibility ("hidden"))) lynq_write_log = NULL; \

+    void __attribute__((constructor)) tag##_init() \

+    { \

+        lynq_write_log = lynq_log_function_init(#tag); \

+        lynq_log_configuration_init(#tag); \

+    }

+

+#endif  //__LYNQ_DEFLOG_H__

diff --git a/cap/zx297520v3/src/lynq/lib/liblynq-log/log-riltel/log.c b/cap/zx297520v3/src/lynq/lib/liblynq-log/log-riltel/log.c
deleted file mode 100755
index c59374b..0000000
--- a/cap/zx297520v3/src/lynq/lib/liblynq-log/log-riltel/log.c
+++ /dev/null
@@ -1,367 +0,0 @@
-#include "liblog.h"
-#include <stdarg.h>
-#include <stdio.h>
-#include <stdlib.h> 
-#include <unistd.h>
-#include <string.h>
-#include <log/log.h>
-#include <include/lynq_uci.h>
-
-#define LOG_NAME_LEN 128
-#define LOG_OUT_LEN 2*1024+100 //lt add @2021.9.22 for write outbuf define len 
-#define LOG_LEN 2*1024 //lt add @2021.9.22 for write buf define len 
-#define LOG_UCI_MODULE "lynq_log"
-#define LOG_UCI_FILE "lynq_uci"
-static unsigned int log_level = 0; 
-static unsigned char log_name_arr[LOG_NAME_LEN] = {0};
-
-int lynq_log_set_value(char *key, char *value);
-int lynq_log_get_value(char *key, char *tmp);
-
-void lynq_log_global_output(log_level_enum Level,const char *format,...)
-{
-#if LOG_ENABLE
-
-    char out_buf[LOG_OUT_LEN] = {0};    
-    char buf[LOG_LEN] = {0};
-	
-    if(Level >=  LOG_LEVEL_MAX)
-        return;
-    if((log_level >> Level)&0x00000001)
-    {
-        va_list args;
-        //TagName
-        if(log_name_arr[0]  > 0)
-        {
-		printf("[%s]",log_name_arr);
-	 }
-        
-        //LevelName
-        printf("%s:",LogLevelNameInfoTable[Level]); //lt dele @2021.7.22 for []
-
-        va_start(args,format);
-        vprintf(format,args);
-        vsnprintf(buf, sizeof(buf), format, args);  //lt add @2021.7.22 for write buf
-        va_end(args);
-        printf("\r\n");
-
-        sprintf(out_buf, "%s %s", LogLevelNameInfoTable[Level], buf);//lt add @2021.7.22 for write outbuf
-        switch(Level) //lt mod @2021.9.22 for matching MTK log level 
-        {
-            case LOG_VERBOSE:
-                __android_log_print(ANDROID_LOG_VERBOSE,log_name_arr, "%s",out_buf); //lt add @2021.9.22 for write syslog.log		
-                break;
-            case LOG_ERROR:
-                __android_log_print(ANDROID_LOG_ERROR,log_name_arr, "%s",out_buf); //lt add @2021.9.22 for write syslog.log		
-                break;
-            case LOG_WARNING:
-                __android_log_print(ANDROID_LOG_WARN,log_name_arr, "%s",out_buf); //lt add @2021.9.22 for write syslog.log		
-                break;		
-            case LOG_INFO:
-                __android_log_print(ANDROID_LOG_INFO,log_name_arr, "%s",out_buf); //lt add @2021.9.22 for write syslog.log		
-                break;
-            case LOG_DEBUG:
-                __android_log_print(ANDROID_LOG_DEBUG,log_name_arr, "%s",out_buf); //lt add @2021.7.22 for write syslog.log		
-                break;
-            default :
-                __android_log_print(ANDROID_LOG_DEBUG,log_name_arr, "Log Level is Error!!!!!!"); //lt add @2021.9.22 for write syslog.log		
-                break;
-        }
-	
-    }
-    return ;
-#endif //LOG_ENABLE
-}
-
-void lynq_log_configuration_set(char *log_name,char log_data_arr)
-{
-    char log_data_str[32] = {0};
-    if(log_name == NULL)
-    {
-        return ;
-    }
-    if(log_data_arr < LOG_LEVEL_MAX)
-    {
-        sprintf(log_data_str,"%d",log_data_arr);
-        if((strlen(log_name)) < LOG_NAME_LEN)
-        {
-            lynq_log_set_value(log_name, log_data_str);//lt mod @2021.8.3 for uci
-        }
-    }
-    lynq_log_configuration_init(log_name);  
-    return ;
-}
-
-void lynq_deal_with_level(unsigned int get_log_level)
-{
-    switch(get_log_level)
-    {
-        case LOG_DEBUG:
-            log_level |= ENABLE(LOG_DEBUG);
-        case LOG_INFO:
-            log_level |= ENABLE(LOG_INFO);
-        case LOG_WARNING:
-            log_level |= ENABLE(LOG_WARNING);
-        case LOG_ERROR:
-            log_level |= ENABLE(LOG_ERROR);
-        case LOG_VERBOSE:
-            log_level |= ENABLE(LOG_VERBOSE);
-            break;
-        default:
-            log_level |= ENABLE(LOG_VERBOSE);
-            break;
-    }
-    return ;
-}
-
-void lynq_log_configuration_init(char *log_name)
-{
-    char get_propty_log_data[32] ={0};
-    unsigned int get_log_level = 0;
-    if(log_name == NULL)
-    {
-        return ;
-    }
-    if((strlen(log_name)) < LOG_NAME_LEN)
-    {
-        strcpy(log_name_arr,log_name);
-        if(0 == lynq_log_get_value(log_name,get_propty_log_data))//lt mod @2021.8.3 for uci
-        {
-            get_log_level = atoi(get_propty_log_data);
-        }
-        else
-        {
-            lynq_log_configuration_set(log_name, get_log_level);//lt add @2021.09.06 for uci
-        }
-    }
-    lynq_deal_with_level(get_log_level);
-    return ;
-}
-
-//lt add @2021.8.3 for in encapsulating the UCI set function
-int lynq_log_set_value(char *key, char *value)
-{
-    return lynq_set_value(LOG_UCI_MODULE, key, value);
-}
-
-//lt add @2021.8.3 for in encapsulating the UCI get function
-int lynq_log_get_value(char *key, char *tmp)
-{
-	return lynq_get_value(LOG_UCI_FILE, LOG_UCI_MODULE, key, tmp);
-}
-
-//lt add @2022.1.5 for  add fota lib name.
-char* lynq_read_log_version()
-{
-	return "LOG-V1.0";
-}
-
-/**
- * @brief Verbose logs are printed and stored
- * 
- * @param log data
- * @return void 
- */
-void lynq_log_verbose(const char *format,...)
-{
-#if LOG_ENABLE
-
-    char out_buf[LOG_OUT_LEN] = {0};    
-    char buf[LOG_LEN] = {0};
-    log_level_enum lynq_level = LOG_VERBOSE;
-    
-    if(lynq_level >=  LOG_LEVEL_MAX)
-        return;
-    if((log_level >> lynq_level)&0x00000001)
-    {
-        va_list args;
-        //TagName
-        if(log_name_arr[0]  > 0)
-        {
-            printf("[%s]",log_name_arr);
-        }
-
-        //LevelName
-        printf("%s:",LogLevelNameInfoTable[lynq_level]); //lt dele @2021.7.22 for []
-
-        va_start(args,format);
-        vprintf(format,args);
-        vsnprintf(buf, sizeof(buf), format, args);  //lt add @2021.7.22 for write buf
-        va_end(args);
-        printf("\r\n");
-
-        sprintf(out_buf, "%s %s",LogLevelNameInfoTable[lynq_level], buf);//lt add @2021.7.22 for write outbuf
-        __android_log_print(ANDROID_LOG_VERBOSE,log_name_arr, "%s",out_buf); //lt add @2021.9.22 for write syslog.log		
-    }
-    return ;
-#endif //LOG_ENABLE
-}
-
-/**
- * @brief Error logs are printed and stored
- * 
- * @param log data
- * @return void 
- */
-void lynq_log_error(const char *format,...)
-{
-#if LOG_ENABLE
-
-    char out_buf[LOG_OUT_LEN] = {0};    
-    char buf[LOG_LEN] = {0};
-    log_level_enum lynq_level = LOG_ERROR;
-
-    if(lynq_level >=  LOG_LEVEL_MAX)
-        return;
-    if((log_level >> lynq_level)&0x00000001)
-    {
-        va_list args;
-        //TagName
-        if(log_name_arr[0]  > 0)
-        {
-            printf("[%s]",log_name_arr);
-        }
-
-        //LevelName
-        printf("%s:",LogLevelNameInfoTable[lynq_level]); //lt dele @2021.7.22 for []
-
-        va_start(args,format);
-        vprintf(format,args);
-        vsnprintf(buf, sizeof(buf), format, args);  //lt add @2021.7.22 for write buf
-        va_end(args);
-        printf("\r\n");
-
-        sprintf(out_buf, "%s %s",LogLevelNameInfoTable[lynq_level], buf);//lt add @2021.7.22 for write outbuf
-        __android_log_print(ANDROID_LOG_ERROR,log_name_arr, "%s",out_buf); //lt add @2021.9.22 for write syslog.log		
-    }
-    return ;
-#endif //LOG_ENABLE
-    return ;
-}
-
-/**
- * @brief Warning logs are printed and stored
- * 
- * @param log data
- * @return void 
- */
-void lynq_log_warning(const char *format,...)
-{
- #if LOG_ENABLE
-
-    char out_buf[LOG_OUT_LEN] = {0};    
-    char buf[LOG_LEN] = {0};
-    log_level_enum lynq_level = LOG_WARNING;
-
-    if(lynq_level >=  LOG_LEVEL_MAX)
-        return;
-    if((log_level >> lynq_level)&0x00000001)
-    {
-        va_list args;
-        //TagName
-        if(log_name_arr[0]  > 0)
-        {
-            printf("[%s]",log_name_arr);
-        }
-
-        //LevelName
-        printf("%s:",LogLevelNameInfoTable[lynq_level]); //lt dele @2021.7.22 for []
-
-        va_start(args,format);
-        vprintf(format,args);
-        vsnprintf(buf, sizeof(buf), format, args);  //lt add @2021.7.22 for write buf
-        va_end(args);
-        printf("\r\n");
-
-        sprintf(out_buf, "%s %s",LogLevelNameInfoTable[lynq_level], buf);//lt add @2021.7.22 for write outbuf
-        __android_log_print(ANDROID_LOG_WARN,log_name_arr, "%s",out_buf); //lt add @2021.9.22 for write syslog.log		
-    }
-    return ;
-#endif //LOG_ENABLE
-    return ;
-}
-
-/**
- * @brief Info logs are printed and stored
- * 
- * @param log data
- * @return void 
- */
-void lynq_log_info(const char *format,...)
-{
- #if LOG_ENABLE
-
-    char out_buf[LOG_OUT_LEN] = {0};    
-    char buf[LOG_LEN] = {0};
-    log_level_enum lynq_level = LOG_INFO;
-
-    if(lynq_level >=  LOG_LEVEL_MAX)
-        return;
-    if((log_level >> lynq_level)&0x00000001)
-    {	
-        va_list args;
-        //TagName
-        if(log_name_arr[0]  > 0)
-        {
-            printf("[%s]",log_name_arr);
-        }
-
-        //LevelName
-        printf("%s:",LogLevelNameInfoTable[lynq_level]); //lt dele @2021.7.22 for []
-
-        va_start(args,format);
-        vprintf(format,args);
-        vsnprintf(buf, sizeof(buf), format, args);  //lt add @2021.7.22 for write buf
-        va_end(args);
-        printf("\r\n");
-
-        sprintf(out_buf, "%s %s",LogLevelNameInfoTable[lynq_level], buf);//lt add @2021.7.22 for write outbuf
-        __android_log_print(ANDROID_LOG_INFO,log_name_arr, "%s",out_buf); //lt add @2021.9.22 for write syslog.log		
-    }
-    return ;
-#endif //LOG_ENABLE
-    return ;
-}
-
-/**
- * @brief debug logs are printed and stored
- * 
- * @param log data
- * @return void 
- */
-void lynq_log_debug(const char *format,...)
-{
-#if LOG_ENABLE
-
-    char out_buf[LOG_OUT_LEN] = {0};    
-    char buf[LOG_LEN] = {0};
-    log_level_enum lynq_level = LOG_DEBUG;
-
-    if(lynq_level >=  LOG_LEVEL_MAX)
-        return;
-    if((log_level >> lynq_level)&0x00000001)
-    {	
-        va_list args;
-        //TagName
-        if(log_name_arr[0]  > 0)
-        {
-            printf("[%s]",log_name_arr);
-        }
-
-        //LevelName
-        printf("%s:",LogLevelNameInfoTable[lynq_level]); //lt dele @2021.7.22 for []
-
-        va_start(args,format);
-        vprintf(format,args);
-        vsnprintf(buf, sizeof(buf), format, args);  //lt add @2021.7.22 for write buf
-        va_end(args);
-        printf("\r\n");
-
-        sprintf(out_buf, "%s %s",LogLevelNameInfoTable[lynq_level], buf);//lt add @2021.7.22 for write outbuf
-        __android_log_print(ANDROID_LOG_DEBUG,log_name_arr, "%s",out_buf); //lt add @2021.9.22 for write syslog.log		
-    }
-    return ;
-#endif //LOG_ENABLE
-    return ;
-}
-
diff --git a/cap/zx297520v3/src/lynq/lib/liblynq-log/log-riltel/log.cpp b/cap/zx297520v3/src/lynq/lib/liblynq-log/log-riltel/log.cpp
new file mode 100755
index 0000000..5feff58
--- /dev/null
+++ b/cap/zx297520v3/src/lynq/lib/liblynq-log/log-riltel/log.cpp
@@ -0,0 +1,497 @@
+#include "lynq_deflog.h"
+#include <stdarg.h>
+#include <stdio.h>
+#include <unistd.h>
+#include <string.h>
+#include <pthread.h>
+#include <log/log.h>
+#include <include/lynq_uci.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <signal.h>
+
+#ifdef MOBILETEK_TARGET_PLATFORM_T106
+extern "C" {
+#include <cfg_api.h>
+}
+#endif
+
+// log entry for each module
+struct log_module_entry
+{
+    LYNQ_WRITE_LOG_PTR log_ptr; // function ptr of write log
+    log_level_enum level; // current log level of module;
+    char module_name[32]; // log tag
+    log_level_enum special_level; // defined by uci of [main module tag]__[module_tag]
+    log_level_enum exe_level; // defined by uci of [main module tag]
+    log_level_enum lib_level; // defined by uci of [module tag]
+    log_level_enum global_level; // defined by uci of "global_level"
+
+    log_module_entry() // constuctor of struct
+    {
+        level = LOG_INFO; // default log level when no uci value
+        special_level = LOG_LEVEL_MAX;
+        lib_level = LOG_LEVEL_MAX;
+        exe_level = LOG_LEVEL_MAX;
+        global_level = LOG_LEVEL_MAX;
+    }
+
+    void calc_level() // to calc the current log level
+    {
+        level = LOG_INFO;
+        if (special_level != LOG_LEVEL_MAX) // [exe]_[lib] level as the first consideration
+        {
+            level = special_level;
+        }
+        else if (exe_level != LOG_LEVEL_MAX) // when [exe] level is set
+        {
+            level = exe_level;
+        }
+        else if (lib_level != LOG_LEVEL_MAX) // when [lib] level is set
+        {
+            level = lib_level;
+        }
+        else if (global_level != LOG_LEVEL_MAX) // global log level is set
+        {
+            level = global_level;
+        }
+    }
+};
+
+
+static pthread_mutex_t s_lynq_log_mutex = PTHREAD_MUTEX_INITIALIZER; //lock for module entry array
+const int entry_count = 32; // max count of modules
+static int s_curr_reg_count = 0; // current reg modules count
+static int s_log_module_array_init_flag = 0;
+static struct log_module_entry *s_log_module_entries[entry_count] = {0};
+static volatile int s_main_module_entry_index = -1;
+
+#define LOG_UCI_MODULE "lynq_log"
+#define LOG_UCI_FILE "lynq_uci"
+
+template <int n>
+void lynq_write_log_func(log_level_enum level, const char *format, ...)
+{
+    log_module_entry *log_entry;
+    va_list args;
+    va_start(args,format);
+
+    log_entry = s_log_module_entries[n];
+    if (log_entry == NULL || level > log_entry->level)
+        return;
+
+    switch(level)
+    {
+        case LOG_VERBOSE:
+            __android_log_vprint(ANDROID_LOG_VERBOSE,log_entry->module_name, format, args);
+            break;
+        case LOG_ERROR:
+            __android_log_vprint(ANDROID_LOG_ERROR,log_entry->module_name, format, args);
+            break;
+        case LOG_WARNING:
+            __android_log_vprint(ANDROID_LOG_WARN,log_entry->module_name, format, args);
+            break;
+        case LOG_INFO:
+            __android_log_vprint(ANDROID_LOG_INFO,log_entry->module_name, format, args);
+            break;
+        case LOG_DEBUG:
+            __android_log_vprint(ANDROID_LOG_DEBUG,log_entry->module_name, format, args);
+            break;
+        default :
+            __android_log_print(ANDROID_LOG_DEBUG,log_entry->module_name, "Log Level is Error!!!!!!");
+            break;
+    }
+    va_end(args);
+    //return 0;
+}
+
+template <int n>
+void reg_write_log_function()
+{
+    s_log_module_entries[n] = new struct log_module_entry;
+    s_log_module_entries[n]->log_ptr = &lynq_write_log_func<n>;
+    reg_write_log_function<n-1>();
+}
+
+template <>
+void reg_write_log_function<0>()
+{
+    s_log_module_entries[0] = new struct log_module_entry;
+    s_log_module_entries[0]->log_ptr = &lynq_write_log_func<0>;
+}
+
+const static char * LogLevelNameInfoTable[LOG_LEVEL_MAX] =
+{
+    "[VERBOSE]","[ERROR]","[WARNING]","[INFO]","[DEBUG]"
+};
+
+static log_level_enum convert_log_level_from_string(const char * level_string)
+{
+    for(int level=LOG_VERBOSE; level < LOG_LEVEL_MAX; level++)
+    {
+        if (strcmp(LogLevelNameInfoTable[level], level_string) == 0)
+        {
+            return (log_level_enum)level;
+        }
+    }
+    return LOG_LEVEL_MAX;
+}
+
+static log_level_enum get_uci_log_value(const char *key)
+{
+    char level_buf[64] = {0};
+    if (key == NULL || key[0] == '\0')
+    {
+        return LOG_LEVEL_MAX;
+    }
+
+    if (0 == lynq_get_value((char*)LOG_UCI_FILE, (char*)LOG_UCI_MODULE, (char*)key, level_buf))
+    {
+        return convert_log_level_from_string(level_buf);
+    }
+
+    return LOG_LEVEL_MAX;
+}
+
+static void get_module_log_level(struct log_module_entry *entry) // calc module log level from uci
+{
+    int main_module_flag = 0;
+    char uci_key[64] = {0};
+
+    pthread_mutex_lock(&s_lynq_log_mutex);
+    if (s_main_module_entry_index >= 0) //to check if this entry is main module if main module is set
+    {
+        strcpy(uci_key, s_log_module_entries[s_main_module_entry_index]->module_name);
+        if (s_log_module_entries[s_main_module_entry_index] == entry)
+        {
+            main_module_flag = 1;
+        }
+    }
+    pthread_mutex_unlock(&s_lynq_log_mutex);
+
+    entry->global_level = get_uci_log_value("global_level");
+    entry->exe_level = get_uci_log_value(uci_key);
+    if (main_module_flag == 1) // if this entry is main module no need to get the special level
+    {
+        entry->lib_level = LOG_LEVEL_MAX;
+        entry->special_level = LOG_LEVEL_MAX;
+    }
+    else
+    {
+        entry->lib_level = get_uci_log_value(entry->module_name);
+        strcat(uci_key, "__");
+        strcat(uci_key, entry->module_name);
+        entry->special_level = get_uci_log_value(uci_key);
+    }
+    entry->calc_level();
+}
+
+static LYNQ_WRITE_LOG_PTR inner_log_function_init(const char *log_name, int main_module_flag)
+{
+    struct log_module_entry *entry = NULL;
+    if(log_name == NULL)
+    {
+        log_name = "MAIN";
+    }
+    pthread_mutex_lock(&s_lynq_log_mutex);
+    if (s_log_module_array_init_flag == 0) // to init module array if is not init
+    {
+        reg_write_log_function<entry_count-1>();
+        s_log_module_array_init_flag = 1;
+    }
+
+    if (s_curr_reg_count < entry_count) // if module entry is not use out
+    {
+        entry = s_log_module_entries[s_curr_reg_count];
+        if (main_module_flag == 1) // set s_main_module_entry_index when main module call
+        {
+            s_main_module_entry_index = s_curr_reg_count;
+        }
+        s_curr_reg_count++;
+
+        entry->level = LOG_DEBUG;
+        strncpy(entry->module_name, log_name, sizeof(entry->module_name));
+    }
+    pthread_mutex_unlock(&s_lynq_log_mutex);
+
+    if (entry == NULL)
+    {
+        return NULL;
+    }
+
+    get_module_log_level(entry); // init the log level
+
+    return entry->log_ptr;
+}
+
+/**
+ * @brief lynq_log_function_init , this function called by lib
+ * @param log_name
+ * @return
+ */
+LYNQ_WRITE_LOG_PTR lynq_log_function_init(const char *log_name)
+{
+    return inner_log_function_init(log_name, 0);
+}
+
+/**
+ * @brief lynq_log_configuration_init , this function called by main module
+ * @param log_name
+ */
+void lynq_log_configuration_init(const char *log_name)
+{
+    log_level_enum exe_level;
+    char exe_key[64] = {0};
+    char special_key[64] = {0};
+
+    pthread_mutex_lock(&s_lynq_log_mutex);
+    for(int i=0; i < s_curr_reg_count; i++) // to check if log module is registered, bring it to main module
+    {
+        if (strcmp(log_name, s_log_module_entries[i]->module_name) == 0)
+        {
+            s_main_module_entry_index = i;
+            break;
+        }
+    }
+    pthread_mutex_unlock(&s_lynq_log_mutex);
+
+    if (s_main_module_entry_index == -1) // if not registered yet, init a main module entry
+    {
+        inner_log_function_init(log_name, 1);
+    }
+
+    pthread_mutex_lock(&s_lynq_log_mutex);
+    strcpy(exe_key, s_log_module_entries[s_main_module_entry_index]->module_name);
+    exe_level = get_uci_log_value(exe_key);
+    for(int i=0; i < s_curr_reg_count; i++) //recalc the module level when main module is set
+    {
+        s_log_module_entries[i]->exe_level = exe_level; // set the main module level
+        if (i == s_main_module_entry_index)
+            continue;
+
+        sprintf(special_key, "%s__%s", exe_key, s_log_module_entries[i]->module_name);
+        s_log_module_entries[i]->special_level = get_uci_log_value(special_key); // get the special level again
+        s_log_module_entries[i]->calc_level();
+    }
+    pthread_mutex_unlock(&s_lynq_log_mutex);
+}
+
+void lynq_log_global_output(log_level_enum level,const char *format,...)
+{
+    if (s_main_module_entry_index == -1)
+        return;
+
+    va_list args;
+    va_start(args,format);
+    s_log_module_entries[s_main_module_entry_index]->log_ptr(level, format, args);
+    va_end(args);
+}
+
+const char* lynq_read_log_version()
+{
+    return "LOG-V1.0";
+}
+
+#ifdef MOBILETEK_TARGET_PLATFORM_T106
+/**
+ * @brief Set the syslog file size
+ *
+ * @param syslog file size (M)
+ * @return 0:success other:fail
+ */
+int lynq_syslog_set_file_size(int value)
+{
+    char lynq_syslog_data[64] = {0};
+
+    if(value > 100)
+    {
+        value = 100;
+    }
+    snprintf(lynq_syslog_data,sizeof(lynq_syslog_data),"%d",value);//Converts bytes to M
+    if (0 != sc_cfg_set("syslog_file_size", lynq_syslog_data))
+    {
+        return -1;
+    }
+    return sc_cfg_save();
+}
+
+/**
+ * @brief Get the syslog file size
+ *
+ * @param log data
+ * @return 1-100:success -1:fial
+ */
+int lynq_syslog_get_file_size(void)
+{
+    int lynq_syslog_size = 0;
+    char lynq_syslog_data[64] = {0};
+    if(0 == sc_cfg_get("syslog_file_size", lynq_syslog_data, 64))
+    {
+        lynq_syslog_size = atoi(lynq_syslog_data);
+        return lynq_syslog_size;
+    }
+    return -1;
+}
+
+/**
+ * @brief Set the syslog file rotate
+ *
+ * @param syslog file rotate number
+ *
+ * @return 0:success other:fial
+ */
+int lynq_syslog_set_file_rotate(int value)
+{
+    char lynq_syslog_data[64] = {0};
+
+    if(value < 0)
+    {
+        value = 0;
+    }
+    else if(value > 99)
+    {
+        value = 99;
+    }
+
+    snprintf(lynq_syslog_data,sizeof(lynq_syslog_data),"%d",value);
+    if (0 != sc_cfg_set("syslog_file_num", lynq_syslog_data))
+    {
+        return -1;
+    }
+    return sc_cfg_save();
+}
+
+/**
+ * @brief Example Set the number of syslog files cut
+ *
+ * @param log data
+ * @return 0-99:success -1:fial
+ */
+int lynq_syslog_get_file_rotate(void)
+{
+    int lynq_syslog_rotate = 0;
+    char lynq_syslog_data[64] = {0};
+    if(0 == sc_cfg_get("syslog_file_num", lynq_syslog_data, 64))
+    {
+        lynq_syslog_rotate = atoi(lynq_syslog_data);
+        return lynq_syslog_rotate;
+    }
+    return -1;
+}
+
+#else
+/**
+ * @brief Set the syslog file size
+ *
+ * @param syslog file size (M)
+ * @return 0:success other:fial
+ */
+int lynq_syslog_set_file_size(int value)
+{
+    char lynq_syslog_data[64] = {0};
+
+    if(value <10)
+    {
+      value = 10;
+    }
+    else if(value > 1024)
+    {
+        value = 1024;
+    }
+    snprintf(lynq_syslog_data,sizeof(lynq_syslog_data),"%d",(value*1024*1024));//Converts bytes to M
+    return lynq_set_value(LOG_UCI_MODULE,"syslog_flie_size", lynq_syslog_data);
+}
+
+/**
+ * @brief Get the syslog file size
+ *
+ * @param log data
+ * @return 10-1024:success -1:fial
+ */
+int lynq_syslog_get_file_size(void)
+{
+    int lynq_syslog_size = 0;
+    char lynq_syslog_data[64] = {0};
+    if(0 == lynq_get_value(LOG_UCI_FILE, LOG_UCI_MODULE, "syslog_flie_size", lynq_syslog_data))
+    {
+        lynq_syslog_size = ((atoi(lynq_syslog_data)) / 1024) /1024;
+        return lynq_syslog_size;
+    }
+    return -1;
+}
+
+/**
+ * @brief Set the syslog file rotate
+ *
+ * @param syslog file rotate number
+ *
+ * @return 0:success other:fial
+ */
+int lynq_syslog_set_file_rotate(int value)
+{
+    char lynq_syslog_data[64] = {0};
+
+    if(value < 0)
+    {
+        value = 0;
+    }
+    else if(value > 100)
+    {
+        value = 100;
+    }
+
+    snprintf(lynq_syslog_data,sizeof(lynq_syslog_data),"%d",value);
+    return lynq_set_value(LOG_UCI_MODULE, "syslog_flie_rotate", lynq_syslog_data);
+}
+
+/**
+ * @brief Example Set the number of syslog files cut
+ *
+ * @param log data
+ * @return 10-1024:success -1:fial
+ */
+int lynq_syslog_get_file_rotate(void)
+{
+    int lynq_syslog_rotate = 0;
+    char lynq_syslog_data[64] = {0};
+    if(0 == lynq_get_value(LOG_UCI_FILE, LOG_UCI_MODULE, "syslog_flie_rotate", lynq_syslog_data))
+    {
+        lynq_syslog_rotate = atoi(lynq_syslog_data);
+        return lynq_syslog_rotate;
+    }
+    return -1;
+}
+#endif
+
+
+static void log_signal_handler(int signum) {
+    if (SIGUSR1 != signum)
+        return;
+    // 处理信号
+    for(int i=0; i < s_curr_reg_count; i++)
+    {
+        get_module_log_level(s_log_module_entries[i]);
+    }
+}
+
+void __attribute__((constructor)) lynq_log_init()
+{
+
+    pid_t pid;
+    char cmd_buf[64];
+    if (SIG_ERR != signal(SIGUSR1, log_signal_handler))
+    {
+        pid = getpid();
+        sprintf(cmd_buf, "mkdir -p /tmp/log_level/%d", pid);
+        system(cmd_buf);
+    }
+
+    pthread_mutex_lock(&s_lynq_log_mutex);
+    if (s_log_module_array_init_flag == 0)
+    {
+        reg_write_log_function<entry_count-1>();
+        s_log_module_array_init_flag = 1;
+    }
+    pthread_mutex_unlock(&s_lynq_log_mutex);
+}
+
diff --git a/cap/zx297520v3/src/lynq/lib/liblynq-log/log-riltel/makefile b/cap/zx297520v3/src/lynq/lib/liblynq-log/log-riltel/makefile
index ee97243..017fc6a 100755
--- a/cap/zx297520v3/src/lynq/lib/liblynq-log/log-riltel/makefile
+++ b/cap/zx297520v3/src/lynq/lib/liblynq-log/log-riltel/makefile
@@ -2,6 +2,7 @@
 RM = rm -f
 
 LOCAL_CFLAGS := -Wall \
+                -std=c++11 \
                 -g -Os \
                 -flto \
                 -fPIC \
@@ -17,21 +18,26 @@
 LOCAL_C_INCLUDES = \
   -I. \
   -I$(LOCAL_PATH)/../include/liblog \
-  -I$(ROOT)$(includedir) \
  -I$(ROOT)$(includedir)/logger \
 
 
 LOCAL_LIBS := \
     -L. \
     -ldl \
+	-lstdc++ \
     -llynq-uci \
     -llog \
 
-SOURCES = $(wildcard *.c wildcard *.h)
+ifeq ($(strip $(TARGET_PLATFORM)), T106)
+LOCAL_CFLAGS += -DMOBILETEK_TARGET_PLATFORM_T106
+LOCAL_LIBS += -lnvram
+endif
+
+SOURCES = $(wildcard *.cpp wildcard *.h)
 
 EXECUTABLE = liblynq-log.so
 
-OBJECTS=$(SOURCES:.c=.o)
+OBJECTS=$(SOURCES:.cpp=.o)
 
 
 .PHONY: build clean install pack_rootfs 
@@ -41,7 +47,10 @@
 	$(CXX) -shared -Wl,--no-undefined $(OBJECTS) $(LOCAL_LIBS) $(CFLAGS) $(LOCAL_CFLAGS) $(LOCAL_C_INCLUDES) -o $@
 
 %.o : %.c
-	$(CC) $(LOCAL_C_INCLUDES) $(CFLAGS) $(LOCAL_CFLAGS) $(LOCAL_LIBS) -o $@ -c $< 
+	$(CXX) $(LOCAL_C_INCLUDES) $(CFLAGS) $(LOCAL_CFLAGS) $(LOCAL_LIBS) -o $@ -c $< 
+
+%.o : %.cpp
+	$(CXX) $(LOCAL_C_INCLUDES) $(CFLAGS) $(LOCAL_CFLAGS) $(LOCAL_LIBS) -o $@ -c $< 
 
 build:  $(EXECUTABLE)
 	$(warning ########## build $(EXECUTABLE)  ##########)
diff --git a/cap/zx297520v3/src/lynq/lib/liblynq-network/lynq_network.cpp b/cap/zx297520v3/src/lynq/lib/liblynq-network/lynq_network.cpp
index bba641e..116503e 100755
--- a/cap/zx297520v3/src/lynq/lib/liblynq-network/lynq_network.cpp
+++ b/cap/zx297520v3/src/lynq/lib/liblynq-network/lynq_network.cpp
@@ -1549,5 +1549,8 @@
     return ret;      

  

 }

+

+DEFINE_LYNQ_LIB_LOG(LYNQ_NETWORK)

+

 #endif

 

diff --git a/cap/zx297520v3/src/lynq/lib/liblynq-qser-autosuspend/LICENSE b/cap/zx297520v3/src/lynq/lib/liblynq-qser-autosuspend/LICENSE
new file mode 100644
index 0000000..cb88533
--- /dev/null
+++ b/cap/zx297520v3/src/lynq/lib/liblynq-qser-autosuspend/LICENSE
@@ -0,0 +1,31 @@
+Copyright Statement:
+
+This software/firmware and related documentation ("Mobiletek Software") are
+protected under relevant copyright laws. The information contained herein is
+confidential and proprietary to Mobiletek Inc. and/or its licensors. Without
+the prior written permission of Mobiletek inc. and/or its licensors, any
+reproduction, modification, use or disclosure of Mobiletek Software, and
+information contained herein, in whole or in part, shall be strictly
+prohibited.
+
+Mobiletek Inc. (C) 2015. All rights reserved.
+
+BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("Mobiletek SOFTWARE")
+RECEIVED FROM Mobiletek AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
+ON AN "AS-IS" BASIS ONLY. Mobiletek EXPRESSLY DISCLAIMS ANY AND ALL
+WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
+WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+NONINFRINGEMENT. NEITHER DOES Mobiletek PROVIDE ANY WARRANTY WHATSOEVER WITH
+RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
+INCORPORATED IN, OR SUPPLIED WITH THE Mobiletek SOFTWARE, AND RECEIVER AGREES
+TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
+RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
+OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN Mobiletek
+SOFTWARE. Mobiletek SHALL ALSO NOT BE RESPONSIBLE FOR ANY Mobiletek SOFTWARE
+RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND Mobiletek'S
+ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE Mobiletek SOFTWARE
+RELEASED HEREUNDER WILL BE, AT Mobiletek'S OPTION, TO REVISE OR REPLACE THE
+Mobiletek SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
+CHARGE PAID BY RECEIVER TO Mobiletek FOR SUCH Mobiletek SOFTWARE AT ISSUE.
diff --git a/cap/zx297520v3/src/lynq/lib/liblynq-qser-autosuspend/include/lynq-qser-autosuspend.h b/cap/zx297520v3/src/lynq/lib/liblynq-qser-autosuspend/include/lynq-qser-autosuspend.h
new file mode 100644
index 0000000..54b663f
--- /dev/null
+++ b/cap/zx297520v3/src/lynq/lib/liblynq-qser-autosuspend/include/lynq-qser-autosuspend.h
@@ -0,0 +1,69 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdlib.h>
+#include <pthread.h>
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define MAX_LOCK_NUM 128
+
+#define E_READ -2
+#define E_WRITE -3
+#define E_INIT -4
+
+typedef enum 
+{
+    E_QL_LPM_FALLING = 0, /* Falling, Means wakeupin falling to wakeup the module, or wakeupout falling to wakeup mcu
+. */
+    E_QL_LPM_RISING = 1, /* Rising, Means  wakeupin rising to wakeup the module,  or wakeupout rising to wakeup  mcu. 
+*/
+}qser_lpm_edge_t;
+
+typedef int qser_lpm_pin_t;
+
+
+typedef struct{
+    qser_lpm_pin_t wakeupin_pin;
+    qser_lpm_edge_t wakeupin_edge;
+}qser_lpm_wakeupin_data_t;
+
+typedef struct{
+    qser_lpm_pin_t wakeupout_pin;
+    qser_lpm_edge_t wakeupout_edge;
+}qser_lpm_wakeupout_data_t;
+
+
+typedef void (*qser_lpm_Handler_t)
+(
+    qser_lpm_edge_t lpm_edge
+);
+
+typedef struct{
+    qser_lpm_wakeupin_data_t wakeupin;
+    qser_lpm_wakeupout_data_t wakeupout;
+}qser_pm_cfg_t;
+
+
+typedef struct
+{
+    char lock_name[MAX_LOCK_NUM][64];
+} LOCK_TABLE;
+
+int read_lock_table(void);
+int qser_lpm_init(qser_lpm_Handler_t qser_lpm_handler, qser_pm_cfg_t *qser_lpm_cfg);
+int qser_lpm_deinit(void);
+int qser_autosuspend_enable(char enable);
+int qser_wakelock_create(const char *name, size_t len);
+int qser_wakelock_lock(int fd);
+int qser_wakelock_unlock(int fd);
+int qser_wakelock_destroy(int fd);
+
+
+#ifdef __cplusplus
+}
+#endif
+
diff --git a/cap/zx297520v3/src/lynq/lib/liblynq-qser-autosuspend/lynq-qser-autosuspend.cpp b/cap/zx297520v3/src/lynq/lib/liblynq-qser-autosuspend/lynq-qser-autosuspend.cpp
new file mode 100755
index 0000000..c037505
--- /dev/null
+++ b/cap/zx297520v3/src/lynq/lib/liblynq-qser-autosuspend/lynq-qser-autosuspend.cpp
@@ -0,0 +1,339 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <errno.h>
+#include <pthread.h>
+
+#include<unistd.h>
+
+
+
+#include <lynq_autosuspend.h>
+#include "lynq-qser-autosuspend.h"
+#include "liblog/lynq_deflog.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+extern int lynq_autosleep_enable(void);
+extern int lynq_autosleep_disable(void);
+extern int release_wake_lock(char *name);
+extern int acquire_wake_lock(int lock, char *name);
+
+#define USER_LOG_TAG "LYNQ_QSER_AUTOSUSPEND"
+#define FILE_LOCK_TABLE "/tmp/.lock_table"
+
+
+LOCK_TABLE lock_status;
+
+
+int file_fd;
+int first_run = 0;
+
+
+int lock_table_init(void)
+{
+    int ret;
+    int err;
+
+    file_fd = open(FILE_LOCK_TABLE, O_RDWR| O_CREAT,0777);
+    if(file_fd < 0)
+    {
+        err = errno;
+        LYINFLOG("Error open lock_table file:%s\n", strerror(errno));
+        return -err;
+    }
+    memset(&lock_status, 0, sizeof(lock_status));
+    ret = write(file_fd, (char*)&lock_status, sizeof(lock_status));
+    if(ret <= 0)
+    {
+        LYINFLOG("write fail\n");
+        close(file_fd);
+        return -1;
+    }
+    sync();
+    close(file_fd);
+    return 0;
+}
+
+
+int read_lock_table(void)
+{
+    int err;
+    int ret;
+    int i;
+    LYLOGSET(LOG_INFO);
+    LYLOGEINIT(USER_LOG_TAG);
+
+    if(access(FILE_LOCK_TABLE,0) < 0)
+    {
+        ret = lock_table_init();
+        if(ret < 0)
+        {
+            return -2;
+        }
+    }
+
+    file_fd = open(FILE_LOCK_TABLE,O_RDWR);
+    if(file_fd < 0)
+    {
+        err = errno;
+        LYINFLOG("Error open lock_table file:%s\n", strerror(errno));
+        return -2;
+    }
+
+    memset(&lock_status, 0, sizeof(lock_status));
+    lseek(file_fd,0,SEEK_SET);
+    ret = read(file_fd,(unsigned char *)&lock_status,sizeof(lock_status));
+    LYINFLOG("read ret=%d\n", ret);
+    if(ret <= 0)
+    {
+        close(file_fd);
+        return -2;
+    }
+
+    for(i=0;i<MAX_LOCK_NUM;i++)
+    {
+        if(strlen(lock_status.lock_name[i]) != 0)
+        {
+            LYINFLOG("fd: %d lock_name:%s strlen:%d\n", i, lock_status.lock_name[i], strlen(lock_status.lock_name[i]));
+        }
+    }
+
+    close(file_fd);
+    return 0;
+}
+
+
+int save_lock_table(void)
+{
+    int err;
+    int ret;
+    file_fd = open(FILE_LOCK_TABLE,O_RDWR);
+    if(file_fd < 0)
+    {
+        err = errno;
+        LYINFLOG("Error open lock_table file:%s\n", strerror(errno));
+        return -3;
+    }
+    LYINFLOG("write lock_name[0]: %s\n", lock_status.lock_name[0]);
+    ret = write(file_fd, (unsigned char *)&lock_status, sizeof(lock_status));
+    LYINFLOG("write ret=%d\n", ret);
+    if(ret <= 0)
+    {
+        LYINFLOG("write fail\n");
+        close(file_fd);
+        return -3;
+    }
+    sync();
+    close(file_fd);
+
+    return 0;
+}
+
+
+int check_lock(char *name)
+{
+    int j;
+    int num;
+    for(j=0;j<MAX_LOCK_NUM;j++)
+    {
+        if(strcmp(lock_status.lock_name[j], name) == 0)
+        {
+            num = j;
+            break;
+        }
+    }
+
+    if(j < MAX_LOCK_NUM)
+    {
+        return num;
+    }
+
+    return -1;
+}
+
+
+int add_lock(char *name)
+{
+    int ret;
+    int i = 0;
+    int num;
+    int check_flag;
+    
+    LYINFLOG("name:%s\n", name);
+    ret = read_lock_table();
+    LYINFLOG("read_lock_table ret = %d\n", ret);
+    if(ret <0)
+    {
+        return ret;
+    }
+
+    check_flag = check_lock(name);
+
+    if(check_flag < 0)
+    {
+        for(i=0;i<MAX_LOCK_NUM;i++)
+        {
+            if(strlen(lock_status.lock_name[i]) == 0)
+            {
+                strcpy(lock_status.lock_name[i], name);
+                LYINFLOG("lock_name[%d] %s\n", i, lock_status.lock_name[i]);
+                break;
+            }
+        }
+        if(i == MAX_LOCK_NUM)
+        {
+            return -1;
+        }
+        else
+        {
+            num = i;
+        }
+    }
+    else
+    {
+        num = check_flag;
+    }
+
+    LYINFLOG("num = %d\n", num);
+    ret = save_lock_table();
+    if(ret < 0)
+    {
+        return ret;
+    }
+    return num;
+}
+
+int delete_lock(int fd)
+{
+    int ret;
+    int i;
+    ret = read_lock_table();
+    memset(lock_status.lock_name[fd], 0, sizeof(lock_status.lock_name[fd]));
+    ret = save_lock_table();
+    return ret;
+}
+
+int qser_lpm_init(qser_lpm_Handler_t qser_lpm_handler, qser_pm_cfg_t *qser_lpm_cfg)
+{
+    int ret;
+    ret = system("uci set lynq_uci.lynq_autosuspend.init='1'");
+    system("uci commit");
+    if(ret != 0)
+    {
+        LYINFLOG("uci set fail");
+    }
+    ret = system("./etc/init.d/lynq-autosuspend.sh restart");
+    if(ret != 0)
+    {
+        LYINFLOG("restart service fail");
+    }
+    return ret;
+}
+
+
+int qser_lpm_deinit(void)
+{
+    int ret;
+    system("uci set lynq_uci.lynq_autosuspend.init='0'");
+    system("uci commit");
+    if(ret != 0)
+    {
+        LYINFLOG("uci set fail");
+    }
+    system("./etc/init.d/lynq-autosuspend.sh restarts");
+    if(ret != 0)
+    {
+        LYINFLOG("restart service fail");
+    }
+    return 0;
+}
+
+int qser_autosuspend_enable(char enable)
+{
+    int ret;
+    if(enable == '0')
+    {
+        ret = lynq_autosleep_disable();
+
+    }
+    else if(enable == '1')
+    {
+        ret = lynq_autosleep_enable();
+    }
+    else
+    {
+        ret = -1;
+
+    }
+    return ret;
+
+}
+
+int qser_wakelock_create(const char *name, size_t len)
+{
+    int ret;
+    if(name == NULL)
+    {
+        return -1;
+    }
+    LYINFLOG("%s\n", name);
+    ret = add_lock(name);
+    return ret;
+}
+
+int qser_wakelock_lock(int fd)
+{
+
+    int ret;
+    if(fd < 0 || fd >= MAX_LOCK_NUM)
+    {
+        return -4;
+    }
+    ret = read_lock_table();
+    ret = acquire_wake_lock( 0, lock_status.lock_name[fd]);
+    return ret;
+}
+
+int qser_wakelock_unlock(int fd)
+{
+    int ret;
+    if(fd < 0 || fd >= MAX_LOCK_NUM)
+    {
+        return -4;
+    }
+    ret = read_lock_table();
+    if(strlen(lock_status.lock_name[fd]) == 0)
+    {
+        LYINFLOG("%d is null\n", fd);
+        return -1;
+    }
+    ret = release_wake_lock(lock_status.lock_name[fd]);
+    return ret;
+}
+
+int qser_wakelock_destroy(int fd)
+{
+    int ret;
+    if(fd < 0 || fd >= MAX_LOCK_NUM)
+    {
+        return -4;
+    }
+    ret = delete_lock(fd);
+    return ret;
+}
+
+DEFINE_LYNQ_LIB_LOG(LYNQ_QSER_AUTOSUSPEND)
+
+#ifdef __cplusplus
+}
+#endif
+
+
+
diff --git a/cap/zx297520v3/src/lynq/lib/liblynq-qser-autosuspend/makefile b/cap/zx297520v3/src/lynq/lib/liblynq-qser-autosuspend/makefile
new file mode 100644
index 0000000..510b40e
--- /dev/null
+++ b/cap/zx297520v3/src/lynq/lib/liblynq-qser-autosuspend/makefile
@@ -0,0 +1,67 @@
+SHELL = /bin/sh
+RM = rm -f
+
+LOCAL_CFLAGS := -Wall \
+                -std=gnu++14 \
+                -g -Os \
+                -flto \
+                -fPIC \
+                -fpermissive \
+
+
+
+$(warning ################# lynq qser autosuspend API ROOT: $(ROOT),includedir:$(includedir))
+LOCAL_PATH   = .
+
+LOCAL_C_INCLUDES = \
+  -I. \
+  -I$(LOCAL_PATH)/include/ \
+  -I$(LOCAL_PATH)/ \
+  -I$(ROOT)$(includedir)/logger \
+  -I$(ROOT)$(includedir)/liblog \
+  -I$(ROOT)$(includedir)/libauto/ \
+
+  
+
+LOCAL_LIBS := \
+    -L. \
+    -lstdc++ \
+    -lcutils \
+    -lutils \
+    -lpthread \
+    -llynq-autosuspend \
+    -llynq-log \
+
+
+SOURCES = $(wildcard *.cpp)
+
+EXECUTABLE = liblynq-qser-autosuspend.so
+
+OBJECTS=$(SOURCES:.cpp=.o)
+
+
+.PHONY: build clean install pack_rootfs 
+all: build
+$(EXECUTABLE): $(OBJECTS)
+	$(CXX) -shared -Wl,--no-undefined $(OBJECTS) $(LOCAL_LIBS) $(LOCAL_CFLAGS) $(LOCAL_C_INCLUDES) -o $@
+
+%.o : %.cpp
+	$(CXX) $(LOCAL_C_INCLUDES) $(LOCAL_CFLAGS) $(LOCAL_LIBS) -o $@ -c $<
+
+build:  $(EXECUTABLE)
+	$(warning ########## build $(EXECUTABLE)  ##########)
+install:
+	mkdir -p $(ROOT)$(base_libdir)/
+	install $(EXECUTABLE) $(ROOT)$(base_libdir)/
+	mkdir -p $(ROOT)$(includedir)/$(NAME)/sdk
+pack_rootfs:
+	mkdir -p $(PACK_INITRAMFS_TO)$(base_libdir)/
+	cp -af $(EXECUTABLE) $(PACK_INITRAMFS_TO)$(base_libdir)/
+	$(CROSS)strip $(PACK_INITRAMFS_TO)$(base_libdir)/$(EXECUTABLE)
+	mkdir -p $(PACK_TO)$(base_libdir)/
+	cp -af $(EXECUTABLE) $(PACK_TO)$(base_libdir)/
+	$(CROSS)strip $(PACK_TO)$(base_libdir)/$(EXECUTABLE)
+.PHONY: clean
+clean:
+	$(RM) $(OBJECTS) $(EXECUTABLE)
+	-find . -name "*.o" -delete
diff --git a/cap/zx297520v3/src/lynq/lib/liblynq-qser-data/lynq-qser-data.cpp b/cap/zx297520v3/src/lynq/lib/liblynq-qser-data/lynq-qser-data.cpp
index f017ef6..6a79c6c 100755
--- a/cap/zx297520v3/src/lynq/lib/liblynq-qser-data/lynq-qser-data.cpp
+++ b/cap/zx297520v3/src/lynq/lib/liblynq-qser-data/lynq-qser-data.cpp
@@ -31,28 +31,188 @@
 
 void lynq_ipv4_aton_urc(lynq_data_call_response_v11_t *libdata,qser_data_call_state_s *data_res)
 {
+#ifdef MOBILETEK_TARGET_PLATFORM_T106
+    char *tmp_char = NULL;
+    char *addresses = NULL;
+    char *dnses = NULL;
+    const char addresses_separator[2] = "/";
+    const char dnses_separator[2] = " ";
+    
+    addresses = libdata->addresses;
+    dnses = libdata->dnses;
+    //get addresses
+    tmp_char = strsep(&addresses, addresses_separator);
+    if(tmp_char != NULL)
+    {
+        LYINFLOG("ipv4 addresses = %s", tmp_char);
+        inet_aton(tmp_char,&(data_res->v4.ip));
+    }
+
+    //get dnses
+    tmp_char = strsep(&dnses, dnses_separator);
+    if(tmp_char != NULL)
+    {
+        LYINFLOG("ipv4 pri_dns = %s", tmp_char);
+        inet_aton(tmp_char,&(data_res->v4.pri_dns));
+    }
+    tmp_char = strsep(&dnses, dnses_separator);
+    if(tmp_char != NULL)
+    {
+        LYINFLOG("ipv4 sec_dns = %s", tmp_char);
+        inet_aton(tmp_char, &(data_res->v4.sec_dns));
+    }
+    //get gateway
+    inet_pton(AF_INET6,libdata->gateways,&(data_res->v6.gateway));
+
+#else
     inet_aton(libdata->addresses,&(data_res->v4.ip));
     inet_aton(libdata->gateways,&(data_res->v4.gateway));
     inet_aton(libdata->dnses,&(data_res->v4.pri_dns));
     inet_aton(libdata->dnses,&(data_res->v4.sec_dns));
+#endif
     return ;
 }
 
 void lynq_ipv6_inet_pton_urc(lynq_data_call_response_v11_t *libdata,qser_data_call_state_s *data_res)
 {
+#ifdef MOBILETEK_TARGET_PLATFORM_T106
+    char *tmp_char = NULL;
+    char *addresses = NULL;
+    char *dnses = NULL;
+    const char addresses_separator[2] = "/";
+    const char dnses_separator[2] = " ";
+
+    addresses = libdata->addresses;
+    dnses = libdata->dnses;
+    //get addresses
+    tmp_char = strsep(&addresses, addresses_separator);
+    if(tmp_char != NULL)
+    {
+        LYINFLOG("ipv6 addresses = %s", tmp_char);
+        inet_pton(AF_INET6, tmp_char, &(data_res->v6.ip));
+    }
+    //get dnses
+    tmp_char = strsep(&dnses, dnses_separator);
+    if(tmp_char != NULL)
+    {
+        LYINFLOG("ipv6 pri_dns = %s", tmp_char);
+        inet_pton(AF_INET6, tmp_char, &(data_res->v6.pri_dns));
+    }
+    tmp_char = strsep(&dnses, dnses_separator);
+    if(tmp_char != NULL)
+    {
+        LYINFLOG("ipv6 sec_dns = %s", tmp_char);
+        inet_pton(AF_INET6, tmp_char, &(data_res->v6.sec_dns));
+    }
+    inet_pton(AF_INET6,libdata->gateways,&(data_res->v6.gateway));
+#else
     inet_pton(AF_INET6,libdata->addresses,&(data_res->v6.ip));
     inet_pton(AF_INET6,libdata->gateways,&(data_res->v6.gateway));
     inet_pton(AF_INET6,libdata->dnses,&(data_res->v6.pri_dns));
     inet_pton(AF_INET6,libdata->dnses,&(data_res->v6.sec_dns));
+#endif
+
+    return ;
+}
+
+void lynq_ipv4v6_inet_pton_urc(lynq_data_call_response_v11_t *libdata,qser_data_call_state_s *data_res)
+{
+    char *tmp_char = NULL;
+    char *addresses = NULL;
+    char *dnses = NULL;
+    const char addresses_separator[2] = "/";
+    const char dnses_separator[2] = " ";
+
+    addresses = libdata->addresses;
+    dnses = libdata->dnses;
+    //get addresses
+    tmp_char = strsep(&addresses, addresses_separator);
+    if(tmp_char != NULL)
+    {
+        LYINFLOG("ipv4 addresses = %s", tmp_char);
+        inet_aton(tmp_char,&(data_res->v4.ip));
+    }
+    tmp_char = strsep(&addresses, addresses_separator);
+    if(tmp_char != NULL)
+    {
+        LYINFLOG("ipv6 addresses = %s", tmp_char);
+        inet_pton(AF_INET6, tmp_char, &(data_res->v6.ip));
+    }
+    //get dnses
+    tmp_char = strsep(&dnses, dnses_separator);
+    if(tmp_char != NULL)
+    {
+        LYINFLOG("ipv4 pri_dns = %s", tmp_char);
+        inet_aton(tmp_char,&(data_res->v4.pri_dns));
+    }
+    tmp_char = strsep(&dnses, dnses_separator);
+    if(tmp_char != NULL)
+    {
+        LYINFLOG("ipv4 sec_dns = %s", tmp_char);
+        inet_aton(tmp_char, &(data_res->v4.sec_dns));
+    }
+    tmp_char = strsep(&dnses, dnses_separator);
+    if(tmp_char != NULL)
+    {
+        LYINFLOG("ipv6 pri_dns = %s", tmp_char);
+        inet_pton(AF_INET6, tmp_char, &(data_res->v6.pri_dns));
+    }
+    tmp_char = strsep(&dnses, dnses_separator);
+    if(tmp_char != NULL)
+    {
+        LYINFLOG("ipv6 sec_dns = %s", tmp_char);
+        inet_pton(AF_INET6, tmp_char, &(data_res->v6.sec_dns));
+    }
+    //get gateway
+    inet_pton(AF_INET6,libdata->gateways,&(data_res->v6.gateway));
+
     return ;
 }
 
 void lynq_ipv4_aton_getinfo(lynq_data_call_response_v11_t *libdata,qser_data_call_info_s *data_res)
 {
+#ifdef MOBILETEK_TARGET_PLATFORM_T106
+    char *tmp_char = NULL;
+    char *addresses = NULL;
+    char *dnses = NULL;
+    const char addresses_separator[2] = "/";
+    const char dnses_separator[2] = " ";
+    
+    addresses = libdata->addresses;
+    dnses = libdata->dnses;
+    //get addresses
+    tmp_char = strsep(&addresses, addresses_separator);
+    if(tmp_char != NULL)
+    {
+        LYINFLOG("ipv4 addresses = %s", tmp_char);
+        inet_aton(tmp_char,&(data_res->v4.addr.ip));
+    }
+    //get dnses
+    tmp_char = strsep(&dnses, dnses_separator);
+    if(tmp_char != NULL)
+    {
+        LYINFLOG("ipv4 pri_dns = %s", tmp_char);
+        inet_aton(tmp_char,&(data_res->v4.addr.pri_dns));
+    }
+    tmp_char = strsep(&dnses, dnses_separator);
+    if(tmp_char != NULL)
+    {
+        LYINFLOG("ipv4 sec_dns = %s", tmp_char);
+        inet_aton(tmp_char, &(data_res->v4.addr.sec_dns));
+    }
+    //get gateway
+    LYINFLOG("ipv4 gateways = %s", libdata->gateways);
+    inet_aton(libdata->gateways,&(data_res->v4.addr.gateway));
+
+    LYINFLOG("v4.ip=%s", inet_ntoa(data_res->v4.addr.ip));
+    LYINFLOG("v4.pri_dns=%s", inet_ntoa(data_res->v4.addr.pri_dns));
+    LYINFLOG("v4.sec_dns=%s", inet_ntoa(data_res->v4.addr.sec_dns));
+#else
     inet_aton(libdata->addresses,&(data_res->v4.addr.ip));
     inet_aton(libdata->gateways,&(data_res->v4.addr.gateway));
     inet_aton(libdata->dnses,&(data_res->v4.addr.pri_dns));
     inet_aton(libdata->dnses,&(data_res->v4.addr.sec_dns));
+#endif
     data_res->v4.stats.pkts_tx = 0;
     data_res->v4.stats.pkts_rx = 0;
     data_res->v4.stats.bytes_tx = 0;
@@ -64,10 +224,123 @@
 
 void lynq_ipv6_inet_pton_getinfo(lynq_data_call_response_v11_t *libdata,qser_data_call_info_s *data_res)
 {
+#ifdef MOBILETEK_TARGET_PLATFORM_T106
+    char *tmp_char = NULL;
+    char *addresses = NULL;
+    char *dnses = NULL;
+    const char addresses_separator[2] = "/";
+    const char dnses_separator[2] = " ";
+
+    addresses = libdata->addresses;
+    dnses = libdata->dnses;
+    //get addresses
+    tmp_char = strsep(&addresses, addresses_separator);
+    if(tmp_char != NULL)
+    {
+        LYINFLOG("ipv6 addresses = %s", tmp_char);
+        inet_pton(AF_INET6, tmp_char, &(data_res->v6.addr.ip));
+    }
+    //get dnses
+    tmp_char = strsep(&dnses, dnses_separator);
+    if(tmp_char != NULL)
+    {
+        LYINFLOG("ipv6 pri_dns = %s", tmp_char);
+        inet_pton(AF_INET6, tmp_char, &(data_res->v6.addr.pri_dns));
+    }
+    tmp_char = strsep(&dnses, dnses_separator);
+    if(tmp_char != NULL)
+    {
+        LYINFLOG("ipv6 sec_dns = %s", tmp_char);
+        inet_pton(AF_INET6, tmp_char, &(data_res->v6.addr.sec_dns));
+    }
+    inet_pton(AF_INET6,libdata->gateways,&(data_res->v6.addr.gateway));
+#else
     inet_pton(AF_INET6,libdata->addresses,&(data_res->v6.addr.ip));
     inet_pton(AF_INET6,libdata->gateways,&(data_res->v6.addr.gateway));
     inet_pton(AF_INET6,libdata->dnses,&(data_res->v6.addr.pri_dns));
     inet_pton(AF_INET6,libdata->dnses,&(data_res->v6.addr.sec_dns));
+#endif
+    data_res->v6.stats.pkts_tx = 0;
+    data_res->v6.stats.pkts_rx = 0;
+    data_res->v6.stats.bytes_tx = 0;
+    data_res->v6.stats.bytes_rx = 0;
+    data_res->v6.stats.pkts_dropped_tx = 0;
+    data_res->v6.stats.pkts_dropped_rx = 0;
+    return ;
+}
+void lynq_ipv4v6_inet_pton_getinfo(lynq_data_call_response_v11_t *libdata,qser_data_call_info_s *data_res)
+{
+    char *tmp_char = NULL;
+    char *addresses = NULL;
+    char *dnses = NULL;
+    const char addresses_separator[2] = "/";
+    const char dnses_separator[2] = " ";
+
+    char buf_ip[64] = {0};
+    char buf_gateway[64] = {0};
+    char buf_pri_dns[64] = {0};
+    char buf_sec_dns[64] = {0};
+
+    addresses = libdata->addresses;
+    dnses = libdata->dnses;
+    //get addresses
+    tmp_char = strsep(&addresses, addresses_separator);
+    if(tmp_char != NULL)
+    {
+        LYINFLOG("ipv4 addresses = %s", tmp_char);
+        inet_aton(tmp_char,&(data_res->v4.addr.ip));
+    }
+    tmp_char = strsep(&addresses, addresses_separator);
+    if(tmp_char != NULL)
+    {
+        LYINFLOG("ipv6 addresses = %s", tmp_char);
+        inet_pton(AF_INET6, tmp_char, &(data_res->v6.addr.ip));
+    }
+    //get dnses
+    tmp_char = strsep(&dnses, dnses_separator);
+    if(tmp_char != NULL)
+    {
+        LYINFLOG("ipv4 pri_dns = %s", tmp_char);
+        inet_aton(tmp_char,&(data_res->v4.addr.pri_dns));
+    }
+    tmp_char = strsep(&dnses, dnses_separator);
+    if(tmp_char != NULL)
+    {
+        LYINFLOG("ipv4 sec_dns = %s", tmp_char);
+        inet_aton(tmp_char, &(data_res->v4.addr.sec_dns));
+    }
+    tmp_char = strsep(&dnses, dnses_separator);
+    if(tmp_char != NULL)
+    {
+        LYINFLOG("ipv6 pri_dns = %s", tmp_char);
+        inet_pton(AF_INET6, tmp_char, &(data_res->v6.addr.pri_dns));
+    }
+    tmp_char = strsep(&dnses, dnses_separator);
+    if(tmp_char != NULL)
+    {
+        LYINFLOG("ipv6 sec_dns = %s", tmp_char);
+        inet_pton(AF_INET6, tmp_char, &(data_res->v6.addr.sec_dns));
+    }
+    //get gateway
+    inet_pton(AF_INET6,libdata->gateways,&(data_res->v6.addr.gateway));
+
+    LYINFLOG("v4.ip=%s", inet_ntoa(data_res->v4.addr.ip));
+    LYINFLOG("v4.pri_dns=%s", inet_ntoa(data_res->v4.addr.pri_dns));
+    LYINFLOG("v4.sec_dns=%s", inet_ntoa(data_res->v4.addr.sec_dns));
+
+    inet_ntop(AF_INET6, &(data_res->v6.addr.ip), buf_ip, sizeof(buf_ip));
+    inet_ntop(AF_INET6, &(data_res->v6.addr.gateway), buf_gateway, sizeof(buf_gateway));
+    inet_ntop(AF_INET6, &(data_res->v6.addr.pri_dns), buf_pri_dns, sizeof(buf_pri_dns));
+    inet_ntop(AF_INET6, &(data_res->v6.addr.sec_dns), buf_sec_dns, sizeof(buf_sec_dns));
+    LYINFLOG("v6.ip=%s, v6.gateway=%s, v6.pri_dns=%s, v6.sec_dns=%s\n"
+        , buf_ip, buf_gateway, buf_pri_dns, buf_sec_dns);
+    data_res->v4.stats.pkts_tx = 0;
+    data_res->v4.stats.pkts_rx = 0;
+    data_res->v4.stats.bytes_tx = 0;
+    data_res->v4.stats.bytes_rx = 0;
+    data_res->v4.stats.pkts_dropped_tx = 0;
+    data_res->v4.stats.pkts_dropped_rx = 0;
+
     data_res->v6.stats.pkts_tx = 0;
     data_res->v6.stats.pkts_rx = 0;
     data_res->v6.stats.bytes_tx = 0;
@@ -519,11 +792,22 @@
 void *thread_wait_cb_status(void)
 {
     int handle = -1;
+    int ret = 0;
     lynq_data_call_response_v11_t data_urc_info;
     qser_data_call_state_s data_cb_state;
     while (s_qser_data_cb_thread_status)
     {
-        lynq_wait_data_call_state_change(&handle);
+        ret = lynq_wait_data_call_state_change(&handle);
+        LYINFLOG("ret = %d, wait data call state change end!!!\n", ret);
+        if(s_qser_data_cb_thread_status == 0)
+        {
+            return NULL;
+        }
+        else if(ret < 0)
+        {
+            continue;
+        }
+
         lynq_get_data_call_list(&handle,&data_urc_info);
         /*compare paramter*/
         data_cb_state.profile_idx = (char)handle;
@@ -565,7 +849,11 @@
         }
         else if (data_cb_state.ip_family == QSER_DATA_CALL_TYPE_IPV4V6)
         {
+#ifdef MOBILETEK_TARGET_PLATFORM_T106
+            lynq_ipv4v6_inet_pton_urc(&data_urc_info,&data_cb_state);
+#else
             lynq_ipv6_inet_pton_urc(&data_urc_info,&data_cb_state);
+#endif
         }
         else
         {
@@ -596,15 +884,10 @@
 
 void qser_cb_pthread_cancel()
 {
-    int ret;
     s_qser_data_cb_thread_status = 0;
     if (s_cb_tid != -1)
     {
-        ret = pthread_cancel(s_cb_tid);
-        LYDBGLOG("pthread cancel ret = %d",ret);
-        ret = pthread_join(s_cb_tid,NULL);
-        LYDBGLOG("pthread join ret = %d",ret);
-        s_cb_tid = -1;
+        lynq_release_wait_data_call();
     }
     return;
 }
@@ -643,22 +926,26 @@
     }
 
     s_data_call_cb = evt_cb;
-    qser_cb_pthread_create();
+    
     ret = lynq_init_data(utoken);
     if (ret != RESULT_OK)
     {
-        qser_cb_pthread_cancel();
+        //qser_cb_pthread_cancel();
         s_data_call_cb = NULL;
         return RESULT_ERROR;
     }
+    qser_cb_pthread_create();
     return RESULT_OK;
 }
 
 void qser_data_call_destroy(void)
 {
-    qser_cb_pthread_cancel();
+    LYINFLOG("[%s] start [%d]",__FUNCTION__,__LINE__);
+    
     lynq_deinit_data();
+    qser_cb_pthread_cancel();
     s_data_call_cb = NULL;
+    LYINFLOG("[%s] end [%d]",__FUNCTION__,__LINE__);
     return ;
 }
 
@@ -719,14 +1006,14 @@
     {
         info->profile_idx = profile_idx;
         info->ip_family = ip_family;
-        if (strcmp(data_call_info.type,"IPV4"))
+        if (strncmp(data_call_info.type,"IPV4", strlen("IPV4") + 1) == 0)
         {
             strcpy(info->v4.name,data_call_info.ifname);
             datacall_ipv4_status_judge(data_call_info.status,info);
             LYINFLOG("[IPV4]addresses:%s,gateways:%s,dnses:%s",data_call_info.addresses,data_call_info.gateways,data_call_info.dnses);
             lynq_ipv4_aton_getinfo(&data_call_info,info);
         }
-        else if (strcmp(data_call_info.type,"IPV6"))
+        else if (strncmp(data_call_info.type,"IPV6", strlen("IPV6") + 1) == 0)
         {
             strcpy(info->v6.name,data_call_info.ifname);
 
@@ -734,16 +1021,23 @@
             LYINFLOG("[IPV6]addresses:%s,gateways:%s,dnses:%s",data_call_info.addresses,data_call_info.gateways,data_call_info.dnses);
             lynq_ipv6_inet_pton_getinfo(&data_call_info,info);
         }
-        else if (strcmp(data_call_info.type,"IPV4V6"))
+        else if (strncmp(data_call_info.type,"IPV4V6", strlen("IPV4V6") + 1) == 0)
         {
             strcpy(info->v4.name,data_call_info.ifname);
             datacall_ipv4_status_judge(data_call_info.status,info);
             LYINFLOG("[IPV4V6]addresses:%s,gateways:%s,dnses:%s",data_call_info.addresses,data_call_info.gateways,data_call_info.dnses);
+#ifndef MOBILETEK_TARGET_PLATFORM_T106
             lynq_ipv4_aton_getinfo(&data_call_info,info);
+#endif
             strcpy(info->v6.name,data_call_info.ifname);
             datacall_ipv6_status_judge(data_call_info.status,info);
             LYINFLOG("[IPV4V6]addresses:%s,gateways:%s,dnses:%s",data_call_info.addresses,data_call_info.gateways,data_call_info.dnses);
+#ifndef MOBILETEK_TARGET_PLATFORM_T106
             lynq_ipv6_inet_pton_getinfo(&data_call_info,info);
+#endif
+#ifdef MOBILETEK_TARGET_PLATFORM_T106
+            lynq_ipv4v6_inet_pton_getinfo(&data_call_info,info);
+#endif
         }
         else
         {
@@ -879,3 +1173,6 @@
     }
     return ret;
 }
+
+DEFINE_LYNQ_LIB_LOG(LYNQ_QSER_DATA)
+
diff --git a/cap/zx297520v3/src/lynq/lib/liblynq-qser-data/makefile b/cap/zx297520v3/src/lynq/lib/liblynq-qser-data/makefile
old mode 100644
new mode 100755
index c3bfba0..4b5eb82
--- a/cap/zx297520v3/src/lynq/lib/liblynq-qser-data/makefile
+++ b/cap/zx297520v3/src/lynq/lib/liblynq-qser-data/makefile
@@ -12,6 +12,9 @@
 LOCAL_CFLAGS += -DBINDER_IPC_32BIT=1 -DHAVE_ENDIAN_H -DHAVE_PTHREADS -DHAVE_SYS_UIO_H -DHAVE_POSIX_FILEMAP -DHAVE_STRLCPY -DHAVE_PRCTL -DHAVE_MEMSET16 -DHAVE_MEMSET32 -DANDROID_SMP=0
 endif
 
+ifeq ($(strip $(TARGET_PLATFORM)), T106)
+    LOCAL_CFLAGS += -DMOBILETEK_TARGET_PLATFORM_T106
+endif
 $(warning ################# lynq qser sms demo ROOT: $(ROOT),includedir:$(includedir))
 LOCAL_PATH   = .
 
diff --git a/cap/zx297520v3/src/lynq/lib/liblynq-qser-fota/lynq-qser-fota.cpp b/cap/zx297520v3/src/lynq/lib/liblynq-qser-fota/lynq-qser-fota.cpp
index e0dcafd..3e3393e 100755
--- a/cap/zx297520v3/src/lynq/lib/liblynq-qser-fota/lynq-qser-fota.cpp
+++ b/cap/zx297520v3/src/lynq/lib/liblynq-qser-fota/lynq-qser-fota.cpp
@@ -131,6 +131,9 @@
     }

     fwrite(&fota_sync_flag,sizeof(int),1,fp);

     fclose(fp);

+

+    /* T106BUG-189 fix */

+    system("sync");

     

     ret = lynq_fota_verify();

     if(ret != 0)

@@ -230,7 +233,10 @@
     fota_sync_flag = 1;

     fwrite(&fota_sync_flag,sizeof(int),1,fp);

     fclose(fp);

-    

+

+    /* T106BUG-189 fix */

+    system("sync");

+

     if(reboot_flag == 1)

     {

         LYINFLOG("Enter reboot device");

@@ -809,6 +815,7 @@
     return 0;

 }

 

+DEFINE_LYNQ_LIB_LOG(LYNQ_FOTA)

 

 #ifdef __cplusplus

 }

diff --git a/cap/zx297520v3/src/lynq/lib/liblynq-qser-network/lynq_qser_network.cpp b/cap/zx297520v3/src/lynq/lib/liblynq-qser-network/lynq_qser_network.cpp
index 15b4b33..0a32515 100755
--- a/cap/zx297520v3/src/lynq/lib/liblynq-qser-network/lynq_qser_network.cpp
+++ b/cap/zx297520v3/src/lynq/lib/liblynq-qser-network/lynq_qser_network.cpp
@@ -21,26 +21,75 @@
 
 nw_client_handle_type g_ph_hw = INVALID_CLIENT_HANDLE;
 
+#if 0
+typedef enum {
+    PREF_NET_TYPE_GSM_WCDMA                = 0, /* GSM/WCDMA (WCDMA preferred) */
+    PREF_NET_TYPE_GSM_ONLY                 = 1, /* GSM only */
+    PREF_NET_TYPE_WCDMA                    = 2, /* WCDMA  */
+    PREF_NET_TYPE_GSM_WCDMA_AUTO           = 3, /* GSM/WCDMA (auto mode, according to PRL) */
+    PREF_NET_TYPE_CDMA_EVDO_AUTO           = 4, /* CDMA and EvDo (auto mode, according to PRL) */
+    PREF_NET_TYPE_CDMA_ONLY                = 5, /* CDMA only */
+    PREF_NET_TYPE_EVDO_ONLY                = 6, /* EvDo only */
+    PREF_NET_TYPE_GSM_WCDMA_CDMA_EVDO_AUTO = 7, /* GSM/WCDMA, CDMA, and EvDo (auto mode, according to PRL) */
+    PREF_NET_TYPE_LTE_CDMA_EVDO            = 8, /* LTE, CDMA and EvDo */
+    PREF_NET_TYPE_LTE_GSM_WCDMA            = 9, /* LTE, GSM/WCDMA */
+    PREF_NET_TYPE_LTE_CMDA_EVDO_GSM_WCDMA  = 10, /* LTE, CDMA, EvDo, GSM/WCDMA */
+    PREF_NET_TYPE_LTE_ONLY                 = 11, /* LTE only */
+    PREF_NET_TYPE_LTE_WCDMA                = 12,  /* LTE/WCDMA */
+    PREF_NET_TYPE_TD_SCDMA_ONLY            = 13, /* TD-SCDMA only */
+    PREF_NET_TYPE_TD_SCDMA_WCDMA           = 14, /* TD-SCDMA and WCDMA */
+    PREF_NET_TYPE_TD_SCDMA_LTE             = 15, /* TD-SCDMA and LTE */
+    PREF_NET_TYPE_TD_SCDMA_GSM             = 16, /* TD-SCDMA and GSM */
+    PREF_NET_TYPE_TD_SCDMA_GSM_LTE         = 17, /* TD-SCDMA,GSM and LTE */
+    PREF_NET_TYPE_TD_SCDMA_GSM_WCDMA       = 18, /* TD-SCDMA, GSM/WCDMA */
+    PREF_NET_TYPE_TD_SCDMA_WCDMA_LTE       = 19, /* TD-SCDMA, WCDMA and LTE */
+    PREF_NET_TYPE_TD_SCDMA_GSM_WCDMA_LTE   = 20, /* TD-SCDMA, GSM/WCDMA and LTE */
+    PREF_NET_TYPE_TD_SCDMA_GSM_WCDMA_CDMA_EVDO_AUTO  = 21, /* TD-SCDMA, GSM/WCDMA, CDMA and EvDo */
+    PREF_NET_TYPE_TD_SCDMA_LTE_CDMA_EVDO_GSM_WCDMA   = 22,  /* TD-SCDMA, LTE, CDMA, EvDo GSM/WCDMA */
+    PREF_NET_TYPE_NR_ONLY                  = 23, /* NR 5G only mode */
+    PREF_NET_TYPE_NR_LTE                   = 24, /* NR 5G, LTE */
+    PREF_NET_TYPE_NR_LTE_CDMA_EVDO         = 25, /* NR 5G, LTE, CDMA and EvDo */
+    PREF_NET_TYPE_NR_LTE_GSM_WCDMA         = 26, /* NR 5G, LTE, GSM and WCDMA */
+    PREF_NET_TYPE_NR_LTE_CDMA_EVDO_GSM_WCDMA = 27, /* NR 5G, LTE, CDMA, EvDo, GSM and WCDMA */
+    PREF_NET_TYPE_NR_LTE_WCDMA             = 28, /* NR 5G, LTE and WCDMA */
+    PREF_NET_TYPE_NR_LTE_TDSCDMA           = 29, /* NR 5G, LTE and TDSCDMA */
+    PREF_NET_TYPE_NR_LTE_TDSCDMA_GSM       = 30, /* NR 5G, LTE, TD-SCDMA and GSM */
+    PREF_NET_TYPE_NR_LTE_TDSCDMA_WCDMA       = 31, /* NR 5G, LTE, TD-SCDMA, WCDMA */
+    PREF_NET_TYPE_NR_LTE_TDSCDMA_GSM_WCDMA = 32, /* NR 5G, LTE, TD-SCDMA, GSM and WCDMA */
+    PREF_NET_TYPE_NR_LTE_TDSCDMA_CDMA_EVDO_GSM_WCDMA = 33 /* NR 5G, LTE, TD-SCDMA, CDMA, EVDO, GSM and WCDMA */
+} RIL_PreferredNetworkType;
+#endif
+
 int switch_preferred_nw_mode(const uint64_t preferred_nw_mode)
 {
-    int map[13]={
-            0xffff,    // "0 : GSM/WCDMA (WCDMA preferred)"
-            QSER_NW_MODE_GSM, // "1 : GSM only"
-            QSER_NW_MODE_WCDMA, // "2 : WCDMA"
-            QSER_NW_MODE_GSM | QSER_NW_MODE_WCDMA, // "3 : GSM/WCDMA (auto mode, according to PRL)"
-            QSER_NW_MODE_CDMA | QSER_NW_MODE_EVDO, // "4 : CDMA and EvDo (auto mode, according to PRL)"
-            QSER_NW_MODE_CDMA, // "5 : CDMA only"
-            QSER_NW_MODE_EVDO, // "6 : EvDo only"
-            QSER_NW_MODE_GSM | QSER_NW_MODE_WCDMA | QSER_NW_MODE_CDMA | QSER_NW_MODE_EVDO, // "7 : GSM/WCDMA, CDMA, and EvDo (auto mode, according to PRL)"
-            QSER_NW_MODE_LTE | QSER_NW_MODE_CDMA | QSER_NW_MODE_EVDO, // "8 : LTE, CDMA and EvDo"
-            QSER_NW_MODE_LTE | QSER_NW_MODE_GSM | QSER_NW_MODE_WCDMA, // "9 : LTE, GSM/WCDMA"
-            QSER_NW_MODE_LTE | QSER_NW_MODE_CDMA | QSER_NW_MODE_EVDO| QSER_NW_MODE_GSM | QSER_NW_MODE_WCDMA, // "10: LTE, CDMA, EvDo, GSM/WCDMA"
-            QSER_NW_MODE_LTE , // "11: LTE only"
-            QSER_NW_MODE_LTE | QSER_NW_MODE_WCDMA, // "12: LTE/WCDMA"            
+    uint32_t map[23]={    
+            0xffff,                                                               //PREF_NET_TYPE_GSM_WCDMA                = 0, /* GSM/WCDMA (WCDMA preferred) */
+            QSER_NW_MODE_GSM,                                                     //PREF_NET_TYPE_GSM_ONLY                 = 1, /* GSM only */
+            QSER_NW_MODE_WCDMA,                                                   //PREF_NET_TYPE_WCDMA                    = 2, /* WCDMA  */
+            QSER_NW_MODE_GSM | QSER_NW_MODE_WCDMA,                                //PREF_NET_TYPE_GSM_WCDMA_AUTO          = 3, /* GSM/WCDMA (auto mode, according to PRL) */
+            QSER_NW_MODE_CDMA | QSER_NW_MODE_EVDO,                                //PREF_NET_TYPE_CDMA_EVDO_AUTO           = 4, /* CDMA and EvDo (auto mode, according to PRL) */
+            QSER_NW_MODE_CDMA,                                                    //PREF_NET_TYPE_CDMA_ONLY                = 5, /* CDMA only */
+            QSER_NW_MODE_EVDO,                                                    // PREF_NET_TYPE_EVDO_ONLY                = 6, /* EvDo only */
+            QSER_NW_MODE_GSM | QSER_NW_MODE_WCDMA | QSER_NW_MODE_CDMA | QSER_NW_MODE_EVDO, //  PREF_NET_TYPE_GSM_WCDMA_CDMA_EVDO_AUTO = 7, /* GSM/WCDMA, CDMA, and EvDo (auto mode, according to PRL) */
+            QSER_NW_MODE_LTE | QSER_NW_MODE_CDMA | QSER_NW_MODE_EVDO,             //PREF_NET_TYPE_LTE_CDMA_EVDO            = 8 "8 : LTE, CDMA and EvDo"
+            QSER_NW_MODE_LTE | QSER_NW_MODE_GSM | QSER_NW_MODE_WCDMA,             //PREF_NET_TYPE_LTE_GSM_WCDMA            = 9, /* LTE, GSM/WCDMA */
+            QSER_NW_MODE_LTE | QSER_NW_MODE_CDMA | QSER_NW_MODE_EVDO| QSER_NW_MODE_GSM | QSER_NW_MODE_WCDMA, //PREF_NET_TYPE_LTE_CMDA_EVDO_GSM_WCDMA  = 10, /* LTE, CDMA, EvDo, GSM/WCDMA */
+            QSER_NW_MODE_LTE ,                                                   //PREF_NET_TYPE_LTE_ONLY                 = 11, /* LTE only */
+            QSER_NW_MODE_LTE | QSER_NW_MODE_WCDMA,                               //PREF_NET_TYPE_LTE_WCDMA                = 12,  /* LTE/WCDMA */   
+            QSER_NW_MODE_TDSCDMA ,                                               //PREF_NET_TYPE_TD_SCDMA_ONLY            = 13, /* TD-SCDMA only */  
+            QSER_NW_MODE_TDSCDMA | QSER_NW_MODE_WCDMA ,                          //PREF_NET_TYPE_TD_SCDMA_WCDMA           = 14, /* TD-SCDMA and WCDMA */      
+            QSER_NW_MODE_TDSCDMA | QSER_NW_MODE_LTE ,                            //PREF_NET_TYPE_TD_SCDMA_LTE             = 15, /* TD-SCDMA and LTE */  
+            QSER_NW_MODE_TDSCDMA | QSER_NW_MODE_GSM,                             // PREF_NET_TYPE_TD_SCDMA_GSM             = 16, /* TD-SCDMA and GSM */
+            QSER_NW_MODE_TDSCDMA | QSER_NW_MODE_GSM | QSER_NW_MODE_LTE,                                           //PREF_NET_TYPE_TD_SCDMA_GSM_LTE         = 17, /* TD-SCDMA,GSM and LTE */
+            QSER_NW_MODE_TDSCDMA | QSER_NW_MODE_GSM | QSER_NW_MODE_WCDMA,                                        //PREF_NET_TYPE_TD_SCDMA_GSM_WCDMA       = 18, /* TD-SCDMA, GSM/WCDMA */
+            QSER_NW_MODE_TDSCDMA | QSER_NW_MODE_WCDMA | QSER_NW_MODE_LTE,                                         //PREF_NET_TYPE_TD_SCDMA_WCDMA_LTE       = 19, /* TD-SCDMA, WCDMA and LTE */
+            QSER_NW_MODE_TDSCDMA | QSER_NW_MODE_GSM | QSER_NW_MODE_WCDMA | QSER_NW_MODE_LTE,                      //PREF_NET_TYPE_TD_SCDMA_GSM_WCDMA_LTE   = 20, /* TD-SCDMA, GSM/WCDMA and LTE */
+            QSER_NW_MODE_TDSCDMA | QSER_NW_MODE_GSM | QSER_NW_MODE_WCDMA | QSER_NW_MODE_CDMA | QSER_NW_MODE_EVDO,                     //PREF_NET_TYPE_TD_SCDMA_GSM_WCDMA_CDMA_EVDO_AUTO  = 21, /* TD-SCDMA, GSM/WCDMA, CDMA and EvDo */
+            QSER_NW_MODE_TDSCDMA | QSER_NW_MODE_LTE | QSER_NW_MODE_CDMA  |QSER_NW_MODE_EVDO | QSER_NW_MODE_GSM | QSER_NW_MODE_WCDMA,  //PREF_NET_TYPE_TD_SCDMA_LTE_CDMA_EVDO_GSM_WCDMA   = 22,  /* TD-SCDMA, LTE, CDMA, EvDo GSM/WCDMA */
     };
     int array_length=sizeof (map)/ sizeof (map[0]);
 
-    for(int i=0;i<array_length;i++)
+    for(int i=1;i<array_length;i++)
     {
         if(map[i]==preferred_nw_mode)
         {
@@ -501,3 +550,6 @@
    
     return RESULT_OK;
 }
+
+DEFINE_LYNQ_LIB_LOG(LYNQ_QSER_NETWORK)
+
diff --git a/cap/zx297520v3/src/lynq/lib/liblynq-qser-sim/lynq_qser_sim.cpp b/cap/zx297520v3/src/lynq/lib/liblynq-qser-sim/lynq_qser_sim.cpp
index 29b14e2..d95945d 100755
--- a/cap/zx297520v3/src/lynq/lib/liblynq-qser-sim/lynq_qser_sim.cpp
+++ b/cap/zx297520v3/src/lynq/lib/liblynq-qser-sim/lynq_qser_sim.cpp
@@ -207,4 +207,7 @@
     ret = lynq_get_sim_status((int*)&pt_info->e_card_state);
     LYINFLOG("[%s-%d] QSER_CARD_STATUS: %d\n", __FUNCTION__, __LINE__, (int *)pt_info->e_card_state);
     return ret;
-}
\ No newline at end of file
+}
+
+DEFINE_LYNQ_LIB_LOG(LYNQ_QSER_SIM)
+
diff --git a/cap/zx297520v3/src/lynq/lib/liblynq-qser-sms/lynq_qser_sms.cpp b/cap/zx297520v3/src/lynq/lib/liblynq-qser-sms/lynq_qser_sms.cpp
index 5ff13a7..7160e8c 100755
--- a/cap/zx297520v3/src/lynq/lib/liblynq-qser-sms/lynq_qser_sms.cpp
+++ b/cap/zx297520v3/src/lynq/lib/liblynq-qser-sms/lynq_qser_sms.cpp
@@ -193,3 +193,6 @@
     }
     return lynq_set_smsc_address(get_sca_cfg->service_center_addr);
 }
+
+DEFINE_LYNQ_LIB_LOG(LYNQ_QSER_SMS)
+
diff --git a/cap/zx297520v3/src/lynq/lib/liblynq-qser-voice/include/lynq-qser-voice.h b/cap/zx297520v3/src/lynq/lib/liblynq-qser-voice/include/lynq-qser-voice.h
index 13622db..8666362 100755
--- a/cap/zx297520v3/src/lynq/lib/liblynq-qser-voice/include/lynq-qser-voice.h
+++ b/cap/zx297520v3/src/lynq/lib/liblynq-qser-voice/include/lynq-qser-voice.h
@@ -88,6 +88,12 @@
 
 int qser_voice_call_switch_waiting_or_holding_and_active(voice_client_handle_type h_voice);
 
+//set voice speech volume
+int qser_voice_set_speech_volume(const int volume);
+
+//Get voice speech volume
+int qser_voice_get_speech_volume(int *volume);
+
 //Set voice call waiting
 int qser_voice_call_setwaiting
 ( 
diff --git a/cap/zx297520v3/src/lynq/lib/liblynq-qser-voice/lynq-qser-voice.cpp b/cap/zx297520v3/src/lynq/lib/liblynq-qser-voice/lynq-qser-voice.cpp
index 1799ea1..fa210e6 100755
--- a/cap/zx297520v3/src/lynq/lib/liblynq-qser-voice/lynq-qser-voice.cpp
+++ b/cap/zx297520v3/src/lynq/lib/liblynq-qser-voice/lynq-qser-voice.cpp
@@ -16,6 +16,10 @@
 #define RESULT_OK (0)
 #define RESULT_ERROR (-1)
 
+#define MIN_VOLUME 0
+#define MAX_VOLUME 5
+
+
 static pthread_t s_lynq_voice_tid = -1;
 static QSER_VoiceCall_StateHandlerFunc_t   s_voice_cb = NULL;
 static int s_voice_thread_status = 0;
@@ -208,4 +212,23 @@
         return RESULT_ERROR;
     }
     return lynq_switch_waiting_or_holding_and_active();
-}
\ No newline at end of file
+}
+
+int qser_voice_set_speech_volume(const int volume)
+{
+    if(volume < MIN_VOLUME || volume > MAX_VOLUME)
+    {
+        LYERRLOG("Illeage input volume");
+        return RESULT_ERROR;
+    }
+    return lynq_set_speech_volume(volume);
+}
+
+
+int qser_voice_get_speech_volume(int *volume)
+{
+    return lynq_get_speech_volume(volume);
+}
+
+DEFINE_LYNQ_LIB_LOG(LYNQ_QSER_CALL)
+
diff --git a/cap/zx297520v3/src/lynq/lib/liblynq-shm/lynq_shm.cpp b/cap/zx297520v3/src/lynq/lib/liblynq-shm/lynq_shm.cpp
index bc1b25a..c7d2e45 100755
--- a/cap/zx297520v3/src/lynq/lib/liblynq-shm/lynq_shm.cpp
+++ b/cap/zx297520v3/src/lynq/lib/liblynq-shm/lynq_shm.cpp
@@ -193,3 +193,5 @@
     return ;

 }

 

+DEFINE_LYNQ_LIB_LOG(LYNQ_SHM)

+

diff --git a/cap/zx297520v3/src/lynq/lib/liblynq-sms/lynq_sms.cpp b/cap/zx297520v3/src/lynq/lib/liblynq-sms/lynq_sms.cpp
index f0b2bbd..9d5ef30 100755
--- a/cap/zx297520v3/src/lynq/lib/liblynq-sms/lynq_sms.cpp
+++ b/cap/zx297520v3/src/lynq/lib/liblynq-sms/lynq_sms.cpp
@@ -364,3 +364,5 @@
     }

 }

 

+DEFINE_LYNQ_LIB_LOG(LYNQ_SMS)

+

diff --git a/cap/zx297520v3/src/lynq/lib/liblynq-systime/lynq_systime.cpp b/cap/zx297520v3/src/lynq/lib/liblynq-systime/lynq_systime.cpp
index 8eaba2a..4109b21 100755
--- a/cap/zx297520v3/src/lynq/lib/liblynq-systime/lynq_systime.cpp
+++ b/cap/zx297520v3/src/lynq/lib/liblynq-systime/lynq_systime.cpp
@@ -374,6 +374,7 @@
     return ret;

 }

 

+DEFINE_LYNQ_LIB_LOG(LYNQ_SYSTIME)

 #ifdef __cplusplus

 }

 #endif

diff --git a/cap/zx297520v3/src/lynq/lib/libpoweralarm/libpoweralarm.cpp b/cap/zx297520v3/src/lynq/lib/libpoweralarm/libpoweralarm.cpp
index 945e0a4..3d17411 100755
--- a/cap/zx297520v3/src/lynq/lib/libpoweralarm/libpoweralarm.cpp
+++ b/cap/zx297520v3/src/lynq/lib/libpoweralarm/libpoweralarm.cpp
@@ -17,7 +17,8 @@
 #include "liblog/lynq_deflog.h"

 #include <include/libpoweralarm.h>

 #include <pthread.h>

-

+#include <string.h>

+#include <errno.h>

 

 #ifdef __cplusplus

 extern "C" {

@@ -25,6 +26,9 @@
 

 #define USER_LOG_TAG "LYNQ_POWERALARM"

 

+#define MIN_TIME    1

+#define MAX_TIME    268435456

+

 

 static int wk_rtc_id = 1;

 static int pw_rtc_id = 2;

@@ -36,7 +40,7 @@
 extern int sc_rtc_timer_add(int srcid, int rtc_id, unsigned long ulSec, sc_rtc_timer_exp_cb rtc_notify);

 extern int sc_rtc_timer_del(int srcid, int rtc_id);

 

-

+extern int sc_rtc_timer_add_utc(int srcid, int rtc_id, struct tm *utc_sec, int wakeup, sc_rtc_timer_exp_cb rtc_notify);

 

 /*****************************************

 * @brief:sc_rtc_timer_add_cb

@@ -66,6 +70,12 @@
 {

     unsigned long  time_sec = 0;

     int ret = 0;

+    char *buf_bak = buffer;

+    time_t tmp_time = 0;

+    struct tm *ptime = NULL;

+    struct tm *wake_arlarm = NULL;

+    tmp_time = time(NULL);

+    ptime = localtime(&tmp_time);

     

     LYLOGSET(LOG_INFO);

     LYLOGEINIT(USER_LOG_TAG);

@@ -76,16 +86,41 @@
         return -1;

     }

 

-    time_sec = atoll(buffer);

+    while(*buffer != '\0' )

+    {

+        if((*buffer < '0') || (*buffer > '9'))

+        {

+            LYERRLOG("Illeagel input buffer , there is invalid character!!!!");

+            return -1;

+        }

+        else

+        {

+            buffer++;

+        }

+    }

+   

+

+    buffer = buf_bak;

+    time_sec = strtoul(buffer,NULL,10);

+    if(time_sec < MIN_TIME || time_sec > MAX_TIME || errno == ERANGE)

+    {

+        LYERRLOG("Illeagle input: too large or too small !!!");

+        return -1;

+    }

+

+    tmp_time += time_sec;

+    wake_arlarm = localtime(&tmp_time);

     

     LYINFLOG("Set  wakealarm   %lu seconds ",time_sec);

+    

     wk_srcid = sc_rtc_timer_init();

     if (wk_srcid <= 0)

     {

         LYINFLOG("rtc_timer_init fail!");

         return -1;

     }

-    ret = sc_rtc_timer_add(wk_srcid, wk_rtc_id, time_sec, sc_rtc_timer_add_cb);

+    

+    ret = sc_rtc_timer_add_utc(wk_srcid, wk_rtc_id,wake_arlarm,0,sc_rtc_timer_add_cb);

     if(ret < 0)

     {

         LYINFLOG("Add  rtc timer failed!!!!");

@@ -119,29 +154,50 @@
     int srcid = 0;

     unsigned long  time_sec = 0;

     int ret = 0;

+    char *buf_bak = buffer;

     

     LYLOGSET(LOG_INFO);

     LYLOGEINIT(USER_LOG_TAG);

-    

+   

     if(buffer == NULL)

     {

-        LYINFLOG("Bad input parameter,exit!!!!");

+        LYERRLOG("Bad input parameter,exit!!!!");

         return -1;

     }

+    

+    while(*buffer != '\0' )

+    {

+        if(( *buffer < '0' )|| ( *buffer > '9'))

+        {

+            LYERRLOG("Illeagel input buffer , there is invalid character!!!!");

+            return -1;

+        }

+        else

+        {

+            buffer++;

+        }

+    }

+    

 

-    time_sec = atoll(buffer);

+    buffer = buf_bak;

+    time_sec = strtoul(buffer,NULL,10);

+    if(time_sec < MIN_TIME || time_sec > MAX_TIME || errno == ERANGE)

+    {

+        LYERRLOG("Illeagle input: too large or too small !!!");

+        return -1;

+    }

     

     LYINFLOG("Set poweralarm %lu seconds",time_sec);

     srcid = sc_rtc_timer_init();

     if (srcid <= 0)

     {

-        LYINFLOG("rtc_timer_init fail!");

+        LYERRLOG("rtc_timer_init fail!");

         return -1;

     }

     ret = sc_rtc_timer_add(srcid, pw_rtc_id, time_sec, sc_rtc_timer_add_cb);

     if(ret < 0)

     {

-        LYINFLOG("Add  rtc timer failed!!!!");

+        LYERRLOG("Add  rtc timer failed!!!!");

         return -1;

     }

     

@@ -174,7 +230,7 @@
     ret = sc_rtc_timer_del(wk_srcid, wk_rtc_id);

     if(ret < 0)

     {

-        LYINFLOG("Del wakealarm failed!!!");

+        LYERRLOG("Del wakealarm failed!!!");

         return -1;

     }

 

@@ -194,15 +250,24 @@
 ******************************************/

 int  lynq_set_poweralarm(unsigned long time_sec)

 {

-    LYLOGSET(LOG_INFO);

-    LYLOGEINIT(USER_LOG_TAG);

+

     int ret = 0;

     int srcid = 0;

+

+    LYLOGSET(LOG_INFO);

+    LYLOGEINIT(USER_LOG_TAG);

+    

+    if(time_sec < MIN_TIME || time_sec > MAX_TIME )

+    {

+        LYERRLOG("Illeagle input: too large or too small !!!");

+        return -1;

+    }

+    

     LYINFLOG("lynq_set_poweralarm %lu seconds",time_sec);

     srcid = sc_rtc_timer_init();

     if (srcid <= 0)

     {

-        LYINFLOG("rtc_timer_init fail!");

+        LYERRLOG("rtc_timer_init fail!");

         return -1;

     }

     ret = sc_rtc_timer_add(srcid, pw_rtc_id, time_sec, sc_rtc_timer_add_cb);

@@ -238,17 +303,35 @@
 {

     int ret = 0;

     

+    time_t tmp_time = 0;

+    struct tm *ptime = NULL;

+    struct tm *wake_arlarm = NULL;

+    tmp_time = time(NULL);

+    ptime = localtime(&tmp_time);

+    

     LYLOGSET(LOG_INFO);

     LYLOGEINIT(USER_LOG_TAG);

     

+    if(time_sec < MIN_TIME || time_sec > MAX_TIME)

+    {

+        LYERRLOG("Illeagle input: too large or too small !!!");

+        return -1;

+    }

+    

     LYINFLOG("lynq_set_wakealarm   %lu seconds ",time_sec);

+    

     wk_srcid = sc_rtc_timer_init();

     if (wk_srcid <= 0)

     {

         LYINFLOG("rtc_timer_init fail!");

         return -1;

     }

-    ret = sc_rtc_timer_add(wk_srcid, wk_rtc_id, time_sec, sc_rtc_timer_add_cb);

+    

+    tmp_time += time_sec;

+    wake_arlarm = localtime(&tmp_time);

+    LYINFLOG("Set  wakealarm   %lu seconds ",time_sec);

+    

+    ret = sc_rtc_timer_add_utc(wk_srcid, wk_rtc_id,wake_arlarm,0,sc_rtc_timer_add_cb);

     if(ret < 0)

     {

         LYINFLOG("Add  rtc timer failed!!!!");

@@ -267,6 +350,7 @@
 

 }

 

+DEFINE_LYNQ_LIB_LOG(LYNQ_POWERALARM)

 

 #ifdef __cplusplus

 }

diff --git a/cap/zx297520v3/src/lynq/packages/apps/Mobiletek_Tester_RDIT/data.cpp b/cap/zx297520v3/src/lynq/packages/apps/Mobiletek_Tester_RDIT/data.cpp
index a4be3e7..b3d1971 100755
--- a/cap/zx297520v3/src/lynq/packages/apps/Mobiletek_Tester_RDIT/data.cpp
+++ b/cap/zx297520v3/src/lynq/packages/apps/Mobiletek_Tester_RDIT/data.cpp
@@ -94,14 +94,20 @@
 qser_data_call_state_s state = {0};

 void evt_cb(qser_data_call_state_s *state)

 {

-    char buf_ip[20] = {0};

-    char buf_gateway[20] = {0};

-    char buf_pri_dns[20] = {0};

-    char buf_sec_dns[20] = {0};

+    char buf_ip[64] = {0};

+    char buf_gateway[64] = {0};

+    char buf_pri_dns[64] = {0};

+    char buf_sec_dns[64] = {0};

     printf("LYNQ_QSER_DATA_INIT: profile_idx=%d, name=%s, ip_family=%d, state=%d, error=%d\n"

         , state->profile_idx, state->name, state->ip_family, state->state, state->err);

-    printf("LYNQ_QSER_DATA_INIT: v4.ip=%s, v4.gateway=%s, v4.pri_dns=%s, v4.sec_dns=%s\n"

-        , inet_ntoa(state->v4.ip), inet_ntoa(state->v4.gateway), inet_ntoa(state->v4.pri_dns), inet_ntoa(state->v4.sec_dns));

+    printf("LYNQ_QSER_DATA_INIT: v4.ip=%s\n"

+        , inet_ntoa(state->v4.ip));

+    printf("LYNQ_QSER_DATA_INIT: v4.gateway=%s\n"

+        , inet_ntoa(state->v4.gateway));

+    printf("LYNQ_QSER_DATA_INIT: v4.pri_dns=%s, v4.sec_dns=%s\n"

+        , inet_ntoa(state->v4.pri_dns));

+    printf("LYNQ_QSER_DATA_INIT: v4.sec_dns=%s\n"

+        , inet_ntoa(state->v4.sec_dns));

     inet_ntop(AF_INET6, &(state->v6.ip), buf_ip, sizeof(buf_ip));

     inet_ntop(AF_INET6, &(state->v6.gateway), buf_gateway, sizeof(buf_gateway));

     inet_ntop(AF_INET6, &(state->v6.pri_dns), buf_pri_dns, sizeof(buf_pri_dns));

@@ -198,10 +204,10 @@
 {

     printf("[%s][%d] enter!\n",__FUNCTION__,__LINE__);

     int ret = -1;

-    char buf_ip[20] = {0};

-    char buf_gateway[20] = {0};

-    char buf_pri_dns[20] = {0};

-    char buf_sec_dns[20] = {0};

+    char buf_ip[64] = {0};

+    char buf_gateway[64] = {0};

+    char buf_pri_dns[64] = {0};

+    char buf_sec_dns[64] = {0};

     qser_data_call_info_s info = {0};

     int profile_idx_int = atoi(argv[1]);

     qser_data_call_error_e err = QSER_DATA_CALL_ERROR_NONE;

@@ -229,8 +235,14 @@
     printf("%s%d\n",TEST_RESULT,ret);

     printf("LYNQ_QSER_GET_DATA_CALL_LIST: error=%d, profile_idx=%d, ip_family=%d\n", err, info.profile_idx, info.ip_family);

     printf("LYNQ_QSER_GET_DATA_CALL_LIST: v4.name=%s, v4.state=%d, v4.reconnect=%d\n", info.v4.name, info.v4.state, info.v4.reconnect);

-    printf("LYNQ_QSER_GET_DATA_CALL_LIST: v4.ip=%s, v4.gateway=%s, v4.pri_dns=%s, v4.sec_dns=%s\n"

-        , inet_ntoa(info.v4.addr.ip), inet_ntoa(info.v4.addr.gateway), inet_ntoa(info.v4.addr.pri_dns), inet_ntoa(info.v4.addr.sec_dns));

+    printf("LYNQ_QSER_GET_DATA_CALL_LIST: v4.ip=%s\n"

+        , inet_ntoa(info.v4.addr.ip));

+    printf("LYNQ_QSER_GET_DATA_CALL_LIST: v4.gateway=%s\n"

+        , inet_ntoa(info.v4.addr.gateway));

+    printf("LYNQ_QSER_GET_DATA_CALL_LIST: v4.pri_dns=%s\n"

+        , inet_ntoa(info.v4.addr.pri_dns));

+    printf("LYNQ_QSER_GET_DATA_CALL_LIST: v4.sec_dns=%s\n"

+        , inet_ntoa(info.v4.addr.sec_dns));

 

     printf("LYNQ_QSER_GET_DATA_CALL_LIST: v6.name=%s, v6.state=%d, v6.reconnect=%d\n", info.v6.name, info.v6.state, info.v6.reconnect);

     inet_ntop(AF_INET6, &(info.v6.addr.ip), buf_ip, sizeof(buf_ip));

diff --git a/cap/zx297520v3/src/lynq/packages/apps/lynq-qser-autosuspend-demo/LICENSE b/cap/zx297520v3/src/lynq/packages/apps/lynq-qser-autosuspend-demo/LICENSE
new file mode 100755
index 0000000..cb88533
--- /dev/null
+++ b/cap/zx297520v3/src/lynq/packages/apps/lynq-qser-autosuspend-demo/LICENSE
@@ -0,0 +1,31 @@
+Copyright Statement:
+
+This software/firmware and related documentation ("Mobiletek Software") are
+protected under relevant copyright laws. The information contained herein is
+confidential and proprietary to Mobiletek Inc. and/or its licensors. Without
+the prior written permission of Mobiletek inc. and/or its licensors, any
+reproduction, modification, use or disclosure of Mobiletek Software, and
+information contained herein, in whole or in part, shall be strictly
+prohibited.
+
+Mobiletek Inc. (C) 2015. All rights reserved.
+
+BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("Mobiletek SOFTWARE")
+RECEIVED FROM Mobiletek AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
+ON AN "AS-IS" BASIS ONLY. Mobiletek EXPRESSLY DISCLAIMS ANY AND ALL
+WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
+WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+NONINFRINGEMENT. NEITHER DOES Mobiletek PROVIDE ANY WARRANTY WHATSOEVER WITH
+RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
+INCORPORATED IN, OR SUPPLIED WITH THE Mobiletek SOFTWARE, AND RECEIVER AGREES
+TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
+RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
+OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN Mobiletek
+SOFTWARE. Mobiletek SHALL ALSO NOT BE RESPONSIBLE FOR ANY Mobiletek SOFTWARE
+RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND Mobiletek'S
+ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE Mobiletek SOFTWARE
+RELEASED HEREUNDER WILL BE, AT Mobiletek'S OPTION, TO REVISE OR REPLACE THE
+Mobiletek SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
+CHARGE PAID BY RECEIVER TO Mobiletek FOR SUCH Mobiletek SOFTWARE AT ISSUE.
diff --git a/cap/zx297520v3/src/lynq/packages/apps/lynq-qser-autosuspend-demo/lynq-qser-autosuspend-demo.c b/cap/zx297520v3/src/lynq/packages/apps/lynq-qser-autosuspend-demo/lynq-qser-autosuspend-demo.c
new file mode 100755
index 0000000..6c1b489
--- /dev/null
+++ b/cap/zx297520v3/src/lynq/packages/apps/lynq-qser-autosuspend-demo/lynq-qser-autosuspend-demo.c
@@ -0,0 +1,284 @@
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <unistd.h>
+#include <dlfcn.h>
+#include <errno.h>
+#include <fcntl.h>
+
+
+#define FILE_LOCK_TABLE "/tmp/.lock_table"
+
+void *dlHandle_wakelock;
+
+int (*qser_lpm_deinit)(void);
+int (*qser_autosuspend_enable)(char enable);
+int (*qser_wakelock_create)(const char *value, size_t len);
+int (*qser_wakelock_lock)(int fd);
+int (*qser_wakelock_unlock)(int fd);
+int (*qser_wakelock_destroy)(int fd);
+
+#define MAX_LOCK_NUM 128
+
+typedef struct
+{
+    char lock_name[MAX_LOCK_NUM][64];
+} LOCK_TABLE;
+
+void init_autosuspend_func(void)
+{
+
+    const char *lynqLibPath_WakeLock = "/lib/liblynq-qser-autosuspend.so";
+
+
+    dlHandle_wakelock = dlopen(lynqLibPath_WakeLock, RTLD_NOW);
+    if (dlHandle_wakelock == NULL) 
+    {
+        printf("dlopen lynqLibPath_WakeLock failed: %s", dlerror());
+        exit(EXIT_FAILURE);
+    }
+
+    qser_lpm_deinit = (int(*)(void))dlsym(dlHandle_wakelock, "qser_lpm_deinit");
+    if (qser_lpm_deinit == NULL)
+    {
+        printf("qser_lpm_deinit not defined or exported in %s", lynqLibPath_WakeLock);
+        exit(EXIT_FAILURE);
+    }
+
+    qser_autosuspend_enable = (int(*)(char))dlsym(dlHandle_wakelock, "qser_autosuspend_enable");
+    if (qser_autosuspend_enable == NULL)
+    {
+        printf("qser_autosuspend_enable not defined or exported in %s", lynqLibPath_WakeLock);
+        exit(EXIT_FAILURE);
+    }
+
+    qser_wakelock_create = (int(*)(const char *value, size_t len))dlsym(dlHandle_wakelock, "qser_wakelock_create");
+    if (qser_wakelock_create == NULL)
+    {
+        printf("qser_wakelock_create not defined or exported in %s", lynqLibPath_WakeLock);
+        exit(EXIT_FAILURE);
+    }
+
+    qser_wakelock_lock = (int(*)(int))dlsym(dlHandle_wakelock, "qser_wakelock_lock");
+    if (qser_wakelock_lock == NULL)
+    {
+        printf("qser_wakelock_lock not defined or exported in %s", lynqLibPath_WakeLock);
+        exit(EXIT_FAILURE);
+    }
+
+    qser_wakelock_unlock = (int(*)(int))dlsym(dlHandle_wakelock, "qser_wakelock_unlock");
+    if (qser_wakelock_unlock == NULL)
+    {
+        printf("qser_wakelock_unlock not defined or exported in %s", lynqLibPath_WakeLock);
+        exit(EXIT_FAILURE);
+    }
+
+    qser_wakelock_destroy = (int(*)(int))dlsym(dlHandle_wakelock, "qser_wakelock_destroy");
+    if (qser_wakelock_destroy == NULL)
+    {
+        printf("qser_wakelock_unlock not defined or exported in %s", lynqLibPath_WakeLock);
+        exit(EXIT_FAILURE);
+    }
+    
+    dlerror(); // Clear any previous dlerror
+
+    return;
+}
+
+
+int check_lock(void)
+{
+    int err;
+    int file_fd;
+    int i;
+    int ret;
+    LOCK_TABLE lock_status;
+    file_fd = open(FILE_LOCK_TABLE,O_RDWR);
+    if(file_fd < 0)
+    {
+        err = errno;
+        printf("Error open lock_table file:%s\n", strerror(errno));
+        return -2;
+    }
+
+    memset(&lock_status, 0, sizeof(lock_status));
+    lseek(file_fd,0,SEEK_SET);
+    ret = read(file_fd,(unsigned char *)&lock_status,sizeof(lock_status));
+    for(i=0;i<128;i++)
+    {
+        if(strlen(lock_status.lock_name[i]) != 0)
+        {
+            printf("fd: %d lock_name:%s strlen:%d\n", i, lock_status.lock_name[i], strlen(lock_status.lock_name[i]));
+        }
+    }
+    if(ret <= 0)
+    {
+        return -2;
+    }
+    close(file_fd);
+    return 0;
+
+}
+
+int main(int argc,char** argv)
+{
+
+    int num;
+    int ret;
+    int len;
+    init_autosuspend_func();
+    if(argc < 2)
+    {
+        printf("wrong input format, please -h \n");
+        return -1;
+    }
+    if(strcmp(argv[1],"-h") == 0)
+    {
+        printf("        -h                  --help\n");
+        printf("        -i                  --qseq_lpm_init\n");
+        printf("        -d                  --qser_lpm_deinit\n");
+        printf("        -e                  --qser_autosuspend_enable\n");
+        printf("        -cl [wakelock name] --qser_wakelock_create \n");
+        printf("        -al [wakelock num]  --qser_wakelock_lock \n");
+        printf("        -rl [wakelock num]  --qser_wakelock_unlock \n");
+        printf("        -dl [wakelock num]  --qser_wakelock_destroy\n");
+        printf("        -ccl                --check created locks\n");
+        printf("        -cll                --check lockup locks\n");
+    }
+    else if(strcmp(argv[1],"-d") == 0)
+    {
+        ret = qser_lpm_deinit();
+        if(ret != 0)
+        {
+            printf("lpm deinit fail\n");
+        }
+        else
+        {
+            printf("lpm deinit success\n");
+        }
+    }
+    else if(strcmp(argv[1],"-e") == 0)
+    {
+        char num='1';
+        ret = qser_autosuspend_enable(num);
+        if(ret != 0)
+        {
+            printf("qser_autosuspend_enable fail\n");
+        }
+        else
+        {
+            printf("qser_autosuspend_enable success\n");
+        }
+    }
+    else if(strcmp(argv[1],"-cl") == 0)
+    {
+        if(argv[2] == NULL)
+        {
+            printf("name is null\n");
+            return -1;
+        }
+        len = strlen(argv[2]);
+        printf("len =%d\n", len);
+        ret = qser_wakelock_create(argv[2], len);
+        if(ret < 0)
+        {
+            printf("wakelock create fail\n");
+            printf("ret=%d\n", ret);
+        }
+        else
+        {
+            printf("wakelock create success\n");
+            printf("fd=%d\n", ret);
+        }
+    }
+    else if (strcmp(argv[1],"-al") == 0)
+    {
+        if(argv[2] == NULL)
+        {
+            printf("fd is null\n");
+            return -1;
+        }
+        num = atoi(argv[2]);
+        ret = qser_wakelock_lock(num);
+        if(ret != 0)
+        {
+            printf("wakelock lock fail\n");
+            printf("ret=%d\n", ret);
+        }
+        else
+        {
+            printf("wakelock lock success\n");
+        }
+    }
+
+    else if (strcmp(argv[1],"-rl") == 0)
+    {
+        if(argv[2] == NULL)
+        {
+            printf("fd is null\n");
+            return -1;
+        }
+        num = atoi(argv[2]);
+        ret = qser_wakelock_unlock(num);
+        if(ret != 0)
+        {
+            printf("wakelock unlock fail\n");
+            printf("ret=%d\n", ret);
+        }
+        else
+        {
+            printf("wakelock unlock success\n");
+        }
+    }
+    else if(strcmp(argv[1],"-dl") == 0)
+    {
+        if(argv[2] == NULL)
+        {
+            printf("fd is null\n");
+            return -1;
+        }
+        num = atoi(argv[2]);
+        ret = qser_wakelock_destroy(num);
+        if(ret != 0)
+        {
+            printf("wakelock destroy fail\n");
+            printf("ret=%d\n", ret);
+        }
+        else
+        {
+            printf("wakelock destroy success\n");
+        }
+    }
+    else if(strcmp(argv[1],"-ccl") == 0)
+    {
+        int ret;
+        ret = check_lock();
+        if(ret != 0)
+        {
+            printf("check lock fail\n");
+            printf("ret=%d\n", ret);
+        }
+        else
+        {
+            printf("check lock success\n");
+        }
+    }
+    else if(strcmp(argv[1],"-cll") == 0)
+    {
+        int ret;
+        ret = system("cat /sys/power/wake_lock");
+        if(ret != 0)
+        {
+            printf("check created lock fail\n");
+        }
+    }
+    else
+    {
+        printf("wrong input format, please -h \n");
+        return -1;
+    }
+    return 0;
+
+}
diff --git a/cap/zx297520v3/src/lynq/packages/apps/lynq-qser-autosuspend-demo/makefile b/cap/zx297520v3/src/lynq/packages/apps/lynq-qser-autosuspend-demo/makefile
new file mode 100755
index 0000000..b3638ea
--- /dev/null
+++ b/cap/zx297520v3/src/lynq/packages/apps/lynq-qser-autosuspend-demo/makefile
@@ -0,0 +1,42 @@
+SHELL = /bin/sh
+RM = rm -f
+
+LOCAL_CFLAGS := -Wall \
+                -g -Os \
+                -flto \
+                -fpermissive \
+                -fPIC \
+
+ifeq ($(strip $(TARGET_PLATFORM)), T106)
+LOCAL_CFLAGS += -DBINDER_IPC_32BIT=1 -DHAVE_ENDIAN_H -DHAVE_PTHREADS -DHAVE_SYS_UIO_H -DHAVE_POSIX_FILEMAP -DHAVE_STRLCPY -DHAVE_PRCTL -DHAVE_MEMSET16 -DHAVE_MEMSET32 -DANDROID_SMP=0
+endif
+
+LOCAL_CFLAGS += -DZXW
+
+LOCAL_PATH   = .
+
+LOCAL_C_INCLUDES = \
+  -I. \
+
+
+LOCAL_LIBS := \
+    -L. \
+    -ldl \
+    -lpthread \
+
+SOURCES = $(wildcard *.c)
+
+EXECUTABLE = lynq-qser-autosuspend-demo
+
+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/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/sdk/ril/reference-ril/ril_mm.c b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/sdk/ril/reference-ril/ril_mm.c
index f9e405b..5369a73 100755
--- a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/sdk/ril/reference-ril/ril_mm.c
+++ b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/sdk/ril/reference-ril/ril_mm.c
@@ -787,9 +787,8 @@
 		

 		default:

 		{ 

-			err = at_send_command("AT^SYSCONFIG=2,0,1,2",  &response);

-			DO_MM_RESPONSE_ERROR_JDUGE;

-			break;

+			RLOGE("%s: not support network type %d", __FUNCTION__, networkType);

+			goto error;

 		}

 	}

 	RIL_onRequestComplete(token, RIL_E_SUCCESS, NULL, 0);

diff --git a/update_version.sh b/update_version.sh
index b313b8e..3d795eb 100644
--- a/update_version.sh
+++ b/update_version.sh
@@ -1,8 +1,8 @@
 #!/bin/bash
 #export LYNQ_VERSION="T106_lynq_version_ap_build_sh"
-LYNQ_AP_VERSION="T106CN-ZS03.V2.01.01.02P50.AP.07.02"
-LYNQ_CAP_INSIDE_VERSION="CAP.07.02"
-LYNQ_CAP_VERSION="CAP.07.02"
+LYNQ_AP_VERSION="T106CN-ZS03.V2.01.01.02P50.AP.07.04"
+LYNQ_CAP_INSIDE_VERSION="CAP.07.04"
+LYNQ_CAP_VERSION="CAP.07.04"
 COMMIT_ID="$(git rev-parse HEAD)"
 
 LYNQ_SW_INSIDE_VERSION="LYNQ_CONFIG_VERSION = \"${LYNQ_AP_VERSION}_${LYNQ_CAP_INSIDE_VERSION}\""