Squashed 'LYNQ_PUBLIC/' changes from f3167cdb0..3d04c4df6

3d04c4df6 [Feature][T8TSK-289] chagne packagegroup-lync-mt2735 to packagegroup-lynq-mt2735
5a98de181 Merge "[Feature][ZK-65][mtklog] ftp log to soc 2  set max syslog size to 2700M"
dca9ff302 [Feature][ZK-65][mtklog] ftp log to soc 2  set max syslog size to 2700M
d36491f92 Merge "[Feature][ZK-65][mtklog] ftp log to soc"
4e37932a9 [Feature][T8TSK-289] add liblynq-at-fota, lynq-log-transfer & change packagegroup-lync-mt2735
5c0d3160b [Feature][ZK-65][mtklog] ftp log to soc
be7540ca5 [Feature][T8TSK-305][FOTA]fix fota to mergev2.0
305fadcb2 [bugfix][API-1525][call] answer call  sometimes fail
b26cb1ccb [Feature][T8TSK-289] merge rndis_status of uci config from old platform branch
e1d75e9dc [Feature][T8TSK-289] merge lynq-ril-service from old platform branch
604e75d9c Merge "[Feature][T8TSK-289] add at+gpsinfo command"
67117dd03 Merge "[Feature][T8TSK-289] merge liblynq-sim from old platform branch"
24d54af81 [Feature][T8TSK-289] merge liblynq-sim from old platform branch
b990775f9 [Feature][T8TSK-289] add at+gpsinfo command
7a54b2130 [Feature][T8TSK-289] temp fix circle reboot caused by fota backup

git-subtree-dir: LYNQ_PUBLIC
git-subtree-split: 3d04c4df6c666dad1d8f09839b8f4989e26d22a4
Change-Id: I998dc04ab224e6fefdd82db6370791456784c560
diff --git a/IC_meta/mtk/2735/liblynq-at-fota/liblynq-at-fota.bb b/IC_meta/mtk/2735/liblynq-at-fota/liblynq-at-fota.bb
new file mode 100755
index 0000000..f22fcb2
--- /dev/null
+++ b/IC_meta/mtk/2735/liblynq-at-fota/liblynq-at-fota.bb
@@ -0,0 +1,47 @@
+inherit externalsrc package

+

+DESCRIPTION = "liblynq-at-fota"

+LICENSE = "MobiletekProprietary"

+LIC_FILES_CHKSUM = "file://LICENSE;md5=c8a2ee6e65c8c0723cb8de987f22458c"

+DEPENDS += "platform-libs liblynq-log liblynq-protcl liblynq-fota"

+inherit workonsrc

+WORKONSRC = "${TOPDIR}/../LYNQ_PUBLIC/common_src/lib/liblynq-at-fota"

+

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

+               ${base_bindir}\

+               ${base_sbindir} \

+               /etc/dbus-1/system.d/"

+FILES_${PN}-dev = "/test \

+                   ${includedir}"

+FILES_${PN}-doc = "/doc"

+FILES_${PN}-dbg ="${base_bindir}/.debug \

+                  ${base_libdir}/.debug \

+                  ${base_sbindir}/.debug"

+INSANE_SKIP_${PN} += "already-stripped"

+INSANE_SKIP_${PN} += "installed-vs-shipped"

+#INHIBIT_PACKAGE_STRIP = "1"

+do_compile () {

+	if [ "${PACKAGE_ARCH}" = "cortexa7hf-vfp-vfpv4-neon" ]; then

+		oe_runmake all ROOT=${STAGING_DIR_HOST} OFLAGS="--sysroot=${STAGING_DIR_HOST} -Os -mfpu=neon-vfpv4 -mhard-float -Wl,--hash-style=gnu -DTELEPHONYWARE"

+	elif [ "${PACKAGE_ARCH}" = "cortexa7hf-neon-vfpv4" ]; then

+		oe_runmake all ROOT=${STAGING_DIR_HOST} OFLAGS="--sysroot=${STAGING_DIR_HOST} -Os -mfpu=neon-vfpv4 -mhard-float -Wl,--hash-style=gnu -DTELEPHONYWARE"

+	elif [ "${PACKAGE_ARCH}" = "cortexa53hf-neon-fp-armv8" ]; then

+		oe_runmake all ROOT=${STAGING_DIR_HOST} OFLAGS="--sysroot=${STAGING_DIR_HOST} -Os -mfpu=neon-vfpv4 -mhard-float -Wl,--hash-style=gnu -DTELEPHONYWARE -mhard-float -mfpu=neon-fp-armv8 -mfloat-abi=hard -mcpu=cortex-a53 -mtune=cortex-a53"

+	else

+		oe_runmake all ROOT=${STAGING_DIR_HOST} OFLAGS="--sysroot=${STAGING_DIR_HOST} -Os -Wl,--hash-style=gnu -DTELEPHONYWARE"

+	fi

+}

+

+do_install() {

+    oe_runmake install ROOT=${D}

+    if [ -d "${WORKONSRC}" ] ; then

+        install -d ${D}${includedir}

+        cp -af ${S}/include/libat/ ${D}${includedir}/libat

+    fi

+}

+

diff --git a/IC_meta/mtk/2735/lynq-log-transfer/lynq-log-transfer.bb b/IC_meta/mtk/2735/lynq-log-transfer/lynq-log-transfer.bb
new file mode 100755
index 0000000..b067aaa
--- /dev/null
+++ b/IC_meta/mtk/2735/lynq-log-transfer/lynq-log-transfer.bb
@@ -0,0 +1,30 @@
+inherit externalsrc package
+
+DESCRIPTION = "lynq-log-transfer"
+LICENSE = "CLOSED"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=e1696b147d49d491bcb4da1a57173fff"
+DEPENDS += "platform-libs liblynq-log"
+inherit workonsrc
+WORKONSRC = "${TOPDIR}/../LYNQ_PUBLIC/IC_src/mtk/packages/apps/lynq-log-transfer"
+
+TARGET_CC_ARCH += "${LDFLAGS}"
+
+
+#INHIBIT_PACKAGE_STRIP = "1"
+do_compile () {
+	if [ "${PACKAGE_ARCH}" = "cortexa7hf-vfp-vfpv4-neon" ]; then
+		oe_runmake all ROOT=${STAGING_DIR_HOST} OFLAGS="--sysroot=${STAGING_DIR_HOST} -Os -mhard-float -Wl,--hash-style=gnu -DTELEPHONYWARE"
+	elif [ "${PACKAGE_ARCH}" = "cortexa7hf-neon-vfpv4" ]; then
+		oe_runmake all ROOT=${STAGING_DIR_HOST} OFLAGS="--sysroot=${STAGING_DIR_HOST} -Os -mhard-float -Wl,--hash-style=gnu -DTELEPHONYWARE"
+	elif [ "${PACKAGE_ARCH}" = "cortexa53hf-neon-fp-armv8" ]; then
+		oe_runmake all ROOT=${STAGING_DIR_HOST} OFLAGS="--sysroot=${STAGING_DIR_HOST} -Os -mhard-float -Wl,--hash-style=gnu -DTELEPHONYWARE -mhard-float -mfpu=neon-fp-armv8 -mfloat-abi=hard -mcpu=cortex-a53 -mtune=cortex-a53"
+	else
+		oe_runmake all ROOT=${STAGING_DIR_HOST} OFLAGS="--sysroot=${STAGING_DIR_HOST} -Os -Wl,--hash-style=gnu -DTELEPHONYWARE"
+	fi
+}
+
+do_install() {
+	install -d ${D}${bindir}/
+	install -m 0755 ${S}/lynq-log-transfer ${D}${bindir}/
+	install -m 0755 ${B}/lynq_inner_log_transfer.sh ${D}${bindir}/
+}
diff --git a/IC_meta/mtk/2735/lynq-ril-service/lynq-ril-service.bb b/IC_meta/mtk/2735/lynq-ril-service/lynq-ril-service.bb
index 848f503..ece6cd1 100755
--- a/IC_meta/mtk/2735/lynq-ril-service/lynq-ril-service.bb
+++ b/IC_meta/mtk/2735/lynq-ril-service/lynq-ril-service.bb
@@ -6,6 +6,7 @@
 DEPENDS += "platform-libs audio-mixer-ctrl libvendor-ril  libpal gstreamer1.0 glib-2.0 dtmf libapn dbus liblynq-log liblynq-systime liblynq-uci liblynq-thermal liblynq-fota liblynq-protcl liblynq-shm liblynq-codec"
 inherit workonsrc
 WORKONSRC = "${TOPDIR}/../LYNQ_PUBLIC/common_src/framework/lynq-ril-service/src"
+MTK_LED_SUPPORT ?= "no"
 
 TARGET_CC_ARCH += "${LDFLAGS}"
 SYSTEMD_PACKAGES = "${PN}"
@@ -15,7 +16,8 @@
 #Parameters passed to do_compile()
 EXTRA_OEMAKE = "'RAT_CONFIG_C2K_SUPPORT = ${RAT_CONFIG_C2K_SUPPORT}'\
                 'MTK_MULTI_SIM_SUPPORT = ${MTK_MULTI_SIM_SUPPORT}'\
-                'TARGET_PLATFORM = ${TARGET_PLATFORM}'"
+                'TARGET_PLATFORM = ${TARGET_PLATFORM}'\
+                'MTK_LED_SUPPORT = ${MTK_LED_SUPPORT}'"
 
 #INHIBIT_PACKAGE_STRIP = "1"
 do_compile () {
diff --git a/IC_meta/mtk/2735/packagegroups/packagegroup-lync-mt2735.bb b/IC_meta/mtk/2735/packagegroups/packagegroup-lynq-mt2735.bb
similarity index 91%
rename from IC_meta/mtk/2735/packagegroups/packagegroup-lync-mt2735.bb
rename to IC_meta/mtk/2735/packagegroups/packagegroup-lynq-mt2735.bb
index 9546799..5d637e5 100755
--- a/IC_meta/mtk/2735/packagegroups/packagegroup-lync-mt2735.bb
+++ b/IC_meta/mtk/2735/packagegroups/packagegroup-lynq-mt2735.bb
@@ -3,7 +3,7 @@
 
 inherit packagegroup
 
-RDEPENDS_packagegroup-lync-mt2735 = "\
+RDEPENDS_packagegroup-lynq-mt2735 = "\
     libautosuspend \
     libpoweralarm \
     lynq-autosuspend \
@@ -39,9 +39,7 @@
     liblynq-system-own \
     lynq-wg870 \
     lynq-ril-service \
-    lynq-uart-service \
     lynq-sdk-ready \
-    lynq-ndis-uevent \
     liblynq-call \
     liblynq-data \
     liblynq-sms \
@@ -51,11 +49,11 @@
     liblynq-at-factory \
     liblynq-at-common \
     lynq-gnss-test \
-    lynq-audio-service \
     ntp \
     tzdata \
     lynq-tester-service \
     liblynq-shm \
     liblynq-misc \
     liblynq-codec \
+	liblynq-at-fota \
     "
diff --git a/IC_src/mtk/lib/liblynq-fota/include/iot_rock.h b/IC_src/mtk/lib/liblynq-fota/include/iot_rock.h
index a6e6821..ea557b9 100755
--- a/IC_src/mtk/lib/liblynq-fota/include/iot_rock.h
+++ b/IC_src/mtk/lib/liblynq-fota/include/iot_rock.h
@@ -140,7 +140,7 @@
 

 

 int iot_patch(IOT_UPDATA_CONTEXT* update_ctx);

-

+int lynq_read_process(void);

 unsigned int iot_hash(unsigned char *buf,unsigned int len, unsigned int* value);

 int lynq_md5_file_verfy(char* filePath, char* file_md5);

 //xf.li@20230822 add for ab recover start

diff --git a/IC_src/mtk/lib/liblynq-fota/rock_ua/rock_ua.c b/IC_src/mtk/lib/liblynq-fota/rock_ua/rock_ua.c
index c970ce1..d510633 100755
--- a/IC_src/mtk/lib/liblynq-fota/rock_ua/rock_ua.c
+++ b/IC_src/mtk/lib/liblynq-fota/rock_ua/rock_ua.c
@@ -38,20 +38,9 @@
 #define ROCK_BACKUP_LEN ROCK_DEFAULT_BLOCK_SIZE
 
 
-
 #define FILENAME_SIZE   50
 
 
-
-//#define DEV_DELTA       "/dev/disk/by-partlabel/delta"
-#if 0
-#define DEV_DELTA       "/dev/disk/by-partlabel/delta"
-#else
-#define DEV_DELTA       "/dev/mtd41"    
-#endif
-
-
-
 char partition_filename_a[][FILENAME_SIZE] = {
     {"/dev/disk/by-partlabel/system_a"},
     {"/dev/disk/by-partlabel/boot_a"},
@@ -63,15 +52,15 @@
     {"/dev/disk/by-partlabel/oemapp2_a"},
     {"/dev/disk/by-partlabel/medmcu_a"},
     {"/dev/disk/by-partlabel/spm_a"},
-    {"/dev/disk/by-partlabel/protect_a"},    
+    {"/dev/disk/by-partlabel/protect_a"},
     {"/dev/disk/by-partlabel/mcf1_a"},
     {"/dev/disk/by-partlabel/mcf2_a"},
     {"/dev/disk/by-partlabel/mcupm_a"},
-    {"/dev/disk/by-partlabel/sspm_a"},    
+    {"/dev/disk/by-partlabel/sspm_a"},
     {"/dev/disk/by-partlabel/dpm_a"},
-    {"/dev/disk/by-partlabel/pi_img_a"},    
+    {"/dev/disk/by-partlabel/pi_img_a"},
     {"/dev/disk/by-partlabel/hsm_os_a"},
-    {"/dev/disk/by-partlabel/bl2_a"},    
+    {"/dev/disk/by-partlabel/bl2_a"},
     {"/dev/disk/by-partlabel/bl33_a"}
 };
 
@@ -85,17 +74,17 @@
     {"/dev/disk/by-partlabel/vbmeta_b"},
     {"/dev/disk/by-partlabel/oemapp_b"},
     {"/dev/disk/by-partlabel/oemapp2_b"},
-    {"/dev/disk/by-partlabel/medmcu_b"},    
+    {"/dev/disk/by-partlabel/medmcu_b"},
     {"/dev/disk/by-partlabel/spm_b"},
     {"/dev/disk/by-partlabel/protect_b"},
     {"/dev/disk/by-partlabel/mcf1_b"},
     {"/dev/disk/by-partlabel/mcf2_b"},
     {"/dev/disk/by-partlabel/mcupm_b"},
-    {"/dev/disk/by-partlabel/sspm_b"},    
+    {"/dev/disk/by-partlabel/sspm_b"},
     {"/dev/disk/by-partlabel/dpm_b"},
     {"/dev/disk/by-partlabel/pi_img_b"},
     {"/dev/disk/by-partlabel/hsm_os_b"},
-    {"/dev/disk/by-partlabel/bl2_b"},    
+    {"/dev/disk/by-partlabel/bl2_b"},
     {"/dev/disk/by-partlabel/bl33_b"}
 };
 
@@ -209,6 +198,7 @@
 static unsigned int  now_patch = 0;
 unsigned int  current_slot = 0;
 unsigned char rock_debug_buffer[512];
+char g_delta_mtd[16];
 
 
 
@@ -306,6 +296,23 @@
     close(fd_fota_status);
 }
 
+int lynq_read_process(void)
+{
+    int err;
+    fd_fota_status = open(FILE_FOTA_STATE,O_RDWR | O_CREAT,0777);
+
+    if (fd_fota_status < 0) {
+        err = errno;
+        RLOGD("+[UA]: save_fota_status: Error opening metadata file: %s\n",strerror(errno));
+        return -err;
+    }
+    memset(&fota_status, 0 , sizeof(fota_status));
+    read(fd_fota_status, &fota_status,sizeof(fota_status));
+    sync();
+    close(fd_fota_status);
+    return fota_status.ota_run;
+}
+
 static int save_fota_info()
 {
     int err;
@@ -343,12 +350,10 @@
 }
 
 int rock_process_block(void* ctx, unsigned char* data, unsigned int start, unsigned int size){
-    //rock_trace(ctx, "rock update progress block %d\n", size);
 
     int writen = 0;
     int ret,err;
-    
-    
+
     if (start == BACKUP_ADDR_FLAG) {
         int fd_backup = open(FILE_BACKUP,O_RDWR | O_CREAT,0777);
         while (writen < size) {
@@ -359,16 +364,14 @@
         close(fd_backup);
         return size;
     }
-    
-    
-    
+
     writen = 0;
    
     if (mtk_device_wrap_seek(fd_write, start, SEEK_SET) < 0) {
         err = errno;
         rock_trace(ctx, "mtk_device_wrap_seek write\n");
         return err;
-    } 
+    }
 
     while (writen < size) {
         ret = mtk_device_wrap_write(fd_write,data+writen, ROCK_DEFAULT_BLOCK_SIZE);
@@ -461,7 +464,7 @@
     } while(size > 0);
 
 
-    return ret;    
+    return ret;
    
     
 }
