Merge "Revert "[Feature]][ZXW-56][CALL] add  oem api demo code""
diff --git a/ap/os/linux/linux-3.4.x/arch/arm/mach-zx297520v3/zx297520v3-mdl-devices.c b/ap/os/linux/linux-3.4.x/arch/arm/mach-zx297520v3/zx297520v3-mdl-devices.c
index 7134e18..d3165a9 100644
--- a/ap/os/linux/linux-3.4.x/arch/arm/mach-zx297520v3/zx297520v3-mdl-devices.c
+++ b/ap/os/linux/linux-3.4.x/arch/arm/mach-zx297520v3/zx297520v3-mdl-devices.c
@@ -948,7 +948,7 @@
 static struct gpio_keys_button zx29_keypad_int[] = {
 	#if 1
 	{
-		.active_low	= 1,				/*ÊÇ·ñµÍµçƽÓÐЧ¡£1: °´ÏÂΪµÍµçƽ  0: °´ÏÂΪ¸ßµçƽ*/
+		.active_low	= 1,				/*\CAǷ\F1\B5͵\E7ƽ\D3\D0Ч\A1\A31: \B0\B4\CF\C2Ϊ\B5͵\E7ƽ  0: \B0\B4\CF\C2Ϊ\B8ߵ\E7ƽ*/
 		.desc       = "kpd_power",
 		.code       = KEY_POWER         /* power: 116 */,
 		.use_pmu_pwron = 1,             /*true: use pmu pwron interrupt fase: use zx297520v2 ext int*/
@@ -1486,11 +1486,15 @@
 	/*
 	  *i2c devices on bus 1
 	  */
+//xf.li@20230626 add for T106BUG-26 start
+#if 0
 	devices_num = ARRAY_SIZE(zx29_i2c1_devices);
 	if (devices_num){
 		ret = i2c_register_board_info(1,zx29_i2c1_devices, devices_num);
 		if(ret)
 			BUG();
 	}
+#endif
+//xf.li@20230626 add for T106BUG-26 end
 }
 #endif
diff --git a/ap/project/zx297520v3/prj_vehicle_dc/config/normal/config.linux b/ap/project/zx297520v3/prj_vehicle_dc/config/normal/config.linux
index 37a50ac..1d95ab8 100755
--- a/ap/project/zx297520v3/prj_vehicle_dc/config/normal/config.linux
+++ b/ap/project/zx297520v3/prj_vehicle_dc/config/normal/config.linux
@@ -1397,93 +1397,8 @@
 # CONFIG_FB is not set
 # CONFIG_EXYNOS_VIDEO is not set
 # CONFIG_BACKLIGHT_LCD_SUPPORT is not set
-#xf.li@20230428 add for codec start
-CONFIG_SOUND=y
+#CONFIG_SOUND is not set
 
-# CONFIG_SOUND_OSS_CORE is not set
-
-CONFIG_SND=y
-
-CONFIG_SND_TIMER=y
-
-CONFIG_SND_PCM=y
-
-CONFIG_SND_JACK=y
-
-# CONFIG_SND_SEQUENCER is not set
-
-# CONFIG_SND_MIXER_OSS is not set
-
-# CONFIG_SND_PCM_OSS is not set
-
-# CONFIG_SND_HRTIMER is not set
-
-# CONFIG_SND_DYNAMIC_MINORS is not set
-
-CONFIG_SND_SUPPORT_OLD_API=y
-
-CONFIG_SND_VERBOSE_PROCFS=y
-
-# CONFIG_SND_VERBOSE_PRINTK is not set
-
-# CONFIG_SND_DEBUG is not set
-
-# CONFIG_SND_RAWMIDI_SEQ is not set
-
-# CONFIG_SND_OPL3_LIB_SEQ is not set
-
-# CONFIG_SND_OPL4_LIB_SEQ is not set
-
-# CONFIG_SND_SBAWE_SEQ is not set
-
-# CONFIG_SND_EMU10K1_SEQ is not set
-
-CONFIG_SND_DRIVERS=y
-
-# CONFIG_SND_DUMMY is not set
-
-# CONFIG_SND_ALOOP is not set
-
-# CONFIG_SND_MTPAV is not set
-
-# CONFIG_SND_SERIAL_U16550 is not set
-
-# CONFIG_SND_MPU401 is not set
-
-CONFIG_SND_ARM=y
-
-CONFIG_SND_SPI=y
-
-CONFIG_SND_SOC=y
-
-CONFIG_SND_SOC_SANECHIPS=y
-
-# CONFIG_SND_SOC_ZX297520V3_TI3100 is not set
-
-CONFIG_SND_SOC_ZX297520V3_NAU8810=y
-
-# CONFIG_SND_SOC_ZX297520V3_ES8374 is not set
-
-# CONFIG_SND_SOC_ZX297520V3_ES8312 is not set
-
-CONFIG_SND_SOC_ZX_VOICE=y
-
-CONFIG_SND_SOC_ZX297520V3=y
-
-CONFIG_SND_SOC_ZX_I2S=y
-
-CONFIG_SND_SOC_ZX_PCM=y
-
-CONFIG_SND_SOC_NAU8810=y
-
-# CONFIG_SND_EXTRA_CTRL is not set
-
-CONFIG_SND_SOC_I2C_AND_SPI=y
-
-# CONFIG_SND_SOC_ALL_CODECS is not set
-
-# CONFIG_SOUND_PRIME is not set
-#xf.li@20230428 add for codec end
 # CONFIG_HID_SUPPORT is not set
 # CONFIG_USB_ARCH_HAS_OHCI is not set
 # CONFIG_USB_ARCH_HAS_EHCI is not set
diff --git a/cap/zx297520v3/sources/meta-zxic-custom/recipes-lynq/mobiletek-tester-rdit/mobiletek-tester-rdit.bb b/cap/zx297520v3/sources/meta-zxic-custom/recipes-lynq/mobiletek-tester-rdit/mobiletek-tester-rdit.bb
index dd99885..1af22a6 100755
--- a/cap/zx297520v3/sources/meta-zxic-custom/recipes-lynq/mobiletek-tester-rdit/mobiletek-tester-rdit.bb
+++ b/cap/zx297520v3/sources/meta-zxic-custom/recipes-lynq/mobiletek-tester-rdit/mobiletek-tester-rdit.bb
@@ -4,7 +4,7 @@
 LICENSE = "CLOSED"
 LICENSE = "CLOSED"
 LIC_FILES_CHKSUM = "file://LICENSE;md5=b1e07e8d88e26263e71d3a9e2aa9a2ff"
-DEPENDS += "liblynq-call liblynq-sms liblynq-network liblynq-sim liblynq-data"
+DEPENDS += "liblynq-call liblynq-sms liblynq-network liblynq-sim liblynq-data liblynq-qser-data"
 #inherit workonsrc
 WORKONSRC = "${TOPDIR}/../src/lynq/packages/apps/Mobiletek_Tester_RDIT"
 FILESEXTRAPATHS_prepend :="${TOPDIR}/../src/lynq/packages/apps/:"
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
old mode 100644
new mode 100755
index cfffa79..e1234e5
--- 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
@@ -23,7 +23,7 @@
 static pthread_mutex_t s_qser_data_cb_mutex = PTHREAD_MUTEX_INITIALIZER;
 static pthread_cond_t s_qser_data_cb_cond = PTHREAD_COND_INITIALIZER;
 
-#define data_xml_path "/data/lynq_qser_data_apn.xml"
+#define data_xml_path "/mnt/userdata/lynq_qser_data_apn.xml"
 
 static qser_data_call_evt_cb_t s_data_call_cb = NULL;
 const int apndb_offset = 683;
@@ -311,9 +311,23 @@
         goto FAILED;
     }
     modify_node = node->xmlChildrenNode;