@@ -470,8 +473,7 @@
 int rock_read_delta(void* ctx, unsigned char* dest, unsigned int offset, unsigned int size){
 
     int ret = 0,err = 0;
-    
-    
+
     if (lseek(fd_delta, offset + delta_offset, SEEK_SET) < 0) {
         err = -errno;
         rock_trace(ctx, "mtk_device_wrap_seek df_delta err\n");
@@ -512,12 +514,68 @@
 int rock_delete_file(void* ctx, void* name){return 0;}
 /* ROCK IPL end */
 
+void delete_enter(char data[])
+{
+    char *find = strchr(data, ':');
+    if(find)
+        *find = '\0';
+    return ;
+}
+
+void get_delta_mtd(char *delta_mtd)
+{
+    FILE *fp;
+    char mtd_buffer[8];
+    fp = popen("cat /proc/mtd|grep delta|awk '{print $1}'","r");
+    fgets(mtd_buffer, sizeof(mtd_buffer), fp);
+    delete_enter(mtd_buffer);
+    sprintf(delta_mtd,"/dev/%s", mtd_buffer);
+    RLOGD("delta_mtd:%s\n", delta_mtd);
+    pclose(fp);
+    return;
+}
+
+int get_file_size(void)
+{
+    FILE *stream;
+    stream = fopen("/tmp/fota.delta", "r");
+    long file_size = -1;
+    long cur_offset = ftell(stream);
+    if (cur_offset == -1)
+    {
+        printf("ftell failed :%s\n", strerror(errno));
+        return -1;
+    }
+    if (fseek(stream, 0, SEEK_END) != 0)
+    {
+        printf("fseek failed: %s\n", strerror(errno));
+        return -1;
+    }
+    file_size = ftell(stream);
+    if (file_size == -1)
+    {
+        printf("ftell failed :%s\n", strerror(errno));
+    }
+    if (fseek(stream, cur_offset, SEEK_SET) != 0)
+    {
+        printf("fseek failed: %s\n", strerror(errno));
+        return -1;
+    }
+    fclose(stream);
+    if(file_size >52428800)
+    {
+        return -1;
+    }
+    return 0;
+}
 
 
 static int init_dev_fd()
 {
 
     int err;
+    int ret;
+    int result;
     char lynq_fota_addr[64] = {0};
     char fota_name[]= "fota.delta";
     int n;
@@ -526,6 +584,29 @@
         return E_ROCK_FOTA_ADDR;
     }
     RLOGD("+[UA]: get fota pack addr: %s\n",lynq_fota_addr);
+    if(!(strcmp(lynq_fota_addr, "/tmp/fota.delta")))
+    {
+        ret = get_file_size();
+        if(ret != 0)
+        {
+            RLOGD("the delta size over 50M\n");
+            return -1;
+        }
+        get_delta_mtd(g_delta_mtd);
+        result = test_write_delta(lynq_fota_addr, g_delta_mtd);
+        if(result != 0)
+        {
+            RLOGD("fota.delta write into mtd fail !\n");
+        }
+        strcpy(lynq_fota_addr, g_delta_mtd);
+    }
+    if(lynq_fota_set_addr_value(lynq_fota_addr,strlen(lynq_fota_addr)))
+    {
+            RLOGD("set addr fail\n");
+            return 1;
+    }
+    RLOGD("+[UA]: get fota pack addr: %s\n", lynq_fota_addr);
+
     fd_delta = open(lynq_fota_addr,O_RDWR);
 
     if (fd_delta < 0) {
@@ -570,9 +651,9 @@
 int test_write_delta(char *source, char *target)
 {
     int fd_source,fd_target,size;
-     
+    char buf[32];
     char delta_data[ROCK_DEFAULT_BLOCK_SIZE];
-     
+    char lynq_fota_addr[64];
     fd_source = open(source,O_RDONLY);
      
     if (fd_source < 0) {
@@ -588,7 +669,12 @@
         RLOGD("+[UA]: open target  error\n");
         return 1;
     } 
-    
+
+    if(!(strcmp(lynq_fota_addr, g_delta_mtd)))
+    {
+        sprintf(buf,"flash_eraseall %s", g_delta_mtd);
+        system(buf);
+    }
     while(( size = read(fd_source,delta_data,ROCK_DEFAULT_BLOCK_SIZE))>0) {
            mtk_device_wrap_write(fd_target,delta_data,ROCK_DEFAULT_BLOCK_SIZE);
     }
@@ -602,7 +688,7 @@
 int nand_copyto_nand(char *source, char *target)
 {
     int fd_source,fd_target,size;
-     
+
     char delta_data[ROCK_DEFAULT_BLOCK_SIZE];
      
     fd_source = mtk_device_wrap_open(source,O_RDONLY);
@@ -828,7 +914,7 @@
     ctx.ram_len = ROCK_RAM_LEN;
     ctx.backup_base = BACKUP_ADDR_FLAG;
     //ctx.backup_len = ROCK_DEFAULT_BLOCK_SIZE;
-    ctx.backup_len = 0;        
+    ctx.backup_len = 0;
     ctx.update_nvram = 0;
     ctx.read_rom_directly = read_rom_directly;
     //ctx.first_run = first_run;
@@ -845,7 +931,7 @@
     memset(&fota_status,0,sizeof(fota_status));
     RLOGD("+[UA]: up_info.ota_run = %d\n",up_info.ota_run);
 
-#if 0    
+#if 0
     if ((up_info.ota_run>PATCH_BL33)||(up_info.ota_run<PATCH_SYSTEM))
     {
         up_info.ota_run = 0;
@@ -870,10 +956,6 @@
     
     RLOGD("+[UA]: up_info.fota_flag = %s\n",up_info.fota_flag);
     RLOGD("+[UA]: update_mode = %d\n",update_mode);
-    
-    //memset(&da_head, 0, sizeof(da_head));
-
-    //read(fd_delta, (unsigned char*)&da_head, sizeof(da_head));
 
     memset(&delta_head, 0, sizeof(delta_head));
     read(fd_delta, (char *)&delta_head[0], sizeof(delta_head));
@@ -885,12 +967,10 @@
         if (delta_head[i] > 0) {
             fota_status.update_status[i].need_update = 1;
             delta_size+=delta_head[i];
-            
         }
-        RLOGD("+[UA]: %s,delta size = %d\n",partition_filename[i],delta_head[i]);    
+        RLOGD("+[UA]: %s,delta size = %d, i=%d\n",partition_filename[i],delta_head[i], i);
     }
-    
-    
+
     for(i = MAX_OTA_ROLE/2;i<(MAX_OTA_ROLE/2+REAL_OTA_ROLE); i++) {
         if (delta_head[i] > 0) {
             fota_status.update_status[i].need_update = 1;
@@ -928,13 +1008,6 @@
     fota_status.switch_slot = WAIT;
     save_fota_status();
 
-    //delta_size = da_head.sys + da_head.boot + da_head.tee + da_head.md1img + da_head.md1dsp + da_head.vbmeta + da_head.oemapp + da_head.oemapp2 + da_head.medmcu+da_head.bl33;
-    
-    //sha_size = da_head.full_sys + da_head.full_boot + da_head.full_tee + da_head.full_md1img + da_head.full_md1dsp + da_head.full_vbmeta + da_head.full_oemapp + da_head.full_oemapp2 + da_head.full_medmcu+da_head.full_bl33
-
-
-
-
     is_need_fullupdate = 0;
     if(sha_size>0) {
         is_need_fullupdate = 1;
@@ -958,7 +1031,7 @@
     RLOGD("+[UA]: delta calc sha = %s\n",str_sha);
     
     if(memcmp(digest_s,digest_t,SHA_DIGEST_SIZE)==0) {
-    
+
         RLOGD("sha verify pass\n");
     
     }else{
@@ -966,9 +1039,8 @@
         
         system("echo fota-interface >/sys/power/wake_unlock");
         return -1;
-    
     }
-    
+
     memset(digest_s,0,SHA_DIGEST_SIZE);
     memset(digest_t,0,SHA_DIGEST_SIZE);
     
@@ -1021,7 +1093,7 @@
             }            
             if(current_slot==SLOT_B){
                 fd_read  = fd_partition_b;
-                fd_write = fd_partition_a;    
+                fd_write = fd_partition_a;
             } else {
                 fd_read  = fd_partition_a;
                 fd_write = fd_partition_b;
@@ -1088,7 +1160,7 @@
                 return status;
             }
                 mtk_device_wrap_close(fd_read);
-                mtk_device_wrap_close(fd_write);        
+                mtk_device_wrap_close(fd_write);
         
         }
     
@@ -1766,28 +1838,39 @@
 {
     FILE *fp;
     char check_result[64];
+    int ret;
     if(strcmp(name, "oemapp") == 0)
     {
         RLOGD("lynq_check_oemapp oemapp");
-        if(system("df -lh|grep oemapp |grep -v oemapp2") != 0)
+        ret = system("cat /proc/mtd|grep oemapp");
+        if(ret != 0)
         {
             return 0;
         }
+        if(system("df -lh|grep oemapp |grep -v oemapp2") != 0)
+        {
+            return -1;
+        }
         else
         {
-            return 1;
+            return 0;
         }
     }
     else if(strcmp(name, "oemapp2") == 0)
     {
         RLOGD("lynq_check_oemapp oemapp2");
-        if(system("df -lh|grep oemapp2") != 0)
+        ret = system("cat /proc/mtd|grep oemapp2");
+        if(ret != 0)
         {
             return 0;
         }
+        if(system("df -lh|grep oemapp2") != 0)
+        {
+            return -1;
+        }
         else
         {
-            return 1;
+            return 0;
         }
     }
 }
@@ -1839,7 +1922,7 @@
     close(fd);
 
     RLOGD("[+UP]: lynq_up_info.ota_run=%d\n",lynq_up_info.ota_run);
-    if((lynq_check_oemapp("oemapp") == 0) || (lynq_check_oemapp("oemapp2") == 0))
+    if((lynq_check_oemapp("oemapp") != 0) || (lynq_check_oemapp("oemapp2") != 0))
     {
         RLOGD("ENTER LYNQ_CHECK_OEMAPP\n");
         system("echo mode 001 0 > /sys/devices/platform/10005000.pinctrl/mt_gpio");
diff --git a/IC_src/mtk/lib/liblynq-gnss/src/lynq_callback.c b/IC_src/mtk/lib/liblynq-gnss/src/lynq_callback.c
index 59a866a..6c0dff4 100755
--- a/IC_src/mtk/lib/liblynq-gnss/src/lynq_callback.c
+++ b/IC_src/mtk/lib/liblynq-gnss/src/lynq_callback.c
@@ -240,7 +240,11 @@
 

 void lynq_at_gps_location_callback(lynq_GpsLocation_ext* location)

 {

-

+    at_gpsinfo_ok = 1;

+    sprintf(gpsinfo, "+CGPSINFO: %.10lf,%.10lf,%f,%f,%.10lf,%f,%ld",location->legacyLocation.latitude \

+            , location->legacyLocation.longitude, location->horizontalAccuracyMeters,location->legacyLocation.bearing \

+            ,location->legacyLocation.altitude, location->legacyLocation.speed\

+            ,location->legacyLocation.timestamp/1000);

 }

 

 void lynq_at_gps_status_callback(GpsStatus* status)

diff --git a/IC_src/mtk/lib/liblynq-gnss/src/lynq_gnss.c b/IC_src/mtk/lib/liblynq-gnss/src/lynq_gnss.c
index 6c8ba42..0f9181f 100755
--- a/IC_src/mtk/lib/liblynq-gnss/src/lynq_gnss.c
+++ b/IC_src/mtk/lib/liblynq-gnss/src/lynq_gnss.c
@@ -51,6 +51,15 @@
 int g_gnss_sync_enable_flag = 0;

 int g_gnss_sync_done = 0;

 #endif

+

+enum

+{

+    Gnss_ok = 0,

+    Not_open = 1,

+    Not_located = 10,

+    Gnss_unknow = 100

+};

+

 /**

  * @brief mark gnss raw meas state

  * 0: deinit state

@@ -63,6 +72,8 @@
 int g_ttyGS_fd= -1;

 bool Open_ELT = true;

 #endif

+int at_gpsinfo_ok = 0;

+char gpsinfo[512] = {0};

 

 int lynq_gnss_init(void)

 {

@@ -155,6 +166,7 @@
     RLOGD("timer de init end");

     g_lynq_gnss_calback_flag = 0;

     g_lynq_gnss_init_flag = 0;

+    at_gpsinfo_ok = 0;

 #ifdef GNSS_ELT_OUTPUT_CFG

     if(g_ttyGS_fd >= 0)

     {

@@ -388,7 +400,8 @@
 void atsvc_incb_entity(const char *input,const int length);

 int lynq_at_cgps(int at_type,char *at_paramter);

 int lynq_at_cgpsnmea(int at_type,char *at_paramter);

-

+int lynq_at_cgpsinfo(void);

+void lynq_display_res(int res);

 

 int strUpper(char * str)

 {

@@ -516,14 +529,13 @@
     }

     else if (!strcmp(parse_atcmd[0], "AT+CGPSNMEA"))

     {

-        lynq_at_cgpsnmea(income_at_type,parse_atcmd[1]);

+        res = lynq_at_cgpsnmea(income_at_type,parse_atcmd[1]);

     }

-    else 

+    else if (!strcmp(parse_atcmd[0], "AT+CGPSINFO"))

     {

-        memcpy(gnss_at_cmd,"+CME ERROR: 100\r\n",strlen("+CME ERROR: 100\r\n"));

+        res = lynq_at_cgpsinfo();

     }

-    memcpy(gnss_at_cmd,"OK\r\n",4);

-    atsvc_gnss_outcb(gnss_at_cmd,4,0);

+    lynq_display_res(res);

 }

 

 

@@ -657,4 +669,43 @@
         }

         return 0;

     }

-}
\ No newline at end of file
+}

+

+int lynq_at_cgpsinfo()

+{

+    if(at_gps_status == 0)//not open gps

+    {

+        return Not_open;

+    }

+    if(at_gpsinfo_ok == 0)//means not valid location

+    {

+        return Not_located;

+    }

+    else

+    {

+        atsvc_gnss_outcb(gpsinfo, strlen(gpsinfo), 1);

+        return 0;

+    }

+}

+

+void lynq_display_res(int res)

+{

+    char res_buf[128] = {0};

+    switch (res)

+    {

+    case Gnss_ok:

+        sprintf(res_buf,"OK\r\n",4);

+        break;

+    case Not_open:

+        sprintf(res_buf, "+CME ERROR: %d\r\n", Not_open);

+        break;

+    case Not_located:

+        sprintf(res_buf, "+CME ERROR: %d\r\n", Not_located);

+        break;

+    default:

+        sprintf(res_buf,"+CME ERROR: %d\r\n", Gnss_unknow);

+        break;

+    }

+    atsvc_gnss_outcb(res_buf,strlen(res_buf),0);

+}

+

diff --git a/IC_src/mtk/lib/liblynq-gnss/src/lynq_gnsshal.h b/IC_src/mtk/lib/liblynq-gnss/src/lynq_gnsshal.h
index 04938c9..0b4f5e2 100755
--- a/IC_src/mtk/lib/liblynq-gnss/src/lynq_gnsshal.h
+++ b/IC_src/mtk/lib/liblynq-gnss/src/lynq_gnsshal.h
@@ -42,6 +42,8 @@
 

 extern lynq_atsvc_outcb atsvc_gnss_outcb;

 extern int at_gpsnmea_status;

+extern int at_gpsinfo_ok;

+extern char gpsinfo[512];

 

 typedef enum{

     LYNQ_ATCMD_TEST = 0,

diff --git a/IC_src/mtk/packages/apps/lynq-log-transfer/lynq_inner_log_transfer.sh b/IC_src/mtk/packages/apps/lynq-log-transfer/lynq_inner_log_transfer.sh
new file mode 100755
index 0000000..1a8a462
--- /dev/null
+++ b/IC_src/mtk/packages/apps/lynq-log-transfer/lynq_inner_log_transfer.sh
@@ -0,0 +1,762 @@
+#!/bin/bash
+#set -x
+#set -e
+
+ERROR_PARAM=1
+ERROR_FTP_SERVER_PING_NOT_OK=2
+ERROR_FTP_TRANSFER_FAIL=3
+ERROR_INNER_ERROR=4
+
+
+ERROR_IS_IN_TRANSFER_LOG=20
+
+ERROR_IS_IN_TRANSFER_SYS_LOG=$((ERROR_IS_IN_TRANSFER_LOG+0))
+ERROR_IS_IN_TRANSFER_REMAIN_SYS_LOG=$((ERROR_IS_IN_TRANSFER_LOG+1))
+ERROR_IS_IN_WAIT_TRRANSFER_REMAIN_SYS_LOG=$((ERROR_IS_IN_TRANSFER_LOG+2))
+
+ERROR_IS_IN_TRANSFER_MTK_LOG=$((ERROR_IS_IN_TRANSFER_LOG+5))
+ERROR_IS_IN_TRANSFER_REMAIN_MTK_LOG=$((ERROR_IS_IN_TRANSFER_LOG+6))
+ERROR_IS_IN_WAIT_TRRANSFER_REMAIN_MTK_LOG=$((ERROR_IS_IN_TRANSFER_LOG+7))
+
+
+ERROR_IS_IN_TRANSFER_DBG_LOG=$((ERROR_IS_IN_TRANSFER_LOG+10))
+ERROR_IS_IN_TRANSFER_REMAIN_DBG_LOG=$((ERROR_IS_IN_TRANSFER_LOG+11))
+ERROR_IS_IN_WAIT_TRRANSFER_REMAIN_DBG_LOG=$((ERROR_IS_IN_TRANSFER_LOG+12))
+
+
+DEBUG_FILE_PATH=/var/log/
+DEBUG_FILE_NAME=syslog.log
+DEBUG_FILE_BACKUP_NAME=log_transfer_debug_0.log
+DEBUG_FILE="${DEBUG_FILE_PATH}${DEBUG_FILE_NAME}"
+DEBUG_FILE_BACKUP="${DEBUG_FILE_PATH}${DEBUG_FILE_BACKUP_NAME}"
+
+if [ ! -d ${DEBUG_FILE_PATH} ]; then                    
+	mkdir -p ${DEBUG_FILE_PATH}
+fi    
+
+SYS_LOG_PATH="/var/log/"
+MTK_LOG_PATH="/var/log/mtklog/"
+TMP_LOG_PATH="/tmp/log_transfer_tmp/"
+MTK_LOG_BUFF_PATH="${TMP_LOG_PATH}mtklog_buffer/"
+MTK_LOG_MOUNT_PATH="${TMP_LOG_PATH}mtklog"
+CONTROL_FILE_PATH="${TMP_LOG_PATH}control/"
+LOG_IS_IN_TRANSFER=(
+     "${CONTROL_FILE_PATH}is_in_transfer_sys_log"
+     "${CONTROL_FILE_PATH}is_in_transfer_mtk_log"
+     "${CONTROL_FILE_PATH}is_in_transfer_dbg_log"
+    )
+WAIT_TRANSFER_REMAIN_LOG=(      
+      "${CONTROL_FILE_PATH}is_in_transfer_remain_sys_log"
+      "${CONTROL_FILE_PATH}is_in_transfer_remain_mtk_log"
+      "${CONTROL_FILE_PATH}is_in_transfer_remain_dbg_log"
+    )
+	
+TARGET_DIR=(      
+      "lynq/log/lynq_log_1"
+      "lynq/log/lynq_log_2"
+      "None"
+    )
+	
+target_dir=""
+
+	
+function is_in_debug()
+{
+    if [ -e "${LOG_IS_IN_TRANSFER[2]}" ] || [ -e "${WAIT_TRANSFER_REMAIN_LOG[2]}" ] 
+	then 
+        return 1
+    else
+        return 0
+    fi
+}
+
+
+log_print=(
+    "sys log"
+    "mtk log"
+    "dbg log"
+)
+
+loop_time=(
+    5
+    1
+    10
+)
+
+transfer_log_tag=(
+    0
+    0
+    0
+)
+
+LOG_PREFIX=(
+    "archive_log"
+    "MDLog"
+    ""
+)
+log_prefix=""
+
+#unit 0.1M
+SINGLE_FILE_SIZE=(
+    21
+    100
+    0
+)
+single_file_size=10
+
+#unit M
+INIT_LOG_MAX_SIZE=(
+    1000
+    2700
+    0
+)
+log_num_max=0
+LOG_DEL=$(($log_num_max/2))
+
+
+Q_CUR_NUM_UCI=(
+    "lynq_uci.lynq_log.log_1_cur_trf_num"
+    "lynq_uci.lynq_log.log_2_cur_trf_num"
+    ""
+)
+q_cur_num_uci=""
+
+Q_MAX_SIZE_UCI=(
+    "lynq_uci.lynq_log.log_1_max_size"
+    "lynq_uci.lynq_log.log_2_max_size"
+    ""
+)
+q_max_size_uci=""
+
+
+
+TAR_CMD="gzip"
+TAR_ARG=" -f"
+TAR_EXT="gz"
+
+UP_LOAD_POSTFIX=(
+    $TAR_EXT
+    "muxz"
+    ""
+)
+q_max_size_uci=""
+
+
+if [ ! -d ${CONTROL_FILE_PATH} ]; then                    
+    mkdir -p ${CONTROL_FILE_PATH}
+fi
+
+function clear_relative_tag()
+{      
+    length=${#transfer_log_tag[@]}
+   
+    for ((i=0;i<$length;i++))
+    do
+        if [ ${transfer_log_tag[$i]} -eq 1 ]; then                       
+            if [ $i -eq 0 ]; then              
+                rm -rf $SYS_LOG_PATH$log_prefix*                    
+            elif [ $i -eq 1 ]; then
+                echo 7 | emdlogger_ctrl        
+                rm -rf $MTK_LOG_PATH*
+                if [ -d ${MTK_LOG_BUFF_PATH} ]; then                    
+                    rm -rf ${MTK_LOG_BUFF_PATH}
+                fi   
+            fi
+        
+            if [ -e ${LOG_IS_IN_TRANSFER[$i]} ]; then        
+                rm -rf ${LOG_IS_IN_TRANSFER[$i]}
+            fi
+        
+            if [ -e ${WAIT_TRANSFER_REMAIN_LOG[$i]} ]; then
+                rm -rf ${WAIT_TRANSFER_REMAIN_LOG[$i]}         
+            fi                  
+        fi            
+    done     
+}
+
+function clear_relative_tag_when_exit()
+{
+    if [ $1 -eq $ERROR_FTP_TRANSFER_FAIL ]; then               
+       clear_relative_tag
+    fi          
+}
+
+function show_relative_tag()
+{    
+    length=${#LOG_IS_IN_TRANSFER[@]}
+   
+    for ((i=0;i<$length;i++))
+    do
+        if [ -e ${LOG_IS_IN_TRANSFER[$i]} ]; then                
+            echo_debug_info "now in transfer ${log_print[$i]}"        
+        else
+            echo_debug_info "now not in transfer ${log_print[$i]}"        
+        fi
+        
+        if [ -e ${WAIT_TRANSFER_REMAIN_LOG[$i]} ]; then                
+            echo_debug_info "now in transfer reamain ${log_print[$i]}"     
+        else
+            echo_debug_info "now not in transfer remain ${log_print[$i]}"         
+        fi    
+    done
+        
+    
+    if [ -d ${MTK_LOG_PATH} ]; then                
+        echo_debug_info "$MTK_LOG_PATH exists"        
+    else
+        echo_debug_info "$MTK_LOG_PATH not exists"        
+    fi    
+}
+
+function rotate_debug_file()
+{
+    filesize=`ls -l $DEBUG_FILE | awk '{ print $5 }'`
+    maxsize=1000000
+    if [ $filesize -gt $maxsize ]; then
+        mv $DEBUG_FILE $DEBUG_FILE_BACKUP
+        echo ""> $DEBUG_FILE
+    fi
+}
+
+currentTime=`date "+%Y%m%d_%H%M%S"`
+add_time_info=""
+function add_time_to_info()     
+{
+    currentTime=`date "+%Y%m%d_%H%M%S"`
+    add_time_info="${currentTime}$1"    
+}
+
+add_time_and_prefix_info=""
+function add_time_and_prefix_to_info()
+{
+    add_time_to_info "$1"
+    add_time_and_prefix_info="${2}${add_time_info}"
+}
+
+
+DBG_INFO_PREFIX="lynq_log_transfer "
+function echo_debug_info()
+{
+    echo $1
+    is_in_debug 	
+    if [ $? -eq 1 ]; then
+        add_time_and_prefix_to_info " $1" $DBG_INFO_PREFIX
+        echo $add_time_and_prefix_info >> $DEBUG_FILE        
+#       rotate_debug_file        
+    fi    
+}
+
+function print_usage()
+{   
+    echo "Usage : lynq-log-transfer 0 | 1 | 2 | 3 | 101 | 102 | 103 " >&2
+	echo "0 : Init, param like this: 0 config_id" >&2
+    echo "1 : Start Transfer syslog, param like this: 1 192.168.10.10 21 username passwword" >&2
+    echo "2 : Start Transfer mtklog,  param like this: 2 192.168.10.10 21 username passwword" >&2
+    echo "3 : Start debug and Transfer debug log,  param like this: 3" >&2
+    echo "101 : Stop transfer sys log, param like this: 101" >&2
+    echo "102 : Stop transfer mtk log, param like this: 102" >&2
+    echo "103 : Stop debug and stop transfer debug log, param like this: 103" >&2    
+    echo " ">&2
+    echo " ">&2
+}
+
+function print_exit_info()
+{
+    case "$1" in
+      0)
+        echo_debug_info "normal exit" 
+      ;;
+      $ERROR_PARAM)
+	    print_usage
+        echo_debug_info "param error"
+        ;;
+      $ERROR_FTP_SERVER_PING_NOT_OK)
+        echo_debug_info "ftp server ping not ok"
+        ;;  
+      $ERROR_FTP_TRANSFER_FAIL)
+        echo_debug_info "ftp transfer error"      
+        ;; 
+      $ERROR_INNER_ERROR)
+        echo_debug_info "inner error"
+        ;;
+      $ERROR_IS_IN_TRANSFER_SYS_LOG)
+        echo_debug_info "is still in transfering sys log"
+        ;;    
+      $ERROR_IS_IN_TRANSFER_REMAIN_SYS_LOG)  
+        echo_debug_info "is still in transfering remain sys log"
+        ;;  
+      $ERROR_IS_IN_WAIT_TRRANSFER_REMAIN_SYS_LOG)
+        echo_debug_info "is still waitting transfer remain sys log"
+        ;;       
+      $ERROR_IS_IN_TRANSFER_MTK_LOG)
+        echo_debug_info "is still in transfering mtk log"
+        ;;    
+      $ERROR_IS_IN_TRANSFER_REMAIN_MTK_LOG)  
+        echo_debug_info "is still in transfering remain mtk log"
+        ;;  
+      $ERROR_IS_IN_WAIT_TRRANSFER_REMAIN_MTK_LOG)
+        echo_debug_info "is still waitting transfer remain mtk log"
+        ;;           
+       $ERROR_IS_IN_TRANSFER_DBG_LOG)
+        echo_debug_info "is still in transfering dbg log"
+        ;;    
+      $ERROR_IS_IN_TRANSFER_REMAIN_DBG_LOG)  
+        echo_debug_info "is still in transfering remain dbg log"
+        ;;  
+      $ERROR_IS_IN_WAIT_TRRANSFER_REMAIN_DBG_LOG)
+        echo_debug_info "is still waitting transfer remain dbg log"
+        ;;           
+      *)
+        echo_debug_info "other error"
+        ;;
+    esac       
+}
+
+ftp_server="192.168.125.111/"
+ftp_user_name="abc"
+ftp_password="abc"
+ftp_port="21"
+
+function ftp_transfer_file_then_delete()
+{
+    new_file_name=$1
+    if [ $2 -eq 1 ]; then
+      ${TAR_CMD} ${TAR_ARG} $new_file_name
+      new_file_name=$new_file_name.$TAR_EXT
+    fi        
+       
+    curl ftp://$ftp_server:$ftp_port/$target_dir/ -u "${ftp_user_name}:${ftp_password}" -T $new_file_name 1>/dev/null
+    ret=$?
+    rm -rf $new_file_name
+    return $ret
+}
+
+function ftp_cp_file_after_add_tag()
+{    
+    if [ -e ${1} ]; then
+        add_time_and_prefix_to_info $1 $2    
+        cp $1 $add_time_and_prefix_info    
+        ftp_transfer_file_then_delete $add_time_and_prefix_info 1    
+        return $?
+    fi
+}
+
+CUR_LOG_NUM=0
+function save_cur_log_num_to_uci()
+{
+    if [ ! -z $q_cur_num_uci ]; then    
+        uci set ${q_cur_num_uci}=${CUR_LOG_NUM}
+    fi
+}
+
+function exit_process()
+{    
+    print_exit_info $1 
+    clear_relative_tag_when_exit  $1 
+    save_cur_log_num_to_uci
+    exit $1
+}
+
+
+SYS_LOG_FILES=(
+    "syslog.log.9"
+    "syslog.log.8"
+    "syslog.log.7"
+    "syslog.log.6"
+    "syslog.log.5"
+    "syslog.log.4"
+    "syslog.log.3"
+    "syslog.log.2"
+    "syslog.log.1"
+    "syslog.log.0"
+)
+
+SYSLOG_INDEX=(0 1 2 3 4 5 6 7 8 9)
+
+#SYS_LOG_FILE_COMMON_PREFIX="archive_log"
+
+function do_cur_log_num_plus()
+{
+    ((CUR_LOG_NUM++))
+    if [ $CUR_LOG_NUM -gt $log_index_max ]; then
+        CUR_LOG_NUM=0
+    fi
+}
+
+function ftp_delete_file()
+{
+   q_cmd="DELE $target_dir/$1"
+   curl -u $ftp_user_name:$ftp_password ftp://$ftp_server:$ftp_port  -Q "$q_cmd" 1>/dev/null
+
+}
+
+function get_del_num()
+{	
+    if [ $1 -lt $((${2}/2)) ]; then
+        LOG_DEL=$((${1}+${2}/2))
+    else
+	LOG_DEL=$((${1}-${2}/2))
+    fi
+}
+
+function do_sys_log_transfer()
+{
+    cd ${SYS_LOG_PATH}     
+    EXIST_SYS_LONG_NUM=0
+    for SYS_LOG_FILE in ${SYS_LOG_FILES[@]} $1; do        
+        if [ -e "${SYS_LOG_PATH}/${SYS_LOG_FILE}" ]; then            
+            mv ${SYS_LOG_FILE} ${log_prefix}_${CUR_LOG_NUM}
+            SYSLOG_INDEX[$EXIST_SYS_LONG_NUM]=${CUR_LOG_NUM}
+            ((EXIST_SYS_LONG_NUM++))        
+            do_cur_log_num_plus                            
+        fi
+    done    
+    
+    for j in `seq 0 $(($EXIST_SYS_LONG_NUM-1))`
+    do          
+         ${TAR_CMD} ${TAR_ARG} ${log_prefix}_${SYSLOG_INDEX[$j]}         
+    done
+        
+    for j in `seq 0 $(($EXIST_SYS_LONG_NUM-1))`
+    do  
+        get_del_num ${SYSLOG_INDEX[$j]} $log_num_max
+        ftp_delete_file ${log_prefix}_${LOG_DEL}.$TAR_EXT
+        ftp_transfer_file_then_delete ${log_prefix}_${SYSLOG_INDEX[$j]}.$TAR_EXT    0    
+        if [ $? -ne 0 ]; then
+             echo_debug_info "ftp error code is $?"
+             exit_process $ERROR_FTP_TRANSFER_FAIL        
+        fi              
+    done
+}    
+
+function do_backup_mtk_log()
+{
+    cd $MTK_LOG_BUFF_PATH
+    for muxzfile in *."$1"; do       
+        get_del_num $CUR_LOG_NUM $log_num_max
+        ftp_delete_file ${log_prefix}_${LOG_DEL}.muxz	
+        ftp_transfer_file_then_delete $muxzfile 0
+        if [ $? -ne 0 ]; then
+            exit_process $ERROR_FTP_TRANSFER_FAIL        
+        fi                   
+    done 
+    cd -
+}
+
+function do_mtk_log_transfer()
+{        
+    cd $MTK_LOG_PATH
+    while true
+    do
+        file_name=$(find -name \*"$1" | xargs ls -lthr | head -1 | awk '{print $9}')        
+        if [ -n "$file_name" ]; then        		   
+            mv $file_name $MTK_LOG_BUFF_PATH${log_prefix}_${CUR_LOG_NUM}.muxz             
+            do_backup_mtk_log "muxz"   
+            do_cur_log_num_plus
+        else
+            break;
+        fi    
+    done
+}
+
+function do_dbg_log_transfer()
+{   
+    if [ $ftp_server = "127.0.0.1" ]; then
+        return 
+    fi       
+    
+    cd $DEBUG_FILE_PATH
+    
+    ftp_cp_file_after_add_tag $1 "debug_" 
+    if [ $? -eq 0 ]; then
+        rm -rf $1
+    fi   
+}
+
+function send_remain_log()
+{
+    if [ $1 -eq 0 ]; then        
+        do_sys_log_transfer "syslog.log"
+        echo "" > ${SYS_LOG_PATH}/syslog.log 
+    elif [ $1 -eq 1 ]; 
+    then
+        do_mtk_log_transfer "muxz"
+        do_mtk_log_transfer "muxz.tmp"   
+    elif [ $1 -eq 2 ]; 
+    then        
+        do_dbg_log_transfer $DEBUG_FILE_BACKUP_NAME
+        do_dbg_log_transfer $DEBUG_FILE_NAME
+    fi    
+}
+
+
+
+function do_log_transfer()
+{
+    if [ $1 -eq 0 ]; then        
+        do_sys_log_transfer
+    elif [ $1 -eq 1 ]; 
+    then
+        do_mtk_log_transfer "muxz"
+    elif [ $1 -eq 2 ]; 
+    then
+        do_dbg_log_transfer $DEBUG_FILE_BACKUP_NAME
+    fi
+}
+
+function do_loop()
+{     
+    echo_debug_info "start transfer ${log_print[$1]}"        
+
+    while [ -e "${LOG_IS_IN_TRANSFER[$1]}" ]
+    do             
+        do_log_transfer $1
+        sleep $2      
+    done
+    echo_debug_info "start remain ${log_print[$1]} transfer"
+    send_remain_log $1 
+    echo_debug_info "stop ${log_print[$1]} transfer"
+    if [ -e ${WAIT_TRANSFER_REMAIN_LOG[$1]} ]; then
+        rm ${WAIT_TRANSFER_REMAIN_LOG[$1]}
+    fi      
+    clear_relative_tag
+}
+
+
+
+function wait_transfer_remain_log()
+{
+    second=0
+    while [ -e "${WAIT_TRANSFER_REMAIN_LOG[$1]}"  -a $second -lt 60 ]
+    do    
+        sleep 1
+        ((second=second+1))
+    done
+}
+
+function stop_log_transfer()
+{
+    if [ -e ${LOG_IS_IN_TRANSFER[$1]} ]; then
+        touch ${WAIT_TRANSFER_REMAIN_LOG[$1]}                    
+        rm ${LOG_IS_IN_TRANSFER[$1]}   
+        echo_debug_info "${log_print[$1]} transfer stoping "
+        wait_transfer_remain_log $1
+        if [ -e ${WAIT_TRANSFER_REMAIN_LOG[$1]} ]; then
+            rm ${WAIT_TRANSFER_REMAIN_LOG[$1]}         
+        fi      
+    fi
+}
+
+function sever_should_ok()
+{
+  ping -c 2 $1
+
+  if [ $? -ne 0 ]; then 
+      exit_process $ERROR_FTP_SERVER_PING_NOT_OK
+  fi  
+}
+
+function get_ftp_param()
+{
+    if [ $1 -gt 4 ]; then
+        ftp_server=$2
+        sever_should_ok $ftp_server        
+        ftp_port=$3
+        ftp_user_name=$4
+        ftp_password=$5                            
+    else
+        echo_debug_info "para num $1 error"
+        exit_process $ERROR_PARAM
+    fi      
+}
+
+function delete_beyond_log()
+{
+	post_fix=${UP_LOAD_POSTFIX[$1]}	 
+	
+	for j in `seq $2 $3`
+	do 
+		ftp_delete_file ${log_prefix}_${j}.${post_fix}
+	done
+}
+
+function get_init_cur_log_num()
+{
+    q_cur_num_uci=${Q_CUR_NUM_UCI[$1]}	
+        
+    if [ ! -z $q_cur_num_uci ]; then
+        q_uci_value=`uci get $q_cur_num_uci`
+        if [ -z $q_uci_value ];
+        then
+            uci set ${q_cur_num_uci}=${CUR_LOG_NUM}
+        else
+            CUR_LOG_NUM=$(($q_uci_value))
+        fi	
+        if [ $CUR_LOG_NUM -gt $log_index_max ]; then
+		    delete_beyond_log $1 $log_index_max  $(($CUR_LOG_NUM-1))
+            CUR_LOG_NUM=$log_index_max
+            uci set ${q_cur_num_uci}=${CUR_LOG_NUM}
+        fi
+    fi	
+}
+
+function get_single_file_size()
+{
+    single_file_size=${SINGLE_FILE_SIZE[$1]}  		
+	 
+    if [ $1 -eq 1 ]; then
+		q_uci_value=`uci get mdlog.property.md_log_size`
+		if [ ! -z $q_uci_value ];
+		then
+		    single_file_size=$(($(($q_uci_value))*10))			
+		fi
+    fi			
+}
+
+function get_init_max_log_num()
+{
+    init_log_max_size=${INIT_LOG_MAX_SIZE[$1]}    		
+    q_max_size_uci=${Q_MAX_SIZE_UCI[$1]}	
+	
+	get_single_file_size $1
+        
+    if [ ! -z $q_max_size_uci ]; then
+        q_uci_value=`uci get $q_max_size_uci`
+        if [ -z $q_uci_value ];
+        then
+            uci set ${q_max_size_uci}=$init_log_max_size
+            log_num_max=$(($init_log_max_size*20/single_file_size))
+        else
+            log_num_max=$(($(($q_uci_value))*20/single_file_size))
+        fi	
+    fi
+    log_index_max=$(($log_num_max-1)) 	
+}
+
+function loop_prepare()
+{
+    if [ $1 -eq 1 ]; then
+        echo 6 | emdlogger_ctrl
+        if [ $? -ne 0 ]; then 
+            echo_debug_info "start mtk log fail"
+            exit_process $ERROR_INNER_ERROR              
+        fi
+        if [ ! -d ${MTK_LOG_BUFF_PATH} ]; then                    
+            mkdir -p ${MTK_LOG_BUFF_PATH}
+        fi      
+    fi     
+    target_dir=${TARGET_DIR[$1]}	
+    log_prefix=${LOG_PREFIX[$1]}   
+
+	
+    get_init_max_log_num $1
+    get_init_cur_log_num $1
+	
+    if [ ! -z $target_dir ]; then
+        # 3 times for guarrantee
+        curl -u $ftp_user_name:$ftp_password -XPWD -p -e ftp://$ftp_server:$ftp_port/$target_dir --ftp-create-dirs ftp://$ftp_server:$ftp_port/$target_dir/ 1>/dev/null
+        curl -u $ftp_user_name:$ftp_password -XPWD -p -e ftp://$ftp_server:$ftp_port/$target_dir --ftp-create-dirs ftp://$ftp_server:$ftp_port/$target_dir/ 1>/dev/null	
+        curl -u $ftp_user_name:$ftp_password -XPWD -p -e ftp://$ftp_server:$ftp_port/$target_dir --ftp-create-dirs ftp://$ftp_server:$ftp_port/$target_dir/ 1>/dev/null
+    fi
+}
+
+
+function trigger_log_transfer()
+{
+    index=$((${1}-1))
+    if [ -e ${LOG_IS_IN_TRANSFER[$index]} ]; then                
+        exit_process $((ERROR_IS_IN_TRANSFER_LOG+${index}*5 ))
+    fi
+    if [ -e ${WAIT_TRANSFER_REMAIN_LOG[$index]} ]; then                
+        exit_process $((ERROR_IS_IN_TRANSFER_LOG+${index}*5+1))    
+    fi
+    
+    if [ $index -ne 2 ]; then
+	    get_ftp_param $# $2 $3 $4 $5        
+        transfer_log_tag[$index]=1
+        loop_prepare $index
+    fi		
+
+    
+    
+    touch ${LOG_IS_IN_TRANSFER[${index}]}
+    
+    echo_debug_info "transfer ${log_print[$index]}"     
+    
+    if [ $index -eq 2 ]; then    
+        echo_debug_info "log transfer param_num $# param $* start"    
+        show_relative_tag
+        return 
+    fi    
+
+    do_loop ${index} ${loop_time[$index]}           
+}
+
+function stop_log_transfer_ui()
+{
+    index=$((${1}-101))
+    if [ -e ${WAIT_TRANSFER_REMAIN_LOG[$index]} ]; then                
+        exit_process $((ERROR_IS_IN_TRANSFER_LOG+${index}*5+2 ))
+    fi          
+    
+    if [ $index -eq 1 ]; then
+        echo 7 | emdlogger_ctrl
+    elif [ $index -eq 2 ]; then
+        show_relative_tag
+        echo_debug_info "log transfer param_num $# param $* complete" 
+        rm ${LOG_IS_IN_TRANSFER[$index]}   
+        return 
+    fi
+    
+    stop_log_transfer  $index
+}
+
+function init_md_log()
+{
+    if [ ! -d $MTK_LOG_MOUNT_PATH ];
+    then 
+        echo_debug_info "init md log start"
+        mkdir -p $MTK_LOG_MOUNT_PATH
+        echo 7 | emdlogger_ctrl
+        rm -rf $MTK_LOG_PATH*
+        mount -o bind $MTK_LOG_MOUNT_PATH $MTK_LOG_PATH
+        rm -rf $MTK_LOG_PATH*
+        uci set mdlog.property.md_cyclic_size='36'
+        uci set mdlog.property.md_log_size=$((${SINGLE_FILE_SIZE[1]}/10))
+        uci commit
+        killall emdlogger1	
+        echo_debug_info "init md log end"
+    fi		
+}
+
+function init_log_transfer_ui()
+{
+    index=$2
+    if [ $index -eq 1 ]; then
+        #Æô¶¯debug
+        trigger_log_transfer 3  
+        init_md_log
+    fi	
+}
+
+echo_debug_info "log transfer param_num $# param $* start"
+
+case "$1" in  
+  [1-3])  
+    trigger_log_transfer "$@"
+    ;;
+  101|102|103)     
+    stop_log_transfer_ui "$@"
+    ;;    
+  0)
+    init_log_transfer_ui "$@"
+	;;
+  *)    
+    exit_process $ERROR_PARAM
+    ;;
+esac
+
+echo_debug_info "log transfer param_num $# param $* complete"
+exit_process 0      
+            
+           
\ No newline at end of file
diff --git a/IC_src/mtk/packages/apps/lynq-log-transfer/lynq_log_transfer.c b/IC_src/mtk/packages/apps/lynq-log-transfer/lynq_log_transfer.c
new file mode 100755
index 0000000..2ab19c5
--- /dev/null
+++ b/IC_src/mtk/packages/apps/lynq-log-transfer/lynq_log_transfer.c
@@ -0,0 +1,54 @@
+#include <stdio.h>
+#include <strings.h>
+#include<stdlib.h>
+
+#define CMD_BUFFER_SIZE  256
+static char printBuf[CMD_BUFFER_SIZE];
+static char tempPrintBuf[CMD_BUFFER_SIZE];  
+#define removeLastChar          printBuf[strlen(printBuf)-1] = 0
+#define clearPrintBuf           printBuf[0] = 0
+#define appendPrintBuf(x...)    snprintf(tempPrintBuf, CMD_BUFFER_SIZE, x); \
+                                  snprintf(printBuf, CMD_BUFFER_SIZE, "%s", tempPrintBuf)
+
+#define BUF_LEN 256
+int main(int argc, const char *argv[])
+{
+    int status;
+    int ret;    
+ 
+    clearPrintBuf;    
+    
+    appendPrintBuf("%s%s",printBuf,"/usr/bin/lynq_inner_log_transfer.sh ");  
+
+    for(int i=1;i < argc; i++)
+    {
+        appendPrintBuf("%s%s",printBuf,argv[i]);
+        appendPrintBuf("%s%s",printBuf," ");
+    }   
+    removeLastChar;
+	
+    status = system(printBuf);  
+
+    printf("status is %d",status);
+    
+    if (-1 == status)  
+    {          
+        ret= -1;
+    }  
+    else  
+    {     
+       
+        if (WIFEXITED(status))  
+        {  
+            
+            ret = WEXITSTATUS(status);           
+        }  
+        else  
+        {  
+            ret= -2;        
+        }  
+    }  
+        
+    exit(ret);  
+
+}
diff --git a/IC_src/mtk/packages/apps/lynq-log-transfer/makefile b/IC_src/mtk/packages/apps/lynq-log-transfer/makefile
new file mode 100755
index 0000000..2ee7d60
--- /dev/null
+++ b/IC_src/mtk/packages/apps/lynq-log-transfer/makefile
@@ -0,0 +1,48 @@
+SHELL = /bin/sh
+RM = rm -f
+
+LOCAL_CFLAGS := -Wall \
+                -g -Os \
+                -flto \
+                -fpermissive \
+                -fPIC \
+
+
+
+LOCAL_CFLAGS += -DLYNQ_SW_INSIDE_VERSION=\"$(LYNQ_CONFIG_VERSION)\"
+LOCAL_CFLAGS += -DLYNQ_SW_VERSION=\"$(LYNQ_CONFIG_SW_VERSION)\"
+
+LOCAL_PATH   = .
+
+LOCAL_C_INCLUDES = \
+  -I. \
+  -I$(ROOT)$(includedir)/logger \
+  -I$(ROOT)$(includedir)/liblog \
+
+
+
+
+LOCAL_LIBS := \
+    -L. \
+    -ldl \
+    -lpthread \
+    -llynq-log \
+    -lssl \
+    -llynq-uci \
+
+SOURCES = $(wildcard *.c)
+
+EXECUTABLE = lynq-log-transfer
+
+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/common_src/framework/lynq-ril-service/src/atci/atci_lynq_data_cmd.cpp b/common_src/framework/lynq-ril-service/src/atci/atci_lynq_data_cmd.cpp
index e0b8321..f261dbd 100755
--- a/common_src/framework/lynq-ril-service/src/atci/atci_lynq_data_cmd.cpp
+++ b/common_src/framework/lynq-ril-service/src/atci/atci_lynq_data_cmd.cpp
@@ -10,7 +10,8 @@
 #include <vendor-ril/telephony/ril.h>
 #include <string.h>
 #include <log/log.h>
-
+#include <vector>
+#include "Radio_capability_switch_util.h"
 #include "ATCI.h"
 #include "atci_util.h"
 #include "atci_at_util.h"
@@ -139,6 +140,51 @@
     return SYS_SUCC;
 }
 
+int check_sim_state(void)
+{
+    char buf[16];
+    //send request
+    char* argv[1] = { 0 };
+    argv[0] = "RIL_REQUEST_GET_SIM_STATUS";
+    android::lynqSendToRil(1,argv,1024);
+    //wait response from callback
+    if(lynq_wait_result_comeback(2000))
+    {
+        sprintf(buf,"%s","+CME ERROR: 14");//sim busy
+        if(atci_send_data(buf)!=0)
+        {
+            RLOGD("send data fail");
+            return SYS_FAIL;
+        }
+        RLOGD("[%d][%s] wait sim state timeout",LINE,FUNC);
+        return SYS_FAIL;
+    }
+    //judge result
+    if(g_lynq_sim_state != 1)
+    {
+        RLOGD("SIM card absent");
+        sprintf(buf,"%s","+CME ERROR: 10");
+        if(atci_send_data(buf)!=0)
+        {
+            RLOGD("send data fail");
+            return SYS_FAIL;
+        }
+        return SYS_FAIL;
+    }
+    if(checkDataRegistration(1024))
+    {
+        RLOGD("[%d][%s] data registion fail",LINE,FUNC);
+        sprintf(buf,"%s","+CME ERROR: 1");
+        if(atci_send_data(buf)!=0)
+        {
+            RLOGD("send data fail");
+            return SYS_FAIL;
+        }
+        return SYS_FAIL;
+    }
+    return SYS_SUCC;
+}
+
 int atci_data_enable_pdp_hdlr(char *cmd, int op_mode, int target, char *response)
 {
     int ret;
@@ -174,6 +220,10 @@
 
             if(state==1)
             {
+                if(check_sim_state())
+                {
+                    return SYS_FAIL;
+                }
                 req.request_id = RIL_REQUEST_SETUP_DATA_CALL;
             }
             else if(state == 0)
@@ -204,6 +254,31 @@
             ATCIResponseNoToken(0,buf,RIL_REQUEST_SETUP_DATA_CALL);
             break;
         }
+        case AT_READ_MODE:
+        {
+            for(int i = 0;i < LYNQ_APN_CHANNEL_MAX; i ++)
+            {
+                if(!apn_table[i].used)
+                {
+                    continue;
+                }
+                memset(buf,0,sizeof(buf));
+                sprintf(buf,"+LAPNACT: %s,%s,%d,%s,%s\n", apn_table[i].apn, apn_table[i].apntype ,apn_table[i].pdpstate, apn_table[i].ifaceName, apn_table[i].address);
+                if(atci_send_data(buf)!=0)
+                {
+                    RLOGD("send data fail");
+                    return SYS_FAIL;
+                }
+            }
+            if(apn_count == 0)
+            {
+                memset(buf,0,sizeof(buf));
+                ATCIResponseNoToken(0,buf,RIL_REQUEST_SETUP_DATA_CALL);
+                return SYS_SUCC;
+            }
+            atci_send_result(0);
+            break;
+        }
         default:
         {
             RLOGD("set mute error");
@@ -320,6 +395,10 @@
             atci_data_req_t req;
             if(state==1)
             {
+                if(check_sim_state())
+                {
+                    return SYS_FAIL;
+                }
                 req.request_id = RIL_REQUEST_SETUP_DATA_CALL;
             }
             else if(state == 0)
@@ -357,7 +436,7 @@
                     continue;
                 }
                 memset(buf,0,sizeof(buf));
-                sprintf(buf,"+ELAPNACT:%s,%s,%d,%s,%s\n", apn_table[i].apn, apn_table[i].apntype ,apn_table[i].pdpstate, apn_table[i].ifaceName, apn_table[i].address);
+                sprintf(buf,"+ELAPNACT: %s,%s,%d,%s,%s\n", apn_table[i].apn, apn_table[i].apntype ,apn_table[i].pdpstate, apn_table[i].ifaceName, apn_table[i].address);
                 if(atci_send_data(buf)!=0)
                 {
                     RLOGD("send data fail");
diff --git a/common_src/framework/lynq-ril-service/src/cc.cpp b/common_src/framework/lynq-ril-service/src/cc.cpp
index 953438c..fa06fda 100755
--- a/common_src/framework/lynq-ril-service/src/cc.cpp
+++ b/common_src/framework/lynq-ril-service/src/cc.cpp
@@ -49,6 +49,9 @@
 #include <binder/Parcel.h>
 #include "call_rtp.h"
 #include "liblynq-codec/lynq_codec.h"
+#ifdef LED_SUPPORT
+#include "led.h"
+#endif
 using android::Parcel;
 /*Warren add for t800 ril servie 2021/12/23 end*/
 
diff --git a/common_src/framework/lynq-ril-service/src/common.cpp b/common_src/framework/lynq-ril-service/src/common.cpp
index 2c2cdde..402aad1 100755
--- a/common_src/framework/lynq-ril-service/src/common.cpp
+++ b/common_src/framework/lynq-ril-service/src/common.cpp
@@ -95,6 +95,7 @@
 */
 extern int current_data_reg = -1;
 extern int modemStatus = 0;
+int g_lynq_sim_state = -1;
 
 /*Warren add for SZZT 2021/11/14 end*/
 
@@ -372,22 +373,26 @@
     pthread_mutex_unlock(&s_state_change_mutex);
 }
 
-void lynq_wait_result_comeback(int mtime)
+int lynq_wait_result_comeback(int mtime)
 {
     RLOGD("wait_call_state");
     int sec = 0;
-    int usec = 0;
+    int ms = 0;
     struct timeval now;
     struct timespec timeout;
     gettimeofday(&now,NULL);
     sec = mtime/1000;
-    usec = mtime%1000;
+    ms = mtime%1000;
     timeout.tv_sec = now.tv_sec+sec;
-    timeout.tv_nsec = now.tv_usec*1000+usec*1000000;
+    unsigned long long ns;
+    ns = now.tv_usec*1000ull + ms*1000000ull;
+    timeout.tv_sec += ns/1000000000;
+    timeout.tv_nsec = ns % 1000000000;
     pthread_mutex_lock(&s_state_change_mutex);
-    pthread_cond_timedwait(&s_state_change_cond,&s_state_change_mutex,&timeout);
+    int ret = pthread_cond_timedwait(&s_state_change_cond,&s_state_change_mutex,&timeout);
     pthread_mutex_unlock(&s_state_change_mutex);
     RLOGD("wait_call_state end");
+    return ret;
 }
 
 int get_default_sim_voice(){
@@ -566,6 +571,9 @@
     } else {
         RLOGD("[slot%d]updateCardStatusV6: sim card message is null", slot);
     }
+#ifdef LED_SUPPORT
+    mbtk_netled_state_update(GPIO_NETLED_REFLASH_NORMAL);  
+#endif
 }
 
 char* getAid(int slot)
@@ -592,6 +600,9 @@
         reg_voice_service_state[slot] = atoi(code);
         regCodeToServiceState(request, atoi(code), slot);
     }
+#ifdef LED_SUPPORT
+    mbtk_netled_state_update(GPIO_NETLED_REFLASH_NORMAL);  
+#endif
 }
 
 void update_reg_voice_radio_tech(int request, int code, int slot, int32_t token) {
@@ -611,6 +622,9 @@
         current_data_reg = status;       
         /*Warren change for SZZT 2021//11/14 end*/
     }
+#ifdef LED_SUPPORT
+    mbtk_netled_state_update(GPIO_NETLED_REFLASH_NORMAL);  
+#endif
 }
 
 void update_reg_data_radio_tech(int request, int code, int slot, int32_t token){
@@ -1040,6 +1054,18 @@
     }
     return false;	
 }
+
+bool ril_get_if_3gpp_data_reg_success()
+{
+    int slot_id=get_default_sim_data();
+
+    if(slot_id==0 || slot_id ==1)
+    {
+        return reg_data_service_state[slot_id] ==1;
+    }
+    return false;	
+}
+
 #endif
 /*hq add for key info output 2022/03/01 begin*/
 // void lynq_output_LINFO_all()
diff --git a/common_src/framework/lynq-ril-service/src/common.h b/common_src/framework/lynq-ril-service/src/common.h
index fba62ac..a7f2a6b 100755
--- a/common_src/framework/lynq-ril-service/src/common.h
+++ b/common_src/framework/lynq-ril-service/src/common.h
@@ -153,6 +153,7 @@
 */
 extern int current_data_reg;
 extern int modemStatus;
+extern int g_lynq_sim_state;
 /*Warren add for SZZT 2021/11/14 end*/
 
 // extern int lynq_output_LINFO_enable;
@@ -176,7 +177,7 @@
 void lynq_output_info(const char* format,...);
 
 void lynq_send_result_already(void);
-void lynq_wait_result_comeback(int mtime);
+int lynq_wait_result_comeback(int mtime);
 
 void updateCardStatusV6(RIL_CardStatus_v6 *card_status,int slot);
 char* getAid(int slot);
@@ -211,6 +212,7 @@
 /*for led add by hq 20221202*/
 bool ril_get_if_insert_simcard();
 bool ril_get_if_3gpp_reg_success();
+bool ril_get_if_3gpp_data_reg_success();
 #endif
 
 /*for urc broad cast optimission by hq 20221216*/
diff --git a/common_src/framework/lynq-ril-service/src/data/data_gdbus.cpp b/common_src/framework/lynq-ril-service/src/data/data_gdbus.cpp
index 3ea7719..0136939 100755
--- a/common_src/framework/lynq-ril-service/src/data/data_gdbus.cpp
+++ b/common_src/framework/lynq-ril-service/src/data/data_gdbus.cpp
@@ -147,6 +147,12 @@
                     writeStringToParcel(p,urc_response->ifname);
                     android::LYNQ_RIL_urcBroadcast(p,LYNQ_URC_DATA_CALL_STATUS_IND);
                     RLOGD("removed apn:%s,apntype:%s",apn_table[i].apn,apn_table[i].apntype);
+#ifdef LED_SUPPORT
+                    if(apn_count==0)
+                    {
+                        mbtk_netled_state_update(GPIO_NETLED_PPP_CLOSED);  
+                    }
+#endif
                     break;
                 }
             }
diff --git a/common_src/framework/lynq-ril-service/src/led/include/led.h b/common_src/framework/lynq-ril-service/src/led/include/led.h
new file mode 100755
index 0000000..d8d6508
--- /dev/null
+++ b/common_src/framework/lynq-ril-service/src/led/include/led.h
@@ -0,0 +1,44 @@
+/**

+ * @file led.h

+ * @author hq

+ * @brief 

+ * @version 1.0

+ * @date 2022-11-28

+ * 

+ * @copyright Copyright (c) 2022

+ * 

+ */

+#ifdef LED_SUPPORT 

+#ifndef LED_H

+#define LED_H 1

+

+#define wait_led_update_effective_timer_ms 20

+

+#ifdef __cplusplus

+extern "C" {

+#endif

+

+typedef enum

+{

+    GPIO_NETLED_REFLASH_NORMAL,

+    GPIO_NETLED_CS_CALLING,

+    GPIO_NETLED_CS_CALLEND,

+    GPIO_NETLED_PPP_CONNECT,

+    GPIO_NETLED_PPP_CLOSED,

+    GPIO_NETLED_AP_GOINGSLEEP,

+    GPIO_NETLED_AP_WAKEUP,

+    GPIO_NETLED_WWAN_CONNECT,

+    GPIO_NETLED_WWAN_CLOSED,

+} mbtk_netled_reflash_type;

+

+void mbtk_netled_state_update(mbtk_netled_reflash_type flag);

+

+void mbtk_netled_init();

+

+void mbtk_netled_deinit();

+

+#ifdef __cplusplus

+}