-    modify_node = modify_node->next;
-    for (node_num = 0;node_num<(int)profile_idx;node_num++)
+    if(modify_node != NULL)
     {
+        modify_node = modify_node->next;
+    }
+    else
+    {
+        LYERRLOG("modify_node is null\n");
+        goto FAILED;
+    }
+    LYINFLOG("profile_idx is %d\n", (int)profile_idx);
+    for (node_num = 0;(node_num<(int)profile_idx);node_num++)
+    {
+        if(modify_node == NULL)
+        {
+            LYERRLOG("modify_node is null\n");
+            goto FAILED;
+        }
         if (xmlGetProp(modify_node, "profile_idx") == NULL)  //Null Node
         {
             modify_node = modify_node->next;
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 c7b49e5..acf9a30 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
@@ -1,7 +1,11 @@
 #include <stdio.h>

 #include <stdlib.h>

 #include <string.h>

+#include <sys/socket.h>

+#include <netinet/in.h>

+#include <arpa/inet.h>

 #include <libdata/lynq_data.h>

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

 #include "data.h"

 #define TEST_RESULT "lynq_result="

 

@@ -85,3 +89,317 @@
     printf("%s%d\n",TEST_RESULT,ret);

     return ret;  

 }

+//=====================================QSER-DATA=========================================================

+

+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};

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