+#endif

+#endif

+#endif

diff --git a/common_src/framework/lynq-ril-service/src/led/led.cpp b/common_src/framework/lynq-ril-service/src/led/led.cpp
index 62e4b11..a252764 100755
--- a/common_src/framework/lynq-ril-service/src/led/led.cpp
+++ b/common_src/framework/lynq-ril-service/src/led/led.cpp
@@ -273,24 +273,25 @@
 

 mbtk_netled_reg_net_status  mbtk_get_reg_net_status(void)

 {

-    mbtk_netled_reg_net_status reg_net_status = NET_REG_FAIL;

-

     if(false  == ril_get_if_insert_simcard())

     {

         RLOGE("ril_get_if_insert_simcard false" );

-        reg_net_status = NET_REG_FAIL;

-        return reg_net_status;

+        return NET_REG_FAIL;

     }

    

     if(true == ril_get_if_3gpp_reg_success())

     {

         RLOGD("ril_get_if_3gpp_reg_success true");

-        reg_net_status = NET_REG_SUCCESS;

-        return reg_net_status;

+        return NET_REG_SUCCESS;

     }

 

-    return reg_net_status;

+    if(true == ril_get_if_3gpp_data_reg_success())

+    {

+        RLOGD("ril_get_if_3gpp_data_reg_success true");

+        return NET_REG_SUCCESS;

+    }	

 

+    return NET_REG_FAIL;

 }

 

 /*=============================================

@@ -504,7 +505,6 @@
 	}

 }

 

-

 /*=============================================

 FUNCTION

     mbtk_netled_reflash_handle

diff --git a/common_src/framework/lynq-ril-service/src/led/led_inner.h b/common_src/framework/lynq-ril-service/src/led/led_inner.h
new file mode 100755
index 0000000..5b0750d
--- /dev/null
+++ b/common_src/framework/lynq-ril-service/src/led/led_inner.h
@@ -0,0 +1,61 @@
+/**

+ * @file led_inner.h

+ * @author hq

+ * @brief 

+ * @version 1.0

+ * @date 2022-11-28

+ * 

+ * @copyright Copyright (c) 2022

+ * 

+ */

+#ifdef LED_SUPPORT 

+#ifndef LED_INNER_H

+#define LED_INNER_H 1

+

+#ifdef __cplusplus

+extern "C" {

+#endif

+

+/*************************************************************

+    Definitions:enum,struct,union,class

+*************************************************************/

+typedef struct {

+    bool gpio_netled_cs_flag;

+    bool gpio_netled_ppp_flag;

+    bool gpio_netled_wwan_flag;

+    bool gpio_netled_goingsleep_flag;

+}mbtk_netled_state_t;

+

+typedef enum

+{

+    GPIO_NETLED_OFF,

+    GPIO_NETLED_REG,

+    GPIO_NETLED_CONNECT,

+    GPIO_NETLED_LIGHT,

+    GPIO_CS_REG,

+    GPIO_NETLED_MAX

+}mbtk_netled_status_type;

+

+typedef enum

+{

+    NET_REG_SUCCESS,

+    NET_REG_FAIL,

+    NET_REG_MAX

+}mbtk_netled_reg_net_status;

+

+typedef enum

+{

+    MBTK_SOCKET_CONNECTED,

+    MBTK_SOCKET_DISCONNECT,

+    MBTK_SOCKET_CONN_MAX

+}mbtk_netled_socket_conn_status;

+

+/*************************************************************

+    Function Declaration

+*************************************************************/

+

+#ifdef __cplusplus

+}

+#endif

+#endif

+#endif

diff --git a/common_src/framework/lynq-ril-service/src/lynq_common.cpp b/common_src/framework/lynq-ril-service/src/lynq_common.cpp
index 418fe86..a5338bc 100755
--- a/common_src/framework/lynq-ril-service/src/lynq_common.cpp
+++ b/common_src/framework/lynq-ril-service/src/lynq_common.cpp
@@ -390,8 +390,11 @@
     char *argv_temp[3]={};
     argv_temp[0] = "RIL_REQUEST_DATA_REGISTRATION_STATE";
     android::lynqSendToRil(1,argv_temp,uToken);
-    ret = lynqATWaitWithTime(10);
-    printf("ret=%d\n,current_data_reg=%d\n",ret,current_data_reg);
+    if(lynqATWaitWithTime(2000))
+    {
+        RLOGD("function %s line %d time out", __FUNCTION__, __LINE__);
+        return -1;
+    }
     /*
     if(ret == ETIMEDOUT)
     {
@@ -405,11 +408,6 @@
     */
     if(current_data_reg!=0)
     {
-        int n = write(ttyGS3_fd,"+CME ERROR: 1\n",strlen("+CME ERROR: 1\n"));
-        if(n<0)
-        {
-            perror("lynq resp write:");
-        }
         return -1;
     }
     return 0;
@@ -887,21 +885,24 @@
     return 0;
 }
 
-int lynqATWaitWithTime(int time)
+int lynqATWaitWithTime(int mtime)
 {
-    int ret = 0;
-    struct timespec start_tm;
-    //struct timespec end_tm;
-    //int timeout_ms = 2500;
-    clock_gettime(CLOCK_MONOTONIC, &start_tm);
-    //struct timeval now;
-    struct timespec outTime;
-    //gettimeofday(&now, NULL);//now.tv_sec(s),now.tv_usec(Micro s)
-    outTime.tv_sec = start_tm.tv_sec + time;
+    RLOGD("wait_call_state");
+    int sec = 0;
+    int usec = 0;
+    struct timeval now;
+    struct timespec outtime;
+    gettimeofday(&now,NULL);
+    sec = mtime/1000;
+    outtime.tv_sec = now.tv_sec+sec;
+    unsigned long long ns;
+    ns = now.tv_usec*1000ull + (mtime%1000)*1000000ull;
+    outtime.tv_sec += ns/1000000000;
+    outtime.tv_nsec = ns%1000000000;
     pthread_mutex_lock(&lynq_at_mutex);
-    //ret = pthread_cond_timedwait(&lynq_at_cond,&lynq_at_mutex,&outTime);
-    pthread_cond_wait(&lynq_at_cond,&lynq_at_mutex);
+    int ret = pthread_cond_timedwait(&lynq_at_cond,&lynq_at_mutex,&outtime);
     pthread_mutex_unlock(&lynq_at_mutex);
+    RLOGD("wait_call_state end");
     return ret;
 }
 void lynqAtRespWatingEvent()
diff --git a/common_src/framework/lynq-ril-service/src/lynq_common.h b/common_src/framework/lynq-ril-service/src/lynq_common.h
index ec1e9e2..16b6403 100755
--- a/common_src/framework/lynq-ril-service/src/lynq_common.h
+++ b/common_src/framework/lynq-ril-service/src/lynq_common.h
@@ -122,4 +122,5 @@
 int lynq_modify_apn_info(int argc,char*argv[],char *rilReq, int uToken);
 void sendSignalApnChange();
 int waitApnResult();
+int checkDataRegistration(int uToken);
 #endif
diff --git a/common_src/framework/lynq-ril-service/src/makefile b/common_src/framework/lynq-ril-service/src/makefile
index 2a07df1..db6b04e 100755
--- a/common_src/framework/lynq-ril-service/src/makefile
+++ b/common_src/framework/lynq-ril-service/src/makefile
@@ -25,6 +25,10 @@
     LOCAL_CFLAGS += -DMODE_DSSS
 endif
 