+    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("LYNQ_QSER_DATA_INIT: 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);

+}

+

+int qser_init_data(int argc, char *argv[], int sp_test)

+{   

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

+    int ret = -1;

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

+    ret = qser_data_call_init(evt_cb);

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

+    return ret;

+}

+

+int qser_deinit_data(int argc, char *argv[], int sp_test)

+{

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

+

+    qser_data_call_destroy();

+    printf("LYNQ_QSER_DATA_DEINIT end\n");

+    return 0;

+}

+int qser_setup_data_call(int argc, char *argv[], int sp_test)

+{

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

+    int ret = -1;

+    qser_data_call_s datacall;

+    qser_data_call_error_e err = QSER_DATA_CALL_ERROR_NONE;

+    int ip_family_flag = atoi(argv[3]);

+

+    datacall.profile_idx = atoi(argv[1]);

+    datacall.reconnect = (bool)atoi(argv[2]);

+

+    if(strcmp(argv[3], "QSER_DATA_CALL_TYPE_IPV4") == 0)

+    {

+        datacall.ip_family = QSER_DATA_CALL_TYPE_IPV4;

+    }

+    else if(strcmp(argv[3], "QSER_DATA_CALL_TYPE_IPV6") == 0)

+    {

+        datacall.ip_family = QSER_DATA_CALL_TYPE_IPV6;

+    }

+    else if(strcmp(argv[3], "QSER_DATA_CALL_TYPE_IPV4V6") == 0)

+    {

+        datacall.ip_family = QSER_DATA_CALL_TYPE_IPV4V6;

+    }

+    else

+    {

+        printf("LYNQ_QSER_SETUP_DATA_CALL: ip_family input error\n");

+        return ret;

+    }

+

+    memcpy(datacall.cdma_username, argv[4], QSER_APN_USERNAME_SIZE+1);

+    memcpy(datacall.cdma_password, argv[5], QSER_APN_PASSWORD_SIZE+1);    

+    

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

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

+    return ret;

+}

+int qser_deactivte_data_call(int argc, char *argv[], int sp_test)

+{

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

+    int ret = -1;

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

+    qser_data_call_ip_family_e ip_family = QSER_DATA_CALL_TYPE_IPV4V6;

+    qser_data_call_error_e err = QSER_DATA_CALL_ERROR_NONE;

+

+    if(strcmp(argv[2], "QSER_DATA_CALL_TYPE_IPV4") == 0)

+    {

+        ip_family = QSER_DATA_CALL_TYPE_IPV4;

+    }

+    else if(strcmp(argv[2], "QSER_DATA_CALL_TYPE_IPV6") == 0)

+    {

+        ip_family = QSER_DATA_CALL_TYPE_IPV6;

+    }

+    else if(strcmp(argv[2], "QSER_DATA_CALL_TYPE_IPV4V6") == 0)

+    {

+        ip_family = QSER_DATA_CALL_TYPE_IPV4V6;

+    }

+    else

+    {

+        printf("LYNQ_QSER_DEACTIVATE_DATA_CALL: ip_family input error\n");

+        return ret;

+    }

+

+    ret = qser_data_call_stop(profile_idx_int, ip_family, &err);

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

+    return ret;

+}

+int qser_get_data_call_list(int argc, char *argv[], int sp_test)

+{

+    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};

+    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;

+    qser_data_call_ip_family_e ip_family = QSER_DATA_CALL_TYPE_IPV4V6;

+

+    if(strcmp(argv[2], "QSER_DATA_CALL_TYPE_IPV4") == 0)

+    {

+        ip_family = QSER_DATA_CALL_TYPE_IPV4;

+    }

+    else if(strcmp(argv[2], "QSER_DATA_CALL_TYPE_IPV6") == 0)

+    {

+        ip_family = QSER_DATA_CALL_TYPE_IPV6;

+    }

+    else if(strcmp(argv[2], "QSER_DATA_CALL_TYPE_IPV4V6") == 0)

+    {

+        ip_family = QSER_DATA_CALL_TYPE_IPV4V6;

+    }

+    else

+    {

+        printf("LYNQ_QSER_GET_DATA_CALL_LIST: ip_family input error\n");

+        return ret;

+    }

+    

+    ret = qser_data_call_info_get(profile_idx_int, ip_family, &info, &err);

+    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: 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));

+    inet_ntop(AF_INET6, &(info.v6.addr.gateway), buf_gateway, sizeof(buf_gateway));

+    inet_ntop(AF_INET6, &(info.v6.addr.pri_dns), buf_pri_dns, sizeof(buf_pri_dns));

+    inet_ntop(AF_INET6, &(info.v6.addr.sec_dns), buf_sec_dns, sizeof(buf_sec_dns));

+    printf("LYNQ_QSER_GET_DATA_CALL_LIST: 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);

+    return ret;

+}

+

+int lynq_qser_apn_set(int argc, char *argv[], int sp_test)

+{

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

+    int ret = -1;

+    qser_apn_info_s apn = {'1', QSER_APN_PDP_TYPE_IPV4V6, QSER_APN_AUTH_PROTO_DEFAULT, NULL, NULL, NULL, NULL};

+

+    apn.profile_idx = atoi(argv[1]);

+    //set pdptype

+    if(strcmp(argv[2], "QSER_APN_PDP_TYPE_IPV4") == 0)

+    {

+        apn.pdp_type = QSER_APN_PDP_TYPE_IPV4;

+    }

+    else if(strcmp(argv[2], "QSER_APN_PDP_TYPE_PPP") == 0)

+    {

+        apn.pdp_type = QSER_APN_PDP_TYPE_PPP;

+    }

+    else if(strcmp(argv[2], "QSER_APN_PDP_TYPE_IPV6") == 0)

+    {

+        apn.pdp_type = QSER_APN_PDP_TYPE_IPV6;

+    }

+    else if(strcmp(argv[2], "QSER_APN_PDP_TYPE_IPV4V6") == 0)

+    {

+        apn.pdp_type = QSER_APN_PDP_TYPE_IPV4V6;

+    }

+    else

+    {

+        printf("LYNQ_QSER_APN_SET: pdp_type input error\n");

+        return ret;

+    }

+    //set auth_proto

+    if(strcmp(argv[3], "QSER_APN_AUTH_PROTO_DEFAULT") == 0)

+    {

+        apn.auth_proto = QSER_APN_AUTH_PROTO_DEFAULT;

+    }

+    else if(strcmp(argv[3], "QSER_APN_AUTH_PROTO_NONE") == 0)

+    {

+        apn.auth_proto = QSER_APN_AUTH_PROTO_NONE;

+    }

+    else if(strcmp(argv[3], "QSER_APN_AUTH_PROTO_PAP") == 0)

+    {

+        apn.auth_proto = QSER_APN_AUTH_PROTO_PAP;

+    }

+    else if(strcmp(argv[3], "QSER_APN_AUTH_PROTO_CHAP") == 0)

+    {

+        apn.auth_proto = QSER_APN_AUTH_PROTO_CHAP;

+    }

+    else if(strcmp(argv[3], "QSER_APN_AUTH_PROTO_PAP_CHAP") == 0)

+    {

+        apn.auth_proto = QSER_APN_AUTH_PROTO_PAP_CHAP;

+    }

+    else

+    {

+        printf("LYNQ_QSER_APN_SET: auth_proto input error\n");

+        return ret;

+    }

+    memcpy(apn.apn_name,argv[4],sizeof(argv[4]));

+    memcpy(apn.username,argv[5],sizeof(argv[5]));

+    memcpy(apn.password,argv[6],sizeof(argv[6]));

+    memcpy(apn.apn_type,argv[7],sizeof(argv[7]));

+    ret = qser_apn_set(&apn);

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

+    return ret;

+}