+ifeq ($(strip $(MTK_LED_SUPPORT)), yes)
+    LOCAL_CFLAGS += -DLED_SUPPORT
+endif
+
 $(warning ################# TARGET_PLATFORM: $(TARGET_PLATFORM))
 ifeq ($(strip $(TARGET_PLATFORM)), mt2731)
 $(warning ################# TARGET_PLATFORM_MT2731)
@@ -40,6 +44,10 @@
 LOCAL_CFLAGS += -DTARGET_PLATFORM_MT2735
 LOCAL_CFLAGS += -DBASELIB_DIR_LIB64 -DTELEMATIC_5G_SUPPORT
 endif
+ifeq ($(strip $(MOBILETEK_RIL_CFG)), GSW)
+    LOCAL_CFLAGS += -DGSW_RIL_CFG
+
+endif
 
 LOCAL_PATH   = .
 
@@ -68,6 +76,7 @@
   -I$(LOCAL_PATH)/factory \
   -I$(LOCAL_PATH)/fota \
   -I$(LOCAL_PATH)/temp \
+  -I$(LOCAL_PATH)/led/include \
   -I$(LOCAL_PATH)/rtp \
   -I$(ROOT)$(includedir)/logger \
   -I$(ROOT)$(includedir)/liblog \
@@ -128,7 +137,7 @@
 endif
 
 
-SOURCES = $(wildcard util/*.cpp *.cpp ecall/*.cpp ecall/gost/*.cpp ecall/gost/utils/*.cpp ecall/gost/sslp/*.cpp ecall/gost/sslp/auth/*.cpp ecall/gost/sslp/firmware/*.cpp ecall/gost/sslp/commands/*.cpp ecall/gost/sslp/ecall/*.cpp ecall/gost/sslp/teledata/*.cpp data/*.cpp  em/rfdesense/*.cpp em/networkinfo/*.cpp em/*.cpp sms/*.cpp sms/gsm/*.cpp sms/cdma/*.cpp atci/*.cpp stateManager/*.cpp sms/lynqSmsManager/*.cpp  rndis/*.cpp factory/*.cpp  temp/*.cpp fota/*.cpp  rtp/*.cpp)
+SOURCES = $(wildcard util/*.cpp *.cpp ecall/*.cpp ecall/gost/*.cpp ecall/gost/utils/*.cpp ecall/gost/sslp/*.cpp ecall/gost/sslp/auth/*.cpp ecall/gost/sslp/firmware/*.cpp ecall/gost/sslp/commands/*.cpp ecall/gost/sslp/ecall/*.cpp ecall/gost/sslp/teledata/*.cpp data/*.cpp  em/rfdesense/*.cpp em/networkinfo/*.cpp em/*.cpp sms/*.cpp sms/gsm/*.cpp sms/cdma/*.cpp atci/*.cpp stateManager/*.cpp sms/lynqSmsManager/*.cpp  rndis/*.cpp factory/*.cpp  temp/*.cpp led/*.cpp fota/*.cpp  rtp/*.cpp)
 
 EXECUTABLE = lynq-ril-service
 
diff --git a/common_src/framework/lynq-ril-service/src/ril.cpp b/common_src/framework/lynq-ril-service/src/ril.cpp
index ecabb01..ef41d33 100755
--- a/common_src/framework/lynq-ril-service/src/ril.cpp
+++ b/common_src/framework/lynq-ril-service/src/ril.cpp
@@ -4177,6 +4177,11 @@
     }
 }
 
+static void lynq_get_sim_state(RIL_CardStatus_v6 *card_status)
+{
+    g_lynq_sim_state = card_status->card_state;
+}
+
 extern "C" void
 RIL_onRequestComplete(RIL_Token t, RIL_Errno e, void *response, size_t responselen) {
     RequestInfo *pRI;
@@ -4361,7 +4366,9 @@
                    if (responselen == sizeof (RIL_CardStatus_v6)) {
                        RIL_CardStatus_v6 *p_cur = ((RIL_CardStatus_v6 *) response);
                        updateCardStatusV6(p_cur, socket_id);
+                       lynq_get_sim_state(p_cur);
                    }
+                   lynq_send_result_already();
                    break;
                }
                case RIL_REQUEST_VOICE_RADIO_TECH:
@@ -5753,6 +5760,9 @@
 
 static void initCoditions()
 {
+#ifdef LED_SUPPORT
+    mbtk_netled_init();
+#endif
     mixer_init();
     lynq_init_rtp();
 
@@ -6276,6 +6286,9 @@
      }
      RLOGD("close socket fd");
      close(server_socket_fd);
+#ifdef LED_SUPPORT
+     mbtk_netled_deinit();
+#endif
      return ;
 }
 int LYNQ_RIL_respSocket(Parcel &p,RIL_Token t)
diff --git a/common_src/framework/lynq-ril-service/src/stateManager/stateManager.cpp b/common_src/framework/lynq-ril-service/src/stateManager/stateManager.cpp
index 9e16b5e..d4f3ce3 100755
--- a/common_src/framework/lynq-ril-service/src/stateManager/stateManager.cpp
+++ b/common_src/framework/lynq-ril-service/src/stateManager/stateManager.cpp
@@ -47,6 +47,9 @@
 #include "util/utils.h"
 #include <cutils/jstring.h>
 #include <liblog/lynq_deflog.h>
+#ifdef LED_SUPPORT
+#include "led.h"
+#endif
 #undef LOG_TAG
 #define LOG_TAG "DEMO_MANAGER"
 
@@ -96,7 +99,13 @@
     size_t pos = p.dataPosition();
 
     p.writeInt32(1);
-    p.writeInt32(atoi(argv[1]));
+
+    int screen_state= atoi(argv[1]);
+    p.writeInt32(screen_state);
+#ifdef LED_SUPPORT
+    mbtk_netled_state_update(screen_state==0 ? GPIO_NETLED_AP_GOINGSLEEP : GPIO_NETLED_AP_WAKEUP);	
+    usleep(wait_led_update_effective_timer_ms*1000);
+#endif
 
     p.setDataPosition(pos);
     pRI->pCI->dispatchFunction(p, pRI);
diff --git a/common_src/lib/liblynq-call/lynq_call.cpp b/common_src/lib/liblynq-call/lynq_call.cpp
index 8e80462..8e6943d 100755
--- a/common_src/lib/liblynq-call/lynq_call.cpp
+++ b/common_src/lib/liblynq-call/lynq_call.cpp
@@ -31,6 +31,8 @@
 #define LIBMODEM_AFE "/tmp/libmodem-afe-ctrl"

 #define TELE_DEMO_LOCK "/tmp/tel_demo_single_proc.lock"

 

+#define MAX_RING_INCOMING_INTERVAL 10

+

 using ::android::Parcel;

 

 /**

@@ -85,6 +87,8 @@
 

 static int s_module_call_state =CALL_OFF;

 static int s_call_auto_answer = 0;

+static time_t s_rev_ring_time=0;

+

 

 typedef enum{

     LYNQ_E_VOLUMN_SET_DTMF,

@@ -422,6 +426,10 @@
 #ifdef ECALL_SUPPORT

     int handupIncomingMT=0;

 #endif

+    unsigned long interval;

+    time_t now;

+

+

     pthread_mutex_lock(&s_notice_get_call_list_mutex);

     pthread_cleanup_push(cleanup_call_list_mutex, NULL); // thread cleanup handler

     int tmp_call_id;

@@ -513,6 +521,17 @@
                 n = find_call_id_with_addr(call_list[i].addr);

                 if(n ==INVALID_ID)

                 {

+                    if(s_call_auto_answer==false && call_list[i].call_state==LYNQ_CALL_INCOMING)

+                    {

+                        time(&now);

+                        interval = difftime(now,s_rev_ring_time);   

+                        if(interval>MAX_RING_INCOMING_INTERVAL)

+                        {

+                            LYINFLOG("recv incoming, %d second no ril ring",interval);

+                            continue;

+                        }                        

+                    }                    

+                    

                     n = addAddr(call_list[i].addr,call_list[i].call_id);

                     updateCallList(&s_call_lists[n],call_list[i].call_id,call_list[i].call_state,call_list[i].toa,call_list[i].direction);

                     send_call_state_change(call_list[i].call_id);

@@ -1539,6 +1558,7 @@
         }

         case RIL_UNSOL_CALL_RING: //1018

         {

+            time(&s_rev_ring_time);

             if(s_call_auto_answer==1)

             {

                 lynq_call_answer();

diff --git a/common_src/lib/liblynq-sim/src/lynq_sim.cpp b/common_src/lib/liblynq-sim/src/lynq_sim.cpp
index f14fda2..c780859 100755
--- a/common_src/lib/liblynq-sim/src/lynq_sim.cpp
+++ b/common_src/lib/liblynq-sim/src/lynq_sim.cpp
@@ -16,27 +16,16 @@
 #include <log/log.h>
 #include <cutils/jstring.h>
 #include <pthread.h>
-#include "lynq_sim.h"
-#include <sys/socket.h>   
-#include <netinet/in.h>   
+#include <vendor-ril/telephony/ril.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
 #include <arpa/inet.h>
 #include <errno.h> /*add for get recvfrom errorid on 20220921*/
 #include <sys/stat.h>
 #include <fcntl.h>
+#include "lynq_sim.h"
 #define MAX_BUF 20
 #define MAX_NUM 80
-#define RIL_REQUEST_GET_SIM_STATUS 1
-#define RIL_REQUEST_GET_IMSI 11
-#define RIL_REQUEST_QUERY_ICCID 2026
-#define RIL_REQUEST_SET_FACILITY_LOCK 43
-#define RIL_REQUEST_QUERY_FACILITY_LOCK 42
-#define RIL_REQUEST_ENTER_SIM_PIN 2
-#define RIL_REQUEST_ENTER_SIM_PUK 3
-#define RIL_REQUEST_CHANGE_SIM_PIN 6
-#define RIL_REQUEST_OEM_HOOK_RAW 59
-#define RIL_REQUEST_SCREEN_STATE 61
-#define RIL_REQUEST_SIM_IO 28
-#define RIL_REQUEST_DEVICE_IDENTITY 98
 #define LYNQ_REQUEST_SET_DEFAULT_SIM_ALL 8008
 #define LYNQ_REQUEST_CHANGE_SCREEN_STATE 8014 /*add for two sim suspend on 20220919*/
 #define LYNQ_REQUEST_CHANGE_RADIO 8015
@@ -55,17 +44,11 @@
     char param[MAX_LEN];
 }lynq_client_t;
 
-lynq_client_t client_t;
 /* socket文件描述符 */ 
 int len_addr_serv;
 struct sockaddr_in addr_serv;
 static int sock_fd = 0;
-int Global_uToken = 0; 
-int solicited_token = -1;
-int resp_type = -1;
-int request = -1;
-int slot_id = -1;
-int error1 = -1;
+int Global_uToken = 0;
 static pthread_mutex_t g_lynq_sim_sendto_mutex;
 /**
  * @brief mark call initialization state
@@ -81,11 +64,154 @@
 char pin2_buf[32] = {0};
 char aidPtr_buf[32] = {0};
 
-/**/
+/**
+ * @brief lynq_shutdown need
+ */
 char options_buf[32] = {0};
 char time_buf[32] = {0};
 char message_buf[32] = {0};
 
+typedef struct{
+    int resp_type;
+    int token;
+    int request;
+    int slot_id;
+    int error;
+}lynq_resp_t;
+
+#define RESULT_OK (0)
+#define RESULT_ERROR (-1)
+
+typedef enum{
+    /*base abnormal*/
+    LYNQ_E_PARAMETER_ANONALY=7000,
+    LYNQ_E_SEND_REQUEST_FAIL=7001,
+    LYNQ_E_GET_HEAD_ERROR=7002,
+    LYNQ_E_INNER_ERROR=7100,
+    LYNQ_E_MALLOC_ERROR=7101,
+    /**/
+    LYNQ_E_CARDSTATE_ERROR=8000,
+    /* The voice service state is out of service*/
+    LYNQ_E_STATE_OUT_OF_SERVICE=8001,
+    /* The voice service state is EMERGENCY_ONLY*/
+    LYNQ_E_STATE_EMERGENCY_ONLY=8002,
+    /* The radio power is power off*/
+    LYNQ_E_STATE_POWER_OFF=8003,
+    LYNQ_E_TIME_OUT=8004,
+    /*create or open sms DB fail */
+    LYNQ_E_SMS_DB_FAIL=8005,
+    /*Failed to execute sql statement*/
+    LYNQ_E_SMS_SQL_FAIL = 8006,
+    LYNQ_E_SMS_NOT_FIND = 8007,
+    /* The logic conflict*/
+    LYNQ_E_CONFLICT=9000,
+    /*Null anomaly*/
+    LYNQ_E_NULL_ANONALY=9001,
+     /*Invalid id anomaly*/
+    LYNQ_E_INVALID_ID_ANONALY=9002,
+#ifdef ECALL_SUPPORT
+    LYNQ_E_ECALL_BEING_RUNNING =9003,
+    LYNQ_E_ECALL_MSD_LENGTH_ERROR =9004,
+    LYNQ_E_ECALL_DAILING_NO_ANSWER =9005,
+#endif
+}LYNQ_E;
+
+/**@brief print solicied response msg's head information
+* @param head [IN]: head information
+* @return none
+*/
+void PrintHeader(lynq_resp_t& head)
+{
+    RLOGD("resp_type=%d,token=%d,request=%d,slot_id=%d,error_code=%d",head.resp_type,head.token,head.request,head.slot_id,head.error);
+}
+
+int GetHeader(Parcel* &p, lynq_resp_t& head, int request_id)
+{
+    RLOGD("get header");
+    if(p->dataAvail() > 0)
+    {
+        p->readInt32(&(head.resp_type));
+        p->readInt32(&(head.token));
+        p->readInt32(&(head.request));
+        RLOGD("%s %d", __FUNCTION__, head.request);
+        p->readInt32(&(head.slot_id));
+        p->readInt32(&(head.error));
+        PrintHeader(head);
+        return head.error;
+    }
+    else
+    {
+        return RESULT_ERROR;
+    }
+}
+
+int lynq_send_common_request(Parcel* p, int request_id, int argc, int cnt, const char* format,...)
+{
+    lynq_client_t client;
+    int ret;
+    int send_num;
+    int recv_num;
+    char res_data[MAX_LEN] = {0};
+    client.uToken = Global_uToken;
+    if(request_id == RIL_REQUEST_SCREEN_STATE)
+    {
+        client.request = LYNQ_REQUEST_CHANGE_SCREEN_STATE;
+    }
+    else if(request_id == RIL_REQUEST_RADIO_POWER)
+    {
+        client.request = LYNQ_REQUEST_CHANGE_RADIO;
+    }
+    else
+    {
+        client.request = request_id;
+    }
+    client.paramLen = argc;
+    bzero(client.param,MAX_LEN);
+    if(argc!=0)
+    {
+        va_list args;
+        va_start(args, format);
+        vsnprintf(client.param, MAX_LEN, format, args);
+        va_end(args);
+    }
+    RLOGD("uToken=%d,request=%d,paralen=%d,param=%s",client.uToken,client.request,client.paramLen,client.param);
+    pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
+    send_num = sendto(sock_fd,&client,sizeof(client),0,(struct sockaddr *)&addr_serv,len_addr_serv);
+    if(send_num <= 0)
+    {
+        RLOGD("send request fail, send num is %d", send_num);
+        pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
+        return LYNQ_E_SEND_REQUEST_FAIL;
+    }
+    lynq_resp_t head;
+    head.request = -1;
+    for(int i = 0; i < cnt;)
+    {
+        recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN, 0, (struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
+        if(recv_num <= 0)
+        {
+            RLOGD("recv request fail, recv num is %d", recv_num);
+            pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
+            return recv_num;
+        }
+        p->setData((uint8_t *)res_data,sizeof(char)*recv_num);
+        p->setDataPosition(0);
+        ret=GetHeader(p,head,request_id);
+        if(ret!=0)
+        {
+            RLOGD("%s %d get head error %d",__FUNCTION__,client.uToken,ret);
+            pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
+            return ret;
+        }
+        if(request_id == head.request)
+        {
+            i++;
+        }
+    }
+    pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
+    return ret;
+}
+
 int lynq_sim_init(int utoken){
 
     RLOGE("%s start, parameter is %d", __func__,utoken);
@@ -169,104 +295,34 @@
     {
         return -1;
     }
-    int ret = -1;
-    if(card_status == NULL)
-        return ret;
-    int send_num = 0;
-    int recv_num = 0;
-    int len = 0;
-    lynq_client_t client_t1;
-    memset(&client_t1, 0, sizeof(client_t1) );
-    client_t1.request = RIL_REQUEST_GET_SIM_STATUS;
-    client_t1.paramLen = 0;
-    client_t1.uToken = Global_uToken;
-    char res_data[MAX_LEN] = {0};
-    int len1 = sizeof(client_t1.param);
-    memset(client_t1.param, 0, sizeof(char)*MAX_LEN);
-    pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
-    send_num = sendto(sock_fd, &client_t1, sizeof(client_t1), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
-    if(send_num < 0)  
-    {  
-        RLOGD("function %s sendto error:", __FUNCTION__);
-        pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
-        return send_num;
-    }
-    //get data msg
-    recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN, 0, (struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
-    if(recv_num < 0 || recv_num == 0)
+    Parcel p;
+    int res = lynq_send_common_request(&p,RIL_REQUEST_GET_SIM_STATUS,0,1,"");
+    if(res != 0)
     {
-        RLOGD("recvfrom step2 fail:");
-        pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
-        return recv_num;
+        RLOGD("function %s execute error", __FUNCTION__);
+        return res;
     }
-    pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
-    Parcel p;;
-    p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
-    p.setDataPosition(0);
-    if(p.dataAvail() > 0)
-    {
-        p.readInt32(&resp_type);
-        p.readInt32(&solicited_token);
-        p.readInt32(&request);
-        p.readInt32(&slot_id);
-        p.readInt32(&error1);
-        p.readInt32(card_status);
-    }
-    return error1;
+    p.readInt32(card_status);
+    return res;
 }
 
 int lynq_get_imsi(char buf[])
-{   
+{
     if(g_lynq_sim_init_flag == 0)
     {
         return -1;
     }
-    int ret = -1;
-    if(buf == NULL)
-        return ret;
-    int send_num = 0;
-    int recv_num = 0;
-    int len = 0;
-    lynq_client_t client_t1;
-    memset(&client_t1, 0, sizeof(client_t1) );
-    client_t1.request = RIL_REQUEST_GET_IMSI;
-    client_t1.paramLen = 0;
-    client_t1.uToken = Global_uToken;
-    char res_data[MAX_LEN] = {0};
-    memset(client_t1.param, 0, sizeof(client_t1.param));
-    pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
-    send_num = sendto(sock_fd, &client_t1, sizeof(client_t1), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
-    if(send_num < 0)  
-    {  
-        RLOGD("function %s sendto error:", __FUNCTION__);
-        pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
-        return send_num;
-    }
-    //get data msg
-    recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN,0,(struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
-    pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
-    if(recv_num < 0 || recv_num == 0)
-    {
-        RLOGD("recvfrom step2 fail:");
-        return recv_num;
-    }
     Parcel p;
-    p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
-    p.setDataPosition(0);
-    if(p.dataAvail() > 0)
+    int res = lynq_send_common_request(&p,RIL_REQUEST_GET_IMSI,0,1,"");
+    if(res != 0)
     {
-        p.readInt32(&resp_type);
-        p.readInt32(&solicited_token);
-        p.readInt32(&request);
-        p.readInt32(&slot_id);
-        p.readInt32(&error1);
-        if(!error1){
-            char * test = lynqStrdupReadString(p);
-            memcpy(buf, test, strlen(test));
-            free(test);
-        }
+        RLOGD("function %s execute error", __FUNCTION__);
+        return res;
     }
-    return error1;
+    char * test = lynqStrdupReadString(p);
+    memcpy(buf, test, strlen(test));
+    free(test);
+    return res;
 }
 
 
@@ -277,50 +333,17 @@
     {
         return -1;
     }
-    int ret = -1;
-    if(buf == NULL)
-        return ret;
-    int send_num = 0;
-    int recv_num = 0;
-    int len = 0; 
-    client_t.request = RIL_REQUEST_QUERY_ICCID;
-    client_t.paramLen = 0;
-    client_t.uToken = Global_uToken;
-    char res_data[MAX_LEN] = {0};
-    memset(client_t.param, 0, sizeof(client_t.param));
-    pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
-    send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
-    if(send_num < 0)  
-    {  
-        RLOGD("function %s sendto error:", __FUNCTION__);
-        pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
-        return send_num;
-    }
-    //get data msg
-    recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN,0,(struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
-    pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
-    if(recv_num < 0 || recv_num == 0)
-    {
-        RLOGD("recvfrom step2 fail:");
-        return recv_num;
-    }
     Parcel p;
-    p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
-    p.setDataPosition(0);
-    if(p.dataAvail() > 0)
+    int res = lynq_send_common_request(&p,RIL_REQUEST_QUERY_ICCID,0,1,"");
+    if(res != 0)
     {
-        p.readInt32(&resp_type);
-        p.readInt32(&solicited_token);
-        p.readInt32(&request);
-        p.readInt32(&slot_id);
-        p.readInt32(&error1);
-        if(!error1){
-            char * test = lynqStrdupReadString(p);
-            memcpy(buf, test, strlen(test));
-            free(test);
-        }
+        RLOGD("function %s execute error", __FUNCTION__);
+        return res;
     }
-    return error1;
+    char * test = lynqStrdupReadString(p);
+    memcpy(buf, test, strlen(test));
+    free(test);
+    return res;
 }
 
 int lynq_enable_pin(char *pin){
@@ -328,47 +351,14 @@
     {
         return -1;
     }
-    int ret = -1;
-    if(pin == NULL)
-        return ret;
-    if(!strlen(pin))
-        return ret;
-    int send_num = 0;
-    int recv_num = 0;  
-    char res_data[MAX_LEN] = {0};
-    client_t.request = RIL_REQUEST_SET_FACILITY_LOCK;
-    client_t.paramLen = 4;
-    client_t.uToken = Global_uToken;
-    sprintf(client_t.param, "%s %s %s %s\n", "SC", pin, "11", "1");
-    pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
-    send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
-    if(send_num < 0)  
-    {  
-        RLOGD("function %s sendto error:", __FUNCTION__);
-        pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
-        return send_num;
-    }
-
-    //get data msg
-    recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN,0,(struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
-    pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
-    if(recv_num < 0 || recv_num == 0)
-    {
-        RLOGD("recvfrom step2 fail:");
-        return recv_num;
-    }
     Parcel p;
-    p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
-    p.setDataPosition(0);
-    if(p.dataAvail() > 0)
+    int res = lynq_send_common_request(&p,RIL_REQUEST_SET_FACILITY_LOCK,4,1,"%s %s %s %s\n", "SC", pin, "11", "1");
+    if(res != 0)
     {
-        p.readInt32(&resp_type);
-        p.readInt32(&solicited_token);
-        p.readInt32(&request);
-        p.readInt32(&slot_id);
-        p.readInt32(&error1);
+        RLOGD("function %s execute error", __FUNCTION__);
+        return res;
     }
-    return error1;
+    return res;
 }
 
 int lynq_sim_power(int mode)
@@ -377,53 +367,14 @@
     {
         return -1;
     }
-    int ret = -1;
-    int send_num = 0;
-    int recv_num = 0;
-    int len = 0;
-    char res_data[MAX_LEN] = {0};
-    client_t.request = RIL_REQUEST_OEM_HOOK_RAW;
-    client_t.paramLen = 1;
-    client_t.uToken = Global_uToken;
-    char buf[64] = {0};
-    sprintf(buf, "%s%d", "AT+ESIMPOWER=", mode);
-    sprintf(client_t.param, "%s\n", buf);
-    pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
-    send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
-    if(send_num < 0)  
-    {  
-        RLOGD("function %s sendto error:", __FUNCTION__);
-        pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
-        return ret;
-    }
-     //get data msg
-    recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN,0,(struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
-    pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
-    if(recv_num < 0 || recv_num == 0)
-    {
-        RLOGD("recvfrom step2 fail:");
-        return recv_num;
-    }
     Parcel p;
-    p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
-    p.setDataPosition(0);
-    int num = -1;
-    if(p.dataAvail() > 0)
-    {   
-        char test[128] = {0};
-        p.readInt32(&resp_type);
-        p.readInt32(&solicited_token);
-        p.readInt32(&request);
-        p.readInt32(&slot_id);
-        p.readInt32(&error1);
-        p.readInt32(&num);
-        if(num == -1){
-        }else{
-            p.read(test, num);
-            return error1;
-        }
+    int res = lynq_send_common_request(&p,RIL_REQUEST_OEM_HOOK_RAW,1,1,"%s%d", "AT+ESIMPOWER=", mode);
+    if(res != 0)
+    {
+        RLOGD("function %s execute error", __FUNCTION__);
+        return res;
     }
-    return error1;
+    return res;
 }
 
 int lynq_disable_pin(char *pin){
@@ -431,44 +382,14 @@
     {
         return -1;
     }
-    int ret = -1;
-    if(pin == NULL)
-        return ret;
-    int send_num = 0;  
-    int recv_num = 0;
-    char res_data[MAX_LEN] = {0};
-    client_t.request = RIL_REQUEST_SET_FACILITY_LOCK;
-    client_t.paramLen = 4;
-    client_t.uToken = Global_uToken;
-    sprintf(client_t.param, "%s %s %s %s\n", "SC", pin, "11", "0");
-    pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
-    send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
-    if(send_num < 0)  
-    {  
-        RLOGD("function %s sendto error:", __FUNCTION__);
-        pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
-        return send_num;
-    }
-    //get data msg
-    recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN,0,(struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
-    pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
-    if(recv_num < 0 || recv_num == 0)
-    {
-        RLOGD("recvfrom step2 fail:");
-        return recv_num;
-    }
     Parcel p;
-    p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
-    p.setDataPosition(0);
-    if(p.dataAvail() > 0)
+    int res = lynq_send_common_request(&p,RIL_REQUEST_SET_FACILITY_LOCK,4,1,"%s %s %s %s\n", "SC", pin, "11", "0");
+    if(res != 0)
     {
-        p.readInt32(&resp_type);
-        p.readInt32(&solicited_token);
-        p.readInt32(&request);
-        p.readInt32(&slot_id);
-        p.readInt32(&error1);
+        RLOGD("function %s execute error", __FUNCTION__);
+        return res;
     }
-    return error1;
+    return res;
 }
 
 int lynq_query_pin_lock(char *pin,int buf[]){
@@ -476,55 +397,25 @@
     {
         return -1;
     }
-    int ret = -1;
-    if(pin == NULL)
-        return ret;
-    int send_num = 0;
-    int recv_num = 0;
-    int len = 0; 
-    client_t.request = RIL_REQUEST_QUERY_FACILITY_LOCK;
-    client_t.paramLen = 3;
-    client_t.uToken = Global_uToken;
-    char res_data[MAX_LEN] = {0};
-    sprintf(client_t.param, "%s %s %s\n", "SC", pin, "11");
-    pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
-    send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
-    if(send_num < 0)  
-    {  
-        RLOGD("function %s sendto error:", __FUNCTION__);
-        pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);  
-        return send_num;
-    }
-    //get data msg
-    recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN,0,(struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
-    pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
-    if(recv_num < 0 || recv_num == 0)
-    {
-        RLOGD("recvfrom step2 fail:");
-        return recv_num;
-    }
     Parcel p;
-    p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
-    p.setDataPosition(0);
-    int num = -1;
-    if(p.dataAvail() > 0)
+    int res = lynq_send_common_request(&p,RIL_REQUEST_QUERY_FACILITY_LOCK,3,1,"%s %s %s\n", "SC", pin, "11");
+    if(res != 0)
     {
-        p.readInt32(&resp_type);
-        p.readInt32(&solicited_token);
-        p.readInt32(&request);
-        p.readInt32(&slot_id);
-        p.readInt32(&error1);
-        p.readInt32(&num);
-        if(num > 0){
-            int *test = (int *)calloc(1, sizeof(int)*num);
-            for(int i =0; i <num; i++){
-                p.readInt32(&test[i]);
-                buf[i] = test[i];
-            }
-            free(test);
-        }
+        RLOGD("function %s execute error", __FUNCTION__);
+        return res;
     }
-    return error1;
+    int num = -1;
+    p.readInt32(&num);
+    if(num > 0)
+    {
+        int *test = (int *)calloc(num, sizeof(int));
+        for(int i =0; i <num; i++){
+            p.readInt32(&test[i]);
+            buf[i] = test[i];
+        }
+        free(test);
+    }
+    return res;
 }
 
 int lynq_verify_pin(char *pin){
@@ -532,45 +423,14 @@
     {
         return -1;
     }
-    int ret = -1;
-    if(pin == NULL)
-        return ret;
-    int send_num = 0;
-    int recv_num = 0;
-    char res_data[MAX_LEN] = {0};
-    int len = 0; 
-    client_t.request = RIL_REQUEST_ENTER_SIM_PIN;
-    client_t.paramLen = 1;
-    client_t.uToken = Global_uToken;
-    sprintf(client_t.param, "%s\n", pin);
-    pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
-    send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
-    if(send_num < 0)  
-    {  
-        RLOGD("function %s sendto error:", __FUNCTION__);
-        pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
-        return send_num;
-    }
-   //get data msg
-    recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN,0,(struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
-    pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
-    if(recv_num < 0 || recv_num == 0)
-    {
-        RLOGD("recvfrom step2 fail:");
-        return recv_num;
-    }
     Parcel p;
-    p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
-    p.setDataPosition(0);
-    if(p.dataAvail() > 0)
+    int res = lynq_send_common_request(&p,RIL_REQUEST_ENTER_SIM_PIN,1,1,"%s\n", pin);
+    if(res != 0)
     {
-        p.readInt32(&resp_type);
-        p.readInt32(&solicited_token);
-        p.readInt32(&request);
-        p.readInt32(&slot_id);
-        p.readInt32(&error1);
+        RLOGD("function %s execute error", __FUNCTION__);
+        return res;
     }
-    return error1;
+    return res;
 }
 
 int lynq_change_pin(char *old_pin, char *new_pin){
@@ -578,49 +438,21 @@
     {
         return -1;
     }
-    int ret = -1;
+    int res = -1;
     if(old_pin == NULL || new_pin == NULL)
-        return ret;
+        return res;
     if(!strlen(new_pin))
-        return ret;
+        return res;
     if(!strlen(old_pin))
-        return ret;
-    int send_num = 0;
-    int recv_num = 0;
-    char res_data[MAX_LEN] = {0};
-    int len = 0; 
-    client_t.request = RIL_REQUEST_CHANGE_SIM_PIN;
-    client_t.paramLen = 2;
-    client_t.uToken = Global_uToken;
-    sprintf(client_t.param, "%s %s\n", old_pin, new_pin);
-    pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
-    send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
-    if(send_num < 0)  
-    {  
-        RLOGD("function %s sendto error:", __FUNCTION__);
-        pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
-        return send_num;
-    }
-    //get data msg
-    recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN,0,(struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
-    pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
-    if(recv_num < 0 || recv_num == 0)
-    {
-        RLOGD("recvfrom step2 fail:");
-        return recv_num;
-    }
+        return res;
     Parcel p;
-    p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
-    p.setDataPosition(0);
-    if(p.dataAvail() > 0)
+    res = lynq_send_common_request(&p,RIL_REQUEST_CHANGE_SIM_PIN,2,1,"%s %s\n", old_pin, new_pin);
+    if(res != 0)
     {
-        p.readInt32(&resp_type);
-        p.readInt32(&solicited_token);
-        p.readInt32(&request);
-        p.readInt32(&slot_id);
-        p.readInt32(&error1);
+        RLOGD("function %s execute error", __FUNCTION__);
+        return res;
     }
-    return error1;
+    return res;
 }
 
 int lynq_unlock_pin(char *puk, char *pin){
@@ -628,45 +460,16 @@
     {
         return -1;
     }
-    int ret = -1;
     if(puk == NULL || pin == NULL)
-        return ret;
-    int send_num = 0;
-    int recv_num = 0;
-    char res_data[MAX_LEN] = {0};
-    int len = 0; 
-    client_t.request = RIL_REQUEST_ENTER_SIM_PUK;
-    client_t.paramLen = 2;
-    client_t.uToken = Global_uToken;
-    sprintf(client_t.param, "%s %s\n", puk, pin);
-    pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
-    send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
-    if(send_num < 0)  
-    {  
-        RLOGD("function %s sendto error:", __FUNCTION__);
-        pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
-        return send_num;
-    }
-    //get data msg
-    recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN,0,(struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
-    pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
-    if(recv_num < 0 || recv_num == 0)
-    {
-        RLOGD("recvfrom step2 fail:");
-        return recv_num;
-    }
+        return -1;
     Parcel p;
-    p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
-    p.setDataPosition(0);
-    if(p.dataAvail() > 0)
+    int res = lynq_send_common_request(&p,RIL_REQUEST_ENTER_SIM_PUK,2,1,"%s %s\n", puk, pin);
+    if(res != 0)
     {
-        p.readInt32(&resp_type);
-        p.readInt32(&solicited_token);
-        p.readInt32(&request);
-        p.readInt32(&slot_id);
-        p.readInt32(&error1);
+        RLOGD("function %s execute error", __FUNCTION__);
+        return res;
     }
-    return error1;
+    return res;
 }
 
 static void delete_char(char str[],char target){
@@ -736,55 +539,24 @@
     {
         return -1;
     }
-    int ret = -1;
-    if(buf == NULL)
-        return ret;
-    int send_num = 0;
-    int recv_num = 0;
-    int len = 0;
-    char res_data[MAX_LEN] = {0};
-    client_t.request = RIL_REQUEST_OEM_HOOK_RAW;
-    client_t.paramLen = 1;
-    client_t.uToken = Global_uToken;
-    sprintf(client_t.param, "%s\n", "AT+CNUM");
-    pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
-    send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
-    if(send_num < 0)  
-    {  
-        RLOGD("function %s sendto error:", __FUNCTION__);
-        pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
-        return ret;
-    }
-     //get data msg
-    recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN,0,(struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
-    pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
-    if(recv_num < 0 || recv_num == 0)
-    {
-        RLOGD("recvfrom step2 fail:");
-        return recv_num;
-    }
     Parcel p;
-    p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
-    p.setDataPosition(0);
-    int num = -1;
-    if(p.dataAvail() > 0)
-    {   
-        char test[128] = {0};
-        char *argv[5] = {0};
-        p.readInt32(&resp_type);
-        p.readInt32(&solicited_token);
-        p.readInt32(&request);
-        p.readInt32(&slot_id);
-        p.readInt32(&error1);
-        p.readInt32(&num);
-        if(num == -1){
-        }else{
-            p.read(test, num);
-            num = parse_param(test, argv, buf);
-            return num;
-        }
+    int res = lynq_send_common_request(&p,RIL_REQUEST_OEM_HOOK_RAW,1,1,"%s\n", "AT+CNUM");
+    if(res != 0)
+    {
+        RLOGD("function %s execute error", __FUNCTION__);
+        return res;
     }
-    return error1;
+    int num = -1;
+    p.readInt32(&num);
+    char test[128] = {0};
+    char *argv[5] = {0};
+    if(num != -1)
+    {
+        p.read(test, num);
+        num = parse_param(test, argv, buf);
+        return num;
+    }
+    return res;
 }
 
 int lynq_get_imei(char buf[])
@@ -793,147 +565,68 @@
     {
         return -1;
     }
-    int ret = -1;
-    if(buf == NULL)
-        return ret;
-    int send_num = 0;
-    int recv_num = 0;
-    int len = 0;
-    lynq_client_t client_t1;
-    memset(&client_t1, 0, sizeof(client_t1) );
-    client_t1.request = RIL_REQUEST_DEVICE_IDENTITY;
-    client_t1.paramLen = 0;
-    client_t1.uToken = Global_uToken;
-    char res_data[MAX_LEN] = {0};
-    memset(client_t1.param, 0, sizeof(client_t1.param));
-    pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
-    send_num = sendto(sock_fd, &client_t1, sizeof(client_t1), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
-    if(send_num < 0)  
-    {  
-        RLOGD("function %s sendto error:", __FUNCTION__);
-        pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
-        return send_num;
-    }
-    //get data msg
-    recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN,0,(struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
-    pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
-    if(recv_num < 0 || recv_num == 0)
-    {
-        RLOGD("recvfrom step2 fail:");
-        return recv_num;
-    }
     Parcel p;
-    p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
-    p.setDataPosition(0);
-    int num = 0;
-    if(p.dataAvail() > 0)
+    int res = lynq_send_common_request(&p,RIL_REQUEST_DEVICE_IDENTITY,0,1,"");
+    if(res != 0)
     {
-        p.readInt32(&resp_type);
-        p.readInt32(&solicited_token);
-        p.readInt32(&request);
-        p.readInt32(&slot_id);
-        p.readInt32(&error1);
-        if(!error1){
-            p.readInt32(&num);
-            char * test = lynqStrdupReadString(p);          
-            memcpy(buf, test, strlen(test));
-            free(test);
-        }
+        RLOGD("function %s execute error", __FUNCTION__);
+        return res;
     }
-    return error1;
+    int num = 0;
+    p.readInt32(&num);
+    char * test = lynqStrdupReadString(p);
+    memcpy(buf, test, strlen(test));
+    free(test);
+    return res;
 }
 
 int lynq_get_imei_and_sv(char imei[],char sv[])
 {
-    RLOGD("%s called",__func__);  
     if(g_lynq_sim_init_flag == 0)
     {
-        RLOGD("%s init_flag is %d",__func__,g_lynq_sim_init_flag);  
-        return -2;
-    }
-    int ret = -1;
-    if(imei == NULL || sv== NULL)
-    {
-        RLOGD("%s imei is NULL or sv is NULL",__func__);  
-        return ret;
-    }
-    
-    int send_num = 0;
-    int recv_num = 0;
-    int len = 0;
-    lynq_client_t client_t1;
-    memset(&client_t1, 0, sizeof(client_t1) );
-    client_t1.request = RIL_REQUEST_DEVICE_IDENTITY;
-    client_t1.paramLen = 0;
-    client_t1.uToken = Global_uToken;
-    char res_data[MAX_LEN] = {0};
-    memset(client_t1.param, 0, sizeof(client_t1.param));
-    pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
-    send_num = sendto(sock_fd, &client_t1, sizeof(client_t1), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
-    if(send_num < 0)  
-    {  
-        RLOGD("%s sendto error: %d",__func__,send_num);
-        pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
-        return send_num;
-    }
-    //get data msg
-    recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN,0,(struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
-    pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
-    if(recv_num < 0 || recv_num == 0)
-    {
-        RLOGD("%s recvfrom step2 fail:%d",__func__,recv_num);
-        return recv_num;
+        return -1;
     }
     Parcel p;
-    p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
-    p.setDataPosition(0);
-    int num = 0;
-    if(p.dataAvail() > 0)
+    int res = lynq_send_common_request(&p,RIL_REQUEST_DEVICE_IDENTITY,0,1,"");
+    if(res != 0)
     {
-        p.readInt32(&resp_type);
-        p.readInt32(&solicited_token);
-        p.readInt32(&request);
-        p.readInt32(&slot_id);
-        p.readInt32(&error1);
-        if(!error1){
-            p.readInt32(&num);
-            if(num<2)
-            {
-                RLOGD("%s num %d error, should greater than 1",__func__,num);
-                return -1;
-            }
-            char *resp[2]={NULL,NULL};
-            int i;
-            for(i=0;i<2;i++)
-            {
-                resp[i]= lynqStrdupReadString(p);
-                if(resp[i]==NULL)
-                {
-                    break;
-                }
-            }            
-
-            if(i==2){           
-                memcpy(imei, resp[0], strlen(resp[0])+1);
-                memcpy(sv, resp[1], strlen(resp[1])+1);
-            }
-            else 
-            {
-                RLOGD("%s resp[%d] is null",__func__,i);
-            }             
-
-            for(i=0;i<2;i++)
-            {
-                if(resp[i]!=NULL)
-                {
-                    free(resp[i]);            
-                }            
-            }                        
-            return i==2? 0:-1;
+        RLOGD("function %s execute error", __FUNCTION__);
+        return res;
+    }
+    int num = 0;
+    p.readInt32(&num);
+    if(num<2)
+    {
+        RLOGD("%s num %d error, should greater than 1",__func__,num);
+        return -1;
+    }
+    char *resp[2]={NULL,NULL};
+    int i;
+    for(i=0;i<2;i++)
+    {
+        resp[i]= lynqStrdupReadString(p);
+        if(resp[i]==NULL)
+        {
+            break;
         }
-    }    
-    RLOGD("%s called failed %d",__func__,error1);  
-    return error1;
+    }
+    if(i==2){
+        memcpy(imei, resp[0], strlen(resp[0])+1);
+        memcpy(sv, resp[1], strlen(resp[1])+1);
+    }
+    else
+    {
+        RLOGD("%s resp[%d] is null",__func__,i);
+    }
+    for(i=0;i<2;i++)
+    {
+        if(resp[i]!=NULL)
+        {
+            free(resp[i]);
+        }
+    }
+    return i==2? 0:-1;
+
 }
 
 static int judge(int slot){
@@ -951,16 +644,16 @@
     {
         return -1;
     }
-    int ret = -1;
     if(!judge(slot))
-        return ret;
+        return -1;
     int send_num = 0;
+    lynq_client_t client_t;
     client_t.request = LYNQ_REQUEST_SET_DEFAULT_SIM_ALL;
     client_t.paramLen = 1;
     client_t.uToken = Global_uToken;
     sprintf(client_t.param, "%d\n", slot);
     pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
-    send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
+    send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv); //because ril of id = -1
     if(send_num < 0)  
     {  
         RLOGD("function %s sendto error:", __FUNCTION__);  
@@ -979,74 +672,16 @@
     {
         return -1;
     }
-
-    int ret = -1;
     if(!judge(num))
-        return ret;
-    int send_num = 0;
-    int recv_num = 0;
-    int error[2];
-    char res_data[MAX_LEN] = {0};
-
-    //change the first screen
-    client_t.request = LYNQ_REQUEST_CHANGE_SCREEN_STATE; //8014
-    client_t.paramLen = 1;
-    client_t.uToken = Global_uToken;
-    sprintf(client_t.param, "%d\n", num);
-
-    pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
-    send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
-    if(send_num < 0)
+        return -1;
+    Parcel p;
+    int res = lynq_send_common_request(&p,RIL_REQUEST_SCREEN_STATE,1,2,"%d\n",num);
+    if(res != 0)
     {
-        RLOGD("sendto error:\n");
-        pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
-        return send_num;
+        RLOGD("function %s execute error", __FUNCTION__);
+        return res;
     }
-    for(int i=0;i<2;i++)
-    {
-        recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN,0,(struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
-        if(recv_num < 0 || recv_num == 0)
-        {
-            pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);//recvfrom fail
-            RLOGD("screen recvform error\n");
-            return errno;
-        }
-        if(i == 1)
-        {
-            pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
-            RLOGD("recvfrom success\n");
-        }
-        Parcel p;
-        p.setData((uint8_t *)res_data,sizeof(char)*recv_num);
-        p.setDataPosition(0);
-        if(p.dataAvail() > 0)
-        {
-            p.readInt32(&resp_type);
-            p.readInt32(&solicited_token);
-            p.readInt32(&request);
-            p.readInt32(&slot_id);
-            p.readInt32(&error1);
-            error[i] = error1;//change screen state result
-        }
-    }
-    
-    if((error[0] != 0) || (error[1] != 0))
-    {
-        RLOGD("error[0] = %d errpr[1] = %d\n",error[0], error[1]);
-        if(error[0] != 0)
-        {
-            return error[0];
-        }
-        else
-        {
-            return error[1];
-        }
-    }
-    else
-    {
-        return 0;
-    }
-
+    return res;
 }
 
 /**@breif    change screen state
@@ -1059,73 +694,16 @@
     {
         return -1;
     }
-
-    int ret = -1;
     if(!judge(num))
-        return ret;
-    int send_num = 0;
-    int recv_num = 0;
-    int error[2];
-    char res_data[MAX_LEN] = {0};
-    //change the first screen
-    client_t.request = LYNQ_REQUEST_CHANGE_RADIO; //8015
-    client_t.paramLen = 1;
-    client_t.uToken = Global_uToken;
-    sprintf(client_t.param, "%d\n", num);
-
-    pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
-    send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
-    if(send_num < 0)
+        return -1;
+    Parcel p;
+    int res = lynq_send_common_request(&p,RIL_REQUEST_RADIO_POWER,1,2,"%d\n",num);
+    if(res != 0)
     {
-        RLOGD("sendto error:\n");
-        pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
-        return send_num;
+        RLOGD("function %s execute error", __FUNCTION__);
+        return res;
     }
-    for(int i=0;i<2;i++)
-    {
-        recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN,0,(struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
-        if(recv_num < 0 || recv_num == 0)
-        {
-            pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);//recvfrom fail
-            RLOGD("screen recvform error\n");
-            return errno;
-        }
-        if(i == 1)
-        {
-            pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
-            RLOGD("recvfrom success\n");
-        }
-        Parcel p;
-        p.setData((uint8_t *)res_data,sizeof(char)*recv_num);
-        p.setDataPosition(0);
-        if(p.dataAvail() > 0)
-        {
-            p.readInt32(&resp_type);
-            p.readInt32(&solicited_token);
-            p.readInt32(&request);
-            p.readInt32(&slot_id);
-            p.readInt32(&error1);
-            error[i] = error1;//change screen state result
-        }
-    }
-    
-    if((error[0] != 0) || (error[1] != 0))
-    {
-        RLOGD("error[0] = %d errpr[1] = %d\n",error[0], error[1]);
-        if(error[0] != 0)
-        {
-            return error[0];
-        }
-        else
-        {
-            return error[1];
-        }
-    }
-    else
-    {
-        return 0;
-    }
-
+    return res;
 }
 
 /**
@@ -1197,54 +775,23 @@
     {
         return -1;
     }
-    int ret = -1;
     if(judge_illegal(list, path, data, pin2, aidPtr, sw, simResponse))
     {
-        return ret;
-    }
-    int send_num = 0;
-    int recv_num = 0;
-    char res_data[MAX_LEN] = {0};
-    client_t.request = RIL_REQUEST_SIM_IO;
-    client_t.paramLen = 9;
-    client_t.uToken = Global_uToken;
-    sprintf(client_t.param, "%d %d %s %d %d %d %s %s %s\n", list[0], list[1], path, list[2], list[3], list[4], data_buf, pin2_buf, aidPtr_buf);
-    pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
-    send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
-    if(send_num < 0)
-    {
-        RLOGD("function %s sendto error:", __FUNCTION__);
-        pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
-        return send_num;
-    }
-    recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN,0,(struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
-    pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
-    if(recv_num < 0 || recv_num == 0)
-    {
-        RLOGD("recvfrom step2 fail:");
-        return recv_num;
+        return -1;
     }
     Parcel p;
-    p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
-    p.setDataPosition(0);
-    if(p.dataAvail() > 0)
+    int res = lynq_send_common_request(&p,RIL_REQUEST_SIM_IO,9,1,"%d %d %s %d %d %d %s %s %s\n", list[0], list[1], path, list[2], list[3], list[4], data_buf, pin2_buf, aidPtr_buf);
+    if(res != 0)
     {
-        p.readInt32(&resp_type);
-        p.readInt32(&solicited_token);
-        p.readInt32(&request);
-        p.readInt32(&slot_id);
-        p.readInt32(&error1);
-        if(!error1)
-        {
-            p.readInt32(&sw[0]);
-            p.readInt32(&sw[1]);
-            char * test = lynqStrdupReadString(p);
-            memcpy(simResponse, test, strlen(test));
-            free(test);
-        }
-
+        RLOGD("function %s execute error", __FUNCTION__);
+        return res;
     }
-    return error1;
+    p.readInt32(&sw[0]);
+    p.readInt32(&sw[1]);
+    char * test = lynqStrdupReadString(p);
+    memcpy(simResponse, test, strlen(test));
+    free(test);
+    return res;
 }
 
 static void wait_reset_mipc_response(int *response)
@@ -1272,12 +819,13 @@
     }
     int ret = -1;
     int send_num = 0;
+    lynq_client_t client_t;
     client_t.request = RIL_REQUEST_OEM_HOOK_RAW;
     client_t.paramLen = 1;
     client_t.uToken = Global_uToken;
     sprintf(client_t.param, "%s\n", "AT+LRSTMD");
     pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
-    send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
+    send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);//because response not by ril callback
     if(send_num < 0)  
     {  
         RLOGD("function %s sendto error:", __FUNCTION__);
@@ -1286,7 +834,7 @@
     }
     wait_reset_mipc_response(&ret);
     pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
-    RLOGD("function %d ret %d",__FUNCTION__, ret);
+    RLOGD("function %s ret %d",__FUNCTION__, ret);
     return ret;
 }
 
@@ -1338,60 +886,31 @@
 
 int lynq_get_version(char buf[])
 {
-    FILE * fp;
+    FILE *fp;
     char buffer[128];
     sprintf(buffer, "%s", "uci get lynq_uci_ro.lynq_version.LYNQ_SW_VERSION");
     fp = popen(buffer, "r");
-    fgets(buffer, sizeof(buffer), fp);
+    if(NULL == fp)
+    {
+        RLOGE("popen failed !");
+        return -1;
+    }
+    if(NULL != fgets(buffer, sizeof(buffer), fp))
+    {
+        if('\n' == buffer[strlen(buffer) - 1])
+        {
+            buffer[strlen(buffer) - 1] = '\0';
+        }
+    }
+    else
+    {
+        RLOGE("fgets failed !");
+        pclose(fp);
+        return -1;
+    }
     memcpy(buf, buffer, strlen(buffer));
     buf[strlen(buffer)] = '\0';
     pclose(fp);
     return 0;
 }
-#if FLAG_TESS
-int lynq_query_operator(char buf[]){
-    int32_t token = -1;
-    if(buf == NULL)
-        return token;
-    char msg_imsi[20] = {0};
-    memset(msg_imsi,0,sizeof(msg_imsi));
-    token = lynq_get_imsi(msg_imsi);
-    if(strlen(msg_imsi) != 0){
-        FindOperator *ope_command = NULL;
-        ope_command = find_ope_command(msg_imsi, findOperator);
-        if(ope_command){
-            memcpy(buf, ope_command->buf, strlen(ope_command->buf));
-            buf[strlen(ope_command->buf)] = '\0';
-        }
-        else{
-            /*more*/
-            char mccmnc[5] = {0};
-            memcpy(buf, msg_imsi, 5);
-            buf[5] = '\0';
-            /*more*/
-        }
-        return token;
-    }
-    else{
-        //msg->base.e = err;
-        const char *test = "please insert sim card";
-        memcpy(buf, test, strlen(test));
-        return token;
-    }
-}
-FindOperator findOperator[] = {
-#include "operator.h"
-};
 
-static FindOperator*find_ope_command (char *name,FindOperator *Class){
-    if(name == NULL || Class == NULL){
-        return ((FindOperator *)NULL);
-    }
-    register int i;
-    for (i = 0; Class[i].MCCMCN; i++)
-        if (strncmp (name, Class[i].MCCMCN, 5) == 0)
-            return (&Class[i]);
-    return ((FindOperator *)NULL);
-}
-
-#endif
diff --git a/common_src/lib/liblynq-uci/lynq_uci.config b/common_src/lib/liblynq-uci/lynq_uci.config
index 501a034..a9232a1 100755
--- a/common_src/lib/liblynq-uci/lynq_uci.config
+++ b/common_src/lib/liblynq-uci/lynq_uci.config
@@ -27,6 +27,9 @@
 config  lynq_rndis  'lynq_rndis'

         option initiate '0'

 

+config  rndis_status 'rndis'

+        option status '0'

+

 config  debug_mode_status 'debug_mode'

         option rild_debug_status '0'

         option sysinfo_debug_status '0'