+int lynq_qser_apn_get(int argc, char *argv[], int sp_test)

+{

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

+    int ret = -1;

+    qser_apn_info_s apn = {0};

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

+    ret = qser_apn_get(profile_idx_int, &apn);

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

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

+        ,apn.apn_type, apn.auth_proto, apn.apn_name, apn.username, apn.password, apn.apn_type);

+    return ret;

+}

+int lynq_qser_apn_add(int argc, char *argv[], int sp_test)

+{

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

+    int ret = -1;

+    unsigned char profile_idx_char;

+    qser_apn_add_s apn = {QSER_APN_PDP_TYPE_IPV4V6, QSER_APN_AUTH_PROTO_DEFAULT, "cmnet", NULL, NULL, NULL};

+

+    if(strcmp(argv[1], "QSER_APN_PDP_TYPE_IPV4") == 0)

+    {

+        apn.pdp_type = QSER_APN_PDP_TYPE_IPV4;

+    }

+    else if(strcmp(argv[1], "QSER_APN_PDP_TYPE_PPP") == 0)

+    {

+        apn.pdp_type = QSER_APN_PDP_TYPE_PPP;

+    }

+    else if(strcmp(argv[1], "QSER_APN_PDP_TYPE_IPV6") == 0)

+    {

+        apn.pdp_type = QSER_APN_PDP_TYPE_IPV6;

+    }

+    else if(strcmp(argv[1], "QSER_APN_PDP_TYPE_IPV4V6") == 0)

+    {

+        apn.pdp_type = QSER_APN_PDP_TYPE_IPV4V6;

+    }

+    else

+    {

+        printf("LYNQ_QSER_APN_ADD: pdp_type input error\n");

+        return ret;

+    }

+    //set auth_proto

+    if(strcmp(argv[2], "QSER_APN_AUTH_PROTO_DEFAULT") == 0)

+    {

+        apn.auth_proto = QSER_APN_AUTH_PROTO_DEFAULT;

+    }

+    else if(strcmp(argv[2], "QSER_APN_AUTH_PROTO_NONE") == 0)

+    {

+        apn.auth_proto = QSER_APN_AUTH_PROTO_NONE;

+    }

+    else if(strcmp(argv[2], "QSER_APN_AUTH_PROTO_PAP") == 0)

+    {

+        apn.auth_proto = QSER_APN_AUTH_PROTO_PAP;

+    }

+    else if(strcmp(argv[2], "QSER_APN_AUTH_PROTO_CHAP") == 0)

+    {

+        apn.auth_proto = QSER_APN_AUTH_PROTO_CHAP;

+    }

+    else if(strcmp(argv[2], "QSER_APN_AUTH_PROTO_PAP_CHAP") == 0)

+    {

+        apn.auth_proto = QSER_APN_AUTH_PROTO_PAP_CHAP;

+    }

+    else

+    {

+        printf("LYNQ_QSER_APN_ADD: auth_proto input error\n");

+        return ret;

+    }

+    memcpy(apn.apn_name,argv[3],sizeof(argv[3]));

+    memcpy(apn.username,argv[4],sizeof(argv[4]));

+    memcpy(apn.password,argv[5],sizeof(argv[5]));

+    memcpy(apn.apn_type,argv[6],sizeof(argv[6]));

+    printf("LYNQ_QSER_APN_ADD: ready to qser_apn_add\n");

+    ret = qser_apn_add(&apn, &profile_idx_char);

+    printf("%s%d,profile = %d\n",TEST_RESULT,ret,profile_idx_char);

+    return ret;

+}

+int lynq_qser_apn_del(int argc, char *argv[], int sp_test)

+{

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

+    int ret = -1;

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

+    ret = qser_apn_del(profile_idx_int);

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

+    return ret;

+}

+int lynq_qser_apn_get_list(int argc, char *argv[], int sp_test)

+{

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

+    int ret = -1;

+    qser_apn_info_list_s apn_list = {0};

+    ret = qser_apn_get_list(&apn_list);

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

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

+    {

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

+            ,apn_list.apn[i].apn_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);

+    }

+    return ret;

+}

diff --git a/cap/zx297520v3/src/lynq/packages/apps/Mobiletek_Tester_RDIT/data.h b/cap/zx297520v3/src/lynq/packages/apps/Mobiletek_Tester_RDIT/data.h
index 8ca841e..af70f2e 100755
--- a/cap/zx297520v3/src/lynq/packages/apps/Mobiletek_Tester_RDIT/data.h
+++ b/cap/zx297520v3/src/lynq/packages/apps/Mobiletek_Tester_RDIT/data.h
@@ -6,3 +6,13 @@
 int wait_data_call(int argc, char *argv[], int sp_test);

 int setup_data_call_sp(int argc, char *argv[], int sp_test);

 int get_data_call_list(int argc, char *argv[], int sp_test);

+int qser_init_data(int argc, char *argv[], int sp_test);

+int qser_deinit_data(int argc, char *argv[], int sp_test);

+int qser_setup_data_call(int argc, char *argv[], int sp_test);

+int qser_deactivte_data_call(int argc, char *argv[], int sp_test);

+int qser_get_data_call_list(int argc, char *argv[], int sp_test);

+int lynq_qser_apn_set(int argc, char *argv[], int sp_test);

+int lynq_qser_apn_get(int argc, char *argv[], int sp_test);

+int lynq_qser_apn_add(int argc, char *argv[], int sp_test);

+int lynq_qser_apn_del(int argc, char *argv[], int sp_test);

+int lynq_qser_apn_get_list(int argc, char *argv[], int sp_test);
\ No newline at end of file
diff --git a/cap/zx297520v3/src/lynq/packages/apps/Mobiletek_Tester_RDIT/lynq.h b/cap/zx297520v3/src/lynq/packages/apps/Mobiletek_Tester_RDIT/lynq.h
index 6472942..d37f10d 100755
--- a/cap/zx297520v3/src/lynq/packages/apps/Mobiletek_Tester_RDIT/lynq.h
+++ b/cap/zx297520v3/src/lynq/packages/apps/Mobiletek_Tester_RDIT/lynq.h
@@ -46,4 +46,16 @@
 #define LYNQ_SETUP_DATA_CALL_SP LYNQ_DATA + 6
 #define LYNQ_GET_DATA_CALL_LIST LYNQ_DATA + 7
 
+#define LYNQ_QSER_DATA LYNQ_BASE + 70
+#define LYNQ_QSER_DATA_INIT LYNQ_QSER_DATA + 1
+#define LYNQ_QSER_DATA_DEINIT LYNQ_QSER_DATA + 2
+#define LYNQ_QSER_SETUP_DATA_CALL LYNQ_QSER_DATA + 3
+#define LYNQ_QSER_DEACTIVATE_DATA_CALL LYNQ_QSER_DATA + 4
+#define LYNQ_QSER_GET_DATA_CALL_LIST LYNQ_QSER_DATA + 5
+#define LYNQ_QSER_APN_SET LYNQ_QSER_DATA + 6
+#define LYNQ_QSER_APN_GET LYNQ_QSER_DATA + 7
+#define LYNQ_QSER_APN_ADD LYNQ_QSER_DATA + 8
+#define LYNQ_QSER_APN_DEL LYNQ_QSER_DATA + 9
+#define LYNQ_QSER_APN_GET_LIST LYNQ_QSER_DATA + 10
+
 int create_socket(const int domain, const int type, const int protocol,const int port,const char *IP,const char *socket_name,void * addr,int backlog,int cs);
diff --git a/cap/zx297520v3/src/lynq/packages/apps/Mobiletek_Tester_RDIT/makefile b/cap/zx297520v3/src/lynq/packages/apps/Mobiletek_Tester_RDIT/makefile
index 2ec043b..5922e77 100755
--- a/cap/zx297520v3/src/lynq/packages/apps/Mobiletek_Tester_RDIT/makefile
+++ b/cap/zx297520v3/src/lynq/packages/apps/Mobiletek_Tester_RDIT/makefile
@@ -28,6 +28,7 @@
     -llynq-network \
     -llynq-data \
     -llynq-sim \
+    -llynq-qser-data \
 
 
 SOURCES = main.cpp cc.cpp dispatch.cpp sms.cpp network.cpp data.cpp
diff --git a/cap/zx297520v3/src/lynq/packages/apps/Mobiletek_Tester_RDIT/req_commands.h b/cap/zx297520v3/src/lynq/packages/apps/Mobiletek_Tester_RDIT/req_commands.h
index d8e275c..a5017b5 100755
--- a/cap/zx297520v3/src/lynq/packages/apps/Mobiletek_Tester_RDIT/req_commands.h
+++ b/cap/zx297520v3/src/lynq/packages/apps/Mobiletek_Tester_RDIT/req_commands.h
@@ -28,9 +28,20 @@
     {"LYNQ_DATA_DEINIT",deinit_data, "deinit the data lib", LYNQ_DATA_DEINIT},
     {"LYNQ_SETUP_DATA_CALL",setup_data_call, "set up data call", LYNQ_SETUP_DATA_CALL},
     {"LYNQ_SETUP_DATA_CALL_SP",setup_data_call_sp, "set up data call sp", LYNQ_SETUP_DATA_CALL_SP},
-    {"LYNQ_DEACTIVATE_DATA_CALL",deactivte_data_call, "wait data call", LYNQ_DEACTIVATE_DATA_CALL},
+    {"LYNQ_DEACTIVATE_DATA_CALL",deactivte_data_call, "deactive data call", LYNQ_DEACTIVATE_DATA_CALL},
     {"LYNQ_WAIT_DATA_CALL",wait_data_call, "wait data call", LYNQ_WAIT_DATA_CALL},
-    {"LYNQ_GET_DATA_CALL_LIST",get_data_call_list, "wait data call", LYNQ_GET_DATA_CALL_LIST},
+    {"LYNQ_GET_DATA_CALL_LIST",get_data_call_list, "get data call list", LYNQ_GET_DATA_CALL_LIST},
+//QSER_DATA
+    {"LYNQ_QSER_DATA_INIT",qser_init_data, "init the data lib", LYNQ_QSER_DATA_INIT},
+    {"LYNQ_QSER_DATA_DEINIT",qser_deinit_data, "deinit the data lib", LYNQ_QSER_DATA_DEINIT},
+    {"LYNQ_QSER_SETUP_DATA_CALL",qser_setup_data_call, "set up data call", LYNQ_QSER_SETUP_DATA_CALL},
+    {"LYNQ_QSER_DEACTIVATE_DATA_CALL",qser_deactivte_data_call, "deactive data call", LYNQ_QSER_DEACTIVATE_DATA_CALL},
+    {"LYNQ_QSER_GET_DATA_CALL_LIST",qser_get_data_call_list, "get data call list", LYNQ_QSER_GET_DATA_CALL_LIST},
+    {"LYNQ_QSER_APN_SET",lynq_qser_apn_set, "set apn", LYNQ_QSER_APN_SET},
+    {"LYNQ_QSER_APN_GET",lynq_qser_apn_get, "get apn", LYNQ_QSER_APN_GET},
+    {"LYNQ_QSER_APN_ADD",lynq_qser_apn_add, "set apn", LYNQ_QSER_APN_ADD},
+    {"LYNQ_QSER_APN_DEL",lynq_qser_apn_del, "del apn", LYNQ_QSER_APN_DEL},
+    {"LYNQ_QSER_APN_GET_LIST",lynq_qser_apn_get_list, "get apn list", LYNQ_QSER_APN_GET_LIST},
     {(char *)NULL, NULL, (char *)NULL , -1},