diff --git a/src/bsp/lk/app/blxboot/rules.mk b/src/bsp/lk/app/blxboot/rules.mk
index b832b2c..2dfae7e 100644
--- a/src/bsp/lk/app/blxboot/rules.mk
+++ b/src/bsp/lk/app/blxboot/rules.mk
@@ -28,9 +28,11 @@
 GLOBAL_COMPILEFLAGS += -DAB_OTA_UPDATER
 endif
 
-ifeq ($(strip $(ENABLE_TCXO)),yes)
-GLOBAL_COMPILEFLAGS += -DENABLE_TCXO
-endif
+#Typethree@2023.2.01 modify for TCXO hw version start
+#ifeq ($(strip $(ENABLE_TCXO)),yes)
+#GLOBAL_COMPILEFLAGS += -DENABLE_TCXO
+#endif
+#Typethree@2023.2.01 modify for TCXO hw version end
 
 # loading kernel format config,
 # 0: fit image header 1: android image header
diff --git a/src/bsp/lk/engine.mk b/src/bsp/lk/engine.mk
index aeae002..d4717ea 100755
--- a/src/bsp/lk/engine.mk
+++ b/src/bsp/lk/engine.mk
@@ -83,6 +83,12 @@
 endif
 
 GLOBAL_CPPFLAGS := -fno-exceptions -fno-rtti -fno-threadsafe-statics
+#xf.li@20230207 modify for T8TSK-155
+LYNQ_CONFIG_COMMITID := $(shell git rev-parse HEAD)
+
+GLOBAL_COMPILEFLAGS += -DLYNQ_VERSION=\"$(LYNQ_CONFIG_VERSION)\"
+GLOBAL_COMPILEFLAGS += -DLYNQ_COMMITID=\"$(LYNQ_CONFIG_COMMITID)\"
+#xf.li@20230207 modify for T8TSK-155
 #GLOBAL_CPPFLAGS += -Weffc++
 GLOBAL_ASMFLAGS := -DASSEMBLY
 GLOBAL_LDFLAGS :=
diff --git a/src/bsp/lk/makefile b/src/bsp/lk/makefile
index be3f634..6cd54cc 100644
--- a/src/bsp/lk/makefile
+++ b/src/bsp/lk/makefile
@@ -24,7 +24,10 @@
 export SECURE_BOOT_TYPE
 export AB_OTA_UPDATER
 export AVB_ENABLE_ANTIROLLBACK
-export ENABLE_TCXO
+
+#Typethree@2023.2.01 modify for TCXO hw version start
+#export ENABLE_TCXO
+#Typethree@2023.2.01 modify for TCXO hw version end
 
 # vaneer makefile that calls into the engine with lk as the build root
 # if we're the top level invocation, call ourselves with additional args
diff --git a/src/bsp/lk/platform/mt2735/drivers/clkbuf/clkbuf_ctl.c b/src/bsp/lk/platform/mt2735/drivers/clkbuf/clkbuf_ctl.c
index 7058a94..ac70548 100644
--- a/src/bsp/lk/platform/mt2735/drivers/clkbuf/clkbuf_ctl.c
+++ b/src/bsp/lk/platform/mt2735/drivers/clkbuf/clkbuf_ctl.c
@@ -40,6 +40,9 @@
 
 #include <platform/clkbuf_ctl.h>
 #include <platform/srclken_rc.h>
+/*Typethree2023/1/29 modify for TCXO hw version start*/
+#include <platform/mt_gpio.h>
+/*Typethree2023/1/29 modify for TCXO hw version end*/
 
 #define clk_buf_warn(fmt, args...)		dprintf(ALWAYS, fmt, ##args)
 #define clk_buf_dbg(fmt, args...)		//dprintf(SPEW, fmt, ##args)
@@ -311,13 +314,19 @@
 
 	pmic_config_interface(PMIC_XO_EXTBUF1_MODE_ADDR, PMIC_CW00_INIT_VAL,
 				PMIC_REG_MASK, PMIC_REG_SHIFT);
-#ifdef ENABLE_TCXO //tcxo
-	pmic_config_interface(PMIC_XO_EXTBUF3_EN_M_ADDR, PMIC_CW00_H_INIT_VAL_TCXO,
-				PMIC_REG_MASK, PMIC_REG_SHIFT);
-#else //normal case
-	pmic_config_interface(PMIC_XO_EXTBUF3_EN_M_ADDR, PMIC_CW00_H_INIT_VAL,
-				PMIC_REG_MASK, PMIC_REG_SHIFT);
-#endif
+/*Typethree2023/1/29 modify for TCXO hw version start*/
+//tcxo
+    if (mt_get_gpio_in(GPIO81) != 0 && mt_get_gpio_in(GPIO82) == 0)  //TCXO open
+    {
+        pmic_config_interface(PMIC_XO_EXTBUF3_EN_M_ADDR, PMIC_CW00_H_INIT_VAL_TCXO,
+                    PMIC_REG_MASK, PMIC_REG_SHIFT);
+    }
+    else 
+    {
+        pmic_config_interface(PMIC_XO_EXTBUF3_EN_M_ADDR, PMIC_CW00_H_INIT_VAL,
+                    PMIC_REG_MASK, PMIC_REG_SHIFT);
+    }
+/*Typethree2023/1/29 modify for TCXO hw version end*/
 	pmic_config_interface(PMIC_XO_EXTBUF7_MODE_ADDR, PMIC_CW09_H_INIT_VAL,
 				PMIC_REG_MASK, PMIC_REG_SHIFT);
 
@@ -411,29 +420,33 @@
 				PMIC_TMA_KEY_H_MASK, PMIC_TMA_KEY_H_SHIFT);
 
 	/* disable clock buffer by DCT setting */
-
-#ifdef ENABLE_TCXO  //tcxo
-	pmic_config_interface(PMIC_DCXO_CW00_CLR_ADDR,
-				      PMIC_XO_EXTBUF2_MODE_MASK,
-				      PMIC_XO_EXTBUF2_MODE_MASK,
-				      PMIC_XO_EXTBUF2_MODE_SHIFT);
-	pmic_config_interface(PMIC_DCXO_CW00_CLR_ADDR,
-				      PMIC_XO_EXTBUF2_EN_M_MASK,
-				      PMIC_XO_EXTBUF2_EN_M_MASK,
-				      PMIC_XO_EXTBUF2_EN_M_SHIFT);
-#else //normal case
-	if (CLK_BUF2_STATUS_PMIC == CLOCK_BUFFER_DISABLE) {
-		pmic_config_interface(PMIC_DCXO_CW00_CLR_ADDR,
-				      PMIC_XO_EXTBUF2_MODE_MASK,
-				      PMIC_XO_EXTBUF2_MODE_MASK,
-				      PMIC_XO_EXTBUF2_MODE_SHIFT);
-		pmic_config_interface(PMIC_DCXO_CW00_CLR_ADDR,
-				      PMIC_XO_EXTBUF2_EN_M_MASK,
-				      PMIC_XO_EXTBUF2_EN_M_MASK,
-				      PMIC_XO_EXTBUF2_EN_M_SHIFT);
-	}
-#endif
-
+/*Typethree2023/1/29 modify for TCXO hw version start*/
+//tcxo
+    if (mt_get_gpio_in(GPIO81) !=0 && mt_get_gpio_in(GPIO82) == 0)
+    {
+        pmic_config_interface(PMIC_DCXO_CW00_CLR_ADDR,
+                        PMIC_XO_EXTBUF2_MODE_MASK,
+                        PMIC_XO_EXTBUF2_MODE_MASK,
+                        PMIC_XO_EXTBUF2_MODE_SHIFT);
+        pmic_config_interface(PMIC_DCXO_CW00_CLR_ADDR,
+                        PMIC_XO_EXTBUF2_EN_M_MASK,
+                        PMIC_XO_EXTBUF2_EN_M_MASK,
+                        PMIC_XO_EXTBUF2_EN_M_SHIFT);
+    }
+    else
+    {
+        if (CLK_BUF2_STATUS_PMIC == CLOCK_BUFFER_DISABLE) {
+            pmic_config_interface(PMIC_DCXO_CW00_CLR_ADDR,
+                        PMIC_XO_EXTBUF2_MODE_MASK,
+                        PMIC_XO_EXTBUF2_MODE_MASK,
+                        PMIC_XO_EXTBUF2_MODE_SHIFT);
+            pmic_config_interface(PMIC_DCXO_CW00_CLR_ADDR,
+                        PMIC_XO_EXTBUF2_EN_M_MASK,
+                        PMIC_XO_EXTBUF2_EN_M_MASK,
+                        PMIC_XO_EXTBUF2_EN_M_SHIFT);
+        }
+    }
+/*Typethree2023/1/29 modify for TCXO hw version end*/
 	if (CLK_BUF3_STATUS_PMIC == CLOCK_BUFFER_DISABLE) {
 		pmic_config_interface(PMIC_DCXO_CW00_CLR_ADDR,
 				      PMIC_XO_EXTBUF3_MODE_MASK,
diff --git a/src/bsp/lk/platform/mt2735/drivers/gpio/mt_gpio.c b/src/bsp/lk/platform/mt2735/drivers/gpio/mt_gpio.c
index b180497..c9c61fb 100755
--- a/src/bsp/lk/platform/mt2735/drivers/gpio/mt_gpio.c
+++ b/src/bsp/lk/platform/mt2735/drivers/gpio/mt_gpio.c
@@ -982,6 +982,20 @@
 //dongyu@2022.11.03 Modify the gpio of imu/smi230 end
 #endif
 
+//Typethree2023/1/29 modify for TCXO hw version start
+	mt_set_gpio_mode(GPIO81, 0);
+	mt_set_gpio_dir(GPIO81, GPIO_DIR_IN);
+	mt_set_gpio_pull_enable(GPIO81, GPIO_PULL_DISABLE);
+	mt_set_gpio_smt(GPIO81, GPIO_SMT_ENABLE);
+	mt_set_gpio_ies(GPIO81, GPIO_IES_ENABLE);
+
+	mt_set_gpio_mode(GPIO82, 0);
+	mt_set_gpio_dir(GPIO82, GPIO_DIR_IN);
+	mt_set_gpio_pull_enable(GPIO82, GPIO_PULL_DISABLE);
+	mt_set_gpio_smt(GPIO82, GPIO_SMT_ENABLE);
+	mt_set_gpio_ies(GPIO82, GPIO_IES_ENABLE);
+//Typethree2023/1/29 modify for TCXO hw version end
+
 }
 
 
diff --git a/src/bsp/lk/top/main.c b/src/bsp/lk/top/main.c
index 36b5a31..95fee17 100644
--- a/src/bsp/lk/top/main.c
+++ b/src/bsp/lk/top/main.c
@@ -87,7 +87,9 @@
     // do any super early target initialization
     lk_primary_cpu_init_level(LK_INIT_LEVEL_PLATFORM_EARLY, LK_INIT_LEVEL_TARGET_EARLY - 1);
     target_early_init();
-
+#ifdef LYNQ_VERSION
+    dprintf(CRITICAL, "LYNQ_VERSION:"LYNQ_VERSION" LYNQ_COMMITID: "LYNQ_COMMITID"\n");
+#endif
 #if WITH_SMP
     dprintf(INFO, "\nwelcome to lk/MP\n\n");
 #else
diff --git a/src/connectivity/gps/2.0/gnss_test/mnld_client/inc/mnld_test.h b/src/connectivity/gps/2.0/gnss_test/mnld_client/inc/mnld_test.h
index f8f29bf..c09611f 100644
--- a/src/connectivity/gps/2.0/gnss_test/mnld_client/inc/mnld_test.h
+++ b/src/connectivity/gps/2.0/gnss_test/mnld_client/inc/mnld_test.h
@@ -12,6 +12,7 @@
 #define MNLD_TEST_NETWORK_ROAMING "roaming"
 #define MNLD_TEST_NETWORK_DISABLE "disable"
 #define MNLD_TEST_RAW_MEAS_START "raw_start"
+#define MNLD_TEST_RAW_MEAS_DEBUG "raw_dbg"
 
 
 #define MNL_VER_LEN 52
diff --git a/src/connectivity/gps/2.0/gnss_test/mnld_client/src/mnld_client.c b/src/connectivity/gps/2.0/gnss_test/mnld_client/src/mnld_client.c
index 63c45ab..0ab2136 100644
--- a/src/connectivity/gps/2.0/gnss_test/mnld_client/src/mnld_client.c
+++ b/src/connectivity/gps/2.0/gnss_test/mnld_client/src/mnld_client.c
@@ -51,6 +51,7 @@
 GpsNavigationMessageCallbacks* navi_msg_cbs = NULL;
 
 int raw_flag = 0;
+int raw_dbg = 0;
 
 int valid_ttff_cnt = 0;
 int valid_ttff_sum = 0;
@@ -635,6 +636,16 @@
             action = MNLD_TEST_ACTION_GNSS_RAW;
             LOGD("mnld_test raw measurement start.\r\n");
             exit_flag = 0;
+            if(argc == 3) {
+                if(!strncmp(argv[2], MNLD_TEST_RAW_MEAS_DEBUG, strlen(MNLD_TEST_RAW_MEAS_DEBUG))) {
+                    raw_dbg = 1;
+                    LOGD("raw measurement start with dbeug message print\r\n");
+                } else {
+                    LOGW(" raw measurement start fail, Unknown command!(%d)\r\n", argc);
+                    mnld_test_show_help();
+                    exit_flag = 1;
+                }
+            }
         }else{
             LOGE("Unknown command!\r\n");
             mnld_test_show_help();
diff --git a/src/connectivity/gps/2.0/gnss_test/mnld_client/src/mnld_client_gps_cb.c b/src/connectivity/gps/2.0/gnss_test/mnld_client/src/mnld_client_gps_cb.c
index 5e60550..fabb4c4 100644
--- a/src/connectivity/gps/2.0/gnss_test/mnld_client/src/mnld_client_gps_cb.c
+++ b/src/connectivity/gps/2.0/gnss_test/mnld_client/src/mnld_client_gps_cb.c
@@ -18,6 +18,7 @@
 GpsLocation_ext location_rslt;
 mnld_test_result mnld_test_result_body;
 extern char mnld_test_mnl_ver[MNL_VER_LEN];
+extern int raw_dbg;
 
 #define MNLD_TEST_CB_DBG 0
 
@@ -299,61 +300,66 @@
     }
 
     meas_cnt = data->measurement_count;
-    LOGD("==================== print_gnss_measurement ====================");
-    LOGD("measurement count is: %d", meas_cnt);
-    for (i = 0; i < meas_cnt; i++) {
-        raw_meas = &(data->measurements[i]);
-        LOGD("********* measurement message %d *********", i+1);
-        LOGD("flags=0x%x", raw_meas->legacyMeasurement.flags);
-        LOGD("svid=%d", raw_meas->legacyMeasurement.svid);
-        LOGD("constellation=0x%x", raw_meas->legacyMeasurement.constellation);
-        LOGD("time_offset_ns=%f", raw_meas->legacyMeasurement.time_offset_ns);
-        LOGD("state=0x%x", raw_meas->legacyMeasurement.state);
-        LOGD("received_gps_tow_ns=%"PRId64, raw_meas->legacyMeasurement.received_sv_time_in_ns);
-        LOGD("received_gps_tow_uncertainty_ns=%"PRId64, raw_meas->legacyMeasurement.received_sv_time_uncertainty_in_ns);
-        LOGD("c_n0_dbhz=%f", raw_meas->legacyMeasurement.c_n0_dbhz);
-        LOGD("pseudorange_rate_mps=%f", raw_meas->legacyMeasurement.pseudorange_rate_mps);
-        LOGD("pseudorange_rate_uncertainty_mps=%f", raw_meas->legacyMeasurement.pseudorange_rate_uncertainty_mps);
-        LOGD("accumulated_delta_range_state=0x%x", raw_meas->legacyMeasurement.accumulated_delta_range_state);
-        LOGD("accumulated_delta_range_m=%f", raw_meas->legacyMeasurement.accumulated_delta_range_m);
-        LOGD("accumulated_delta_range_uncertainty_m=%f", raw_meas->legacyMeasurement.accumulated_delta_range_uncertainty_m);
-        LOGD("carrier_frequency_hz=%f", raw_meas->legacyMeasurement.carrier_frequency_hz);
-        LOGD("carrier_cycles=%"PRId64, raw_meas->legacyMeasurement.carrier_cycles);
-        LOGD("carrier_phase=%f", raw_meas->legacyMeasurement.carrier_phase);
-        LOGD("carrier_phase_uncertainty=%f", raw_meas->legacyMeasurement.carrier_phase_uncertainty);
-        LOGD("multipath_indicator=%d", raw_meas->legacyMeasurement.multipath_indicator);
-        LOGD("snr_db=%f", raw_meas->legacyMeasurement.snr_db);
-
-        LOGD("agc_level_db=%f", raw_meas->agc_level_db);
-        LOGD("codeType=%s", raw_meas->codeType);
-        LOGD("fullInterSignalBiasNs=%f", raw_meas->fullInterSignalBiasNs);
-        LOGD("fullInterSignalBiasUncertaintyNs=%f", raw_meas->fullInterSignalBiasUncertaintyNs);
-        LOGD("satelliteInterSignalBiasNs=%f", raw_meas->satelliteInterSignalBiasNs);
-        LOGD("satelliteInterSignalBiasUncertaintyNs=%f", raw_meas->satelliteInterSignalBiasUncertaintyNs);
-        LOGD("basebandCN0DbHz=%f", raw_meas->basebandCN0DbHz);
+    if (raw_dbg == 1) {
+        LOGD("==================== print_gnss_measurement ====================");
     }
+    LOGD("measurement count is: %d", meas_cnt);
 
-    clk = &(data->clock);
-    LOGD("======================= print_gnss_clock =======================");
-    LOGD("flags=0x%x", clk->legacyClock.flags);
-    LOGD("leap_second=%d", clk->legacyClock.leap_second);
-    LOGD("time_ns=%"PRId64, clk->legacyClock.time_ns);
-    LOGD("time_uncertainty_ns=%f", clk->legacyClock.time_uncertainty_ns);
-    LOGD("full_bias_ns=%"PRId64, clk->legacyClock.full_bias_ns);
-    LOGD("bias_ns=%f", clk->legacyClock.bias_ns);
-    LOGD("bias_uncertainty_ns=%f", clk->legacyClock.bias_uncertainty_ns);
-    LOGD("drift_nsps=%f", clk->legacyClock.drift_nsps);
-    LOGD("drift_uncertainty_nsps=%f", clk->legacyClock.drift_uncertainty_nsps);
-    LOGD("hw_clock_discontinuity_count=%d", clk->legacyClock.hw_clock_discontinuity_count);
-    LOGD("constellation=%d", clk->referenceSignalTypeForIsb.constellation);
-    LOGD("carrierFrequencyHz=%f", clk->referenceSignalTypeForIsb.carrierFrequencyHz);
-    LOGD("codeType=%s", clk->referenceSignalTypeForIsb.codeType);
+    if (raw_dbg == 1) {
+        for (i = 0; i < meas_cnt; i++) {
+            raw_meas = &(data->measurements[i]);
+            LOGD("********* measurement message %d *********", i+1);
+            LOGD("flags=0x%x", raw_meas->legacyMeasurement.flags);
+            LOGD("svid=%d", raw_meas->legacyMeasurement.svid);
+            LOGD("constellation=0x%x", raw_meas->legacyMeasurement.constellation);
+            LOGD("time_offset_ns=%f", raw_meas->legacyMeasurement.time_offset_ns);
+            LOGD("state=0x%x", raw_meas->legacyMeasurement.state);
+            LOGD("received_gps_tow_ns=%"PRId64, raw_meas->legacyMeasurement.received_sv_time_in_ns);
+            LOGD("received_gps_tow_uncertainty_ns=%"PRId64, raw_meas->legacyMeasurement.received_sv_time_uncertainty_in_ns);
+            LOGD("c_n0_dbhz=%f", raw_meas->legacyMeasurement.c_n0_dbhz);
+            LOGD("pseudorange_rate_mps=%f", raw_meas->legacyMeasurement.pseudorange_rate_mps);
+            LOGD("pseudorange_rate_uncertainty_mps=%f", raw_meas->legacyMeasurement.pseudorange_rate_uncertainty_mps);
+            LOGD("accumulated_delta_range_state=0x%x", raw_meas->legacyMeasurement.accumulated_delta_range_state);
+            LOGD("accumulated_delta_range_m=%f", raw_meas->legacyMeasurement.accumulated_delta_range_m);
+            LOGD("accumulated_delta_range_uncertainty_m=%f", raw_meas->legacyMeasurement.accumulated_delta_range_uncertainty_m);
+            LOGD("carrier_frequency_hz=%f", raw_meas->legacyMeasurement.carrier_frequency_hz);
+            LOGD("carrier_cycles=%"PRId64, raw_meas->legacyMeasurement.carrier_cycles);
+            LOGD("carrier_phase=%f", raw_meas->legacyMeasurement.carrier_phase);
+            LOGD("carrier_phase_uncertainty=%f", raw_meas->legacyMeasurement.carrier_phase_uncertainty);
+            LOGD("multipath_indicator=%d", raw_meas->legacyMeasurement.multipath_indicator);
+            LOGD("snr_db=%f", raw_meas->legacyMeasurement.snr_db);
+        
+            LOGD("agc_level_db=%f", raw_meas->agc_level_db);
+            LOGD("codeType=%s", raw_meas->codeType);
+            LOGD("fullInterSignalBiasNs=%f", raw_meas->fullInterSignalBiasNs);
+            LOGD("fullInterSignalBiasUncertaintyNs=%f", raw_meas->fullInterSignalBiasUncertaintyNs);
+            LOGD("satelliteInterSignalBiasNs=%f", raw_meas->satelliteInterSignalBiasNs);
+            LOGD("satelliteInterSignalBiasUncertaintyNs=%f", raw_meas->satelliteInterSignalBiasUncertaintyNs);
+            LOGD("basebandCN0DbHz=%f", raw_meas->basebandCN0DbHz);
+        }
+        
+        clk = &(data->clock);
+        LOGD("======================= print_gnss_clock =======================");
+        LOGD("flags=0x%x", clk->legacyClock.flags);
+        LOGD("leap_second=%d", clk->legacyClock.leap_second);
+        LOGD("time_ns=%"PRId64, clk->legacyClock.time_ns);
+        LOGD("time_uncertainty_ns=%f", clk->legacyClock.time_uncertainty_ns);
+        LOGD("full_bias_ns=%"PRId64, clk->legacyClock.full_bias_ns);
+        LOGD("bias_ns=%f", clk->legacyClock.bias_ns);
+        LOGD("bias_uncertainty_ns=%f", clk->legacyClock.bias_uncertainty_ns);
+        LOGD("drift_nsps=%f", clk->legacyClock.drift_nsps);
+        LOGD("drift_uncertainty_nsps=%f", clk->legacyClock.drift_uncertainty_nsps);
+        LOGD("hw_clock_discontinuity_count=%d", clk->legacyClock.hw_clock_discontinuity_count);
+        LOGD("constellation=%d", clk->referenceSignalTypeForIsb.constellation);
+        LOGD("carrierFrequencyHz=%f", clk->referenceSignalTypeForIsb.carrierFrequencyHz);
+        LOGD("codeType=%s", clk->referenceSignalTypeForIsb.codeType);
 
-    elap_realtime = &(data->elapsedRealtime);
-    LOGD("================= print_gnss_elapsed_real_time =================");
-    LOGD("flags=0x%x", elap_realtime->flags);
-    LOGD("timestampNs=%"PRId64, elap_realtime->timestampNs);
-    LOGD("timeUncertaintyNs=%"PRId64, elap_realtime->timeUncertaintyNs);
+        elap_realtime = &(data->elapsedRealtime);
+        LOGD("================= print_gnss_elapsed_real_time =================");
+        LOGD("flags=0x%x", elap_realtime->flags);
+        LOGD("timestampNs=%"PRId64, elap_realtime->timestampNs);
+        LOGD("timeUncertaintyNs=%"PRId64, elap_realtime->timeUncertaintyNs);
+    }
 
     return;
 }
@@ -384,13 +390,15 @@
         return;
     }
 
-    LOGD("==================== print gnss navigation msg ====================");
-    LOGD("[navi_msg] svid=%d", msg->svid);
-    LOGD("[navi_msg] type=%d", msg->type);
-    LOGD("[navi_msg] status=0x%x", msg->status);
-    LOGD("[navi_msg] message_id=%d", msg->message_id);
-    LOGD("[navi_msg] submessage_id=%d", msg->submessage_id);
-    LOGD("[navi_msg] data_length=%zu", msg->data_length);
+    if (raw_dbg == 1) {
+        LOGD("==================== print gnss navigation msg ====================");
+        LOGD("[navi_msg] svid=%d", msg->svid);
+        LOGD("[navi_msg] type=%d", msg->type);
+        LOGD("[navi_msg] status=0x%x", msg->status);
+        LOGD("[navi_msg] message_id=%d", msg->message_id);
+        LOGD("[navi_msg] submessage_id=%d", msg->submessage_id);
+        LOGD("[navi_msg] data_length=%zu", msg->data_length);
+    }
 
     data_length = msg->data_length;
     if (data_length > MAX_NAV_DATA_LEN) {
@@ -398,8 +406,11 @@
     }
 
     memcpy(data, msg->data, data_length);
-    for (i = 0; i < data_length; i++) {
-        LOGD("[navi_msg] gnss navigation data[%d] = %x", i, data[i]);
+
+    if (raw_dbg == 1) {
+        for (i = 0; i < data_length; i++) {
+            LOGD("[navi_msg] gnss navigation data[%d] = %x", i, data[i]);
+        }
     }
 
     return;
diff --git a/src/connectivity/gps/2.0/gps_hal/inc/hardware/gps_mtk.h b/src/connectivity/gps/2.0/gps_hal/inc/hardware/gps_mtk.h
index f672617..da6ee72 100644
--- a/src/connectivity/gps/2.0/gps_hal/inc/hardware/gps_mtk.h
+++ b/src/connectivity/gps/2.0/gps_hal/inc/hardware/gps_mtk.h
@@ -787,6 +787,19 @@
     /// v1.1 ///
     int  (*inject_fused_location)(double latitude, double longitude, float accuracy);
 
+    /** Dynamically set the fix interval.
+    *The unit of interval is ms.
+    */
+    int   (*fix_interval)(uint32_t interval);
+
+    /** Dynamically set gnss OpMode. */
+    int   (*op_mode)(uint8_t opmode);
+
+    /** Dynamically set elevation angle constraint. */
+    int   (*elevation_angle)(uint8_t angle);
+
+    /** Dynamically set L5 disable/enable. */
+    int   (*l5_disable)(bool disable);
 } GpsInterface_ext;
 
 
diff --git a/src/connectivity/gps/2.0/gps_hal/mnldinf/inc/mnldinf_common.h b/src/connectivity/gps/2.0/gps_hal/mnldinf/inc/mnldinf_common.h
index f1bf7f5..f1b812f 100644
--- a/src/connectivity/gps/2.0/gps_hal/mnldinf/inc/mnldinf_common.h
+++ b/src/connectivity/gps/2.0/gps_hal/mnldinf/inc/mnldinf_common.h
@@ -52,6 +52,10 @@
     HAL2MNL_SET_TTFF_ACC                    = 704,
     HAL2MNL_BASIC_CAP_SYNC                  = 705,
     HAL2MNL_EXT_CAP_SYNC                    = 706,
+    HAL2MNL_GPS_FIX_INTERVAL                = 707,
+    HAL2MNL_GPS_OPMODE                      = 708,
+    HAL2MNL_GPS_ELEVATION_ANGLE             = 709,
+    HAL2MNL_GPS_L5_DISABLE                  = 801,
 } hal2mnl_cmd;
 
 typedef int gps_pos_mode;
diff --git a/src/connectivity/gps/2.0/gps_hal/mnldinf/src/mnldinf_ext.c b/src/connectivity/gps/2.0/gps_hal/mnldinf/src/mnldinf_ext.c
index aa6bf45..f384666 100644
--- a/src/connectivity/gps/2.0/gps_hal/mnldinf/src/mnldinf_ext.c
+++ b/src/connectivity/gps/2.0/gps_hal/mnldinf/src/mnldinf_ext.c
@@ -184,6 +184,54 @@
     return mnldinf_tcp_send(fd, buff, offset);
 }
 
+int mnldinf_ext_gnss_fix_interval(int fd, uint32_t interval) {
+    LOGD("mnldinf_ext_gnss_fix_interval  interval=%u", interval);
+    char buff[HAL_MNL_BUFF_SIZE] = {0};
+    int offset = 0;
+    mnldinf_put_int(buff, &offset, HAL_MNL_INTERFACE_VERSION);
+
+    mnldinf_put_int(buff, &offset, HAL2MNL_GPS_FIX_INTERVAL);
+    mnldinf_put_int(buff, &offset, interval);
+
+    return mnldinf_tcp_send(fd, buff, offset);
+}
+
+int mnldinf_ext_gnss_opmode(int fd, uint8_t opmode) {
+    LOGD("mnldinf_ext_gnss_opmode  opmode=%hhu", opmode);
+    char buff[HAL_MNL_BUFF_SIZE] = {0};
+    int offset = 0;
+    mnldinf_put_int(buff, &offset, HAL_MNL_INTERFACE_VERSION);
+
+    mnldinf_put_int(buff, &offset, HAL2MNL_GPS_OPMODE);
+    mnldinf_put_byte(buff, &offset, opmode);
+
+    return mnldinf_tcp_send(fd, buff, offset);
+}
+
+int mnldinf_ext_gnss_elevation_angle(int fd, uint8_t elevation) {
+    LOGD("mnldinf_ext_gnss_elevation_angle  elevation=%hhu", elevation);
+    char buff[HAL_MNL_BUFF_SIZE] = {0};
+    int offset = 0;
+    mnldinf_put_int(buff, &offset, HAL_MNL_INTERFACE_VERSION);
+
+    mnldinf_put_int(buff, &offset, HAL2MNL_GPS_ELEVATION_ANGLE);
+    mnldinf_put_byte(buff, &offset, elevation);
+
+    return mnldinf_tcp_send(fd, buff, offset);
+}
+
+int mnldinf_ext_gnss_l5_disable(int fd, bool flag) {
+    LOGD("mnldinf_ext_gnss_l5_disable  flag=%hhu", flag);
+    char buff[HAL_MNL_BUFF_SIZE] = {0};
+    int offset = 0;
+    mnldinf_put_int(buff, &offset, HAL_MNL_INTERFACE_VERSION);
+
+    mnldinf_put_int(buff, &offset, HAL2MNL_GPS_L5_DISABLE);
+    mnldinf_put_byte(buff, &offset, flag);
+
+    return mnldinf_tcp_send(fd, buff, offset);
+}
+
 int mnldinf_ext_gnss_set_position_mode(int fd, gps_pos_mode mode) {
     LOGD("mode=%d", mode);
     char buff[HAL_MNL_BUFF_SIZE] = {0};
diff --git a/src/connectivity/gps/2.0/gps_hal/src/gpsinf.c b/src/connectivity/gps/2.0/gps_hal/src/gpsinf.c
index 82f109d..4de9894 100644
--- a/src/connectivity/gps/2.0/gps_hal/src/gpsinf.c
+++ b/src/connectivity/gps/2.0/gps_hal/src/gpsinf.c
@@ -434,6 +434,63 @@
     return 0;  // 0:ok,   non-zero: error; but GPS JNI will ignore it
 }
 
+//The unit of interval is ms.
+//interval:100,200,500,1000
+static int gpsinf_fix_interval(uint32_t interval){
+    int fix_interval;
+    if(interval == 100 || interval == 200 || interval == 500 ||
+    interval == 1000) {
+        fix_interval = interval;
+    }else{
+        fix_interval = 1000;  //default 1HZ.
+    }
+    LOGD("fix interval = %u \n", fix_interval);
+
+    if (hal2mnl_gps_fix_interval(fix_interval) == -1) {
+        LOGE("hal2mnl_gps_fix_interval failed because of safe_sendto fail ,strerror:%s \n", strerror(errno));
+    }
+    return 0;  // 0:ok,   non-zero: error; but GPS JNI will ignore it
+}
+
+//2:GP+GL+BD
+//3:GP
+//4:BD
+//6:GP+GL+GA+BD
+//8:GP+GL+GA
+//10:GP+GL+GA+BD+NI
+static int gpsinf_opmode(uint8_t opmode){
+    if (hal2mnl_gps_opmode(opmode) == -1) {
+        LOGE("hal2mnl_gps_opmode failed because of safe_sendto fail ,strerror:%s \n", strerror(errno));
+    }
+
+    return 0;  // 0:ok,   non-zero: error; but GPS JNI will ignore it
+}
+
+//Constraint range:0~30 degree
+static int gpsinf_elevation_angle(uint8_t elevation){
+    char gnss_elevation;
+    if(elevation >= 0 && elevation <= 30){
+        gnss_elevation = elevation;
+    }else{
+        gnss_elevation = 5;  //default 5 angle.
+    }
+
+    if (hal2mnl_gps_elevation_angle(gnss_elevation) == -1) {
+        LOGE("hal2mnl_gps_elevation_angle failed because of safe_sendto fail ,strerror:%s \n", strerror(errno));
+    }
+
+    return 0;  // 0:ok,   non-zero: error; but GPS JNI will ignore it
+}
+
+//1:Disable L5.
+//0:Enable L5;
+static int gpsinf_l5_disable(bool flag){
+    if (hal2mnl_gps_l5_disable(flag) == -1) {
+        LOGE("hal2mnl_gps_l5_disable failed because of safe_sendto fail ,strerror:%s \n", strerror(errno));
+    }
+    return 0;  // 0:ok,   non-zero: error; but GPS JNI will ignore it
+}
+
 static const GpsInterface_ext  mtk_gps_inf = {
     sizeof(GpsInterface_ext),
     gpsinf_init,
@@ -446,6 +503,10 @@
     gpsinf_set_position_mode,
     gpsinf_get_extension,
     gpsinf_inject_fused_location,
+    gpsinf_fix_interval,
+    gpsinf_opmode,
+    gpsinf_elevation_angle,
+    gpsinf_l5_disable,
 };
 
 #ifdef __ANDROID_OS__
diff --git a/src/connectivity/gps/2.0/gps_hal/src/hal2mnl_interface.c b/src/connectivity/gps/2.0/gps_hal/src/hal2mnl_interface.c
index 003260e..3f103a8 100644
--- a/src/connectivity/gps/2.0/gps_hal/src/hal2mnl_interface.c
+++ b/src/connectivity/gps/2.0/gps_hal/src/hal2mnl_interface.c
@@ -56,6 +56,22 @@
     return mnldinf_ext_gnss_delete_aiding_data(g_gpshal_ctx.fd_mnl2hal_ext, flags);
 }
 
+int hal2mnl_gps_fix_interval(uint32_t interval){
+    return mnldinf_ext_gnss_fix_interval(g_gpshal_ctx.fd_mnl2hal_ext, interval);
+}
+
+int hal2mnl_gps_opmode(uint8_t opmode){
+    return mnldinf_ext_gnss_opmode(g_gpshal_ctx.fd_mnl2hal_ext, opmode);
+}
+
+int hal2mnl_gps_elevation_angle(uint8_t elevation){
+    return mnldinf_ext_gnss_elevation_angle(g_gpshal_ctx.fd_mnl2hal_ext, elevation);
+}
+
+int hal2mnl_gps_l5_disable(bool flag){
+    return mnldinf_ext_gnss_l5_disable(g_gpshal_ctx.fd_mnl2hal_ext, flag);
+}
+
 int hal2mnl_gps_set_position_mode(gps_pos_mode mode, gps_pos_recurrence recurrence,
     int min_interval, int preferred_acc, int preferred_time, bool lowPowerMode) {
 
diff --git a/src/connectivity/gps/2.0/mtk_mnld/mnl/libs/aarch64/libmnl_gnss.so b/src/connectivity/gps/2.0/mtk_mnld/mnl/libs/aarch64/libmnl_gnss.so
index 09ab788..78b857e 100755
--- a/src/connectivity/gps/2.0/mtk_mnld/mnl/libs/aarch64/libmnl_gnss.so
+++ b/src/connectivity/gps/2.0/mtk_mnld/mnl/libs/aarch64/libmnl_gnss.so
Binary files differ
diff --git a/src/connectivity/gps/2.0/mtk_mnld/mnl/libs/inc/mtk_gps.h b/src/connectivity/gps/2.0/mtk_mnld/mnl/libs/inc/mtk_gps.h
index f86a7d6..db1d0d1 100644
--- a/src/connectivity/gps/2.0/mtk_mnld/mnl/libs/inc/mtk_gps.h
+++ b/src/connectivity/gps/2.0/mtk_mnld/mnl/libs/inc/mtk_gps.h
@@ -38,6 +38,9 @@
 #ifdef __cplusplus
   extern "C" {
 #endif
+
+#define RAWMEAS_NUM 159
+
 /* ================= Application layer functions ================= */
 
 /*****************************************************************************
@@ -1853,18 +1856,11 @@
 
 void
 mtk_gnss_get_measurement(
-Gnssmeasurement GpQzMeasurement[MTK_GPS_SV_MAX_PRN+MTK_QZS_SV_MAX_PRN], 
-Gnssmeasurement GloMeasurement[MTK_GLON_SV_MAX_NUM],
-Gnssmeasurement BDMeasurement[MTK_BEDO_SV_MAX_NUM], 
-Gnssmeasurement GalMeasurement[MTK_GLEO_SV_MAX_NUM],
-Gnssmeasurement SBASMeasurement[MTK_SBAS_SV_MAX_NUM],
-Gnssmeasurement IRNSSMeasurement[MTK_NAVIC_SV_MAX_NUM],
-INT8 GpQz_Ch_Proc_Ord_PRN[MTK_GPS_SV_MAX_PRN+MTK_QZS_SV_MAX_PRN],
-INT8 Glo_Ch_Proc_Ord_PRN[MTK_GLON_SV_MAX_NUM],
-INT8 BD_Ch_Proc_Ord_PRN[MTK_BEDO_SV_MAX_NUM],
-INT8 Gal_Ch_Proc_Ord_PRN[MTK_GLEO_SV_MAX_NUM],
-INT8 SBAS_Ch_Proc_Ord_PRN[MTK_SBAS_SV_MAX_NUM],
-INT8 IRNSS_Ch_Proc_Ord_PRN[MTK_NAVIC_SV_MAX_NUM]);
+   Gnssmeasurement Measurement[RAWMEAS_NUM],
+   INT8 Ch_Proc_Ord_PRN[RAWMEAS_NUM],
+   INT8 Ch_Proc_Ord_SV_TYPE[RAWMEAS_NUM],
+   INT8 Ch_Proc_Ord_SIG_TYPE[RAWMEAS_NUM]
+);
 
 INT32
 mtk_gnss_get_clock(Gnssclock *GnssClock);
diff --git a/src/connectivity/gps/2.0/mtk_mnld/mnl/libs/inc/mtk_gps_type.h b/src/connectivity/gps/2.0/mtk_mnld/mnl/libs/inc/mtk_gps_type.h
index 69b828b..3a61859 100644
--- a/src/connectivity/gps/2.0/mtk_mnld/mnl/libs/inc/mtk_gps_type.h
+++ b/src/connectivity/gps/2.0/mtk_mnld/mnl/libs/inc/mtk_gps_type.h
@@ -931,7 +931,8 @@
   MTK_DATUM_WGS1972_GLOBAL_DEFINITION,
   MTK_DATUM_WGS1984_GLOBAL_DEFINITION,
   MTK_DATUM_YACARE_URUGUAY,
-  MTK_DATUM_ZANDERIJ_SURINAME
+  MTK_DATUM_ZANDERIJ_SURINAME,
+  MTK_DATUM_PZ90_11
 } MTK_GPS_DATUM;
 
 /************************************************
@@ -1042,6 +1043,10 @@
   MTK_PARAM_CMD_RTK_FILL_NMEA_INFO, 
   MTK_PARAM_CMD_RTK_FILL_POSITION, 
   MTK_PARAM_CMD_RTK_STATUS_REPONSE,
+  MTK_PARAM_CMD_AUTO_ELEV_CONFIG,
+  MTK_PARAM_CMD_AUTO_OPMODE,
+  MTK_PARAM_CMD_AUTO_L5_DISABLE,
+  MTK_PARAM_CMD_AUTO_FIXRATE,
 } MTK_GPS_PARAM;
 
 typedef enum{
@@ -1620,8 +1625,9 @@
   UINT8     factory_test_state;   //0: normal, 1: specific customer's factory test
   UINT8     factory_mode;         //0: normal mode, 1: non-normal mode
   UINT8     pps_polarity;     /* Range: 0~1   , Default: 0 */
-  INT32    pps_delay;        /* Range: -4000~4000, Default: 0 */
+  INT32     pps_delay;        /* Range: -4000~4000, Default: 0 */
   INT8      elev_mask;        /* Range: 0~90 */
+  UINT8     ga_before_ttff;  //0:Disable,1:Enable
 } MTK_GPS_INIT_CFG;
 
 #define MTK_GPS_DRIVER_CFG_EXT_SUPPORT
diff --git a/src/connectivity/gps/2.0/mtk_mnld/mnld_entity/inc/gps_controller.h b/src/connectivity/gps/2.0/mtk_mnld/mnld_entity/inc/gps_controller.h
index ef1f08e..a578f38 100644
--- a/src/connectivity/gps/2.0/mtk_mnld/mnld_entity/inc/gps_controller.h
+++ b/src/connectivity/gps/2.0/mtk_mnld/mnld_entity/inc/gps_controller.h
@@ -29,6 +29,8 @@
 #define SVTYPE_GLONASS  16
 #define SVTYPE_BD       32
 
+#define NUM_CH_ALL 159
+
 int gps_control_init();
 
 int gps_control_gps_start(int delete_aiding_data_flags);
diff --git a/src/connectivity/gps/2.0/mtk_mnld/mnld_entity/inc/hal_mnl_interface_common.h b/src/connectivity/gps/2.0/mtk_mnld/mnld_entity/inc/hal_mnl_interface_common.h
index dcc636d..d7d1467 100644
--- a/src/connectivity/gps/2.0/mtk_mnld/mnld_entity/inc/hal_mnl_interface_common.h
+++ b/src/connectivity/gps/2.0/mtk_mnld/mnld_entity/inc/hal_mnl_interface_common.h
@@ -56,6 +56,10 @@
     HAL2MNL_SET_TTFF_ACC                    = 704,
     HAL2MNL_BASIC_CAP_SYNC                  = 705,
     HAL2MNL_EXT_CAP_SYNC                    = 706,
+    HAL2MNL_GPS_FIX_INTERVAL                = 707,
+    HAL2MNL_GPS_OPMODE                      = 708,
+    HAL2MNL_GPS_ELEVATION_ANGLE             = 709,
+    HAL2MNL_GPS_L5_DISABLE                  = 801,
 } hal2mnl_cmd;
 
 typedef int gps_pos_mode;
diff --git a/src/connectivity/gps/2.0/mtk_mnld/mnld_entity/inc/hardware/gps_mtk.h b/src/connectivity/gps/2.0/mtk_mnld/mnld_entity/inc/hardware/gps_mtk.h
index 0e1c37c..5ff3c19 100644
--- a/src/connectivity/gps/2.0/mtk_mnld/mnld_entity/inc/hardware/gps_mtk.h
+++ b/src/connectivity/gps/2.0/mtk_mnld/mnld_entity/inc/hardware/gps_mtk.h
@@ -783,6 +783,19 @@
     /// v1.1 ///
     int  (*inject_fused_location)(double latitude, double longitude, float accuracy);
 
+    /** Dynamically set the fix interval.
+    *The unit of interval is ms.
+    */
+    int   (*fix_interval)(uint32_t interval);
+
+    /** Dynamically set gnss OpMode. */
+    int   (*op_mode)(uint8_t opmode);
+
+    /** Dynamically set elevation angle constraint. */
+    int   (*elevation_angle)(uint8_t angle);
+
+    /** Dynamically set L5 disable/enable. */
+    int   (*l5_disable)(bool disable);
 } GpsInterface_ext;
 
 
diff --git a/src/connectivity/gps/2.0/mtk_mnld/mnld_entity/inc/mnl2hal_ext_interface.h b/src/connectivity/gps/2.0/mtk_mnld/mnld_entity/inc/mnl2hal_ext_interface.h
index 266c165..5250d69 100644
--- a/src/connectivity/gps/2.0/mtk_mnld/mnld_entity/inc/mnl2hal_ext_interface.h
+++ b/src/connectivity/gps/2.0/mtk_mnld/mnld_entity/inc/mnl2hal_ext_interface.h
@@ -49,6 +49,11 @@
     void (*set_epo_enable)(epo_bitmap epo_cfg);
     void (*set_ttff_acc)(ttff_acc acc_mode);
     void (*client_capability_update)(int fd, mnl_hal_ext_client_cap *cap);
+    
+    void (*gnss_fix_interval)(uint32_t interval);
+    void (*gnss_opmode)(uint8_t opmode);
+    void (*gnss_elevation_angle)(uint8_t elevation);
+    void (*gnss_l5_disable)(bool flag); 
 } hal2mnl_ext_interface;
 
 int mnl2hal_mnld_reboot();
diff --git a/src/connectivity/gps/2.0/mtk_mnld/mnld_entity/inc/mnl_common.h b/src/connectivity/gps/2.0/mtk_mnld/mnld_entity/inc/mnl_common.h
index f10bd01..f88c1e7 100644
--- a/src/connectivity/gps/2.0/mtk_mnld/mnld_entity/inc/mnl_common.h
+++ b/src/connectivity/gps/2.0/mtk_mnld/mnld_entity/inc/mnl_common.h
@@ -207,8 +207,12 @@
     int pps_delay;    /* range: -4000~4000 unit: ns */
     int pps_polarity;    /* pps polarity, Range: 0~1, Default: 0,  0: pps active low  1: pps active high */
     int pps_duty;    /* PPS pulse high duration (ms), Range: 0~2000, Default: 0 */
+    int dgps_mode_sbas;  /* enable/disable SBAS*/
 
-int elev_mask;    /* elevation angle mask in degree, Range: 0~90, Default: 5 */
+    int elev_mask;    /* elevation angle mask in degree, Range: 0~90, Default: 5 */
+    UINT8 ga_before_ttff;  //0:Disable,1:Enable
+    MTK_GPS_DATUM     datum;          /* datum */
+    UINT8 debug_type;    //0:default,0x08:Comport use
 } MNL_CONFIG_T;
 /*---------------------------------------------------------------------------*/
 typedef struct {
diff --git a/src/connectivity/gps/2.0/mtk_mnld/mnld_entity/src/gps_controller.c b/src/connectivity/gps/2.0/mtk_mnld/mnld_entity/src/gps_controller.c
index 79a3574..7511179 100755
--- a/src/connectivity/gps/2.0/mtk_mnld/mnld_entity/src/gps_controller.c
+++ b/src/connectivity/gps/2.0/mtk_mnld/mnld_entity/src/gps_controller.c
@@ -464,7 +464,11 @@
     .pps_delay = 0,
     .pps_polarity = 0,
     .pps_duty = 100,
-    .elev_mask = 5
+    .dgps_mode_sbas = 1,
+    .elev_mask = 5,
+    .ga_before_ttff = 0,
+    .datum = MTK_DATUM_WGS84,
+    .debug_type = 0
 };
 
 MTK_GPS_SV_BLACKLIST svBlacklist = {
@@ -964,6 +968,7 @@
     init_cfg.pps_duty = mnl_config.pps_duty;
 
     init_cfg.elev_mask = mnl_config.elev_mask;
+    init_cfg.ga_before_ttff = mnl_config.ga_before_ttff;
 
     UINT32 hw_ver = 0;
     UINT32 fw_ver = 0;
@@ -1064,17 +1069,24 @@
 #endif
 
     if(mnl_config.fix_interval == 200 || mnl_config.fix_interval == 500 ||
-        mnl_config.fix_interval == 1000 || (mnl_config.fix_interval >= 100 &&
-        mnl_config.GNSSOPMode == MTK_CONFIG_GPS_ONLY)) {
+        mnl_config.fix_interval == 1000 || mnl_config.fix_interval == 100) {
         init_cfg.fix_interval = mnl_config.fix_interval;
     }else{
-        init_cfg.fix_interval = 1000;
+        init_cfg.fix_interval = 100;
     }
     LOGD("init_cfg.fix_interval = %d \n", init_cfg.fix_interval);
 
 
-    init_cfg.datum = MTK_DATUM_WGS84;           //  datum
+    init_cfg.datum = mnl_config.datum;           //  datum
+    LOGD("init_cfg.datum = %d \n", init_cfg.datum);
+    
     init_cfg.dgps_mode = MTK_DGPS_MODE_SBAS;    //  enable SBAS
+    if ( mnl_config.dgps_mode_sbas == 1 ) {    //1: enable sbas
+        init_cfg.dgps_mode = MTK_DGPS_MODE_SBAS;
+    } else if ( mnl_config.dgps_mode_sbas == 0 ) {    //0: disable sbas
+        init_cfg.dgps_mode = MTK_DGPS_MODE_NONE;
+    }
+    LOGD("init_cfg.dgps_mode = %d \n", init_cfg.dgps_mode);
 
 MTK_GPS_MNL_CONFIG_XML_PARAM mnl_config_xml;
 #ifdef MTK_GPS_DUAL_FREQ_SUPPORT  /*Defined in Android.mk*/
@@ -1611,7 +1623,8 @@
     init_cfg.sv_type_agps_set = sv_type_agps_set;
     gps_dbg_log_state_set_bitmask(mnl_config.dbg2file);
      // driver_cfg.DebugType: 0x01-> libmnl write file;0x11 -> libmnl write file.
-    driver_cfg.DebugType    =   gps_debuglog_state;
+    driver_cfg.DebugType    =   (gps_debuglog_state | mnl_config.debug_type);
+    LOGD("driver_cfg.DebugType(%d),mnl_config.debug_type(%d)!", driver_cfg.DebugType,mnl_config.debug_type);
     MNLD_STRNCPY(gps_debuglog_file_name, mnl_config.debug_file_name, GPS_DEBUG_LOG_FILE_NAME_MAX_LEN);
     if(gps_dbg_log_output2file() && (mnld_debug_file_check_init(mnl_config.debug_file_name) == MTK_GPS_ERROR)) {
         gps_dbg_log_output2file_clean();
@@ -1705,8 +1718,8 @@
 
     driver_cfg.socket_port = mnl_config.socket_port;
 
-    LOGD("pps_config mode = %d, delay = %d, polarity = %d, duty = %d elev_mask = %d\n",
-        init_cfg.pps_mode, init_cfg.pps_delay, init_cfg.pps_polarity, init_cfg.pps_duty, init_cfg.elev_mask);
+    LOGD("pps_config mode = %d, delay = %d, polarity = %d, duty = %d elev_mask = %d, ga_before_ttff = %d\n",
+        init_cfg.pps_mode, init_cfg.pps_delay, init_cfg.pps_polarity, init_cfg.pps_duty, init_cfg.elev_mask, init_cfg.ga_before_ttff);
 
     mnl_status = mtk_gps_mnl_run((const MTK_GPS_INIT_CFG*)&init_cfg , (const MTK_GPS_DRIVER_CFG*)&driver_cfg);
     LOGD("Status (%d) \n", mnl_status);
@@ -1809,6 +1822,9 @@
 
     hasAlmanac();
 
+    ret = mtk_gps_set_param(MTK_PARAM_DGPS_CONFIG, &(init_cfg.dgps_mode));
+    LOGD("sent MTK_PARAM_DGPS_CONFIG to mnl, dgps_mode = %d ,ret = %d", init_cfg.dgps_mode, ret);
+
     ret = mtk_gps_set_param(MTK_PARAM_CMD_SIB8_16_ENABLE, &sib8_16_enable);
     LOGD("sent CMD_SIB8_16_ENABLE to mnl, sib8_16_enable = %d ,ret = %d", sib8_16_enable, ret);
     ret = mtk_gps_set_param(MTK_PARAM_CMD_DEBUG2APP_CONFIG, &enable_debug2app);
@@ -2465,35 +2481,21 @@
 }
 
 gnss_data gnssdata;
-Gnssmeasurement gpqzmeasurement[MNLD_MGPSID+MNLD_MQZSSID];
-Gnssmeasurement glomeasurement[MNLD_MGLONID];
-Gnssmeasurement bdmeasurement[MNLD_MBD2ID];
-Gnssmeasurement galmeasurement[MNLD_MGLEOID];
-Gnssmeasurement sbasmeasurement[MNLD_SBAS_BUN_PRN];
-Gnssmeasurement navicmeasurement[MNLD_MNAVICID];
+Gnssmeasurement gnssmeasurement[NUM_CH_ALL];
 
 static void get_gnss_measurement_clock_data() {
+    LOGD("get_gnss_measurement_clock_data begin");
+
     int i;
     unsigned int num = 0;
     int ret;
 
-    INT8 GpQz_Ch_Proc_Ord_PRN[MNLD_MGPSID+MNLD_MQZSSID] = {0};
-    INT8 Glo_Ch_Proc_Ord_PRN[MNLD_MGLONID] = {0};
-    INT8 BD_Ch_Proc_Ord_PRN[MNLD_MBD2ID] = {0};
-    INT8 Gal_Ch_Proc_Ord_PRN[MNLD_MGLEOID] = {0};
-    INT8 SBAS_Ch_Proc_Ord_PRN[MNLD_SBAS_BUN_PRN] = {0};
-    INT8 NAVIC_Ch_Proc_Ord_PRN[MNLD_MNAVICID] = {0};
+    INT8 Gnss_Ch_Proc_Ord_PRN[NUM_CH_ALL] = {0};
+    INT8 Gnss_Ch_Proc_Ord_SV_TYPE[NUM_CH_ALL] = {0};
+    INT8 Gnss_Ch_Proc_Ord_SIG_TYPE[NUM_CH_ALL] = {0};
 
-    LOGD("get_gnss_measurement_clock_data begin, sizeof(Gnssmeasurement):%lu, sizeof(gnss_data):%lu",sizeof(Gnssmeasurement), sizeof(gnss_data));
-
-    memset(gpqzmeasurement, 0, sizeof(gpqzmeasurement));
-    memset(glomeasurement, 0, sizeof(glomeasurement));
-    memset(bdmeasurement, 0, sizeof(bdmeasurement));
-    memset(galmeasurement, 0, sizeof(galmeasurement));
-    memset(sbasmeasurement, 0, sizeof(sbasmeasurement));
-    memset(navicmeasurement, 0, sizeof(navicmeasurement));
-    mtk_gnss_get_measurement(gpqzmeasurement, glomeasurement, bdmeasurement, galmeasurement, sbasmeasurement,navicmeasurement,
-        GpQz_Ch_Proc_Ord_PRN, Glo_Ch_Proc_Ord_PRN, BD_Ch_Proc_Ord_PRN, Gal_Ch_Proc_Ord_PRN, SBAS_Ch_Proc_Ord_PRN, NAVIC_Ch_Proc_Ord_PRN);
+    memset(gnssmeasurement, 0, sizeof(gnssmeasurement));
+    mtk_gnss_get_measurement(gnssmeasurement, Gnss_Ch_Proc_Ord_PRN, Gnss_Ch_Proc_Ord_SV_TYPE, Gnss_Ch_Proc_Ord_SIG_TYPE);
 
     Gnssclock gnssclock;
     if (mtk_gnss_get_clock(&gnssclock) == 0) {
@@ -2505,122 +2507,28 @@
     update_gnss_clock(&gnss_clock, &gnssclock);
 
     memset(&gnssdata, 0, sizeof(gnssdata));
-    // For GPS & QZSS
-    for (i = 0; i < MNLD_MGPSID+MNLD_MQZSSID; i++) {
-        if (gpqzmeasurement[i].svid != 0) {
+
+    // For GNSS
+    for (i = 0; i < NUM_CH_ALL; i++) {
+        if (gnssmeasurement[i].svid != 0) {
             num = gnssdata.measurement_count;
             if (num >= MTK_MNLD_GNSS_MAX_MEASUREMENT) {
                 LOGD("measurement_count exceed the upper limit!");
                 break;
             }
 
-            update_gnss_measurement(&gnssdata.measurements[num], &gpqzmeasurement[i]);
+            update_gnss_measurement(&gnssdata.measurements[num], &gnssmeasurement[i]);
             if (gnssdata.measurements[num].state == 0) {
                 gnssdata.measurements[num].pseudorange_rate_mps = 1;
             }
             gnssdata.measurement_count++;
-            LOGD("GPS/QZSS measurements[%d] memcpy completed, old _num = %d, prn = %d\n",
-                num, i, gnssdata.measurements[num].svid);
-        }
-    }
-
-    // For Glonass
-    for (i = 0; i < MNLD_MGLONID; i++) {
-        if (glomeasurement[i].svid != 0) {
-            num = gnssdata.measurement_count;
-            if (num >= MTK_MNLD_GNSS_MAX_MEASUREMENT) {
-                LOGD("measurement_count exceed the upper limit!");
-                break;
-            }
-
-            update_gnss_measurement(&gnssdata.measurements[num], &glomeasurement[i]);
-            if (gnssdata.measurements[num].state == 0) {
-                gnssdata.measurements[num].pseudorange_rate_mps = 1;
-            }
-            gnssdata.measurement_count++;
-            LOGD("Glonass measurements[%d] memcpy completed, old _num = %d, prn = %d\n",
-                num, i, gnssdata.measurements[num].svid);
-        }
-    }
-
-    // For Beidou
-    for (i = 0; i < MNLD_MBD2ID; i++) {
-        if (bdmeasurement[i].svid != 0) {
-            num = gnssdata.measurement_count;
-            if (num >= MTK_MNLD_GNSS_MAX_MEASUREMENT) {
-                LOGD("measurement_count exceed the upper limit!");
-                break;
-            }
-
-            update_gnss_measurement(&gnssdata.measurements[num], &bdmeasurement[i]);
-            if (gnssdata.measurements[num].state == 0) {
-                gnssdata.measurements[num].pseudorange_rate_mps = 1;
-            }
-            gnssdata.measurement_count++;
-            LOGD("Beidou measurements[%d] memcpy completed, old _num = %d, prn = %d\n",
-                num, i, gnssdata.measurements[num].svid);
-        }
-    }
-
-    // For Galileo
-    for (i = 0; i < MNLD_MGLEOID; i++) {
-        if (galmeasurement[i].svid != 0) {
-            num = gnssdata.measurement_count;
-            if (num >= MTK_MNLD_GNSS_MAX_MEASUREMENT) {
-                LOGD("measurement_count exceed the upper limit!");
-                break;
-            }
-
-            update_gnss_measurement(&gnssdata.measurements[num], &galmeasurement[i]);
-            if (gnssdata.measurements[num].state == 0) {
-                gnssdata.measurements[num].pseudorange_rate_mps = 1;
-            }
-            gnssdata.measurement_count++;
-            LOGD("Galileo measurements[%d] memcpy completed, old _num = %d, prn = %d\n",
-                num, i, gnssdata.measurements[num].svid);
-        }
-    }
-
-    // For SBAS
-    for (i = 0; i < MNLD_SBAS_BUN_PRN; i++) {
-        if (sbasmeasurement[i].svid != 0) {
-            num = gnssdata.measurement_count;
-            if (num >= MTK_MNLD_GNSS_MAX_MEASUREMENT) {
-                LOGD("measurement_count exceed the upper limit!");
-                break;
-            }
-
-            update_gnss_measurement(&gnssdata.measurements[num], &sbasmeasurement[i]);
-            if (gnssdata.measurements[num].state == 0) {
-                gnssdata.measurements[num].pseudorange_rate_mps = 1;
-            }
-            gnssdata.measurement_count++;
-            LOGD("SBAS measurements[%d] memcpy completed, old _num = %d, prn = %d\n",
-                num, i, gnssdata.measurements[num].svid);
-        }
-    }
-
-    // For NAVIC
-    for (i = 0; i < MNLD_MNAVICID; i++) {
-        if (navicmeasurement[i].svid != 0) {
-            num = gnssdata.measurement_count;
-            if (num >= MTK_MNLD_GNSS_MAX_MEASUREMENT) {
-                LOGD("measurement_count exceed the upper limit!");
-                break;
-            }
-
-            update_gnss_measurement(&gnssdata.measurements[num], &navicmeasurement[i]);
-            if (gnssdata.measurements[num].state == 0) {
-                gnssdata.measurements[num].pseudorange_rate_mps = 1;
-            }
-            gnssdata.measurement_count++;
-            LOGD("NAVIC measurements[%d] memcpy completed, old _num = %d, prn = %d\n",
+            LOGD("GNSS measurements[%d] memcpy completed, old _num = %d, prn = %d\n",
                 num, i, gnssdata.measurements[num].svid);
         }
     }
 
     memcpy(&gnssdata.clock , &gnss_clock, sizeof(gnss_clock));
-    LOGD("gnssdata.measurement_count = %zu, sizeof(gnssdata) = %lu", gnssdata.measurement_count, sizeof(gnssdata));
+    LOGD("gnssdata.measurement_count = %lu, sizeof(gnssdata) = %lu", gnssdata.measurement_count, sizeof(gnssdata));
     if (gnssdata.measurement_count > 0) {
         ret = mnl2hal_gnss_measurements(&gnssdata);
         LOGD("mnl2hal_gnss_measurements done ,ret = %d", ret);
@@ -2723,6 +2631,42 @@
         LOGD("BD sv[%d], mnl2hal_gnss_navigation done ,ret = %d", svid, ret);
     }
 
+    // beidou
+    LOGD("for BD GEO call again");
+    for (svid = 1; svid <= MTK_BEDO_SV_MAX_NUM; svid++) {
+        if (BD2_GEO != BD2_SVTYPE(svid)) {
+            continue;
+        }
+        ret = mtk_gnss_get_navigation_event(&gnss_navigation_msg, svid, SVTYPE_BD);
+        // Report only when has navy data.
+        if (1 != ret) {
+            if (gps_raw_debug_mode) {
+                LOGD("mtk_gnss_get_navigation_event BD sv fail, svid = %d,[ret=%d]\n", svid, ret);
+            }
+            continue;
+        }
+
+        memset(&gnssnavigation, 0, sizeof(gnss_nav_msg));
+        update_gnss_navigation(&gnssnavigation, &gnss_navigation_msg);
+        data_length = (int)MIN(gnssnavigation.data_length, sizeof(gnssnavigation.data));
+        if (BD2_MEO_IGSO == BD2_SVTYPE(svid)) {
+            data_length = (int)MIN(data_length, sizeof(gnss_navigation_msg.uData.BD_D1_data));
+            memcpy(gnssnavigation.data, gnss_navigation_msg.uData.BD_D1_data, data_length);
+        } else {
+            data_length = (int)MIN(data_length, sizeof(gnss_navigation_msg.uData.BD_D2_data));
+            memcpy(gnssnavigation.data, gnss_navigation_msg.uData.BD_D2_data, data_length);
+        }
+        LOGD("BD sv[%d] gnssnavigation data length = %d", svid, data_length);
+        if (gps_raw_debug_mode) {
+            for (i = 0; i < data_length; i++) {
+                LOGD("BD sv[%d] gnssnavigation.data[%d] = %x, %p",
+                svid, i, gnssnavigation.data[i], &gnssnavigation.data[i]);
+            }
+        }
+        ret = mnl2hal_gnss_navigation(gnssnavigation);
+        LOGD("BD sv[%d], mnl2hal_gnss_navigation done ,ret = %d", svid, ret);
+    }
+
     // galileo
     for (svid = 1; svid <= MTK_GLEO_SV_MAX_NUM; svid++) {
         ret = mtk_gnss_get_navigation_event(&gnss_navigation_msg, svid, SVTYPE_GALILEO);
diff --git a/src/connectivity/gps/2.0/mtk_mnld/mnld_entity/src/mnl2hal_interface.c b/src/connectivity/gps/2.0/mtk_mnld/mnld_entity/src/mnl2hal_interface.c
index 8fa283f..f7aee28 100644
--- a/src/connectivity/gps/2.0/mtk_mnld/mnld_entity/src/mnl2hal_interface.c
+++ b/src/connectivity/gps/2.0/mtk_mnld/mnld_entity/src/mnl2hal_interface.c
@@ -667,6 +667,46 @@
             }
             break;
         }
+        case HAL2MNL_GPS_FIX_INTERVAL: {
+            if (hdlr->gnss_fix_interval) {
+                uint32_t interval = get_int(buff, &offset, sizeof(buff));
+                hdlr->gnss_fix_interval(interval);
+            } else {
+                LOGE("hal2mnl_ext_hdlr() gnss_fix_interval is NULL");
+                ret = -1;
+            }
+            break;
+        }
+        case HAL2MNL_GPS_OPMODE: {
+            if (hdlr->gnss_opmode) {
+                uint8_t opmode = get_byte(buff, &offset, sizeof(buff));
+                hdlr->gnss_opmode(opmode);
+            } else {
+                LOGE("hal2mnl_ext_hdlr() gnss_opmode is NULL");
+                ret = -1;
+            }
+            break;
+        }
+        case HAL2MNL_GPS_ELEVATION_ANGLE: {
+            if (hdlr->gnss_elevation_angle) {
+                uint8_t elevation = get_byte(buff, &offset, sizeof(buff));
+                hdlr->gnss_elevation_angle(elevation);
+            } else {
+                LOGE("hal2mnl_ext_hdlr() gnss_elevation_angle is NULL");
+                ret = -1;
+            }
+            break;
+        }
+        case HAL2MNL_GPS_L5_DISABLE: {
+            if (hdlr->gnss_l5_disable) {
+                bool flag = get_byte(buff, &offset, sizeof(buff));
+                hdlr->gnss_l5_disable(flag);
+            } else {
+                LOGE("hal2mnl_ext_hdlr() gnss_l5_disable is NULL");
+                ret = -1;
+            }
+            break;
+        }
         case HAL2MNL_DATA_CONN_OPEN: {
             if (hdlr->data_conn_open) {
                 char* apn = get_string(buff, &offset, sizeof(buff));
@@ -836,10 +876,10 @@
         }
         case HAL2MNL_SV_BLACKLIST: {
             if (hdlr->set_sv_blacklist) {
-                long long blacklist[7];
+                long long blacklist[8];
                 memset(blacklist, 0x00, sizeof(long long));
                 int size = get_int(buff, &offset, sizeof(buff));
-                size = size < 7 ? size : 7;
+                size = size < 8 ? size : 8;
                 get_binary(buff, &offset, (char*)blacklist, sizeof(buff),
                         sizeof(long long) * size);
                 hdlr->set_sv_blacklist(blacklist, size);
diff --git a/src/connectivity/gps/2.0/mtk_mnld/mnld_entity/src/mnl_common.c b/src/connectivity/gps/2.0/mtk_mnld/mnld_entity/src/mnl_common.c
index 953edb8..23acdf3 100644
--- a/src/connectivity/gps/2.0/mtk_mnld/mnld_entity/src/mnl_common.c
+++ b/src/connectivity/gps/2.0/mtk_mnld/mnld_entity/src/mnl_common.c
@@ -162,6 +162,8 @@
     else if (!strcmp(key, "pmtk.serial.port")) {
         prConfig->socket_port = atoi(val);
         set_mnl_prop_config_socket_port();
+    } else if (!strcmp(key, "debug_type")) {
+        prConfig->debug_type = atoi(val);
     }
     else if (!strcmp(key, "debug.debug_nmea")) {
         /* it will be set to enable_dbg_log */
@@ -259,6 +261,14 @@
         prConfig->pps_polarity = atoi(val);
     } else if ((!strcmp(key, "pps_duty"))) {
         prConfig->pps_duty = atoi(val);
+    } else if ((!strcmp(key, "DGPS_MODE_SBAS"))) {
+        prConfig->dgps_mode_sbas = atoi(val);
+    } else if ((!strcmp(key, "elev_mask"))) {
+        prConfig->elev_mask = atoi(val);
+    }else if ((!strcmp(key, "ga_before_ttff"))) {
+        prConfig->ga_before_ttff = atoi(val);
+    }else if ((!strcmp(key, "datum"))) {
+        prConfig->datum = atoi(val);
     }
     return 0;
 }
@@ -321,9 +331,9 @@
         LOGD_ENG("[setting] load default value\n");
         res = -1;
     }
-    LOGD("dev_dsp/dev_dsp2/dev_gps : %s %s %s,init_speed/link_speed: %d %d\n",
+    LOGD("dev_dsp/dev_dsp2/dev_gps : %s %s %s,init_speed/link_speed: %d %d,dgps_mode_sbas : %d.\n",
         prConfig->dev_dsp, prConfig->dev_dsp2, prConfig->dev_gps,
-        prConfig->init_speed, prConfig->link_speed);
+        prConfig->init_speed, prConfig->link_speed,prConfig->dgps_mode_sbas);
     LOGD_ENG("pmtk_conn/socket_port/dev_dbg : %d %d %s\n",
         prConfig->pmtk_conn, prConfig->socket_port, prConfig->dev_dbg);
     LOGD_ENG("debug_nmea/debug_mnl: %d 0x%04X,nmea2file/dbg2file: %d/%d\n",
diff --git a/src/connectivity/gps/2.0/mtk_mnld/mnld_entity/src/mnld.c b/src/connectivity/gps/2.0/mtk_mnld/mnld_entity/src/mnld.c
index ae5aa45..3411b98 100755
--- a/src/connectivity/gps/2.0/mtk_mnld/mnld_entity/src/mnld.c
+++ b/src/connectivity/gps/2.0/mtk_mnld/mnld_entity/src/mnld.c
@@ -926,6 +926,20 @@
     mnld_gps_client* raw_meas = &g_mnld_ctx.gps_status.clients.raw_meas;
     ctx->meas_started = false;
 
+//ensure the navi/meas is disable, when raw meas stop
+    if(g_mnld_ctx.gps_status.is_gps_navi_enabled) {
+        LOGD("set gps_navigation disable");
+        g_mnld_ctx.gps_status.is_gps_navi_enabled = false;
+    }
+    if(g_enable_full_tracking) {
+        LOGD("set full tracking disable");
+        g_enable_full_tracking = false;
+    }
+    if(g_mnld_ctx.gps_status.is_gps_meas_enabled) {
+        LOGD("set gps_measurement disable");
+        g_mnld_ctx.gps_status.is_gps_meas_enabled = false;
+    }
+
     LOGW("hal_raw_meas_gps_stop, fd:[%d], meas_open:%d", fd, raw_meas->gps_used);
     if((raw_meas->gps_used == true) && client_list_is_all_meas_stop(&g_hal_basic_client_list)) {
         raw_meas->gps_used = false;
@@ -1012,6 +1026,31 @@
     mnld_fsm(GPS_EVENT_RESET, 0, 0, NULL);
 }
 
+
+static void hal_gps_fix_interval(UINT32 interval) {
+    LOGD("hal_gps_fix_interval  interval=%u.",interval);
+    // TODO libmnl.so
+    mtk_gps_set_param(MTK_PARAM_CMD_AUTO_FIXRATE,&interval);
+}
+
+static void hal_gps_opmode(UINT8 opmode) {
+    LOGD("hal_gps_opmode  opmode=%hhu.",opmode);
+    // TODO libmnl.so
+    mtk_gps_set_param(MTK_PARAM_CMD_AUTO_OPMODE,&opmode);
+}
+
+static void hal_gps_elevation_angle(UINT8 elev) {
+    LOGD("hal_gps_elevation_angle  elev=%hhu.",elev);
+    // TODO libmnl.so
+    mtk_gps_set_param(MTK_PARAM_CMD_AUTO_ELEV_CONFIG,&elev);
+}
+
+static void hal_gps_l5_disable(bool flag) {
+    LOGD("hal_gps_l5_disable  flag=%hhu.",flag);
+    // TODO libmnl.so
+    mtk_gps_set_param(MTK_PARAM_CMD_AUTO_L5_DISABLE,&flag);
+}
+
 static void hal_gps_set_position_mode(gps_pos_mode mode, gps_pos_recurrence recurrence,
         int min_interval, int preferred_acc, int preferred_time, bool lowPowerMode) {
     LOGD("hal_gps_set_position_mode  mode=%d recurrence=%d min_interval=%d preferred_acc=%d preferred_time=%d lowPowerMode=%d",
@@ -1406,6 +1445,10 @@
     hal_set_epo_enable,
     hal_set_ttff_acc,
     hal_ext_client_capability_update,
+    hal_gps_fix_interval,
+    hal_gps_opmode,
+    hal_gps_elevation_angle,
+    hal_gps_l5_disable,
 };
 
 
diff --git a/src/kernel/linux/v4.19/arch/arm64/boot/dts/mediatek/auto2735evb.dts b/src/kernel/linux/v4.19/arch/arm64/boot/dts/mediatek/auto2735evb.dts
index 716549a..e58b7fc 100755
--- a/src/kernel/linux/v4.19/arch/arm64/boot/dts/mediatek/auto2735evb.dts
+++ b/src/kernel/linux/v4.19/arch/arm64/boot/dts/mediatek/auto2735evb.dts
@@ -793,7 +793,9 @@
 		pins_bus {
 			pinmux = <PINMUX_GPIO81__FUNC_SDA5>,
 				 <PINMUX_GPIO82__FUNC_SCL5>;
-                        bias-pull-up;
+//Typethree@2023.2.01 modify for cancel internal pull-up start
+                        bias-disable;
+//Typethree@2023.2.01 modify for cancel internal pull-up end
 			mediatek,res-sel = <3>;
                 };
         };
@@ -1511,6 +1513,10 @@
             "nfi_cg";
 #endif
 };
+/*Lxf add in 2022/12/2 for gpio init*/
+&gpio_init{
 
+};
+/*Lxf add in 2022/12/2 for gpio init end*/
 #include <mediatek/evb6890v1_64_cpe/cust.dtsi>
 /*End of this file, DO NOT ADD ANYTHING HERE*/
diff --git a/src/kernel/linux/v4.19/arch/arm64/boot/dts/mediatek/auto2735evb_gsw.dts b/src/kernel/linux/v4.19/arch/arm64/boot/dts/mediatek/auto2735evb_gsw.dts
index 1e8f584..56090fe 100755
--- a/src/kernel/linux/v4.19/arch/arm64/boot/dts/mediatek/auto2735evb_gsw.dts
+++ b/src/kernel/linux/v4.19/arch/arm64/boot/dts/mediatek/auto2735evb_gsw.dts
@@ -850,7 +850,9 @@
 		pins_bus {
 			pinmux = <PINMUX_GPIO81__FUNC_SDA5>,
 				 <PINMUX_GPIO82__FUNC_SCL5>;
-                        bias-pull-up;
+//Typethree@2023.2.01 modify for cancel internal pull-up start
+                        bias-disable;
+//Typethree@2023.2.01 modify for cancel internal pull-up end
 			mediatek,res-sel = <3>;
                 };
         };
@@ -1569,6 +1571,10 @@
             "nfi_cg";
 #endif
 };
+/*Lxf add in 2022/12/2 for gpio init*/
+&gpio_init{
 
+};
+/*Lxf add in 2022/12/2 for gpio init end*/
 #include <mediatek/evb6890v1_64_cpe/cust.dtsi>
 /*End of this file, DO NOT ADD ANYTHING HERE*/
diff --git a/src/kernel/linux/v4.19/arch/arm64/boot/dts/mediatek/mt2735.dtsi b/src/kernel/linux/v4.19/arch/arm64/boot/dts/mediatek/mt2735.dtsi
index bb47281..7e172b6 100644
--- a/src/kernel/linux/v4.19/arch/arm64/boot/dts/mediatek/mt2735.dtsi
+++ b/src/kernel/linux/v4.19/arch/arm64/boot/dts/mediatek/mt2735.dtsi
@@ -4499,7 +4499,11 @@
         enable-active-high;
 	/*zhengzhou 0316 ---*/
     };
-
+/*Lxf add in 2022/12/2 for gpio init*/
+	gpio_init: gpio_init{
+		compatible = "linux,gpio_init";
+	};
+/*Lxf add in 2022/12/2 for gpio init end*/
 	firmware {
 		optee {
 			compatible = "linaro,optee-tz";
diff --git a/src/kernel/linux/v4.19/drivers/Makefile b/src/kernel/linux/v4.19/drivers/Makefile
index a4c433d..6066d60 100644
--- a/src/kernel/linux/v4.19/drivers/Makefile
+++ b/src/kernel/linux/v4.19/drivers/Makefile
@@ -5,7 +5,9 @@
 # 15 Sep 2000, Christoph Hellwig <hch@infradead.org>
 # Rewritten to use lists instead of if-statements.
 #
-
+#Lxf add in 2022/12/2 for gpio init
+obj-y				+= lynq_gpio_init/
+#Lxf add in 2022/12/2 for gpio init end
 obj-y				+= irqchip/
 obj-y				+= bus/
 
diff --git a/src/kernel/linux/v4.19/drivers/lynq_gpio_init/Makefile b/src/kernel/linux/v4.19/drivers/lynq_gpio_init/Makefile
new file mode 100644
index 0000000..0f7ff3d
--- /dev/null
+++ b/src/kernel/linux/v4.19/drivers/lynq_gpio_init/Makefile
@@ -0,0 +1,2 @@
+
+obj-y	+= lynq_gpio_init.o
diff --git a/src/kernel/linux/v4.19/drivers/lynq_gpio_init/lynq_gpio_init.c b/src/kernel/linux/v4.19/drivers/lynq_gpio_init/lynq_gpio_init.c
new file mode 100755
index 0000000..e7caba3
--- /dev/null
+++ b/src/kernel/linux/v4.19/drivers/lynq_gpio_init/lynq_gpio_init.c
@@ -0,0 +1,71 @@
+#include <linux/init.h>
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/gpio.h>
+#include <linux/of.h>
+#include <linux/of_gpio.h>
+#include <linux/platform_device.h>
+
+#include "../pinctrl/mediatek/pinctrl-mtk-common-v2_debug.h"
+#include "../pinctrl/mediatek/pinctrl-mtk-common-v2.h"
+#include "lynq_gpio_init.h"
+
+
+static int __init drv_init(void)
+{
+    struct device_node *gpio_device_node = NULL;
+    struct device_node *gpio_next_node = NULL;
+    int ret = 0;
+    int i;
+
+    printk("GPIO_INIT:init start");
+    log_offset = sprintf(log_info, "GPIO init start\n");
+    //create folder in /sys
+	ret = kobject_init_and_add(&kobj,&ktype,NULL,"lynq_gpio");
+    ret = kobject_init_and_add(&kobj_log,&ktype_log,NULL,"lynq_log");
+    //find the dts node
+    gpio_device_node = of_find_node_by_path("/gpio_init");
+    if(gpio_device_node == NULL)
+    {
+        printk("GPIO_INIT: get DTS property failed!\n");
+        log_offset += sprintf(log_info + log_offset, "get DTS property failed!\n");
+        return 0;
+    }
+    //get the number of gpio_init child node
+    node_num = of_get_child_count(gpio_device_node);
+    if(node_num <= GPIO_NODE_NUM)
+    {
+        printk("GPIO_INIT:node number: %d", node_num);
+        log_offset += sprintf(log_info + log_offset, "GPIO_INIT:node number: %d\n", node_num);
+    }
+    else
+    {
+        node_num = GPIO_NODE_NUM;
+        log_offset += sprintf(log_info + log_offset, "GPIO_INIT:over the max number\n");
+        printk("GPIO_INIT:over the max number");
+    }
+//set each gpio
+   for(i = 0; i < node_num; i++)
+   {
+        gpio_next_node = of_get_next_child(gpio_device_node, gpio_next_node);
+        if(gpio_next_node)
+        {
+            printk("exist this node");
+        }
+        else
+        {
+            printk("no more node");
+            break;
+        }
+        ret = set_gpio(gpio_next_node, i);        
+    }
+
+    printk("GPIO_INIT:END");
+    log_offset += sprintf(log_info + log_offset, "GPIO_INIT:END\n");
+    return 0;
+}
+
+device_initcall(drv_init);
+MODULE_AUTHOR("Mobiletek");
+MODULE_DESCRIPTION("driver for init gpio");
+MODULE_LICENSE("GPL");
diff --git a/src/kernel/linux/v4.19/drivers/lynq_gpio_init/lynq_gpio_init.h b/src/kernel/linux/v4.19/drivers/lynq_gpio_init/lynq_gpio_init.h
new file mode 100755
index 0000000..1d58455
--- /dev/null
+++ b/src/kernel/linux/v4.19/drivers/lynq_gpio_init/lynq_gpio_init.h
@@ -0,0 +1,315 @@
+#include <linux/init.h>
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/gpio.h>
+#include <linux/of.h>
+#include <linux/of_gpio.h>
+#include <linux/kobject.h>
+#include <linux/platform_device.h>
+#include <linux/device.h> 
+#include <linux/string.h> 
+#include <linux/sysfs.h> 
+#include <linux/stat.h> 
+#include <linux/slab.h>
+
+#include "../pinctrl/mediatek/pinctrl-mtk-common-v2_debug.h"
+#include "../pinctrl/mediatek/pinctrl-mtk-common-v2.h"
+
+#define GPIO_NODE_NUM 15
+#define LOG_SIZE 8192
+#define ERROR_SIZE 1024 
+
+struct gpio_node{
+    int gpio_num;
+	int gpio_mode;
+	int gpio_dir;
+	int gpio_dout;
+	int gpio_din;
+};
+
+//struct gpio_node *gpio_test;
+
+struct mtk_pinctrl *hw = NULL;
+const struct mtk_pin_desc *desc = NULL;
+
+struct kobject kobj;
+struct kobject kobj_log;
+int node_num = 0;
+struct gpio_node gpio_node_list[GPIO_NODE_NUM];
+
+char log_info[LOG_SIZE];
+int log_offset = 0;
+char error_info[ERROR_SIZE];
+int error_offset = 0;
+ 
+ssize_t kobj_test_show(struct kobject *kobject, struct attribute *attr,char *buf);
+ssize_t kobj_log_show(struct kobject *kobject, struct attribute *attr,char *buf);
+int set_gpio(struct device_node *gpio_node, int num);
+
+struct attribute gpio_attr = { 
+	.name = "gpio_init", 
+	.mode = S_IRUGO, 
+}; 
+struct attribute gpio_attr_log = { 
+	.name = "gpio_init_log", 
+	.mode = S_IRUGO, 
+}; 
+static struct attribute *def_attrs[] = { 
+	&gpio_attr, 
+	NULL, 
+}; 
+static struct attribute *def_attrs_log[] = { 
+	&gpio_attr_log, 
+	NULL, 
+}; 
+
+struct sysfs_ops obj_test_sysops = 
+{ 
+	.show = kobj_test_show, 
+}; 
+ 
+struct sysfs_ops gpio_log_sysops = 
+{ 
+	.show = kobj_log_show, 
+}; 
+ 
+struct kobj_type ktype =  
+{ 
+	.sysfs_ops=&obj_test_sysops, 
+	.default_attrs=def_attrs, 
+};
+ 
+struct kobj_type ktype_log =  
+{ 
+	.sysfs_ops=&gpio_log_sysops, 
+	.default_attrs=def_attrs_log, 
+};
+ 
+/*cat /sys/lynq_gpio/gpio_init*/ 
+ssize_t kobj_test_show(struct kobject *kobject, struct attribute *attr,char *buf)
+{
+    int show;
+    int i;
+	printk("gpio config show.\n"); 
+	printk("attrname:%s, node_num: %d.\n", attr->name, node_num); 
+	show = sprintf(buf,"%s, node_num: %d\n",attr->name, node_num);
+    show += sprintf(buf + show, "%s", error_info);
+    show += sprintf(buf + show, "NUM\tMODE\tDIR\tDOUT\tDIN\n");
+    for(i = 0; i < node_num; i++)
+    {
+        show += sprintf(buf + show, "%d\t%d\t%d\t%d\t%d\n", gpio_node_list[i].gpio_num, gpio_node_list[i].gpio_mode, gpio_node_list[i].gpio_dir, gpio_node_list[i].gpio_dout, gpio_node_list[i].gpio_din);
+        printk("%d\t%d\t%d\t%d\t%d\n", gpio_node_list[i].gpio_num, gpio_node_list[i].gpio_mode, gpio_node_list[i].gpio_dir, gpio_node_list[i].gpio_dout, gpio_node_list[i].gpio_din);
+    }
+    return strlen(buf);
+}
+/*cat /sys/lynq_log/gpio_init_log*/
+ssize_t kobj_log_show(struct kobject *kobject, struct attribute *attr,char *buf)
+{
+	printk("gpio init log show.\n"); 
+    sprintf(buf,"SHOW LOG\n%s", log_info);
+    return strlen(buf);
+}
+int set_gpio(struct device_node *gpio_node, int num)
+{
+    int ret = 0;
+    unsigned int gpio_num, gpio_mode, gpio_dir, gpio_dout, gpio_din;
+    int read_mode = -1;
+
+    gpio_node_list[num].gpio_num = -1;
+    gpio_node_list[num].gpio_mode = -1;
+    gpio_node_list[num].gpio_dir = -1;
+    gpio_node_list[num].gpio_din = -1;
+    gpio_node_list[num].gpio_dout = -1;
+
+    //get the gpio hw
+    ret = of_property_read_u32(gpio_node, "gpio_num", &gpio_num);
+    if(ret == -EINVAL || ret == -ENODATA)
+    {
+        printk("no value or no node");
+        log_offset += sprintf(log_info + log_offset,"No gpio num\n");
+        return 0;
+    }
+    else if(ret < 0)
+    {
+        printk("GPIO_INIT:READ ERROR: %d", ret);
+        log_offset += sprintf(log_info + log_offset, "GPIO_INIT: read num ERROR: %d\n", ret);
+        return ret;
+    }
+
+    gpio_node_list[num].gpio_num = (int)gpio_num;
+    printk("GPIO_INIT: the gpio_num is %u", gpio_num);
+    log_offset += sprintf(log_info + log_offset, "GPIO_INIT: the gpio_num is %u\n", gpio_num);
+
+    hw = mtk_gpio_find_mtk_pinctrl_dev_hw();
+    if(hw == NULL)
+    {
+        printk("GPIO_INIT: GET HW ERROR!");
+        log_offset += sprintf(log_info + log_offset, "GPIO_INIT: can not find this gpiochip!\n");
+        return -1;
+    }
+	if (gpio_num > hw->soc->npins)
+    {
+        log_offset += sprintf(log_info + log_offset, "GPIO_INIT: ERROR: over the max gpio num!\n");
+        error_offset += sprintf(error_info + error_offset, "GPIO_INIT: ERROR: over the max gpio num!\n");
+        return -1;
+    }
+    desc = (const struct mtk_pin_desc *)&hw->soc->pins[gpio_num];
+    //end of get gpio hw   
+
+//set gpio mode
+    ret = of_property_read_u32(gpio_node, "gpio_mode", &gpio_mode);
+    if(ret == -EINVAL || ret == -ENODATA)
+    {
+        printk("no value or no node");
+        log_offset += sprintf(log_info + log_offset, "no value or no node\n");
+    }
+    else if(ret < 0)
+    {
+        printk("GPIO_INIT:READ ERROR: %d", ret);
+        log_offset += sprintf(log_info + log_offset, "GPIO_INIT: read num ERROR: %d\n", ret);
+        return ret;
+    }
+    else
+    {
+        gpio_node_list[num].gpio_mode = (int)gpio_mode;
+        printk("GPIO_INIT: the gpio_mode is %u", gpio_mode);
+        log_offset += sprintf(log_info + log_offset, "GPIO_INIT: the gpio_mode is %u\n", gpio_mode);
+        if(gpio_mode >= 0 && gpio_mode <= 7)
+        {
+            ret = mtk_hw_set_value(hw, desc, PINCTRL_PIN_REG_MODE, gpio_mode);
+            if(ret == 0)
+            {
+                ret = mtk_hw_get_value(hw, desc, PINCTRL_PIN_REG_MODE, &read_mode);
+                log_offset += sprintf(log_info + log_offset, "GPIO_INIT: Mode SET %d\n", read_mode);
+                printk("GPIO_INIT: modify successfully"); 
+            }
+            else
+            {
+                printk("GPIO_INIT: SET REEOR %d", ret);
+                log_offset += sprintf(log_info + log_offset, "GPIO_INIT: SET REEOR %d\n", ret);
+                return ret;
+            }
+        }
+        else
+        {
+            log_offset += sprintf(log_info + log_offset, "GPIO_INIT: mode: %u out of the range 0-7\n", gpio_mode);
+            error_offset += sprintf(error_info + error_offset, "GPIO_INIT: mode: %u out of the range 0-7\n", gpio_mode);
+        }
+    }
+//set gpio dir
+    ret = of_property_read_u32(gpio_node, "gpio_dir", &gpio_dir);
+    if(ret == -EINVAL || ret == -ENODATA)
+    {
+        printk("no value or no node");
+        log_offset += sprintf(log_info + log_offset, "no value or no node\n");
+    }
+    else if(ret < 0)
+    {
+        printk("GPIO_INIT:READ ERROR: %d", ret);
+        log_offset += sprintf(log_info + log_offset, "GPIO_INIT: read num ERROR: %d\n", ret);
+        return ret;
+    }
+    else
+    {
+        gpio_node_list[num].gpio_dir = (int)gpio_dir;
+        printk("GPIO_INIT: the gpio_dir is %u", gpio_dir);
+        log_offset += sprintf(log_info + log_offset, "GPIO_INIT: the gpio_dir is %u\n", gpio_dir);
+        if(gpio_dir == 0 || gpio_dir == 1)
+        {
+            ret = mtk_hw_set_value(hw, desc, PINCTRL_PIN_REG_DIR, gpio_dir);
+            if(ret == 0)
+            {
+                printk("GPIO_INIT: modify successfully"); 
+            }
+            else
+            {
+                printk("GPIO_INIT: SET REEOR %d", ret);
+                log_offset += sprintf(log_info + log_offset, "GPIO_INIT: SET REEOR %d\n", ret);
+                return ret;
+            }
+        }
+        else
+        {
+            log_offset += sprintf(log_info + log_offset, "GPIO_INIT: dir: %u out of the range 0-1\n", gpio_dir);
+            error_offset += sprintf(error_info + error_offset, "GPIO_INIT: dir: %u out of the range 0-1\n", gpio_dir);
+        }
+	    
+    }    
+//set gpio dout
+    ret = of_property_read_u32(gpio_node, "gpio_dout", &gpio_dout);
+    if(ret == -EINVAL || ret == -ENODATA)
+    {
+        printk("no value or no node");
+        log_offset += sprintf(log_info + log_offset, "no value or no node\n");
+    }
+    else if(ret < 0)
+    {
+        printk("GPIO_INIT:READ ERROR: %d", ret);
+        log_offset += sprintf(log_info + log_offset, "GPIO_INIT: read num ERROR: %d\n", ret);
+        return ret;
+    }
+    else
+    {
+        gpio_node_list[num].gpio_dout = (int)gpio_dout;
+        printk("GPIO_INIT: the gpio_dout is %u", gpio_dout);
+        log_offset += sprintf(log_info + log_offset, "GPIO_INIT: the gpio_dout is %u\n", gpio_dout);
+        if(gpio_dout == 0 || gpio_dout == 1)
+        {
+            ret = mtk_hw_set_value(hw, desc, PINCTRL_PIN_REG_DO, gpio_dout);
+            if(ret == 0)
+            {
+                printk("GPIO_INIT: modify successfully"); 
+            }
+            else
+            {
+                printk("GPIO_INIT: SET REEOR %d", ret);
+                log_offset += sprintf(log_info + log_offset, "GPIO_INIT: SET REEOR %d\n", ret);
+                return ret;
+            }
+        }
+        else
+        {
+            log_offset += sprintf(log_info + log_offset, "GPIO_INIT: dout: %u out of the range 0-1\n", gpio_dout);
+            error_offset += sprintf(error_info + error_offset, "GPIO_INIT: dout: %u out of the range 0-1\n", gpio_dout);
+        }
+    }
+//set gpio din
+    ret = of_property_read_u32(gpio_node, "gpio_din", &gpio_din);
+    if(ret == -EINVAL || ret == -ENODATA)
+    {
+        printk("no value or no node");
+        log_offset += sprintf(log_info + log_offset, "no value or no node\n");
+    }
+    else if(ret < 0)
+    {
+        printk("GPIO_INIT:READ ERROR: %d", ret);
+        log_offset += sprintf(log_info + log_offset, "GPIO_INIT: read num ERROR: %d\n", ret);
+        return ret;
+    }
+    else
+    {
+        gpio_node_list[num].gpio_din = (int)gpio_din;
+        printk("GPIO_INIT: the gpio_din is %u", gpio_din);
+        log_offset += sprintf(log_info + log_offset, "GPIO_INIT: the gpio_din is %u\n", gpio_din);
+        if(gpio_din == 0 || gpio_din == 1)
+        {
+            ret = mtk_hw_set_value(hw, desc, PINCTRL_PIN_REG_DI, gpio_din);
+            if(ret == 0)
+            {
+                printk("GPIO_INIT: modify successfully"); 
+            }
+            else
+            {
+                printk("GPIO_INIT: SET REEOR %d", ret);
+                log_offset += sprintf(log_info + log_offset, "GPIO_INIT: SET REEOR %d\n", ret);
+                return ret;
+            }
+        }
+        else
+        {
+            log_offset += sprintf(log_info + log_offset, "GPIO_INIT: din: %u out of the range 0-1\n", gpio_din);
+            error_offset += sprintf(error_info + error_offset, "GPIO_INIT: din: %u out of the range 0-1\n", gpio_din);
+        }
+    }
+    return ret;
+}
diff --git a/src/kernel/linux/v4.19/drivers/pinctrl/mediatek/pinctrl-mtk-common-v2_debug.c b/src/kernel/linux/v4.19/drivers/pinctrl/mediatek/pinctrl-mtk-common-v2_debug.c
index 47c97dc..732260c 100644
--- a/src/kernel/linux/v4.19/drivers/pinctrl/mediatek/pinctrl-mtk-common-v2_debug.c
+++ b/src/kernel/linux/v4.19/drivers/pinctrl/mediatek/pinctrl-mtk-common-v2_debug.c
@@ -29,6 +29,9 @@
 #include <linux/uaccess.h>
 #include <linux/io.h>
 //zhengzhou modify 20201110 end
+/*Lxf add in 2022/12/2 for gpio init*/
+#include "pinctrl-mtk-common-v2.h"
+/*Lxf add in 2022/12/2 for gpio init end*/
 //zhengzhou modify 20201110 start start
 struct mtk_pinctrl *hw_file ;//= dev_get_drvdata(dev);
 struct device *dev_file;
@@ -66,7 +69,33 @@
 
 	pr_notice("[pinctrl]cannot find %s gpiochip\n", pinctrl_paris_modname);
 }
+/*Lxf add in 2022/12/2 for gpio init*/
+struct mtk_pinctrl* mtk_gpio_find_mtk_pinctrl_dev_hw(void)
+{
+	struct gpio_desc *gdesc;
+	unsigned int pin = ARCH_NR_GPIOS - 1;
 
+	do {
+		gdesc = gpio_to_desc(pin);
+		if (gdesc
+		 && !strncmp(pinctrl_paris_modname,
+				gdesc->gdev->chip->label,
+				strlen(pinctrl_paris_modname))) {
+			g_hw = gpiochip_get_data(gdesc->gdev->chip);
+			
+			return g_hw;
+		}
+		if (gdesc)
+			pin = (pin + 1) - gdesc->gdev->chip->base;
+		if (pin == 0 || !gdesc)
+			break;
+	} while (1);
+
+	pr_notice("[pinctrl]cannot find %s gpiochip\n", pinctrl_paris_modname);
+	return NULL;
+}
+EXPORT_SYMBOL_GPL(mtk_gpio_find_mtk_pinctrl_dev_hw);
+/*Lxf add in 2022/12/2 for gpio init end*/
 int gpio_get_tristate_input(unsigned int pin)
 {
 	struct mtk_pinctrl *hw = NULL;
diff --git a/src/kernel/linux/v4.19/drivers/pinctrl/mediatek/pinctrl-mtk-common-v2_debug.h b/src/kernel/linux/v4.19/drivers/pinctrl/mediatek/pinctrl-mtk-common-v2_debug.h
index 5227f59..2c97de8 100644
--- a/src/kernel/linux/v4.19/drivers/pinctrl/mediatek/pinctrl-mtk-common-v2_debug.h
+++ b/src/kernel/linux/v4.19/drivers/pinctrl/mediatek/pinctrl-mtk-common-v2_debug.h
@@ -5,10 +5,14 @@
  * Author: Light Hsieh <light.hsieh@mediatek.com>
  *
  */
-
+/*Lxf add in 2022/12/2 for gpio init*/
+#include "pinctrl-mtk-common-v2.h"
+/*Lxf add in 2022/12/2 for gpio init end*/
 #ifndef __PINCTRL_MTK_COMMON_V2_DEBUG_H
 #define __PINCTRL_MTK_COMMON_V2_DEBUG_H
 
 int gpio_get_tristate_input(unsigned int pin);
-
+/*Lxf add in 2022/12/2 for gpio init*/
+struct mtk_pinctrl* mtk_gpio_find_mtk_pinctrl_dev_hw(void);
+/*Lxf add in 2022/12/2 for gpio init end*/
 #endif /* __PINCTRL_MTK_COMMON_V2_DEBUG_H */
diff --git a/src/kernel/linux/v4.19/drivers/rtc/rtc-mt6330.c b/src/kernel/linux/v4.19/drivers/rtc/rtc-mt6330.c
index 9ae0db2..5c0281b 100644
--- a/src/kernel/linux/v4.19/drivers/rtc/rtc-mt6330.c
+++ b/src/kernel/linux/v4.19/drivers/rtc/rtc-mt6330.c
@@ -21,6 +21,9 @@
 
 
 #define RTC_BBPU		0x0000
+/*dongyu@2023.1.9 RTC set sleep wake time and call shutdown for shutdown, the module will automatically turn on start*/
+#define RTC_BBPU_KEY            0x4300 
+/*dongyu@2023.1.9 RTC set sleep wake time and call shutdown for shutdown, the module will automatically turn on end*/
 #define RTC_BBPU_CBUSY		BIT(6)
 
 #define RTC_WRTGR_MT6330	0x3a
@@ -453,7 +456,13 @@
 	struct mt6330_rtc *rtc = data;
 	u32 irqsta = 0, irqen;
 	int ret;
+        /*dongyu@2023.1.9 RTC set sleep wake time and call shutdown for shutdown, the module will automatically turn on start*/
+        int ret2, tmp;
 
+        ret2 = rtc_read(rtc, rtc->addr_base + RTC_BBPU, &tmp);
+        ret2 = rtc_write(rtc, rtc->addr_base + RTC_BBPU, (tmp | RTC_BBPU_KEY | (1<<3)));
+        mtk_rtc_write_trigger(rtc);
+        /*dongyu@2023.1.9 RTC set sleep wake time and call shutdown for shutdown, the module will automatically turn on end*/
 	ret = rtc_read(rtc, rtc->addr_base + RTC_IRQ_STA, &irqsta);
 	if ((ret >= 0) && (irqsta & RTC_IRQ_STA_AL)) {
 		rtc_update_irq(rtc->rtc_dev, 1, RTC_IRQF | RTC_AF);
diff --git a/src/kernel/linux/v4.19/drivers/soc/mediatek/Kconfig b/src/kernel/linux/v4.19/drivers/soc/mediatek/Kconfig
index c82a4f4..7945f5c 100644
--- a/src/kernel/linux/v4.19/drivers/soc/mediatek/Kconfig
+++ b/src/kernel/linux/v4.19/drivers/soc/mediatek/Kconfig
@@ -83,6 +83,10 @@
 	  platform could enter deeper sleep mode when cpu preparing to
 	  power down if it have sufficient time between warmboot.
 
+#Typethree@2023.2.01 modify for TCXO hw version start
+
+#Typethree@2023.2.01 modify for TCXO hw version end
+
 config MTK_IPI
 	tristate "MediaTek IPI Support"
 	depends on RPMSG_MTK
diff --git a/src/kernel/linux/v4.19/drivers/soc/mediatek/mtk-scpsys.c b/src/kernel/linux/v4.19/drivers/soc/mediatek/mtk-scpsys.c
index d9736f0..2c822d1 100755
--- a/src/kernel/linux/v4.19/drivers/soc/mediatek/mtk-scpsys.c
+++ b/src/kernel/linux/v4.19/drivers/soc/mediatek/mtk-scpsys.c
@@ -25,6 +25,9 @@
 #include <dt-bindings/power/mt8173-power.h>
 #include <dt-bindings/power/mt6880-power.h>
 #include <dt-bindings/power/mt6890-power.h>
+/*Typethree add for tcxo power problem 2023/01/30 start*/
+#include <linux/gpio.h>
+/*Typethree add for tcxo power problem 2023/01/30 end*/
 #include "mtk-scpsys.h"
 
 #define MTCMOS_BRINGUP      0
@@ -62,10 +65,15 @@
 #define SPM_WB_PWR_CON			0x02ec	/* MT7622 */
 /* NETSYS_S_SRAM_CON (0x10006000+0x378)*/
 #define NETSYS_S_SRAM_CON		0x0378
-
+/* CONN_STATUS (0x10006000+0x62C)*/
+/*Typethree add for tcxo power problem 2023/01/12 start*/
+#define CONN_STATUS			0x062C
+/*Typethree add for tcxo power problem 2023/01/12 end*/
 #define SPM_PWR_STATUS			0x060c
 #define SPM_PWR_STATUS_2ND		0x0610
-
+/*Typethree add for tcxo power problem 2023/01/12 start*/
+#define CONN_STATUS_BIT			BIT(0)
+/*Typethree add for tcxo power problem 2023/01/12 end*/
 #define PWR_RST_B_BIT			BIT(0)
 #define PWR_ISO_BIT			BIT(1)
 #define PWR_ON_BIT			BIT(2)
@@ -647,8 +655,28 @@
 	struct scp_domain *scpd = container_of(genpd, struct scp_domain, genpd);
 	struct scp *scp = scpd->scp;
 	void __iomem *ctl_addr = scp->base + scpd->data->ctl_offs;
-	u32 val;
+    
+    u32 val;
 	int ret, tmp;
+	
+/*Typethree add for tcxo power problem 2023/01/30 start*/
+	int gpio_81 = gpio_get_value(81+268);
+	int gpio_82 = gpio_get_value(82+268);
+    void __iomem *conn_status_addr = scp->base + CONN_STATUS;
+
+    if (gpio_81 != 0 && gpio_82 == 0) //TCXO open
+    {
+        val = readl(conn_status_addr);
+        if (strcmp(genpd->name, "conn") == 0) {
+            if ((val & CONN_STATUS_BIT) == CONN_STATUS_BIT)
+                dev_err(scp->dev, "gps try to power on\n");
+            else {
+                dev_err(scp->dev, "Skip conn power on\n");
+                return 0;
+            }
+        }
+    }
+/*Typethree add for tcxo power problem 2023/01/30 end*/
 
 	ret = scpsys_regulator_enable(scpd);
 	if (ret < 0)
@@ -755,8 +783,27 @@
 	struct scp_domain *scpd = container_of(genpd, struct scp_domain, genpd);
 	struct scp *scp = scpd->scp;
 	void __iomem *ctl_addr = scp->base + scpd->data->ctl_offs;
+
 	u32 val;
 	int ret, tmp;
+/*Typethree add for tcxo power problem 2023/01/30 start*/
+	int gpio_81 = gpio_get_value(81+268);
+	int gpio_82 = gpio_get_value(82+268);
+    void __iomem *conn_status_addr = scp->base + CONN_STATUS;
+
+    if (gpio_81 != 0 && gpio_82 == 0)
+    {
+        val = readl(conn_status_addr);
+        if (strcmp(genpd->name, "conn") == 0) {
+            if ((val & CONN_STATUS_BIT) == CONN_STATUS_BIT)
+                dev_err(scp->dev, "gps try to power off\n");
+            else {
+                dev_err(scp->dev, "Skip conn power off\n");
+                return 0;
+            }
+        }
+    }
+/*Typethree add for tcxo power problem 2023/01/30 end*/
 
 	ret = scpsys_bus_protect_enable(scpd);
 	if (ret < 0)
diff --git a/src/kernel/linux/v4.19/fs/proc/version.c b/src/kernel/linux/v4.19/fs/proc/version.c
index b449f18..aab869f 100644
--- a/src/kernel/linux/v4.19/fs/proc/version.c
+++ b/src/kernel/linux/v4.19/fs/proc/version.c
@@ -5,6 +5,7 @@
 #include <linux/proc_fs.h>
 #include <linux/seq_file.h>
 #include <linux/utsname.h>
+#include <generated/compile.h>
 
 static int version_proc_show(struct seq_file *m, void *v)
 {
@@ -18,6 +19,7 @@
 static int __init proc_version_init(void)
 {
 	proc_create_single("version", 0, NULL, version_proc_show);
+	printk("VERSION: ("LYNQ_VERSION") "UTS_VERSION" \n");
 	return 0;
 }
 fs_initcall(proc_version_init);
diff --git a/src/kernel/linux/v4.19/init/version.c b/src/kernel/linux/v4.19/init/version.c
index ef4012e..0a0c76d 100644
--- a/src/kernel/linux/v4.19/init/version.c
+++ b/src/kernel/linux/v4.19/init/version.c
@@ -49,6 +49,7 @@
 const char linux_proc_banner[] =
 	"%s version %s"
 	" (" LINUX_COMPILE_BY "@" LINUX_COMPILE_HOST ")"
+	" (" LYNQ_VERSION ")"
 	" (" LINUX_COMPILER ") %s\n";
 
 BUILD_SALT;
diff --git a/src/kernel/linux/v4.19/oe-logs b/src/kernel/linux/v4.19/oe-logs
index 7c64d2b..b6ad895 120000
--- a/src/kernel/linux/v4.19/oe-logs
+++ b/src/kernel/linux/v4.19/oe-logs
@@ -1 +1 @@
-/mnt/sdc/qs.xiong/work_space/up_drv/build/tmp/work/auto2735evb_ivt_main-poky-linux/linux-mtk-extension/4.19-r0/temp
\ No newline at end of file
+/home/ren/git/diff/Merged/T800/build/tmp/work/auto2735evb_ivt_main-poky-linux/linux-mtk-extension/4.19-r0/temp
\ No newline at end of file
diff --git a/src/kernel/linux/v4.19/oe-workdir b/src/kernel/linux/v4.19/oe-workdir
index e87e9b6..b2307d2 120000
--- a/src/kernel/linux/v4.19/oe-workdir
+++ b/src/kernel/linux/v4.19/oe-workdir
@@ -1 +1 @@
-/mnt/sdc/qs.xiong/work_space/up_drv/build/tmp/work/auto2735evb_ivt_main-poky-linux/linux-mtk-extension/4.19-r0
\ No newline at end of file
+/home/ren/git/diff/Merged/T800/build/tmp/work/auto2735evb_ivt_main-poky-linux/linux-mtk-extension/4.19-r0
\ No newline at end of file
diff --git a/src/kernel/linux/v4.19/scripts/mkcompile_h b/src/kernel/linux/v4.19/scripts/mkcompile_h
index aebd613..4aaaa32 100755
--- a/src/kernel/linux/v4.19/scripts/mkcompile_h
+++ b/src/kernel/linux/v4.19/scripts/mkcompile_h
@@ -52,6 +52,7 @@
 fi
 #LXF 2022.10.10 modify for T8TSK-91 start
 COMMITID=$(git rev-parse --short HEAD)
+#LYNQ_VERSION="T800_UNSET_v02.MP1_MR3.02b06.00.01"
 
 UTS_VERSION="#$VERSION"
 CONFIG_FLAGS=""
@@ -74,6 +75,7 @@
   echo \#define UTS_VERSION \"`echo $UTS_VERSION | $UTS_TRUNCATE`\"
 #LXF 2022.10.10 modify for T8TSK-91 start
   printf '#define LINUX_COMPILE_BY "%s"\n' "$LINUX_COMPILE_BY"
+  printf '#define LYNQ_VERSION "%s"\n' "$LYNQ_VERSION"
   #echo \#define LINUX_COMPILE_BY \"`echo $LINUX_COMPILE_BY | $UTS_TRUNCATE`\"
 #LXF 2022.10.10 modify for T8TSK-91 end
   echo \#define LINUX_COMPILE_HOST \"`echo $LINUX_COMPILE_HOST | $UTS_TRUNCATE`\"
diff --git a/src/kernel/modules/connectivity/2.0/conninfra_driver/Makefile b/src/kernel/modules/connectivity/2.0/conninfra_driver/Makefile
index 67ec6d9..1ca5c6b 100755
--- a/src/kernel/modules/connectivity/2.0/conninfra_driver/Makefile
+++ b/src/kernel/modules/connectivity/2.0/conninfra_driver/Makefile
@@ -74,9 +74,11 @@
 ccflags-y += -D CONFIG_CONNINFRA_THERMAL_SUPPORT=1
 endif
 
-ifeq ($(ENABLE_TCXO), yes)
-    ccflags-y += -D ENABLE_TCXO=1
-endif
+#Typethree@2023.2.01 modify for TCXO hw version start
+#ifeq ($(ENABLE_TCXO), yes)
+#    ccflags-y += -D ENABLE_TCXO=1
+#endif
+#Typethree@2023.2.01 modify for TCXO hw version end
 
 $(patsubst CONFIG_%, -DCFG_%=1, $(patsubst %=m,%,$(filter %=m,$(EXTRA_KCONFIG)))) \
 $(patsubst CONFIG_%, -DCFG_%=1, $(patsubst %=y,%,$(filter %=y,$(EXTRA_KCONFIG)))) \
diff --git a/src/kernel/modules/connectivity/2.0/conninfra_driver/platform/consys_hw.c b/src/kernel/modules/connectivity/2.0/conninfra_driver/platform/consys_hw.c
index 1415faa..f3d038d 100755
--- a/src/kernel/modules/connectivity/2.0/conninfra_driver/platform/consys_hw.c
+++ b/src/kernel/modules/connectivity/2.0/conninfra_driver/platform/consys_hw.c
@@ -21,6 +21,10 @@
 #include <linux/of_device.h>
 #include <linux/of_reserved_mem.h>
 #include <linux/pinctrl/consumer.h>
+/*Typethree@2023.2.01 modify for TCXO hw version start*/
+#include <linux/gpio.h>
+/*Typethree@2023.2.01 modify for TCXO hw version start*/
+
 
 #include "osal.h"
 
@@ -510,6 +514,12 @@
 int mtk_conninfra_probe(struct platform_device *pdev)
 {
 	int ret = -1;
+    
+/*Typethree add for tcxo power problem 2023/02/03 start*/
+    int gpio_81 = 0;
+    int gpio_82 = 0;
+/*Typethree add for tcxo power problem 2023/02/03 start*/
+
 #if CFG_CONNINFRA_FW_LOG_SUPPORT
 	struct consys_emi_addr_info* emi_info = NULL;
 #endif
@@ -552,12 +562,21 @@
 		pr_err("pmic_mng init fail, %d\n", ret);
 		return -5;
 	}
+	
+    /*Typethree add for tcxo power problem 2023/02/03 start*/
+	gpio_81 = gpio_get_value(81+268);
+	gpio_82 = gpio_get_value(82+268);
 
-#ifdef ENABLE_TCXO
-	conn_hw_env.tcxo_support = true;
-#else
-	consys_hw_tcxo_parser(pdev);
-#endif
+	if (gpio_81 != 0 && gpio_82 == 0)
+	{
+		conn_hw_env.tcxo_support = true;
+	}
+	else
+	{
+		consys_hw_tcxo_parser(pdev);
+	}
+    /*Typethree add for tcxo power problem 2023/02/03 end*/
+
 
 #if CFG_CONNINFRA_FW_LOG_SUPPORT
 	/* Setup connsys log emi base */
diff --git a/src/kernel/modules/connectivity/2.0/gps_driver/data_link/hal/gps_dl_power_ctrl.c b/src/kernel/modules/connectivity/2.0/gps_driver/data_link/hal/gps_dl_power_ctrl.c
index 1da21c4..878c01b 100644
--- a/src/kernel/modules/connectivity/2.0/gps_driver/data_link/hal/gps_dl_power_ctrl.c
+++ b/src/kernel/modules/connectivity/2.0/gps_driver/data_link/hal/gps_dl_power_ctrl.c
@@ -33,7 +33,9 @@
 #if GPS_DL_ON_CTP
 #include "gps_dl_ctp.h"
 #endif
-
+/*Typethree add for tcxo power problem 2023/01/12 start*/
+#include <asm/io.h>
+/*Typethree add for tcxo power problem 2023/01/12 end*/
 /* TODO: move them into a single structure */
 bool g_gps_common_on;
 bool g_gps_dsp_on_array[GPS_DATA_LINK_NUM];
@@ -337,6 +339,18 @@
 		gps_dl_hw_gps_dsp_ctrl(GPS_L5_DSP_CLEAR_PWR_STAT);
 }
 
+/*Typethree add for tcxo power problem 2023/01/12 start*/
+void gps_dl_hal_conn_power_ctrl_temp(unsigned int op)
+{
+	/*Troubleshoot the first GNSS startup failure due to no power supply for TCXO conn_vcn1.8*/
+	unsigned int md2gps_status = 0;
+	char *addr = ioremap(0x1000662c, 0x4);
+	md2gps_status = *(unsigned int *)addr;
+	md2gps_status = (md2gps_status & 0xFFFFFFFE)| op;
+	*(unsigned int *)addr = md2gps_status;
+	iounmap(addr);
+}
+/*Typethree add for tcxo power problem 2023/01/12 end*/
 int gps_dl_hal_conn_power_ctrl(enum gps_dl_link_id_enum link_id, int op)
 {
 	bool dma_en_flag = gps_dl_hal_get_dma_irq_en_flag();
@@ -349,6 +363,9 @@
 
 	if (1 == op) {
 		if (g_conn_user == 0) {
+/*Typethree add for tcxo power problem 2023/01/12 start*/
+			gps_dl_hal_conn_power_ctrl_temp(op);
+/*Typethree add for tcxo power problem 2023/01/12 end*/
 			gps_dl_log_info_show();
 			if (!gps_dl_hal_conn_infra_driver_on())
 				return -1;
@@ -383,6 +400,9 @@
 			gps_dl_wake_lock_hold(false);
 #endif
 			gps_dl_hal_conn_infra_driver_off();
+/*Typethree add for tcxo power problem 2023/01/12 start*/
+			gps_dl_hal_conn_power_ctrl_temp(op);
+/*Typethree add for tcxo power problem 2023/01/12 end*/
 		}
 	}
 
diff --git a/src/lynq/framework/lynq-ril-service/LICENSE b/src/lynq/framework/lynq-ril-service/LICENSE
index 77f59ed..605b7ea 100755
--- a/src/lynq/framework/lynq-ril-service/LICENSE
+++ b/src/lynq/framework/lynq-ril-service/LICENSE
@@ -1,31 +1,31 @@
 Copyright Statement:
 
-This software/firmware and related documentation ("MediaTek Software") are
+This software/firmware and related documentation ("MobileTek Software") are
 protected under relevant copyright laws. The information contained herein is
-confidential and proprietary to MediaTek Inc. and/or its licensors. Without
-the prior written permission of MediaTek inc. and/or its licensors, any
-reproduction, modification, use or disclosure of MediaTek Software, and
+confidential and proprietary to MobileTek Inc. and/or its licensors. Without
+the prior written permission of MobileTek inc. and/or its licensors, any
+reproduction, modification, use or disclosure of MobileTek Software, and
 information contained herein, in whole or in part, shall be strictly
 prohibited.
 
-MediaTek Inc. (C) 2015. All rights reserved.
+MobileTek Inc. (C) 2015. All rights reserved.
 
 BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
-THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
-RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
-ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL
+THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MobileTek SOFTWARE")
+RECEIVED FROM MobileTek AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
+ON AN "AS-IS" BASIS ONLY. MobileTek EXPRESSLY DISCLAIMS ANY AND ALL
 WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
 WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
-NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH
+NONINFRINGEMENT. NEITHER DOES MobileTek PROVIDE ANY WARRANTY WHATSOEVER WITH
 RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
-INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES
+INCORPORATED IN, OR SUPPLIED WITH THE MobileTek SOFTWARE, AND RECEIVER AGREES
 TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
 RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
-OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK
-SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE
+OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MobileTek
+SOFTWARE. MobileTek SHALL ALSO NOT BE RESPONSIBLE FOR ANY MobileTek SOFTWARE
 RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
-STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S
-ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE
-RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE
-MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
-CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MobileTek'S
+ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MobileTek SOFTWARE
+RELEASED HEREUNDER WILL BE, AT MobileTek'S OPTION, TO REVISE OR REPLACE THE
+MobileTek SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
+CHARGE PAID BY RECEIVER TO MobileTek FOR SUCH MobileTek SOFTWARE AT ISSUE.
diff --git a/src/lynq/framework/lynq-ril-service/src/LICENSE b/src/lynq/framework/lynq-ril-service/src/LICENSE
index 77f59ed..605b7ea 100755
--- a/src/lynq/framework/lynq-ril-service/src/LICENSE
+++ b/src/lynq/framework/lynq-ril-service/src/LICENSE
@@ -1,31 +1,31 @@
 Copyright Statement:
 
-This software/firmware and related documentation ("MediaTek Software") are
+This software/firmware and related documentation ("MobileTek Software") are
 protected under relevant copyright laws. The information contained herein is
-confidential and proprietary to MediaTek Inc. and/or its licensors. Without
-the prior written permission of MediaTek inc. and/or its licensors, any
-reproduction, modification, use or disclosure of MediaTek Software, and
+confidential and proprietary to MobileTek Inc. and/or its licensors. Without
+the prior written permission of MobileTek inc. and/or its licensors, any
+reproduction, modification, use or disclosure of MobileTek Software, and
 information contained herein, in whole or in part, shall be strictly
 prohibited.
 
-MediaTek Inc. (C) 2015. All rights reserved.
+MobileTek Inc. (C) 2015. All rights reserved.
 
 BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
-THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
-RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
-ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL
+THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MobileTek SOFTWARE")
+RECEIVED FROM MobileTek AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
+ON AN "AS-IS" BASIS ONLY. MobileTek EXPRESSLY DISCLAIMS ANY AND ALL
 WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
 WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
-NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH
+NONINFRINGEMENT. NEITHER DOES MobileTek PROVIDE ANY WARRANTY WHATSOEVER WITH
 RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
-INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES
+INCORPORATED IN, OR SUPPLIED WITH THE MobileTek SOFTWARE, AND RECEIVER AGREES
 TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
 RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
-OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK
-SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE
+OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MobileTek
+SOFTWARE. MobileTek SHALL ALSO NOT BE RESPONSIBLE FOR ANY MobileTek SOFTWARE
 RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
-STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S
-ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE
-RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE
-MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
-CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MobileTek'S
+ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MobileTek SOFTWARE
+RELEASED HEREUNDER WILL BE, AT MobileTek'S OPTION, TO REVISE OR REPLACE THE
+MobileTek SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
+CHARGE PAID BY RECEIVER TO MobileTek FOR SUCH MobileTek SOFTWARE AT ISSUE.
diff --git a/src/lynq/framework/lynq-ril-service/src/atci/ATCI.cpp b/src/lynq/framework/lynq-ril-service/src/atci/ATCI.cpp
old mode 100644
new mode 100755
index 16f38df..236a3d7
--- a/src/lynq/framework/lynq-ril-service/src/atci/ATCI.cpp
+++ b/src/lynq/framework/lynq-ril-service/src/atci/ATCI.cpp
@@ -55,6 +55,7 @@
 #include "atci_sys_cmd.h"
 #include "atci_ss_cmd.h"
 #include "atci_cc_cmd.h"
+#include "atci_lynq_data_cmd.h" //warren add for lynq atsvc on 20221207
 #endif
 
 struct sockaddr_un atci_server_addr;
@@ -454,6 +455,90 @@
   RLOGD("Response Buf is %s, send length is %d",buf,len_s);
 }
 
+/*warren add for lynq atsvc on 20221208 start*/
+int atci_send_result(int error_code)
+{
+    char buf[32];
+    memset(buf, 0, sizeof(buf));
+    if(error_code != 0)
+    {
+        sprintf(buf,"%s%d\r\n","\r\n+CME ERROR: ",error_code);
+    }
+    else
+    {
+        sprintf(buf,"%s","\r\nOK\r\n");
+    }
+    int len_s = send(atci_client_connect, buf, strlen(buf), 0);
+    if(len_s != strlen(buf))
+    {
+        RLOGD("send buf fail Response Buf is %s, send length is %d",buf,len_s);
+        return -1;
+    }
+    RLOGD("Response Buf is %s, send length is %d",buf,len_s);
+    return 0;
+}
+int atci_send_data(char *data)
+{
+    char buf[256];
+    int data_len = 0;
+    memset(buf, 0, sizeof(buf));
+    if(NULL == data)
+    {
+        RLOGD("data is null");
+        return -1;
+    }
+    else
+    {
+        data_len = strlen(data);
+        if(data_len > 252)// \r\n + \r\n\0
+        {
+            RLOGD("data too long");
+            snprintf(buf,252,"\r\n%s\r\n",data);
+        }
+        else
+        {
+            snprintf(buf,data_len+5,"\r\n%s\r\n",data);// \r\n + \r\n\0
+        }
+        int len_s = send(atci_client_connect, buf, strlen(buf), 0);
+        if(len_s != strlen(buf))
+        {
+            RLOGD("send buf fail Response Buf is %s, send length is %d",buf,len_s);
+            return -1;
+        }
+        RLOGD("Response Buf is %s, send length is %d",buf,len_s);
+    }
+    return 0;
+}
+void ATCIResponseNoToken(int error, char* data, int reqNum)
+{
+    char buf[64];
+    if(NULL == data && reqNum == 0)
+    {
+          RLOGD("[%d][%s] input error",__LINE__,__FUNCTION__);
+          return;
+    }
+    RLOGD("request is %d,%s",reqNum,android::requestToString(reqNum));
+    if(NULL == data)
+    {
+        if(atci_send_result(error)!=0)
+        {
+            RLOGD("send result fail");
+        }
+    }
+    else
+    {
+        if(atci_send_data(data)!=0)
+        {
+            RLOGD("send data fail");
+            return;
+        }
+        if(atci_send_result(error)!=0)
+        {
+            RLOGD("send result fail");
+        }
+    }
+}
+/*warren add for lynq atsvc on 20221208 end*/
 #ifdef ATCI_PARSE
 int acti_cmd_recv(int fd, char *buf, int len) {
   int ret = 0;
@@ -588,7 +673,7 @@
   }
 #ifdef ATCI_PARSE
   DbgMsg("init cmd handle");
-  if(/*atci_generic_init(NULL)||*/atci_cc_init(NULL)||atci_ss_init(NULL)||atci_sys_init(NULL)) {
+  if(/*atci_generic_init(NULL)||*/atci_cc_init(NULL)||atci_ss_init(NULL)||atci_sys_init(NULL)||atci_lynq_data_init(NULL)) {
     ErrMsg("module init function error,exit");
     exit(-1);
   }
@@ -798,7 +883,7 @@
     int cmd_mode = atci_get_cmd_mode(line);
     char response[MAX_RESP_BUF_LENGTH];
     memset(response, 0, sizeof(response));
-    RLOGD("write to handler");
+    RLOGD("write to handler,cmd_mode:%d",cmd_mode);
     ret = cmd_handle->cmd_handle_func(line, cmd_mode, cmd_handle->target,
         response);
     if (SYS_FAIL == ret) {
diff --git a/src/lynq/framework/lynq-ril-service/src/atci/ATCI.h b/src/lynq/framework/lynq-ril-service/src/atci/ATCI.h
index 45f9d4f..6d52dbf 100755
--- a/src/lynq/framework/lynq-ril-service/src/atci/ATCI.h
+++ b/src/lynq/framework/lynq-ril-service/src/atci/ATCI.h
@@ -146,6 +146,8 @@
 #endif
 
 void ATCIResponse(int token, int error, char* data, int reqNum);
-
+void ATCIResponseNoToken(int error, char* data, int reqNum); /*warren add for lynq atsvc on 20221208*/
+int atci_send_data(char *data);
+int atci_send_result(int error_code);
 void * StartATCISocket(void *param);
 #endif
diff --git a/src/lynq/framework/lynq-ril-service/src/atci/atci_lynq_data_cmd.cpp b/src/lynq/framework/lynq-ril-service/src/atci/atci_lynq_data_cmd.cpp
new file mode 100755
index 0000000..e0b8321
--- /dev/null
+++ b/src/lynq/framework/lynq-ril-service/src/atci/atci_lynq_data_cmd.cpp
@@ -0,0 +1,694 @@
+/**********************************************************************************************
+* @file atci_lynq_data_cmd.cpp
+* @brief.Implementation of lynq data AT commands function 
+* @details None
+* @author   Hong Liu。
+* @date     2022-12-07
+* @version  V1.0
+* @copyright   Copyright (c) MobileTek 
+***********************************************************************************************/
+#include <vendor-ril/telephony/ril.h>
+#include <string.h>
+#include <log/log.h>
+
+#include "ATCI.h"
+#include "atci_util.h"
+#include "atci_at_util.h"
+#include "atci_lynq_data_cmd.h"
+#include "atci_common.h"
+#include "lynq_common.h"
+#include "common.h"
+#include "sim.h"
+
+#undef LOG_TAG
+#define LOG_TAG "DEMO_ATCI_DATA"
+#define LINE __LINE__
+#define FUNC __FUNCTION__
+#define SET_DEFAULT_SIM_ALL -1
+
+int g_flag_apn = 0;
+
+atci_cmd_type_t atci_data_cmd_table[] = {
+//cmd_name      target_type        handler
+    { "AT+LAPNACT", TARGET_TELEPHONY, atci_data_enable_pdp_hdlr },            //AT command to enable defult PDP
+    { "AT+ELAPNACT", TARGET_TELEPHONY, atci_data_enable_pdp_with_apn_hdlr },  //AT command to enable PDP with APN
+    { "AT+LEAPNMOD", TARGET_TELEPHONY, atci_data_modify_apn_hdlr },           //AT command to modify APN
+    { "AT+LCSUS", TARGET_TELEPHONY, atci_switch_card_halr },
+    { NULL, TARGET_UNKNOWN, NULL }
+};
+int atci_lynq_data_init(void *arg) {
+    int ret;
+    ret = atci_cmd_register(atci_data_cmd_table);
+    return ret;
+}
+
+int atci_switch_card_halr(char *cmd, int op_mode, int target, char *response)
+{
+    char buf[16];
+    switch (op_mode)
+    {
+        case AT_SET_MODE:
+        {
+            //paser parameter
+            //send to target handle
+            //ex: at+lapnact=int
+            RLOGD("input cmd[%s]", cmd);
+            if (SYS_FAIL == atci_at_to_equal(&cmd))
+            {
+                //input error
+                ATCIResponseNoToken(100,NULL,SET_DEFAULT_SIM_ALL);
+                return SYS_FAIL;
+            }
+            RLOGD("[%d][%s] data is[%s]",LINE,FUNC,cmd);
+            int state;
+            if (SYS_FAIL == atci_at_get_nexthexint(&cmd, &state))
+            {
+                ATCIResponseNoToken(100,NULL,SET_DEFAULT_SIM_ALL);
+                return SYS_FAIL;
+            }
+            RLOGD("state value is %d", state);
+            if(state==1)
+            {
+                char* argv[2] = { 0 };
+                argv[0] = "SET_DEFAULT_SIM_ALL";
+                //sprintf(argv[1], "%d", state);
+                argv[1] = "1";
+                
+                int argc = 2;
+                android::lynqSendToRil(2,argv,1024);
+                RLOGD("%s g_switch_card_error %d %d", __FUNCTION__, g_switch_card_error, __LINE__);
+                if(!g_switch_card_error)
+                {
+                    ATCIResponseNoToken(0,NULL,-1);
+                }
+                else
+                {
+                    ATCIResponseNoToken(g_switch_card_error,NULL,-1);
+                }
+                
+            }
+            else if(state == 0)
+            {
+                char* argv[2] = { 0 };
+                argv[0] = "SET_DEFAULT_SIM_ALL";
+                //sprintf(argv[1], "%d", state);
+                argv[1] = "0";
+                
+                int argc = 2;
+                android::lynqSendToRil(2,argv,1024);
+                RLOGD("%s g_switch_card_error %d %d", __FUNCTION__, g_switch_card_error, __LINE__);
+                if(!g_switch_card_error)
+                {
+                    ATCIResponseNoToken(0,NULL,-1);
+                }
+                else
+                {
+                    ATCIResponseNoToken(g_switch_card_error,NULL,-1);
+                }
+            }
+            else
+            {
+                
+                ATCIResponseNoToken(100,NULL,SET_DEFAULT_SIM_ALL);
+                return SYS_FAIL;
+            }
+            break;
+        }
+        case AT_TEST_MODE:
+        {
+            memset(buf,0,sizeof(buf));
+            sprintf(buf,"%s","+LCSUS: (0,1)");
+            ATCIResponseNoToken(0,buf,SET_DEFAULT_SIM_ALL);
+            break;
+        }
+        case AT_READ_MODE:
+        {
+            
+            int id = get_default_sim_all();
+            memset(buf,0,sizeof(buf));
+            sprintf(buf,"+LCSUS: %d", id);
+            ATCIResponseNoToken(0,buf,SET_DEFAULT_SIM_ALL);
+            break;
+        }
+        default:
+        {
+            RLOGD("set mute error");
+            break;
+        }
+    }
+    return SYS_SUCC;
+}
+
+int atci_data_enable_pdp_hdlr(char *cmd, int op_mode, int target, char *response)
+{
+    int ret;
+    char buf[16];
+    switch (op_mode)
+    {
+        case AT_SET_MODE:
+        {
+            //paser parameter
+            //send to target handle
+            //ex: at+lapnact=int
+            RLOGD("input cmd[%s]", cmd);
+
+            if (SYS_FAIL == atci_at_to_equal(&cmd))
+            {
+                //input error
+                ATCIResponseNoToken(100,NULL,RIL_REQUEST_SETUP_DATA_CALL);
+                return SYS_FAIL;
+            }
+            RLOGD("[%d][%s] data is[%s]",LINE,FUNC,cmd);
+            int state;
+
+            if (SYS_FAIL == atci_at_get_nexthexint(&cmd, &state))
+            {
+                ATCIResponseNoToken(100,NULL,RIL_REQUEST_SETUP_DATA_CALL);
+                return SYS_FAIL;
+            }
+
+            RLOGD("state value is %d", state);
+
+            //wrire data to target
+            atci_data_req_t req;
+
+            if(state==1)
+            {
+                req.request_id = RIL_REQUEST_SETUP_DATA_CALL;
+            }
+            else if(state == 0)
+            {
+                req.request_id = RIL_REQUEST_DEACTIVATE_DATA_CALL;
+            }
+            else
+            {
+                ATCIResponseNoToken(100,NULL,RIL_REQUEST_SETUP_DATA_CALL);
+                return SYS_FAIL;
+            }
+            
+
+            char reqStr[RIL_REQUEST_STRING_LENGTH] = {0};
+            memcpy(reqStr, request2RILStr(req.request_id),strlen(request2RILStr(req.request_id)) + 1);
+            RLOGD("request is %s", reqStr);
+            char* argv[2] = { 0 };
+            argv[0] = reqStr;
+            int argc = 1;
+            sendAtciRequest(req.request_id, reqStr, argc, argv);
+            ATCIResponseNoToken(0,NULL,req.request_id);
+            break;
+        }
+        case AT_TEST_MODE:
+        {
+            memset(buf,0,sizeof(buf));
+            sprintf(buf,"%s","+LAPNACT: (0,1)");
+            ATCIResponseNoToken(0,buf,RIL_REQUEST_SETUP_DATA_CALL);
+            break;
+        }
+        default:
+        {
+            RLOGD("set mute error");
+            break;
+        }
+    }
+    return SYS_SUCC;
+}
+
+int atci_data_enable_pdp_with_apn_hdlr(char *cmd, int op_mode, int target,char *response)
+{
+    int ret;
+    int argc = 0;
+    char* argv[8] = { 0 };
+    char buf[512];
+    char authTypebuf[16] = {0};
+    int state = 0;
+    int authType = 0;
+    char *apn = NULL;
+    char *apnTpye = NULL;
+    char *user = NULL;
+    char *password =NULL;
+    char *apnprotocol = NULL;
+    char *apnRoamProtocol = NULL;
+    switch (op_mode)
+    {
+        case AT_SET_MODE:
+        {
+            //paser parameter
+            //send to target handle
+            //ex: at+lapnact=int
+            RLOGD("input cmd[%s]", cmd);
+
+            if (SYS_FAIL == atci_at_to_equal(&cmd))
+            {
+              //input error
+                ATCIResponseNoToken(100,NULL,RIL_REQUEST_SETUP_DATA_CALL);
+                return SYS_FAIL;
+            }
+            RLOGD("[%d][%s] data is[%s]",LINE,FUNC,cmd);
+
+            if (SYS_FAIL == atci_at_get_nexthexint(&cmd, &state))
+            {
+                ATCIResponseNoToken(100,NULL,RIL_REQUEST_SETUP_DATA_CALL);
+                return SYS_FAIL;
+            }
+            RLOGD("state value is %d", state);
+            if(state == 1)
+            {
+                if (SYS_FAIL == atci_at_get_next_key(&cmd, &apn))
+                {
+                    ATCIResponseNoToken(100,NULL,RIL_REQUEST_SETUP_DATA_CALL);
+                    return SYS_FAIL;
+                }
+                RLOGD("apn value is %s", apn);
+                if (SYS_FAIL == atci_at_get_next_key(&cmd, &apnTpye))
+                {
+                    ATCIResponseNoToken(100,NULL,RIL_REQUEST_SETUP_DATA_CALL);
+                    return SYS_FAIL;
+                }
+                RLOGD("apnTpye value is %s", apnTpye);
+                if (SYS_FAIL == atci_at_get_next_key(&cmd, &user))
+                {
+                    ATCIResponseNoToken(100,NULL,RIL_REQUEST_SETUP_DATA_CALL);
+                    return SYS_FAIL;
+                }
+                RLOGD("user value is %s", user);
+                if (SYS_FAIL == atci_at_get_next_key(&cmd, &password))
+                {
+                    ATCIResponseNoToken(100,NULL,RIL_REQUEST_SETUP_DATA_CALL);
+                    return SYS_FAIL;
+                }
+                RLOGD("pwd value is %s", password);
+                if (SYS_FAIL == atci_at_get_nexthexint(&cmd, &authType))
+                {
+                    ATCIResponseNoToken(100,NULL,RIL_REQUEST_SETUP_DATA_CALL);
+                    return SYS_FAIL;
+                }
+                RLOGD("authType value is %d", authType);
+                if (SYS_FAIL == atci_at_get_next_key(&cmd, &apnprotocol))
+                {
+                    ATCIResponseNoToken(100,NULL,RIL_REQUEST_SETUP_DATA_CALL);
+                    return SYS_FAIL;
+                }
+                RLOGD("apnprotocol value is %s", apnprotocol);
+                if (SYS_FAIL == atci_at_get_next_key(&cmd, &apnRoamProtocol))
+                {
+                    ATCIResponseNoToken(100,NULL,RIL_REQUEST_SETUP_DATA_CALL);
+                    return SYS_FAIL;
+                }
+                RLOGD("apnRoamProtocol value is %s", apnRoamProtocol);
+                argv[1] = apn;
+                argv[2] = apnTpye;
+                argv[3] = user;
+                argv[4] = password;
+                sprintf(authTypebuf,"%d",authType);
+                argv[5] = authTypebuf;
+                argv[6] = apnprotocol;
+                argv[7] = apnRoamProtocol;
+                argc = 8;
+            }
+            else if(state == 0)
+            {
+                if (SYS_FAIL == atci_at_get_next_key(&cmd, &apnTpye))
+                {
+                    ATCIResponseNoToken(100,NULL,RIL_REQUEST_SETUP_DATA_CALL);
+                    return SYS_FAIL;
+                }
+                RLOGD("apnTpye value is %s", apnTpye);
+                argv[1] = apnTpye;
+                argc = 2;
+            }
+            //wrire data to target
+            atci_data_req_t req;
+            if(state==1)
+            {
+                req.request_id = RIL_REQUEST_SETUP_DATA_CALL;
+            }
+            else if(state == 0)
+            {
+                req.request_id = RIL_REQUEST_DEACTIVATE_DATA_CALL;
+            }
+            else
+            {
+                ATCIResponseNoToken(100,NULL,RIL_REQUEST_SETUP_DATA_CALL);
+                return SYS_FAIL;
+            }
+            
+
+            char reqStr[RIL_REQUEST_STRING_LENGTH] = {0};
+            memcpy(reqStr, request2RILStr(req.request_id),strlen(request2RILStr(req.request_id)) + 1);
+            RLOGD("request is %s", reqStr);
+            argv[0] = reqStr;
+            sendAtciRequest(req.request_id, reqStr, argc, argv);
+            ATCIResponseNoToken(0,NULL,req.request_id);
+            break;
+        }
+        case AT_TEST_MODE:
+        {
+            memset(buf,0,sizeof(buf));
+            sprintf(buf,"%s","+ELAPNACT: (0,1),"","","","",(0-3),(\"null\",\"IPV4\",\"IPV6\",\"IPV4V6\"),(\"null\",\"IPV4\",\"IPV6\",\"IPV4V6\")");
+            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,"+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");
+                    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");
+            break;
+        }
+    }
+    return SYS_SUCC;
+}
+
+static int insert_apn_char(char *agc, char *id,char *mcc, char *mnc, char *apn, char *apntype, char *user, char *password, char *normalprotocol, char *roamingprotocol, char *carrier)
+{
+    char strtmp[10][64];
+    if (!strcmp(id,"null"))
+    {
+        sprintf(strtmp[0], "id=;");
+    }
+    else
+    {
+        sprintf(strtmp[0], "id=%s;", id);
+    }
+    if (!strcmp(mcc,"null"))
+    {
+        char mcc[8] = {0};
+        if(strlen(mccmnc))
+        {
+            strncpy(mcc, mccmnc, 3);
+            sprintf(strtmp[1], "mcc=%s;", mcc);
+        }
+        else
+        {
+            sprintf(strtmp[2], "mcc=;");
+        }
+    }
+    else
+    {
+        sprintf(strtmp[1], "mcc=%s;", mcc);
+    }
+    if (!strcmp(mnc,"null"))
+    {
+        if(strlen(mccmnc))
+        {
+            sprintf(strtmp[2], "mnc=%s;", mccmnc+3);
+        }
+        else
+        {
+            sprintf(strtmp[2], "mnc=;");
+        }
+    }
+    else
+    {
+        sprintf(strtmp[2], "mnc=%s;", mnc);
+    }
+    if (!strcmp(apn,"null"))
+    {
+        sprintf(strtmp[3], "apn=;");
+    }
+    else
+    {
+        sprintf(strtmp[3], "apn=%s;", apn);
+    }
+    if (!strcmp(apntype,"null"))
+    {
+        sprintf(strtmp[4], "apntype=;");
+    }
+    else
+    {
+        sprintf(strtmp[4], "type=%s;", apntype);
+    }
+    if (!strcmp(user,"null"))
+    {
+        sprintf(strtmp[5], "user=;");
+    }
+    else
+    {
+        sprintf(strtmp[5], "user=%s;", user);
+    }
+    if (!strcmp(password,"null"))
+    {
+        sprintf(strtmp[6], "password=;");
+    }
+    else
+    {
+        sprintf(strtmp[6], "password=%s;", password);
+    }
+    if (!strcmp(normalprotocol,"null"))
+    {
+        sprintf(strtmp[7], "protocol=;");
+    }
+    else
+    {
+        sprintf(strtmp[7], "normalprotocol=%s;", normalprotocol);
+    }
+    if (!strcmp(roamingprotocol,"null"))
+    {
+        sprintf(strtmp[8], "roamingprotocol=;");
+    }
+    else
+    {
+        sprintf(strtmp[8], "roamingprotocol=%s;", roamingprotocol);
+    }
+    if (!strcmp(carrier,"null"))
+    {
+        sprintf(strtmp[9], "carrier=;");
+    }
+    else
+    {
+        sprintf(strtmp[9], "carrier=%s;", carrier);
+    }
+    sprintf(agc, "%s%s%s%s%s%s%s%s%s%s",strtmp[0], strtmp[1], strtmp[2], strtmp[3], strtmp[4], strtmp[5], strtmp[6], strtmp[7], strtmp[8], strtmp[9]);
+    return 0;
+}
+
+int atci_data_modify_apn_hdlr(char *cmd, int op_mode, int target, char *response)
+{
+    char *id  = NULL;
+    char *mcc = NULL;
+    char *mnc = NULL;
+    char *apn = NULL;
+    char *apntype = NULL;
+    char *user = NULL;
+    char *password = NULL;
+    char *normalprotocol = NULL;
+    char *roamingprotocol = NULL;
+    char *carrier = NULL;
+    int state = -1;
+    char apn_info[512];
+    char* argv[3] = { 0 };
+    int argc = 0;
+    g_flag_apn = 1;
+    switch (op_mode)
+    {
+        case AT_SET_MODE:
+        {
+            RLOGD("input cmd[%s]", cmd);
+            if (SYS_FAIL == atci_at_to_equal(&cmd))
+            {
+                //input error
+                ATCIResponseNoToken(100,NULL,RIL_REQUEST_MODIFY_APN);
+                return SYS_FAIL;
+            }
+            RLOGD("[%d][%s] data is[%s]",LINE,FUNC,cmd);
+            if (SYS_FAIL == atci_at_get_nexthexint(&cmd, &state))
+            {
+                ATCIResponseNoToken(100,NULL,RIL_REQUEST_MODIFY_APN);
+                return SYS_FAIL;
+            }
+            RLOGD("state value is %d", state);
+            if (SYS_FAIL == atci_at_get_next_key(&cmd, &id))
+            {
+                ATCIResponseNoToken(100,NULL,RIL_REQUEST_MODIFY_APN);
+                return SYS_FAIL;
+            }
+            if(state == 0)
+            {
+                if (SYS_FAIL == atci_at_get_next_key(&cmd, &mcc))
+                {
+                    ATCIResponseNoToken(100,NULL,RIL_REQUEST_MODIFY_APN);
+                    return SYS_FAIL;
+                }
+                if (SYS_FAIL == atci_at_get_next_key(&cmd, &mnc))
+                {
+                    ATCIResponseNoToken(100,NULL,RIL_REQUEST_MODIFY_APN);
+                    return SYS_FAIL;
+                }
+                if (SYS_FAIL == atci_at_get_next_key(&cmd, &apn))
+                {
+                    ATCIResponseNoToken(100,NULL,RIL_REQUEST_MODIFY_APN);
+                    return SYS_FAIL;
+                }
+                if (SYS_FAIL == atci_at_get_next_key(&cmd, &apntype))
+                {
+                    ATCIResponseNoToken(100,NULL,RIL_REQUEST_MODIFY_APN);
+                    return SYS_FAIL;
+                }
+                if (SYS_FAIL == atci_at_get_next_key(&cmd, &user))
+                {
+                    ATCIResponseNoToken(100,NULL,RIL_REQUEST_MODIFY_APN);
+                    return SYS_FAIL;
+                }
+                if (SYS_FAIL == atci_at_get_next_key(&cmd, &password))
+                {
+                    ATCIResponseNoToken(100,NULL,RIL_REQUEST_MODIFY_APN);
+                    return SYS_FAIL;
+                }
+                if (SYS_FAIL == atci_at_get_next_key(&cmd, &normalprotocol))
+                {
+                    ATCIResponseNoToken(100,NULL,RIL_REQUEST_MODIFY_APN);
+                    return SYS_FAIL;
+                }
+                if (SYS_FAIL == atci_at_get_next_key(&cmd, &roamingprotocol))
+                {
+                    ATCIResponseNoToken(100,NULL,RIL_REQUEST_MODIFY_APN);
+                    return SYS_FAIL;
+                }
+                if (SYS_FAIL == atci_at_get_next_key(&cmd, &carrier))
+                {
+                    ATCIResponseNoToken(100,NULL,RIL_REQUEST_MODIFY_APN);
+                    return SYS_FAIL;
+                }
+                /*get mccmnc*/
+                lynq_req_mccmnc(666);
+                lynq_wait_result_comeback(100);//wait 100ms
+                /*get mccmnc*/
+                insert_apn_char(apn_info, id, mcc, mnc, apn, apntype, user, password, normalprotocol, roamingprotocol, carrier);
+                argv[1] = "0";
+                argv[2] = apn_info;
+                RLOGD("apn_info %s\n", apn_info);
+                atci_data_req_t req;
+                req.request_id = RIL_REQUEST_MODIFY_APN;
+                char reqStr[RIL_REQUEST_STRING_LENGTH] = {0};
+                memcpy(reqStr, request2RILStr(req.request_id),strlen(request2RILStr(req.request_id)) + 1);
+                RLOGD("request is %s", reqStr);
+                argv[0] = reqStr;
+                argc = 3;
+                sendAtciRequest(req.request_id, reqStr, argc, argv);
+            }
+            else if (state == 1)
+            {
+                sprintf(apn_info, "id=%s", id);
+                argv[1] = "1";
+                argv[2] = apn_info;
+                atci_data_req_t req;
+                req.request_id = RIL_REQUEST_MODIFY_APN;
+                char reqStr[RIL_REQUEST_STRING_LENGTH] = {0};
+                memcpy(reqStr, request2RILStr(req.request_id),strlen(request2RILStr(req.request_id)) + 1);
+                RLOGD("request is %s", reqStr);
+                argv[0] = reqStr;
+                argc = 3;
+                sendAtciRequest(req.request_id, reqStr, argc, argv);
+            }
+            else if (state == 2)
+            {
+                sprintf(apn_info, "id=%s", id);
+                argv[1] = "2";
+                argv[2] = apn_info;
+                atci_data_req_t req;
+                req.request_id = RIL_REQUEST_MODIFY_APN;
+                char reqStr[RIL_REQUEST_STRING_LENGTH] = {0};
+                memcpy(reqStr, request2RILStr(req.request_id),strlen(request2RILStr(req.request_id)) + 1);
+                RLOGD("request is %s", reqStr);
+                argv[0] = reqStr;
+                argc = 3;
+                sendAtciRequest(req.request_id, reqStr, argc, argv);
+            }
+            else if (state == 3)
+            {
+                if (SYS_FAIL == atci_at_get_next_key(&cmd, &mcc))
+                {
+                    ATCIResponseNoToken(100,NULL,RIL_REQUEST_MODIFY_APN);
+                    return SYS_FAIL;
+                }
+                if (SYS_FAIL == atci_at_get_next_key(&cmd, &mnc))
+                {
+                    ATCIResponseNoToken(100,NULL,RIL_REQUEST_MODIFY_APN);
+                    return SYS_FAIL;
+                }
+                if (SYS_FAIL == atci_at_get_next_key(&cmd, &apn))
+                {
+                    ATCIResponseNoToken(100,NULL,RIL_REQUEST_MODIFY_APN);
+                    return SYS_FAIL;
+                }
+                if (SYS_FAIL == atci_at_get_next_key(&cmd, &apntype))
+                {
+                    ATCIResponseNoToken(100,NULL,RIL_REQUEST_MODIFY_APN);
+                    return SYS_FAIL;
+                }
+                if (SYS_FAIL == atci_at_get_next_key(&cmd, &user))
+                {
+                    ATCIResponseNoToken(100,NULL,RIL_REQUEST_MODIFY_APN);
+                    return SYS_FAIL;
+                }
+                if (SYS_FAIL == atci_at_get_next_key(&cmd, &password))
+                {
+                    ATCIResponseNoToken(100,NULL,RIL_REQUEST_MODIFY_APN);
+                    return SYS_FAIL;
+                }
+                if (SYS_FAIL == atci_at_get_next_key(&cmd, &normalprotocol))
+                {
+                    ATCIResponseNoToken(100,NULL,RIL_REQUEST_MODIFY_APN);
+                    return SYS_FAIL;
+                }
+                if (SYS_FAIL == atci_at_get_next_key(&cmd, &roamingprotocol))
+                {
+                    ATCIResponseNoToken(100,NULL,RIL_REQUEST_MODIFY_APN);
+                    return SYS_FAIL;
+                }
+                if (SYS_FAIL == atci_at_get_next_key(&cmd, &carrier))
+                {
+                    ATCIResponseNoToken(100,NULL,RIL_REQUEST_MODIFY_APN);
+                    return SYS_FAIL;
+                }
+                insert_apn_char(apn_info, id, mcc, mnc, apn, apntype, user, password, normalprotocol, roamingprotocol, carrier);
+                argv[1] = "3";
+                argv[2] = apn_info;
+                atci_data_req_t req;
+                req.request_id = RIL_REQUEST_MODIFY_APN;
+                char reqStr[RIL_REQUEST_STRING_LENGTH] = {0};
+                memcpy(reqStr, request2RILStr(req.request_id),strlen(request2RILStr(req.request_id)) + 1);
+                RLOGD("request is %s", reqStr);
+                argv[0] = reqStr;
+                argc = 3;
+                sendAtciRequest(req.request_id, reqStr, argc, argv);
+            }
+            else
+            {
+                RLOGD("function %s line %d unknow command", __FUNCTION__, __LINE__);
+            }
+            break;
+        }
+        default:
+        {
+            break;
+        }
+       
+    }
+    return SYS_SUCC;
+}
+
+
diff --git a/src/lynq/framework/lynq-ril-service/src/atci/atci_lynq_data_cmd.h b/src/lynq/framework/lynq-ril-service/src/atci/atci_lynq_data_cmd.h
new file mode 100755
index 0000000..09a030f
--- /dev/null
+++ b/src/lynq/framework/lynq-ril-service/src/atci/atci_lynq_data_cmd.h
@@ -0,0 +1,22 @@
+/**********************************************************************************************
+* @file atci_lynq_data_cmd.h
+* @brief.define lynq data at commands function
+* @details None
+* @author   Hong Liu。
+* @date     2022-12-07
+* @version  V1.0
+* @copyright   Copyright (c) MobileTek 
+***********************************************************************************************/
+
+#ifndef __ATCI_LYNQ_DATA_CMD_H__
+#define __ATCI_LYNQ_DATA__CMD_H__
+
+extern int g_flag_apn;
+
+int atci_lynq_data_init(void *arg);
+int atci_data_enable_pdp_hdlr(char *cmd, int op_type, int target, char *response);
+int atci_data_enable_pdp_with_apn_hdlr(char *cmd, int op_mode, int target, char *response);
+int atci_data_modify_apn_hdlr(char *cmd, int op_mode, int target, char *response);
+int atci_switch_card_halr(char *cmd, int op_mode, int target, char *response);
+#endif
+
diff --git a/src/lynq/framework/lynq-ril-service/src/atci/atci_lynq_generic_cmd.cpp b/src/lynq/framework/lynq-ril-service/src/atci/atci_lynq_generic_cmd.cpp
new file mode 100755
index 0000000..f94947c
--- /dev/null
+++ b/src/lynq/framework/lynq-ril-service/src/atci/atci_lynq_generic_cmd.cpp
@@ -0,0 +1,26 @@
+#include <vendor-ril/telephony/ril.h>
+#include <string.h>
+#include <log/log.h>
+
+#include "ATCI.h"
+#include "atci_util.h"
+#include "atci_at_util.h"
+#include "atci_lynq_generic_cmd.h"
+#include "atci_common.h"
+
+#undef LOG_TAG
+#define LOG_TAG "DEMO_ATCI_GENERIC"
+/*
+atci_cmd_type_t atci_generic_cmd_table[] = {
+//cmd_name      target_type        handler
+    { "AT+LCSUS", TARGET_TELEPHONY, atci_data_enable_pdp_hdlr },              //AT command to dsds
+    { "AT+SCREEN", TARGET_TELEPHONY, atci_data_enable_pdp_with_apn_hdlr },    //AT command to off/on modem screen
+    { "ATD", TARGET_TELEPHONY, atci_data_modify_apn_hdlr },
+    { NULL, TARGET_UNKNOWN, NULL }
+};
+int atci_lynq_generic_init(void *arg) {
+  int ret;
+  ret = atci_cmd_register(atci_generic_cmd_table);
+  return ret;
+}
+*/
diff --git a/src/lynq/framework/lynq-ril-service/src/atci/atci_lynq_generic_cmd.h b/src/lynq/framework/lynq-ril-service/src/atci/atci_lynq_generic_cmd.h
new file mode 100755
index 0000000..33882cd
--- /dev/null
+++ b/src/lynq/framework/lynq-ril-service/src/atci/atci_lynq_generic_cmd.h
@@ -0,0 +1 @@
+int atci_lynq_generic_init(void *arg);
diff --git a/src/lynq/framework/lynq-ril-service/src/atci/atci_util.cpp b/src/lynq/framework/lynq-ril-service/src/atci/atci_util.cpp
index 656a251..0cc6d9a 100755
--- a/src/lynq/framework/lynq-ril-service/src/atci/atci_util.cpp
+++ b/src/lynq/framework/lynq-ril-service/src/atci/atci_util.cpp
@@ -76,6 +76,14 @@
     return "RIL_REQUEST_DIAL_WITH_SIP_URI";
   case RIL_REQUEST_SET_IMS_ENABLE:
     return "RIL_REQUEST_SET_IMS_ENABLE";
+  case RIL_REQUEST_DEACTIVATE_DATA_CALL:
+    return "RIL_REQUEST_DEACTIVATE_DATA_CALL";
+  case RIL_REQUEST_SETUP_DATA_CALL:
+    return "RIL_REQUEST_SETUP_DATA_CALL";
+  case RIL_REQUEST_MODIFY_APN:
+    return "RIL_REQUEST_MODIFY_APN";
+  case RIL_REQUEST_OPERATOR:
+    return "RIL_REQUEST_OPERATOR";
   default:
     return "unknown define";
   }
diff --git a/src/lynq/framework/lynq-ril-service/src/cc.cpp b/src/lynq/framework/lynq-ril-service/src/cc.cpp
index 2302212..8afb2d3 100755
--- a/src/lynq/framework/lynq-ril-service/src/cc.cpp
+++ b/src/lynq/framework/lynq-ril-service/src/cc.cpp
@@ -47,6 +47,9 @@
 /*Warren add for t800 ril servie 2021/12/23 start*/
 #include "lynq_interface.h"
 #include <binder/Parcel.h>
+#ifdef LED_SUPPORT
+#include "led.h"
+#endif
 using android::Parcel;
 /*Warren add for t800 ril servie 2021/12/23 end*/
 
diff --git a/src/lynq/framework/lynq-ril-service/src/common.cpp b/src/lynq/framework/lynq-ril-service/src/common.cpp
index bf45112..59d853d 100755
--- a/src/lynq/framework/lynq-ril-service/src/common.cpp
+++ b/src/lynq/framework/lynq-ril-service/src/common.cpp
@@ -39,7 +39,10 @@
 #include "cc.h"
 #include "include/lynq_systime.h"
 #include <include/lynq_uci.h>
-
+#ifdef LED_SUPPORT
+#include "led.h"
+#endif
+#include "lynq_shm.h"
 static pthread_mutex_t s_DataMutex = PTHREAD_MUTEX_INITIALIZER;
 static pthread_cond_t s_DataCond = PTHREAD_COND_INITIALIZER;
 
@@ -83,6 +86,10 @@
 
 static std::int32_t token = 0;
 static std::mutex g_mutex;
+
+pthread_mutex_t s_state_change_mutex = PTHREAD_MUTEX_INITIALIZER;
+pthread_cond_t s_state_change_cond = PTHREAD_COND_INITIALIZER;
+
 /*Warren add for SZZT 2021/11/14 start*
 ** record data registration
 */
@@ -355,6 +362,32 @@
     default_sim_voice = slot_id;
 }
 
+void lynq_send_result_already(void)
+{
+    RLOGD("send_imei_state_change");
+    pthread_mutex_lock(&s_state_change_mutex);
+    pthread_cond_signal(&s_state_change_cond);
+    pthread_mutex_unlock(&s_state_change_mutex);
+}
+
+void lynq_wait_result_comeback(int mtime)
+{
+    RLOGD("wait_call_state");
+    int sec = 0;
+    int usec = 0;
+    struct timeval now;
+    struct timespec timeout;
+    gettimeofday(&now,NULL);
+    sec = mtime/1000;
+    usec = mtime%1000;
+    timeout.tv_sec = now.tv_sec+sec;
+    timeout.tv_nsec = now.tv_usec*1000+usec*1000000;
+    pthread_mutex_lock(&s_state_change_mutex);
+    pthread_cond_timedwait(&s_state_change_cond,&s_state_change_mutex,&timeout);
+    pthread_mutex_unlock(&s_state_change_mutex);
+    RLOGD("wait_call_state end");
+}
+
 int get_default_sim_voice(){
     return default_sim_voice;
 }
@@ -531,6 +564,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)
@@ -557,6 +593,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) {
@@ -895,7 +934,7 @@
         return ;
 
     stime(&t);
-
+    system("hwclock -w -f /dev/rtc0");
     return;
 }
 void notifyDataSignal() {
@@ -970,6 +1009,40 @@
         return -1;
     }
 }
+
+void lynq_exit()
+{
+    ril_deinit_mem();
+    mbtk_netled_deinit();
+}
+
+#ifdef LED_SUPPORT
+bool ril_get_if_insert_simcard()
+{
+    int slot_id=get_default_sim_voice();
+
+    if(slot_id==0 || slot_id ==1)
+    {
+        if(cur_CardS_Status[slot_id]!=NULL)
+        {
+            return  cur_CardS_Status[slot_id]->card_state == RIL_CARDSTATE_PRESENT;
+        }
+        
+    }
+    return false;	
+}
+
+bool ril_get_if_3gpp_reg_success()
+{
+    int slot_id=get_default_sim_voice();
+
+    if(slot_id==0 || slot_id ==1)
+    {
+        return reg_voice_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/src/lynq/framework/lynq-ril-service/src/common.h b/src/lynq/framework/lynq-ril-service/src/common.h
index aa9d89c..58aef69 100755
--- a/src/lynq/framework/lynq-ril-service/src/common.h
+++ b/src/lynq/framework/lynq-ril-service/src/common.h
@@ -171,6 +171,9 @@
  */
 void lynq_output_info(const char* format,...);
 
+void lynq_send_result_already(void);
+void lynq_wait_result_comeback(int mtime);
+
 void updateCardStatusV6(RIL_CardStatus_v6 *card_status,int slot);
 char* getAid(int slot);
 
@@ -200,6 +203,15 @@
 const char *radioStateToString(RIL_RadioState);
 const char * rilSocketIdToString(RIL_SOCKET_ID socket_id);
 
+#ifdef LED_SUPPORT
+/*for led add by hq 20221202*/
+bool ril_get_if_insert_simcard();
+bool ril_get_if_3gpp_reg_success();
+#endif
+
+/*for urc broad cast optimission by hq 20221216*/
+void lynq_exit();
+
 #if EM_MODE_SUPPORT
 typedef void (* netwokInfoNotify)(int type, char *data);
 typedef void (*atCmdResponse)(char *response,int responselen);
@@ -270,7 +282,7 @@
     int lynqAssemblyParcelheader(Parcel &p,int slot,int utoken,int request,int respType,int error);
     int LYNQ_RIL_respSocket(Parcel &p,RIL_Token t);
     int LYNQ_RIL_respSocket_sp(Parcel &p,RequestInfo *pRI);
-    int LYNQ_RIL_urcBroadcast(Parcel &p);
+    int LYNQ_RIL_urcBroadcast(Parcel &p,int urc_id=0);
 /*Warren add for t800 ril service 2021/12/23 end*/
 
 
diff --git a/src/lynq/framework/lynq-ril-service/src/data/data.cpp b/src/lynq/framework/lynq-ril-service/src/data/data.cpp
index 9a06968..8d81825 100755
--- a/src/lynq/framework/lynq-ril-service/src/data/data.cpp
+++ b/src/lynq/framework/lynq-ril-service/src/data/data.cpp
@@ -805,7 +805,7 @@
                 writeStringToParcel(urc_p, apn_table[i].apn);
                 writeStringToParcel(urc_p, apn_table[i].apntype);
                 writeStringToParcel(urc_p, apn_table[i].ifaceName);
-                android::LYNQ_RIL_urcBroadcast(urc_p);
+                android::LYNQ_RIL_urcBroadcast(urc_p,LYNQ_URC_DATA_CALL_STATUS_IND);
                 RLOGD("apn:%s,apntype:%s",apn_table[i].apn,apn_table[i].apntype);
                 return -1;
             }
@@ -843,7 +843,7 @@
             writeStringToParcel(urc_p, apn_table[i].apn);
             writeStringToParcel(urc_p, apn_table[i].apntype);
             writeStringToParcel(urc_p, apn_table[i].ifaceName);
-            android::LYNQ_RIL_urcBroadcast(urc_p);
+            android::LYNQ_RIL_urcBroadcast(urc_p,LYNQ_URC_DATA_CALL_STATUS_IND);
             RLOGD("apn:%s,apntype:%s",apn_table[i].apn,apn_table[i].apntype);
             return -1;
         }
diff --git a/src/lynq/framework/lynq-ril-service/src/data/data_gdbus.cpp b/src/lynq/framework/lynq-ril-service/src/data/data_gdbus.cpp
index 03b43dd..10f9c84 100755
--- a/src/lynq/framework/lynq-ril-service/src/data/data_gdbus.cpp
+++ b/src/lynq/framework/lynq-ril-service/src/data/data_gdbus.cpp
@@ -48,6 +48,11 @@
 #include "lynq_common.h"
 #include "lynq_interface.h"
 #include <binder/Parcel.h>
+#include "ATCI.h"
+#include "atci_lynq_data_cmd.h"
+#ifdef LED_SUPPORT
+#include "led.h"
+#endif
 using android::Parcel;
 
 /*Warren add for t800 ril service 2021/12/25 end*/
@@ -78,7 +83,7 @@
     p.writeInt32(lynq_request_id);
     p.writeInt32(0);
     writeStringToParcel(p,reason);
-    android::LYNQ_RIL_urcBroadcast(p);
+    android::LYNQ_RIL_urcBroadcast(p,lynq_request_id);
     return 0;
 }
 
@@ -86,18 +91,7 @@
 
 /*Warren add for t103 szzt atsvc 2022/1/5 start*/
 /*lei modify on 2022/11/16*/
-int lynqUpdateApnStatus(char *apn,char *apntype,int pdnState,char *ifname, char *addresses)//jb.qi add for IP address on20221025
-{
-    if(pdnState==PDN_CONNECTED)
-    {
-        lynq_output_info("+LAPNST:%s,%s,%d,%s,%s\n",apn,apntype,pdnState,ifname,addresses);
-    }
-    else
-    {
-        lynq_output_info("+LAPNST:%s,%s,%d\n",apn,apntype,pdnState);
-    }
-    return 0;
-}
+
 /*lei modify on 2022/11/16*/
 /*Warren add for t103 szzt atsvc 2022/1/5 end*/
 
@@ -121,7 +115,7 @@
             for(int i = 0;i < LYNQ_APN_CHANNEL_MAX;i++)
             {
                 #if DEBUG
-                lynq_output_info("line %d [PDN_DISCONNECTED]apn_table[%d],apntype:%s,apnstatus:%d,,,urc_response->apnName:%s\n",__LINE__, i,apn_table[i].apntype,apn_table[i].apnstatus,urc_response->apnType);
+                printf("line %d [PDN_DISCONNECTED]apn_table[%d],apntype:%s,apnstatus:%d,,,urc_response->apnName:%s\n",__LINE__, i,apn_table[i].apntype,apn_table[i].apnstatus,urc_response->apnType);
                 #endif
                 RLOGD("[PDN_DISCONNECTED]apn_table[%d],apntype:%s,apnstatus:%d,,,urc_response->apnName:%s\n",i,apn_table[i].apntype,apn_table[i].apnstatus,urc_response->apnType);
                 if((strcmp(apn_table[i].apntype,urc_response->apnType)==0)&&(apn_table[i].apnstatus==0))
@@ -132,14 +126,19 @@
                     apn_table[i].netId = 0;
                     apn_table[i].pdpstate = PDN_DISCONNECTED;
                     apn_count--;
-                    lynq_output_info("\nOK\n");
                     p.writeInt32 (1);
                     p.writeInt32 (LYNQ_URC_DATA_CALL_STATUS_IND);
                     p.writeInt32 (0);//temporary plan
                     p.writeInt32(PDN_DISCONNECTED);
                     writeStringToParcel(p,urc_response->apnType);
-                    android::LYNQ_RIL_urcBroadcast(p);
+                    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;
                 }
             }
@@ -164,14 +163,13 @@
                 memcpy(apn_table[apn_count].address,urc_response->addresses,strlen(urc_response->addresses)+1);
                 apn_table[apn_count].pdpstate = urc_response->pdnState;
                 #if DEBUG
-                lynq_output_info("line %d apn_table[%d].apn:%s,apntype:%s,,,urc_response->apnName:%s,urc_response->apntype:%s\n",__LINE__,apn_count,apn_table[apn_count].apn,apn_table[apn_count].apntype,urc_response->apnName,urc_response->apnType);
+                printf("line %d apn_table[%d].apn:%s,apntype:%s,,,urc_response->apnName:%s,urc_response->apntype:%s\n",__LINE__,apn_count,apn_table[apn_count].apn,apn_table[apn_count].apntype,urc_response->apnName,urc_response->apnType);
                 #endif
                 RLOGD("apn_table[%d].apn:%s,apntype:%s,,,urc_response->apnName:%s,urc_response->apntype:%s\n",apn_count,apn_table[apn_count].apn,apn_table[apn_count].apntype,urc_response->apnName,urc_response->apnType);
                 apn_table[apn_count].apnstatus=1;
                 apn_table[apn_count].used=1;
                 apn_table[apn_count].netId=urc_response->netId;
                 apn_count++;
-                lynqUpdateApnStatus(urc_response->apnName,urc_response->apnType,urc_response->pdnState,urc_response->ifname,urc_response->addresses);//jb.qi add for IP address on20221025
                 p.writeInt32(1);
                 p.writeInt32(LYNQ_URC_DATA_CALL_STATUS_IND);
                 p.writeInt32(0);//temporary plan
@@ -179,33 +177,35 @@
                 writeStringToParcel(p,urc_response->apnName);
                 writeStringToParcel(p,urc_response->apnType);
                 writeStringToParcel(p,urc_response->ifname);
-                android::LYNQ_RIL_urcBroadcast(p);
+                android::LYNQ_RIL_urcBroadcast(p,LYNQ_URC_DATA_CALL_STATUS_IND);
+#ifdef LED_SUPPORT
+                mbtk_netled_state_update(GPIO_NETLED_PPP_CONNECT); 
+#endif
             }
             else
             {
                 for(int i = 0;i < LYNQ_APN_CHANNEL_MAX;i++)//means apn state changed,need update
                 {
                     #if DEBUG
-                    lynq_output_info("line %d for apn_table[%d].apn:%s,,,,urc_response->apnName:%s\n",__LINE__,i,apn_table[i].apn,urc_response->apnName);
+                    printf("line %d for apn_table[%d].apn:%s,,,,urc_response->apnName:%s\n",__LINE__,i,apn_table[i].apn,urc_response->apnName);
                     #endif
                     RLOGD("for apn_table[%d].apn:%s,,,,urc_response->apnName:%s\n",i,apn_table[i].apn,urc_response->apnName);
                     if(strcmp(apn_table[i].apn,urc_response->apnName)==0)
                     {
                         #if DEBUG
-                        lynq_output_info("line %d This apn has been created update???!!!\n",__LINE__);
+                        printf("line %d This apn has been created update???!!!\n",__LINE__);
                         #endif
                         RLOGD("This apn has been created!!!");
                         apnHasCreated = TRUE;
                         if(apn_table[i].netId!=urc_response->netId)
                         {
                             #if DEBUG
-                            lynq_output_info("update???\n");
+                            printf("update???\n");
                             #endif
                             apn_table[i].netId = urc_response->netId;
                             apn_table[i].pdpstate = urc_response->pdnState;
                             memcpy(apn_table[i].ifaceName,urc_response->ifname,strlen(urc_response->ifname)+1);
                             memcpy(apn_table[i].address,urc_response->addresses,strlen(urc_response->addresses)+1);
-                            lynqUpdateApnStatus(urc_response->apnName,urc_response->apnType,urc_response->pdnState,urc_response->ifname,urc_response->addresses);//jb.qi add for IP address on20221025
                             memcpy(iface_t,apn_table[i].ifaceName,strlen(apn_table[i].ifaceName)+1);
                             memcpy(apnType_t,apn_table[i].apntype,strlen(apn_table[i].apntype)+1);
                             memcpy(apn_t,apn_table[i].apn,strlen(apn_table[i].apn)+1);
@@ -219,7 +219,7 @@
                             writeStringToParcel(p,apn_t);
                             writeStringToParcel(p,apnType_t);
                             writeStringToParcel(p,iface_t);
-                            android::LYNQ_RIL_urcBroadcast(p);
+                            android::LYNQ_RIL_urcBroadcast(p,LYNQ_URC_DATA_CALL_STATUS_IND);
                         }
                         break;
                     }
@@ -239,7 +239,7 @@
                     if(getLable)
                     {
                         #if DEBUG
-                        lynq_output_info("line %d Multiple APNs are established\n", __LINE__);
+                        printf("line %d Multiple APNs are established\n", __LINE__);
                         #endif
                         RLOGD("[getLable]:label==%d\n",lable);
                         memcpy(apn_table[lable].apn,urc_response->apnName,strlen(urc_response->apnName)+1);
@@ -252,7 +252,6 @@
                         apn_table[lable].used=1;
                         apn_table[lable].netId=urc_response->netId;
                         apn_count++;
-                        lynqUpdateApnStatus(urc_response->apnName,urc_response->apnType,urc_response->pdnState,urc_response->ifname,urc_response->addresses);//jb.qi add for IP address on20221025
                         p.writeInt32(1);
                         p.writeInt32(LYNQ_URC_DATA_CALL_STATUS_IND);
                         p.writeInt32(0);//temporary plan
@@ -260,7 +259,7 @@
                         writeStringToParcel(p,urc_response->apnName);
                         writeStringToParcel(p,urc_response->apnType);
                         writeStringToParcel(p,urc_response->ifname);
-                        android::LYNQ_RIL_urcBroadcast(p);
+                        android::LYNQ_RIL_urcBroadcast(p,LYNQ_URC_DATA_CALL_STATUS_IND);
                     }
                     else
                     {
@@ -280,7 +279,7 @@
             for(i;i < LYNQ_APN_CHANNEL_MAX;i++)
             {
                 #if DEBUG
-                lynq_output_info("line %d don't know\n", __LINE__);
+                printf("line %d don't know\n", __LINE__);
                 #endif
                 RLOGD("[cid<0]apn_table[%d].apntype:%s,,,,urc_response->apntype:%s\n",i,apn_table[i].apntype,urc_response->apnType);
                 if(strcmp(apn_table[i].apntype,urc_response->apnType)==0)
@@ -293,7 +292,7 @@
             if(apnHasCreated)
             {
                 #if DEBUG
-                lynq_output_info("line %d don't know\n", __LINE__);
+                printf("line %d don't know\n", __LINE__);
                 #endif
                 apn_table[i].pdpstate = urc_response->pdnState;
                 char ptr[1] = "";
@@ -305,7 +304,6 @@
                 {
                     memcpy(apn_table[i].address, ptr, strlen(ptr)+1);
                 }
-                lynqUpdateApnStatus(apn_table[i].apn,apn_table[i].apntype,urc_response->pdnState,NULL,NULL);//jb.qi add for IP address on20221025
                 memcpy(iface_t,apn_table[i].ifaceName,strlen(apn_table[i].ifaceName)+1);
                 memcpy(apnType_t,apn_table[i].apntype,strlen(apn_table[i].apntype)+1);
                 memcpy(apn_t,apn_table[i].apn,strlen(apn_table[i].apn)+1);
@@ -316,7 +314,7 @@
                 writeStringToParcel(p,apn_t);
                 writeStringToParcel(p,apnType_t);
                 writeStringToParcel(p,iface_t);
-                android::LYNQ_RIL_urcBroadcast(p);
+                android::LYNQ_RIL_urcBroadcast(p,LYNQ_URC_DATA_CALL_STATUS_IND);
             }
         }
     }
@@ -438,9 +436,14 @@
     RLOGD("modifyApnDB_method_cb reason %s", ((reason == NULL)? "":reason));
     printf("modify apn db success, return message: %s\n", ((reason == NULL)? "":reason));
     //printf("modifyApnDB_method_cb reason %s\n", ((reason == NULL)? "":reason));
-    /*lei add for at+lmdapn*/
-    lynq_output_info("+LEAPNMOD:%s\n", ((reason == NULL)? "":reason));
-    /*lei add for at+lmdapn*/
+    /*lei add for AT+LEAPNMOD*/
+    if(g_flag_apn)
+    {
+        char apn_buf[256];
+        sprintf(apn_buf, "+LEAPNMOD:%s", ((reason == NULL)? "":reason));
+        ATCIResponseNoToken(0, apn_buf, 666);//tmp plan
+    }
+    /*lei add for AT+LEAPNMOD*/
     g_variant_unref(result);
     lynq_data_modify_apn(reason,LYNQ_URC_MODIFY_APNDB);
 }
diff --git a/src/lynq/framework/lynq-ril-service/src/ecall/eCall.cpp b/src/lynq/framework/lynq-ril-service/src/ecall/eCall.cpp
index 7c2b400..5d1ea71 100755
--- a/src/lynq/framework/lynq-ril-service/src/ecall/eCall.cpp
+++ b/src/lynq/framework/lynq-ril-service/src/ecall/eCall.cpp
@@ -864,7 +864,7 @@
      free(pRI);
      return 0;
   }
-  else if(enable <=-100){
+  else if(-200 < enable &&  enable<=-100){
      g_reset_timer=-enable-100;
      android::lynqAssemblyParcelheader(p,socket_id,pRI->uToken,RIL_REQUEST_ECALL_SET_IVS,0,0);
      android::LYNQ_RIL_respSocket_sp(p,pRI);
diff --git a/src/lynq/framework/lynq-ril-service/src/fota/lynq_fota.cpp b/src/lynq/framework/lynq-ril-service/src/fota/lynq_fota.cpp
deleted file mode 100755
index d97a0ce..0000000
--- a/src/lynq/framework/lynq-ril-service/src/fota/lynq_fota.cpp
+++ /dev/null
@@ -1,255 +0,0 @@
-/*============================================================================= 
-**     FileName: lynq_send_log_data
-**     Desc: send log data
-**     Author: victor
-**     Version: V1.0
-**     LastChange: 2021-12-23
-**     History: 
-=============================================================================*/
-
-#include "common.h"
-#include <stdio.h>
-#include <string.h>
-#include <stdlib.h>
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-#include <log/log.h>
-#include "lynq_fota.h"
-#include "ftp/lynq_ftp.h"
-#include "mtk_device_wrap.h"
-#include "include/iot_rock.h"
-
-static lynq_ftp_socker_info ftp_atfota_info;
-
-#define UPDATA_ADDR "/tmp/fota.delta"
-#define READ_BLOCK_SIZE 0x40000
-
-int lynq_fota_md5_flag = -1;
-
-#define FLASH_DEV_DELTA       "/dev/mtd41"	
-#define EMMC_DEV_DELTA        "/media/fota.delta"
-
-void lynq_response_ttyGS3(char *log_buf)
-{
-    if((ttyGS3_fd > 0) && (NULL != log_buf))
-    {
-	    if(-1 == write(ttyGS3_fd,log_buf,strlen(log_buf)))
-	    {
-            printf("write ttyGS3_fd fail \n");
-        }
-    }
-    return ;
-}
-
-/**
- * @brief get fota patch
- * 
- * @param string:ftp log message,Refer to the fota documentation
- */
-int lynq_ftp_download_atfota_package(char *string[])
-{
-    int ret = 0;
-
-    for(int i = 0; i < 9; i++)
-    {
-        if(string[i] == NULL)
-        {
-            lynq_response_ttyGS3("+LYNQFOTA: Download Data NULL\n");
-            return 1;
-        }
-    }
-    
-    sprintf(ftp_atfota_info.sevname,"%s",string[0]);
-
-    ftp_atfota_info.portnum = atoi(string[1]);
-
-    sprintf(ftp_atfota_info.username,"%s",string[2]);
-    sprintf(ftp_atfota_info.pw,"%s",string[3]);
-
-
-    sprintf(ftp_atfota_info.is_pasv_mode,"%s",string[4]);
-    sprintf(ftp_atfota_info.file_type,"%s",string[5]);
-    sprintf(ftp_atfota_info.put_opt,"%s",string[6]);
-
-    sprintf(ftp_atfota_info.getfilename_path,"%s",string[7]);
-    sprintf(ftp_atfota_info.getfilename,"%s",string[8]);
-    chdir("/tmp/");
-    if(1 == lynq_ftp_login(&ftp_atfota_info))
-    {
-        if(0 == lynq_ftp_download(&ftp_atfota_info))
-        {
-            lynq_response_ttyGS3("+LYNQFOTA: GET FOTA FILE OK\n");
-            ret = 0;
-        }
-        else
-        {
-            lynq_response_ttyGS3("+CME: GET FOTA FILE FAIL\n");
-            ret = 1;
-        }
-    }
-    else
-    {
-        lynq_response_ttyGS3("+CME: FOTA LOGIN FAIL\n");
-        ret = 1;
-    }
-    return ret;
-}
-
-/**
- * @brief Differential subcontracting MD5 check
- * 
- * @param string:MD5 value,Subcontracting address,Refer to the fota documentation
- */
-int lynq_md5_atfota_package(char *string[])
-{
-    int fd_down,size,fd_target;
-    char delta_data[READ_BLOCK_SIZE];
-    char input_md5_data[64] = {0};
-    char buf_buf[128] = {0};
-
-    for(int i = 0; i < 2; i++)
-    {
-        if(string[i] == NULL)
-        {
-            lynq_response_ttyGS3("+LYNQFOTA: Md5 Value NULL\n");
-            return 1;
-        }
-    }
-
-    sprintf(input_md5_data,"%s",string[0]);
-    lynq_fota_md5_flag = lynq_md5_file_verfy(UPDATA_ADDR, input_md5_data);
-    if(lynq_fota_md5_flag == 0)
-    {
-        lynq_response_ttyGS3("+LYNQFOTA: MD5 OK\n");
-    }
-    else
-    {
-        lynq_response_ttyGS3("+LYNQFOTA: MD5 FAIL\n");
-        return 1;
-    }
-
-    if((atoi(string[1])) == 0)
-    {
-        fd_down = open(UPDATA_ADDR,O_RDONLY);
-        if (fd_down < 0) {
-            lynq_response_ttyGS3("+LYNQFOTA: open source  error\n");
-            lynq_fota_md5_flag = -1;
-            return 1;
-        }
-        if(lynq_fota_set_addr_value(FLASH_DEV_DELTA,strlen(FLASH_DEV_DELTA)))
-        {
-            lynq_response_ttyGS3("+LYNQFOTA: SET FOTA NAND ADDR FAIL\n");
-            close(fd_down);
-            lynq_fota_md5_flag = -1;
-            return 1;
-        }
-        fd_target = open(FLASH_DEV_DELTA,O_RDWR);
-        if (fd_target < 0) {
-            close(fd_down);
-            lynq_response_ttyGS3("+LYNQFOTA: open target  error\n");
-            lynq_fota_md5_flag = -1;
-            return 1;
-        } 
-
-        while(( size = read(fd_down,delta_data,READ_BLOCK_SIZE))>0) {
-            write(fd_target,delta_data,READ_BLOCK_SIZE);
-            memset(delta_data,0,READ_BLOCK_SIZE);
-        }
-        close(fd_target);
-        close(fd_down);
-    }
-    else if((atoi(string[1])) == 1)
-    {
-        if(lynq_fota_set_addr_value(EMMC_DEV_DELTA,strlen(EMMC_DEV_DELTA)))
-        {
-            lynq_response_ttyGS3("+LYNQFOTA: SET FOTA EMMC ADDR FAIL\n");
-            lynq_fota_md5_flag = -1;
-            return 1;
-        }
-        system("cp -rf /tmp/fota.delta /media/");
-    }
-    else
-    {
-        lynq_response_ttyGS3("+LYNQFOTA: NO SET FOTA ADDR ERROR\n");
-        lynq_fota_md5_flag = -1;
-        return 1;
-    }
-
-    lynq_response_ttyGS3("+LYNQFOTA: Saving the upgrade Package Success\n");
-//    lynq_response_ttyGS3("Store upgrade data to delta success\n");
-
-    return 0;
-}
-
-/**
- * @brief fota
- * 
- * @param void
- */
-int lynq_atfota_func_test(void)
-{
-    if(lynq_fota_md5_flag == 0) //upgrade success ,device reboot ,lynq_fota_md5_flag no need to reset
-    {
-        lynq_response_ttyGS3("+LYNQFOTA: Recive upgrade Command OK\n");
-        if(0 != lynq_rock_main(1))
-        {
-            lynq_response_ttyGS3("+LYNQFOTA: Upgrade Fail\n");
-            lynq_fota_md5_flag = -1;
-        }
-    }
-    else
-    {
-        lynq_response_ttyGS3("+LYNQFOTA: MD5 verify fail\n");
-        return 1;
-    }
-    return 0;
-}
-
-void lynq_atfota_test(char *argv[]) 
-{
-    if((argv[0] == NULL) || (argv[1] == NULL) || (argv[2] == NULL)|| (argv[3] == NULL))
-    {
-        printf("argv NULL\n");
-        return ;
-    }
-    if(!strcmp(argv[3], "download"))
-    {
-        if(!(strcmp(argv[4], "ftp")))
-        {
-            if(lynq_ftp_download_atfota_package(&argv[5]))
-            {
-                printf("lynq_ftp_download_atfota_package fail\n");
-            }
-        }
-        else
-        {
-            lynq_response_ttyGS3("+LYNQFOTA: No FTP Download\n");
-        }
-    }
-    else if(!(strcmp(argv[3], "md5")))
-    {
-        if(lynq_md5_atfota_package(&argv[4]))
-        {
-            printf("lynq_md5_atfota_package fail\n");
-        }
-    }
-    else if(!(strcmp(argv[3], "upgrade")))
-    {
-        if(lynq_atfota_func_test())
-        {
-            printf("lynq_atfota_func_test fail\n");
-        }
-    }
-    else
-    {
-        lynq_response_ttyGS3("+LYNQFOTA: fota api error!!!\n");
-    }
-    return ;
-}
-
-
-#ifdef __cplusplus
-}
-#endif
diff --git a/src/lynq/framework/lynq-ril-service/src/fota/lynq_fota.h b/src/lynq/framework/lynq-ril-service/src/fota/lynq_fota.h
deleted file mode 100755
index 33e5a03..0000000
--- a/src/lynq/framework/lynq-ril-service/src/fota/lynq_fota.h
+++ /dev/null
@@ -1,18 +0,0 @@
-#ifndef __LYNQ_FOTA_H__
-#define __LYNQ_FOTA_H__
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#define LYNQ_E_FTP_LOGIN_FAIL 9002 /*Ftp login fail*/
-#define LYNQ_E_FTP_SEND_FAIL 9003 /*Ftp send log fail*/
-#define LYNQ_E_GET_LOG_FAIL 9004 /*Get log fail*/
-#define LYNQ_E_LOG_CMD_ERROR 9005 /*cmd error*/
-
-void lynq_atfota_test(char *argv[]);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif //__LYNQ_LOGSEND_TEST_H__
diff --git a/src/lynq/framework/lynq-ril-service/src/led/include/led.h b/src/lynq/framework/lynq-ril-service/src/led/include/led.h
new file mode 100755
index 0000000..d8d6508
--- /dev/null
+++ b/src/lynq/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/src/lynq/framework/lynq-ril-service/src/led/led.cpp b/src/lynq/framework/lynq-ril-service/src/led/led.cpp
new file mode 100755
index 0000000..62e4b11
--- /dev/null
+++ b/src/lynq/framework/lynq-ril-service/src/led/led.cpp
@@ -0,0 +1,577 @@
+#ifdef LED_SUPPORT
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <binder/Parcel.h>
+#include <sys/socket.h>
+#include <errno.h>
+#include <unistd.h>
+#include <cutils/jstring.h>
+#include <sys/types.h>
+#include <time.h>
+#include <signal.h>
+#include "led.h"
+#include "led_inner.h"
+#include <liblog/lynq_deflog.h>
+#include "common.h"
+
+#undef LOG_TAG
+#define LOG_TAG "LED"
+
+
+/*************************************************************
+    Constants and Macros
+*************************************************************/
+#define GPIO_NETLED_CONNECT_REFLASH_TIMER   200
+#define GPIO_NETLED_CREG_REFLASH_TIMER   800
+#define MBTK_GPIO_NETLED_N            77
+
+/*************************************************************
+    Extern Function Declaration
+*************************************************************/
+void mbtk_netled_reflash_handle();
+
+/*************************************************************
+    Variables:local,extern
+*************************************************************/
+//static rex_timer_type mbtk_gpio_netled_timer;
+static mbtk_netled_state_t  mbtk_netled_state;
+/*************************************************************
+    Definitions:enum,struct,union
+*************************************************************/
+
+/*=============================================
+FUNCTION
+    mbtk_get_netled_state
+    
+DESCRIPTION
+    This function to return pointer of mbtk_netled_state.
+
+DEPENDENCIES
+    None
+
+PARAMETERS
+    None
+
+RETURN VALUE
+    &mbtk_netled_state
+
+SIDE EFFECTS
+    None
+=============================================*/
+
+mbtk_netled_state_t * mbtk_get_netled_state()
+{
+    return &mbtk_netled_state;
+}
+
+/*=============================================
+FUNCTION
+    mbtk_init_netled_state
+    
+DESCRIPTION
+    This function to init mbtk_netled_state.
+
+DEPENDENCIES
+    None
+
+PARAMETERS
+    None
+
+RETURN VALUE
+    None
+
+SIDE EFFECTS
+    None
+=============================================*/
+
+void mbtk_init_netled_state()
+{
+    mbtk_netled_state_t * netled_state = NULL;
+    netled_state = mbtk_get_netled_state();
+    
+    netled_state->gpio_netled_cs_flag = false;
+    netled_state->gpio_netled_goingsleep_flag = false;
+    netled_state->gpio_netled_ppp_flag = false;
+    netled_state->gpio_netled_wwan_flag = false;
+    
+}
+
+static timer_t s_mbtk_gpio_netled_timer;
+
+static int s_mbtk_gpio_netled_timer_sig_value = 11;  /* 2,3,4 are used by network */
+
+void start_led_timer(timer_t timer, int signal_value, int milliseconds) 
+{
+    RLOGD("start_led_timer(), timer_id=%ld, signal_value=%d, time=%d",(long)timer, signal_value, milliseconds);
+
+    struct itimerspec expire;
+    expire.it_interval.tv_sec = 0;
+    expire.it_interval.tv_nsec = 0;
+    expire.it_value.tv_sec = milliseconds/1000;
+    expire.it_value.tv_nsec = (milliseconds%1000)*1000000;
+	if (timer_settime(timer, 0, &expire, NULL) == -1) {
+        RLOGE("timer_settime  failed reason=[%s]", strerror(errno));
+    }
+    
+}
+
+void stop_led_timer(timer_t timer, int signal_value) {
+    RLOGD("stop_led_timer(), timer_id=%ld, signal_value=%d", (long)timer, signal_value);
+    struct itimerspec timespec;
+    if(timer_gettime(timer, &timespec) == -1) {
+        RLOGE("stop_led_timer(), get time fail(%s)", strerror(errno));
+        return;
+    }
+    RLOGD("stop_led_timer(), tv_sec=%ld, tv_nsec=%ld",timespec.it_value.tv_sec, timespec.it_value.tv_nsec);
+    if((timespec.it_value.tv_sec == 0)  && (timespec.it_value.tv_nsec == 0) ) {
+        RLOGD("stop_led_timer(), timer_id(%ld) had stopped, just return", (long)timer);
+        return;
+    } else {
+        start_led_timer(timer, signal_value, 0);
+    }
+}
+
+static pthread_mutex_t mtx = PTHREAD_MUTEX_INITIALIZER;
+void led_timer_handler(sigval_t sig) 
+{    
+    RLOGD("led_timer_handler, sig_value: %d", sig.sival_int);
+    int s;   
+    s = pthread_mutex_lock(&mtx);
+    if(s != 0) {
+        RLOGE("led_timer_handler, pthead_mutex_lock fail");
+    }   
+    if(sig.sival_int == s_mbtk_gpio_netled_timer_sig_value) 
+    {
+        mbtk_netled_reflash_handle();
+    }    
+    s = pthread_mutex_unlock(&mtx);
+    if(s != 0) {
+        RLOGE("led_timer_handler, pthead_mutex_unlock fail");
+    }   
+}
+
+void init_led_timer(timer_t* timer, int signal_value) 
+{
+    struct sigevent sevp;
+    memset(&sevp, 0, sizeof(sevp));
+    sevp.sigev_value.sival_int = signal_value;
+    sevp.sigev_notify = SIGEV_THREAD;
+    sevp.sigev_notify_function = led_timer_handler;
+
+    if(timer_create(CLOCK_MONOTONIC, &sevp, timer) == -1) {
+        RLOGE("init_led_timer()  failed reason=[%s]", strerror(errno));
+    }
+    RLOGD("init_led_timer(), timer_Id = %ld, signal_value=%d", (long)(*timer), signal_value);
+}
+
+void init_led_timer_all() 
+{
+    init_led_timer(&s_mbtk_gpio_netled_timer,s_mbtk_gpio_netled_timer_sig_value);   
+}
+
+void deinit_led_timer_all() 
+{
+    stop_led_timer(s_mbtk_gpio_netled_timer,s_mbtk_gpio_netled_timer_sig_value);    
+}
+
+/*=============================================
+FUNCTION
+    mbtk_netled_init
+    
+DESCRIPTION
+    This function to init timer
+
+DEPENDENCIES
+    None
+
+PARAMETERS
+    param    not used
+
+RETURN VALUE
+    None
+
+SIDE EFFECTS
+    None
+=============================================*/
+void mbtk_netled_init()
+{
+    mbtk_init_netled_state();
+    init_led_timer_all();   
+}
+
+/*=============================================
+FUNCTION
+    mbtk_netled_deinit
+    
+DESCRIPTION
+    This function to init timer
+
+DEPENDENCIES
+    None
+
+PARAMETERS
+    param    not used
+
+RETURN VALUE
+    None
+
+SIDE EFFECTS
+    None
+=============================================*/
+void mbtk_netled_deinit()
+{
+    deinit_led_timer_all();   
+}
+
+
+/*=============================================
+FUNCTION
+    mbtk_get_at_netled_cmd
+    
+DESCRIPTION
+    This function to return netled switch value.
+
+DEPENDENCIES
+    None
+
+PARAMETERS
+    None
+
+RETURN VALUE
+    int
+
+SIDE EFFECTS
+    None
+=============================================*/
+
+int mbtk_get_at_netled_cmd(void)
+{
+    return 1;
+//    return (int) dsatutil_get_val(MBTK_AT_GPIO_CGNETLED_IDX,0,0,NUM_TYPE);
+}
+
+/*=============================================
+FUNCTION
+    mbtk_get_reg_net_status
+    
+DESCRIPTION
+    This function that determine if net registers successfully.
+    
+DEPENDENCIES
+    None
+
+PARAMETERS
+    param    not used
+
+RETURN VALUE
+    mbtk_netled_reg_net_status
+
+SIDE EFFECTS
+    None
+=============================================*/
+
+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;
+    }
+   
+    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 reg_net_status;
+
+}
+
+/*=============================================
+FUNCTION
+    mbtk_netled_get_socket_conn_status
+    
+DESCRIPTION
+    This function that socket connects successfully.
+
+DEPENDENCIES
+    None
+
+PARAMETERS
+    param    not used
+
+RETURN VALUE
+    mbtk_netled_socket_conn_status
+
+SIDE EFFECTS
+    None
+=============================================*/
+
+mbtk_netled_socket_conn_status  mbtk_netled_get_socket_conn_status(void)
+{
+    mbtk_netled_socket_conn_status  socket_conn_status = MBTK_SOCKET_DISCONNECT; 
+    mbtk_netled_state_t * netled_state =  mbtk_get_netled_state();    
+
+    if(netled_state->gpio_netled_ppp_flag || netled_state->gpio_netled_wwan_flag)
+    {
+        RLOGD("GPIO: ppp wwan netled state sockNum %d,%d",
+        netled_state->gpio_netled_ppp_flag, netled_state->gpio_netled_wwan_flag);
+        
+        socket_conn_status = MBTK_SOCKET_CONNECTED;
+        return socket_conn_status;
+    }   
+
+    return socket_conn_status;
+
+}
+
+/*=============================================
+FUNCTION
+    mbtk_netled_get_current_state
+    
+DESCRIPTION
+    get the netled status .
+
+DEPENDENCIES
+    None
+
+PARAMETERS
+    param    not used
+
+RETURN VALUE
+    mbtk_netled_status_type
+
+SIDE EFFECTS
+    None
+=============================================*/
+mbtk_netled_status_type mbtk_netled_get_current_state(void)
+{
+    mbtk_netled_reg_net_status reg_net_status = NET_REG_FAIL;
+    mbtk_netled_status_type netled_status_type = GPIO_NETLED_OFF;
+    mbtk_netled_socket_conn_status socket_conn_status = MBTK_SOCKET_DISCONNECT;
+    int mbtk_netled_at_cmd_value = mbtk_get_at_netled_cmd();  //  0 -- close netled / 1 -- open netled
+    mbtk_netled_state_t * netled_state =  mbtk_get_netled_state();
+    
+    if(mbtk_netled_at_cmd_value == 0 || 
+       netled_state->gpio_netled_goingsleep_flag == true)
+    {
+        netled_status_type = GPIO_NETLED_OFF;
+        return netled_status_type;
+    }
+
+    reg_net_status = mbtk_get_reg_net_status();
+    if( NET_REG_FAIL == reg_net_status || true == netled_state->gpio_netled_cs_flag )
+    {
+        netled_status_type = GPIO_NETLED_LIGHT;
+    }
+    else if( NET_REG_SUCCESS == reg_net_status )
+    {
+        socket_conn_status = mbtk_netled_get_socket_conn_status();
+        
+        if( MBTK_SOCKET_CONNECTED == socket_conn_status )
+        {
+            netled_status_type = GPIO_NETLED_CONNECT;
+        }
+        else if( MBTK_SOCKET_DISCONNECT == socket_conn_status )
+        {
+            netled_status_type = GPIO_NETLED_REG;
+        }
+    } 
+    return netled_status_type;
+}
+
+
+
+bool is_mbtk_timer_finish() {
+    struct itimerspec timespec;
+    if(timer_gettime(s_mbtk_gpio_netled_timer, &timespec) == -1) {
+        RLOGD("%s(), get time fail(%s)", __FUNCTION__, strerror(errno));
+        return true;
+    }
+    RLOGD("%s(), tv_sec=%ld, tv_nsec=%ld", __FUNCTION__,timespec.it_value.tv_sec, timespec.it_value.tv_nsec);
+    if((timespec.it_value.tv_sec == 0)  && (timespec.it_value.tv_nsec == 0) ) {
+        RLOGD("%s(), timer_id(%ld) had stopped", __FUNCTION__, (long)s_mbtk_gpio_netled_timer);
+        return true;
+    }
+	return false;
+}
+
+/*=============================================
+FUNCTION
+    mbtk_netled_state_update
+    
+DESCRIPTION
+    This function to reflash network led status and write gpio value
+
+DEPENDENCIES
+    None
+
+PARAMETERS
+    param     flag
+
+RETURN VALUE
+    None
+
+SIDE EFFECTS
+    None
+=============================================*/
+void mbtk_netled_state_update(mbtk_netled_reflash_type flag)
+{
+//  rex_timer_cnt_type prev_value;
+    mbtk_netled_state_t * netled_state = NULL;
+    netled_state = mbtk_get_netled_state();
+    
+    switch (flag)
+    {
+        case GPIO_NETLED_REFLASH_NORMAL:
+             break;
+        case GPIO_NETLED_CS_CALLING:
+             netled_state->gpio_netled_cs_flag = true;
+             break;
+        case GPIO_NETLED_PPP_CONNECT:
+             netled_state->gpio_netled_ppp_flag = true;
+             break;
+        case GPIO_NETLED_PPP_CLOSED:
+             netled_state->gpio_netled_ppp_flag = false;
+             break;
+        case GPIO_NETLED_CS_CALLEND:
+             netled_state->gpio_netled_cs_flag = false;
+             break;
+        case GPIO_NETLED_AP_GOINGSLEEP:
+             netled_state->gpio_netled_goingsleep_flag = true;
+             break;
+        case GPIO_NETLED_AP_WAKEUP:
+             netled_state->gpio_netled_goingsleep_flag = false;
+             break;
+        case GPIO_NETLED_WWAN_CONNECT:
+             netled_state->gpio_netled_wwan_flag = true;
+             break;
+        case GPIO_NETLED_WWAN_CLOSED:
+             netled_state->gpio_netled_wwan_flag = false;
+             break;
+
+    }
+
+    //prev_value = rex_get_timer(&mbtk_gpio_netled_timer);
+//    prev_value = timer_get_64(&mbtk_gpio_netled_timer, T_MSEC);
+//    if( prev_value == 0)
+	if((flag== GPIO_NETLED_AP_GOINGSLEEP) || is_mbtk_timer_finish())
+    {
+ //     MBTK_MSG1_HIGH("GPIO: rex_get_timer prev_value =%d",prev_value);
+       //rex_set_timer(&mbtk_gpio_netled_timer, 1);
+       //timer_set_64(&mbtk_gpio_netled_timer,1,0,T_MSEC);
+        start_led_timer(s_mbtk_gpio_netled_timer, s_mbtk_gpio_netled_timer_sig_value, 1);        
+    }
+
+    return ;
+}
+
+/*=============================================
+FUNCTION
+    mbtk_netled_reflash_handle
+    
+DESCRIPTION
+    This function to reflash network led status and write gpio value
+
+DEPENDENCIES
+    None
+
+PARAMETERS
+    param    not used
+
+RETURN VALUE
+    None
+
+SIDE EFFECTS
+    None
+=============================================*/
+
+void mbtk_gpio_write_output(int gpio_port, int value)
+{
+    if(value==1)
+    {
+        system("echo 255 > /sys/class/leds/led9515:green:cellular-radio/brightness");
+    }  
+	else 
+	{
+	    system("echo 0 > /sys/class/leds/led9515:green:cellular-radio/brightness");
+	}
+}
+
+
+/*=============================================
+FUNCTION
+    mbtk_netled_reflash_handle
+    
+DESCRIPTION
+    This function to reflash network led status and write gpio value
+
+DEPENDENCIES
+    None
+
+PARAMETERS
+    param    not used
+
+RETURN VALUE
+    None
+
+SIDE EFFECTS
+    None
+=============================================*/
+void mbtk_netled_reflash_handle()
+{
+    mbtk_netled_status_type state = GPIO_NETLED_MAX;
+    state = mbtk_netled_get_current_state();
+    RLOGD("mbtk_netled_get_current_state  state = %d",state);
+    static int led_val = 0;
+
+    switch(state)
+    {
+        case GPIO_NETLED_OFF:
+             {
+                 if( 0 != led_val )
+                 {
+                     led_val = 0;
+                     mbtk_gpio_write_output(MBTK_GPIO_NETLED_N, 0);
+                 }
+             }
+             break;
+        case GPIO_NETLED_REG:
+             {
+                led_val = ( (1 == led_val)? 0:1 );
+                mbtk_gpio_write_output(MBTK_GPIO_NETLED_N, led_val);
+                start_led_timer(s_mbtk_gpio_netled_timer, s_mbtk_gpio_netled_timer_sig_value, GPIO_NETLED_CREG_REFLASH_TIMER);
+				
+              //  timer_set_64(&mbtk_gpio_netled_timer,GPIO_NETLED_CREG_REFLASH_TIMER,0,T_MSEC);
+                //rex_set_timer(&mbtk_gpio_netled_timer, GPIO_NETLED_CREG_REFLASH_TIMER);
+             }
+             break;
+        case GPIO_NETLED_CONNECT:
+             {
+                 led_val = ( (1 == led_val)? 0:1 );
+                 mbtk_gpio_write_output(MBTK_GPIO_NETLED_N, led_val);
+        		 start_led_timer(s_mbtk_gpio_netled_timer, s_mbtk_gpio_netled_timer_sig_value, GPIO_NETLED_CONNECT_REFLASH_TIMER);
+                // timer_set_64(&mbtk_gpio_netled_timer,GPIO_NETLED_CONNECT_REFLASH_TIMER,0,T_MSEC);
+                 //rex_set_timer(&mbtk_gpio_netled_timer, GPIO_NETLED_CONNECT_REFLASH_TIMER);
+             }
+             break;
+        case GPIO_NETLED_LIGHT:
+             {
+                 if( 1 != led_val )
+                 {
+                     led_val = 1;
+                     mbtk_gpio_write_output(MBTK_GPIO_NETLED_N, 1);
+                 }
+             }
+             break;
+        default:
+             RLOGE("GPIO: Unkown netled state !");
+    }
+}
+#endif
diff --git a/src/lynq/framework/lynq-ril-service/src/led/led_inner.h b/src/lynq/framework/lynq-ril-service/src/led/led_inner.h
new file mode 100755
index 0000000..5b0750d
--- /dev/null
+++ b/src/lynq/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/src/lynq/framework/lynq-ril-service/src/lynq_common.cpp b/src/lynq/framework/lynq-ril-service/src/lynq_common.cpp
index 7b54cc8..418fe86 100755
--- a/src/lynq/framework/lynq-ril-service/src/lynq_common.cpp
+++ b/src/lynq/framework/lynq-ril-service/src/lynq_common.cpp
@@ -33,6 +33,7 @@
 extern apn_table_t apn_table[LYNQ_APN_CHANNEL_MAX] = {};
 extern int apn_count = 0;
 extern char lynq_at[LYNQ_AT_LEN_MAX]= {};
+char mccmnc[8] = {0};
 pthread_cond_t lynq_at_cond = PTHREAD_COND_INITIALIZER;
 pthread_mutex_t lynq_at_mutex= PTHREAD_MUTEX_INITIALIZER;
 
@@ -502,7 +503,6 @@
             new_argv[0] = "RIL_REQUEST_DEACTIVATE_DATA_CALL";
             new_argv[1] = argv[4];//apntype
             android::lynqSendToRil(2,new_argv,uToken);
-            syncRespToUsb(0);
         }
     }
     else if (type == 1)
@@ -519,7 +519,7 @@
 
 int insert_apn_char(char *agc, char *id,char *mcc, char *mnc, char *apn, char *apntype, char *user, char *password, char *normalprotocol, char *roamingprotocol, char *carrier)
 {
-    char strtmp[10][32];
+    char strtmp[10][64];
     if (!strcmp(id,"null"))
     {
         sprintf(strtmp[0], "id=;");
@@ -530,7 +530,16 @@
     }
     if (!strcmp(mcc,"null"))
     {
-        sprintf(strtmp[1], "mcc=;");
+        char mcc[8] = {0};
+        if(strlen(mccmnc))
+        {
+            strncpy(mcc, mccmnc, 3);
+            sprintf(strtmp[1], "mcc=%s;", mcc);
+        }
+        else
+        {
+            sprintf(strtmp[2], "mcc=;");
+        }
     }
     else
     {
@@ -538,7 +547,14 @@
     }
     if (!strcmp(mnc,"null"))
     {
-        sprintf(strtmp[2], "mnc=;");
+        if(strlen(mccmnc))
+        {
+            sprintf(strtmp[2], "mnc=%s;", mccmnc+3);
+        }
+        else
+        {
+            sprintf(strtmp[2], "mnc=;");
+        }
     }
     else
     {
@@ -604,6 +620,13 @@
     return 0;
 }
 
+void lynq_req_mccmnc(int uToken)
+{
+    char *new_argv[10] = {};
+    new_argv[0] = "RIL_REQUEST_OPERATOR";
+    android::lynqSendToRil(1,new_argv,uToken);//for get mccmnc
+}
+
 int lynq_modify_apn_info(int argc,char*argv[],char *rilReq, int uToken)
 {
     /*
@@ -630,13 +653,14 @@
     {
         for(int i = 4; i < 14; i++)
         {
-            printf("argv[%d] %s\n", i,argv[i]);
             if(argv[i] == NULL)
             {
                 syncRespToUsb(100);
                 return -1;
             }
         }
+        lynq_req_mccmnc(uToken);
+        usleep(500*1000);
         insert_apn_char(apn_info, argv[4], argv[5], argv[6], argv[7], argv[8], argv[9], argv[10], argv[11], argv[12], argv[13]);
         new_argv[1] = "0";
         new_argv[2] = apn_info;
diff --git a/src/lynq/framework/lynq-ril-service/src/lynq_common.h b/src/lynq/framework/lynq-ril-service/src/lynq_common.h
index 483986a..ec1e9e2 100755
--- a/src/lynq/framework/lynq-ril-service/src/lynq_common.h
+++ b/src/lynq/framework/lynq-ril-service/src/lynq_common.h
@@ -98,12 +98,13 @@
 extern apn_table_t apn_table[LYNQ_APN_CHANNEL_MAX];
 extern int apn_count;
 extern char lynq_at[LYNQ_AT_LEN_MAX];
+extern char mccmnc[8];
 usb_at_transfer_t *lynqFindId(char *cmd);
 usb_cmd_t * lynqFindUsbEvent(char *cmd);
 int transferAtToRequest(char *cmd);
 //argv[2]:0 send,1 list,2 get
 int lynqParseUsbCommand(const char* cmd,char *argv[],char test[],char* parser_buf,int maxArgc);
-
+void lynq_req_mccmnc(int uToken);
 int routeCmd(int request);
 
 int CGMI(int argc,char*argv[],char *rilReq, int uToken);
diff --git a/src/lynq/framework/lynq-ril-service/src/main.cpp b/src/lynq/framework/lynq-ril-service/src/main.cpp
index 50f270f..0b2c2a3 100755
--- a/src/lynq/framework/lynq-ril-service/src/main.cpp
+++ b/src/lynq/framework/lynq-ril-service/src/main.cpp
@@ -37,6 +37,7 @@
 #include <sys/types.h>
 #include <signal.h>
 #include "common.h"
+#include "lynq_shm.h"
 
 extern "C" void RIL_register (const RIL_RadioFunctions *callbacks);
 
@@ -127,7 +128,8 @@
     /*lei add for gsw
     reason:Socket sending failed at GSW
     */
-    signal(SIGHUP, signal_handler);
+    //signal(SIGHUP, signal_handler);
+    atexit (lynq_exit);
     system("route add -host 255.255.255.255 dev lo");
     int lock_file = open("/tmp/tel_demo_single_proc.lock", O_CREAT|O_RDWR, 0666);
     int rc = flock(lock_file,LOCK_EX|LOCK_NB);
@@ -138,6 +140,14 @@
             exit(0);
         }
     }
+
+    if(ril_init_mem()!=0)
+    {
+        printf("Error: cannot ril_init_mem\n");
+        RLOGD("Error: cannot ril_init_mem");
+        exit(0);
+    }
+		
 #ifdef BASELIB_DIR_LIB64
     const char *rilLibPath = "/lib64/libvendor-ril.so";
 #else
@@ -153,12 +163,12 @@
     dlHandle = dlopen(rilLibPath, RTLD_NOW);
 
     if (dlHandle == NULL) {
-        RLOGE("dlopen failed: %s", dlerror());
+        RLOGE("dlopen failed: %s", dlerror());       
         exit(EXIT_FAILURE);
     }
 
     android::RIL_startEventLoop();
-    //android::startATCILoop();
+    android::startATCILoop();
     //android::startPMLoop();
     //android::startWakupLoop();
 
diff --git a/src/lynq/framework/lynq-ril-service/src/makefile b/src/lynq/framework/lynq-ril-service/src/makefile
index a5c49fa..7eaf082 100755
--- a/src/lynq/framework/lynq-ril-service/src/makefile
+++ b/src/lynq/framework/lynq-ril-service/src/makefile
@@ -33,6 +33,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)
@@ -85,8 +89,8 @@
   -I$(LOCAL_PATH)/ecall/gost/sslp/teledata \
   -I$(LOCAL_PATH)/rndis \
   -I$(LOCAL_PATH)/factory \
-  -I$(LOCAL_PATH)/fota \
   -I$(LOCAL_PATH)/temp \
+  -I$(LOCAL_PATH)/led/include \
   -I$(ROOT)$(includedir)/logger \
   -I$(ROOT)$(includedir)/liblog \
   -I$(ROOT)$(includedir)/liblynq-thermal \
@@ -96,6 +100,7 @@
   -I$(ROOT)$(includedir)/vendor-ril \
   -I$(ROOT)$(includedir)/gstreamer-1.0 \
   -I$(ROOT)$(includedir)/glib-2.0 \
+  -I$(ROOT)$(includedir)/lynq_shm \
   -I$(ROOT)$(libdir)/glib-2.0/include \
   -I$(ROOT)$(libdir)/gstreamer-1.0/include\
   -I$(ROOT)$(includedir)/dbus-1.0 \
@@ -133,8 +138,8 @@
     -llynq-thermal  \
     -llynq-systime \
     -llynq-uci \
-    -llynq-fota \
     -llynq-protcl \
+    -llynq-shm  \
 
 ifeq ($(strip $(TARGET_PLATFORM)), mt2735)
 LOCAL_LIBS += -luciwrapper
@@ -143,7 +148,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)
+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)
 
 EXECUTABLE = lynq-ril-service
 
diff --git a/src/lynq/framework/lynq-ril-service/src/ril.cpp b/src/lynq/framework/lynq-ril-service/src/ril.cpp
index 386fd13..d0156ca 100755
--- a/src/lynq/framework/lynq-ril-service/src/ril.cpp
+++ b/src/lynq/framework/lynq-ril-service/src/ril.cpp
@@ -88,9 +88,12 @@
 #include "lynq_at_temp.h"
 /*rita add end*/
 /*lt add start*/
-#include "lynq_fota.h"
 /*lt add end*/
 /*Warren add for t800 RIL service 2021_12_10 end*/
+#ifdef LED_SUPPORT
+#include "led.h"
+#endif
+#include "lynq_shm.h"
 
 #define LOG_TAG "DEMO_RIL"
 #define WAIT_TIME_FOR_SIM_SWITCH 30
@@ -171,6 +174,11 @@
 //int LYNQ_RIL_respSocket(Parcel &p,RIL_Token t);
 //int LYNQ_RIL_urcBroadcast(Parcel &p);
 
+/*hq add for urc broadcast opti 2023/01/06 */
+#define SHM_BUFFER_INDEX_OFFSET 1
+#define SHM_BUFFER_SIZE_OFFSET 16
+#define urc_broadcase_shm_size_limit 20
+
 int lynq_urc_socket_fd = 0;
 struct sockaddr_in urc_broadcast_addr;
 /*Warren add for t800 RIL service 2021_12_10 end*/
@@ -3937,6 +3945,90 @@
     return strndup16to8(s16, stringlen);
 }
 
+static void lynq_get_mccmnc(Parcel &p, char *mccmnc)
+{
+    p.setDataPosition(0);
+    if(p.dataAvail() > 0)
+    {
+        int resp_type;
+        int token;
+        int request;
+        int slot_id;
+        int error1;
+        int num;
+        char *resp[128];
+        p.readInt32(&resp_type);
+        p.readInt32(&token);
+        p.readInt32(&request);
+        p.readInt32(&slot_id);
+        p.readInt32(&error1);
+        if(!error1)
+        {
+            p.readInt32(&num);
+            if(num == 0 || num > 128)
+            {
+                LYERRLOG("no paramters or num %d too great",num);
+            }
+            else
+            {
+                int i;
+                for(i = 0; i<num;i++)
+                {
+                    resp[i] = lynqStrdupReadString(p);
+                }
+                if(NULL != resp[2])
+                {
+                    strcpy(mccmnc,resp[2]);
+                    printf("mcc mnc %s\n", mccmnc);
+                }
+                for(i = 0; i<num;i++)
+                {
+                    if(resp[i]!=NULL)
+                    {
+                        free(resp[i]);
+                    }  
+                }
+            }
+        }
+        else
+        {
+            LYERRLOG("lynq_get_mccmnc error");
+        }
+    }
+}
+
+static void lynq_sdk_ready(Parcel &p)
+{
+    int resp_type;
+    int token;
+    int request;
+    int slot_id;
+    int error1;
+    int num;
+    char imei[32] = {0};
+    if(sdk_ready == true)
+    {
+        p.setDataPosition(0);
+        if(p.dataAvail() > 0)
+        {
+            p.readInt32(&resp_type);
+            p.readInt32(&token);
+            p.readInt32(&request);
+            p.readInt32(&slot_id);
+            p.readInt32(&error1);
+            if(!error1)
+            {
+                system("uci set lynq_uci.sdk_ready=0");
+            }
+            else
+            {
+                system("uci set lynq_uci.sdk_ready=2");
+            }
+        }
+        sdk_ready = false;
+    }
+}
+
 extern "C" void
 RIL_onRequestComplete(RIL_Token t, RIL_Errno e, void *response, size_t responselen) {
     RequestInfo *pRI;
@@ -4168,152 +4260,23 @@
                    }
                    break;
                }
-               case RIL_REQUEST_OEM_HOOK_RAW:
-               {
-                   if(pRI->lynqEvent==1)
-                   {    
-                        /*lei add for at+cgmr*/
-                        if(strstr((const char*)response,"+CGMR")){
-                            lynq_get_version();
-                        }
-                        /*lei add for at+cgmr*/
-                        int n = write(ttyGS3_fd,response,responselen);
-                        if(n<0)
-                        {
-                            perror("lynq resp write:");
-                        }
-                        printf("n = %d\n",n);
-                   }
-                   /*lei add only for factory test 2022/5/19*/
-                   if(pRI->lynqEvent==3)
-                   {
-                       /*lei add for at+cgir*/
-                        if(strstr((const char*)response,"+CGMR")){
-                            lynq_get_inside_version();
-                        }
-                        /*lei add for at+cgir*/
-                        parse_inside_version(response);
-                        int n = write(ttyGS3_fd,response,responselen);
-                        if(n<0)
-                        {
-                            perror("lynq resp write:");
-                        }
-                        printf("n = %d\n",n);
-                   }
-                   break;
-               }
-                /*lei add for AT+CGSN 2022/8/4*/
+               /*lei add for sdk ready 2022/8/17*/
                 case RIL_REQUEST_DEVICE_IDENTITY:
                 {
-                    int resp_type;
-                    int token;
-                    int request;
-                    int slot_id;
-                    int error1;
-                    int num;
-                    char imei[32] = {0};
-                    if(pRI->lynqEvent==1)
-                    {
-                        //printf("lei test %s\n" ,printBuf);
-                        p.setDataPosition(0);
-                        if(p.dataAvail() > 0)
-                        {
-                            p.readInt32(&resp_type);
-                            p.readInt32(&token);
-                            p.readInt32(&request);
-                            p.readInt32(&slot_id);
-                            p.readInt32(&error1);
-                            if(!error1)
-                            {
-                                p.readInt32(&num);
-                                char * test = lynqStrdupReadString(p);
-                                parse_imei(test);
-                                if(imei_cnt % 2 == 0)
-                                {
-                                    sprintf(imei,"%s%s%s", "+CGSN: ", test, "\n");
-                                    int n = write(ttyGS3_fd,imei,strlen(imei));
-                                    if(n<0)
-                                    {
-                                        perror("lynq resp write:");
-                                    }
-                                }
-                                else
-                                {
-                                    sprintf(imei,"%s%s%s", "+CGSN: ", test, "\n");
-                                    int n = write(ttyGS3_fd,imei,strlen(imei));
-                                    if(n<0)
-                                    {
-                                        perror("lynq resp write:");
-                                    }
-                                    char eBuf[64] = {0};
-                                    sprintf(eBuf,"OK\n");
-                                    n = write(ttyGS3_fd,eBuf,strlen(eBuf));
-                                    if(n<0)
-                                    {
-                                        perror("lynq resp write:");
-                                    }
-                                }
-                                imei_cnt++;
-                            }
-                        }
-                    }
-                    /*lei add for sdk ready 2022/8/17*/
-                    else
-                    {
-                        if(sdk_ready == true)
-                        {
-                            p.setDataPosition(0);
-                            if(p.dataAvail() > 0)
-                            {
-                                p.readInt32(&resp_type);
-                                p.readInt32(&token);
-                                p.readInt32(&request);
-                                p.readInt32(&slot_id);
-                                p.readInt32(&error1);
-                                if(!error1)
-                                {
-                                   system("uci set lynq_uci.sdk_ready=0");
-                                }
-                                else
-                                {
-                                    system("uci set lynq_uci.sdk_ready=2");
-                                }
-                            }
-                            sdk_ready = false;
-                        }
-                    }
-                    /*lei add for sdk ready 2022/8/17*/
+                    lynq_sdk_ready(p);
                     break;
                 }
-                /*lei add for AT+CGSN 2022/8/4*/
+                /*lei add for sdk ready 2022/8/17*/
+                case RIL_REQUEST_OPERATOR:
+                {
+                    lynq_get_mccmnc(p, mccmnc);
+                    lynq_send_result_already();
+                    break;
+                }
                default:
                    break;
                }
         }
-       /*Warren add for FAW platform 2021/10/8 start*/
-       else
-       {
-           if(pRI->lynqEvent==1)
-           {
-               char eBuf[64] = {0};
-               bzero(eBuf, 64);
-               if(e==RIL_E_SUCCESS)
-               {
-                    sprintf(eBuf,"\nOK\n\0");
-               }
-               else
-               {
-                   sprintf(eBuf,"\nCME ERROR: %d\n\0",e);
-               }
-               int n = write(ttyGS3_fd,eBuf,strlen(eBuf));
-               if(n<0)
-               {
-                   perror("lynq resp write:");
-               }
-               //printf("n = %d\n",n);
-           }
-       }
-       /*Warren add for FAW platform 2021/10/8 start*/
         if (e != RIL_E_SUCCESS) {
             appendPrintBuf("%s fails by %s", printBuf, failCauseToString(e));
         }
@@ -4681,9 +4644,11 @@
 
 //unsol trigger other things.
     switch(unsolResponse) {
-    //case RIL_UNSOL_RESPONSE_CALL_STATE_CHANGED:
-        //ARspRequest(RIL_REQUEST_GET_CURRENT_CALLS, soc_id);
-        //break;
+#ifdef LED_SUPPORT
+    case RIL_UNSOL_RESPONSE_CALL_STATE_CHANGED:   //add this for API-720
+        ARspRequest(RIL_REQUEST_GET_CURRENT_CALLS, soc_id);
+        break;
+#endif
     case RIL_UNSOL_CALL_RING:
         callRing(soc_id);
         break;
@@ -4829,7 +4794,7 @@
         break;
     }
     /*Warren add for t800 ril service 2021/12/16 start*/
-    ret = LYNQ_RIL_urcBroadcast(p);
+    ret = LYNQ_RIL_urcBroadcast(p,unsolResponse);
     /*Warren add for t800 ril service 2021/12/16 end*/
 #if 0
     if (ret != 0 && unsolResponse == RIL_UNSOL_NITZ_TIME_RECEIVED) {
@@ -5306,6 +5271,7 @@
         case RIL_UNSOL_RESPONSE_RADIO_STATE_CHANGED: return "UNSOL_RESPONSE_RADIO_STATE_CHANGED";
         case RIL_UNSOL_RESPONSE_CALL_STATE_CHANGED: return "UNSOL_RESPONSE_CALL_STATE_CHANGED";
         case RIL_UNSOL_RESPONSE_VOICE_NETWORK_STATE_CHANGED: return "UNSOL_RESPONSE_VOICE_NETWORK_STATE_CHANGED";
+        case RIL_UNSOL_RESPONSE_PS_NETWORK_STATE_CHANGED: return "UNSOL_RESPONSE_VOICE_NETWORK_STATE_CHANGED";
         case RIL_UNSOL_RESPONSE_NEW_SMS: return "UNSOL_RESPONSE_NEW_SMS";
         case RIL_UNSOL_RESPONSE_NEW_SMS_STATUS_REPORT: return "UNSOL_RESPONSE_NEW_SMS_STATUS_REPORT";
         case RIL_UNSOL_RESPONSE_NEW_SMS_ON_SIM: return "UNSOL_RESPONSE_NEW_SMS_ON_SIM";
@@ -5613,6 +5579,9 @@
 
 static void initCoditions()
 {
+#ifdef LED_SUPPORT
+    mbtk_netled_init();
+#endif
     mixer_init();
     if(utils::is_support_dsds()) {
         for(int i = 0; i < 2 ; i++) {
@@ -5623,7 +5592,7 @@
     if(utils::is_suppport_dsss()) {
         int id = Phone_utils::get_enable_sim_for_dsss();
         init(id);
-    }
+    }	
 }
 
 
@@ -5929,6 +5898,21 @@
     }
     */
 }
+
+//add by hq for bug 760 2023/02/09
+static int setnonblocking(int sockfd) {
+    int flag = fcntl(sockfd, F_GETFL, 0);  //get current flag
+    if (flag < 0) {
+        RLOGE("fcntl F_GETFL fail");
+        return -1;
+    }
+    if (fcntl(sockfd, F_SETFL, flag | O_NONBLOCK) < 0) {  //add O_NONBLOCK
+        RLOGE("fcntl F_SETFL fail");
+        return -1;
+    }
+    return 0;
+}
+
 void LYNQ_RIL_RecSocket()
 {
     RLOGD("LYNQ_RIL_RecSocket start\n");
@@ -5962,6 +5946,13 @@
          RLOGE("Server Bind Failed:");
          exit(1);
     }
+
+    if(setnonblocking(server_socket_fd)!=0)
+    {
+        RLOGE("setnonblocking Failed");
+        exit(1);
+    }
+	
     /* create epoll fd，add socket to epoll */
     ep_fd = epoll_create(LYNQ_SOCKET_ENVNT_FD_MAX);
     //int len = sizeof(struct sockaddr_in);
@@ -6000,117 +5991,122 @@
                 socklen_t client_addr_length = sizeof(lynqClient_addr);
                 /* receive the data */
                 bzero(buffer, LYNQ_SOCKET_BUFFER);
-                if(recvfrom(server_socket_fd, buffer, LYNQ_SOCKET_BUFFER,0,(struct sockaddr*)&lynqClient_addr, &client_addr_length) == -1)
+                while(recvfrom(server_socket_fd, buffer, LYNQ_SOCKET_BUFFER,0,(struct sockaddr*)&lynqClient_addr, &client_addr_length) != -1)//add while by hq for bug 760 2023/02/09
                 {
-                    RLOGE("Receive Data Failed:");
-                    continue;
-                }
-                client_tmp = (lynq_client_t*)buffer;
-                RLOGD("[LYNQ socketId] utoken=%d,request=%d,len=%d,param=%s",client_tmp->uToken,client_tmp->request,client_tmp->paramLen,client_tmp->param);
-                //char test[36] = {};
-                //sprintf(test,"test okay len = %d",client_tmp->paramLen);
-                //sendto(server_socket_fd,test,strlen(test),0,(struct sockaddr*)&client_addr,client_addr_length);
-                argv[0] = (char *)lynq_requset_to_string(client_tmp->request);
-                argc = 0;
-                if(client_tmp->paramLen > 0)
-                {
-                    /*transfer struct*/
-                    argc = parse_param(client_tmp->param, argv+1, MAX_ARGS);
-                    if(argc < 1)
+                    client_tmp = (lynq_client_t*)buffer;
+                    RLOGD("[LYNQ socketId] utoken=%d,request=%d,len=%d,param=%s",client_tmp->uToken,client_tmp->request,client_tmp->paramLen,client_tmp->param);
+                    //char test[36] = {};
+                    //sprintf(test,"test okay len = %d",client_tmp->paramLen);
+                    //sendto(server_socket_fd,test,strlen(test),0,(struct sockaddr*)&client_addr,client_addr_length);
+                    argv[0] = (char *)lynq_requset_to_string(client_tmp->request);
+                    argc = 0;
+                    if(client_tmp->paramLen > 0)
                     {
-                        RLOGE("%s: error input.", buffer);
+                        /*transfer struct*/
+                        argc = parse_param(client_tmp->param, argv+1, MAX_ARGS);
+                        if(argc < 1)
+                        {
+                            RLOGE("%s: error input.", buffer);
+                            continue;
+                        }
+                    }
+                    printf("argc =%d\n",argc);
+                    argc = argc+1;
+                    for(int t = 0;t<argc;t++)
+                    {
+                        RLOGD("warren test argv[%d]=%s\n",t,argv[t]);
+                    }
+                    COMMAND *command = find_command(argv[0]);
+                    if(!command)
+                    {
+                        RLOGE("%s: No such command for DemoApp", argv[0]);
                         continue;
                     }
-                }
-                printf("argc =%d\n",argc);
-                argc = argc+1;
-                for(int t = 0;t<argc;t++)
-                {
-                    RLOGD("warren test argv[%d]=%s\n",t,argv[t]);
-                }
-                COMMAND *command = find_command(argv[0]);
-                if(!command)
-                {
-                    RLOGE("%s: No such command for DemoApp", argv[0]);
-                    continue;
-                }
-                int32_t request;
-                request = command->request;
-                RIL_SOCKET_ID id = RIL_SOCKET_1;
-                if(utils::is_support_dsds()) {
-                    id = (RIL_SOCKET_ID)get_default_sim_all_except_data();
-                } else if(utils::is_suppport_dsss()) {
-                    id = (RIL_SOCKET_ID)Phone_utils::get_enable_sim_for_dsss();
-                }
-                if(request == -1)
-                {
-                    (*(command->func)) (argc, argv, id, NULL);
-                    continue;
-                }
-                if (request < 1 || (request >= (int32_t)NUM_ELEMS(s_commands) && request < RIL_REQUEST_VENDOR_BASE)) {
-                    RLOGW("unsupported request code %d token %d", request);
-                    // FIXME this should perhaps return a response
-                    continue;
-                }
-                /*jb.qi add for two sim suspend 2022/9/19 start  lei modify for factory test of sleep*/
-                if(request == LYNQ_REQUEST_CHANGE_SCREEN_STATE || request == LYNQ_REQUEST_CHANGE_RADIO)
-                {
-                    int i;
-                    RLOGD("lynq_request_change_screen_state");
-                    if(request == LYNQ_REQUEST_CHANGE_SCREEN_STATE)
-                    {
-                        for(i=0;i<2;i++) //suspend sim0 and sim1
-                        {
-                            lynq_sendRequestToMd(RIL_REQUEST_SCREEN_STATE, i, argv, lynqClient_addr, client_tmp->uToken);
-                        }
+                    int32_t request;
+                    request = command->request;
+                    RIL_SOCKET_ID id = RIL_SOCKET_1;
+                    if(utils::is_support_dsds()) {
+                        id = (RIL_SOCKET_ID)get_default_sim_all_except_data();
+                    } else if(utils::is_suppport_dsss()) {
+                        id = (RIL_SOCKET_ID)Phone_utils::get_enable_sim_for_dsss();
                     }
-                    /*lei modify for factory test of sleep*/
-                    if(request == LYNQ_REQUEST_CHANGE_RADIO)
+                    if(request == -1)
                     {
-                        for(i=0;i<2;i++) //both radio on/off
-                        {
-                            lynq_sendRequestToMd(RIL_REQUEST_RADIO_POWER, i, argv, lynqClient_addr, client_tmp->uToken);
-                        }
+                        (*(command->func)) (argc, argv, id, NULL);
+                        continue;
                     }
-                    continue;
+                    if (request < 1 || (request >= (int32_t)NUM_ELEMS(s_commands) && request < RIL_REQUEST_VENDOR_BASE)) {
+                        RLOGW("unsupported request code %d token %d", request);
+                        // FIXME this should perhaps return a response
+                        continue;
+                    }
+                    /*jb.qi add for two sim suspend 2022/9/19 start  lei modify for factory test of sleep*/
+                    if(request == LYNQ_REQUEST_CHANGE_SCREEN_STATE || request == LYNQ_REQUEST_CHANGE_RADIO)
+                    {
+                        int i;
+                        RLOGD("lynq_request_change_screen_state");
+                        if(request == LYNQ_REQUEST_CHANGE_SCREEN_STATE)
+                        {
+                            for(i=0;i<2;i++) //suspend sim0 and sim1
+                            {
+                                lynq_sendRequestToMd(RIL_REQUEST_SCREEN_STATE, i, argv, lynqClient_addr, client_tmp->uToken);
+                            }
+                        }
+                        /*lei modify for factory test of sleep*/
+                        if(request == LYNQ_REQUEST_CHANGE_RADIO)
+                        {
+                            for(i=0;i<2;i++) //both radio on/off
+                            {
+                                lynq_sendRequestToMd(RIL_REQUEST_RADIO_POWER, i, argv, lynqClient_addr, client_tmp->uToken);
+                            }
+                        }
+                        continue;
+                    }
+                    /*jb.qi add for two sim suspend 2022/9/19 end*/
+                    RLOGD("REQUEST: %s ParamterNum:%d", requestToString(request), argc);
+                    RequestInfo *pRI  = creatRILInfoAndInit(request, UDP, (RIL_SOCKET_ID)(id));
+                    pRI->uToken = client_tmp->uToken;
+                    pRI->lynqEvent = 2;
+                    pRI->uClient_addr.sin_family = lynqClient_addr.sin_family;
+                    pRI->uClient_addr.sin_addr.s_addr = lynqClient_addr.sin_addr.s_addr;
+                    pRI->uClient_addr.sin_port = lynqClient_addr.sin_port;
+                    //sendto(server_socket_fd,test,strlen(test),0,(struct sockaddr*)&pRI->uClient_addr,client_addr_length);
+                    //pRI->uClient_addr.sa_family = (struct sockaddr)client_addr.sa_family;
+                    //memcpy(pRI->uClient_addr.sa_data,&client_addr
+                    //Radio on/off only allow one thread operate.
+                    if(request == RIL_REQUEST_RADIO_POWER)
+                    {
+                        speciaRequest_wait();
+                    }
+    #ifdef ECALL_SUPPORT
+                    else if(request == RIL_REQUEST_ECALL_FAST_MAKE_ECALL)
+                    {
+                        init_redial_flag();
+                    }
+    #endif
+                    memset(Time_buf,0,sizeof(Time_buf));
+                    GetTimeString(Time_buf);
+                    //FUNCTION_CALLED(Time_buf,requestToString(request));
+                    int waittoken = pRI->token;
+                    (*(command->func)) (argc, argv, pRI->socket_id, pRI);
+                    FUNCTION_CALLED(Time_buf,requestToString(request));
+                    waitResponse(waittoken);
+                    memset(Time_buf,0,sizeof(Time_buf));
+                    GetTimeString(Time_buf);
+                    FUNCTION_RETURN(Time_buf,requestToString(request));          
+                    bzero(buffer, LYNQ_SOCKET_BUFFER);
+
                 }
-                /*jb.qi add for two sim suspend 2022/9/19 end*/
-                RLOGD("REQUEST: %s ParamterNum:%d", requestToString(request), argc);
-                RequestInfo *pRI  = creatRILInfoAndInit(request, UDP, (RIL_SOCKET_ID)(id));
-                pRI->uToken = client_tmp->uToken;
-                pRI->lynqEvent = 2;
-                pRI->uClient_addr.sin_family = lynqClient_addr.sin_family;
-                pRI->uClient_addr.sin_addr.s_addr = lynqClient_addr.sin_addr.s_addr;
-                pRI->uClient_addr.sin_port = lynqClient_addr.sin_port;
-                //sendto(server_socket_fd,test,strlen(test),0,(struct sockaddr*)&pRI->uClient_addr,client_addr_length);
-                //pRI->uClient_addr.sa_family = (struct sockaddr)client_addr.sa_family;
-                //memcpy(pRI->uClient_addr.sa_data,&client_addr
-                //Radio on/off only allow one thread operate.
-                if(request == RIL_REQUEST_RADIO_POWER)
-                {
-                    speciaRequest_wait();
-                }
-#ifdef ECALL_SUPPORT
-                else if(request == RIL_REQUEST_ECALL_FAST_MAKE_ECALL)
-                {
-                    init_redial_flag();
-                }
-#endif
-                memset(Time_buf,0,sizeof(Time_buf));
-                GetTimeString(Time_buf);
-                //FUNCTION_CALLED(Time_buf,requestToString(request));
-                int waittoken = pRI->token;
-                (*(command->func)) (argc, argv, pRI->socket_id, pRI);
-                FUNCTION_CALLED(Time_buf,requestToString(request));
-                waitResponse(waittoken);
-                memset(Time_buf,0,sizeof(Time_buf));
-                GetTimeString(Time_buf);
-                FUNCTION_RETURN(Time_buf,requestToString(request));
+                RLOGE("process Receive Data end");
+             //   continue;                
             }
         }
      }
      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)
@@ -6162,17 +6158,64 @@
     return 0;
 }
 
-int LYNQ_RIL_urcBroadcast(Parcel &p)
+bool is_need_use_shm(int dataSize, int urc_id)
+{
+    switch(urc_id)
+    {
+        /*network*/
+        case RIL_UNSOL_RESPONSE_VOICE_NETWORK_STATE_CHANGED:
+        case RIL_UNSOL_RESPONSE_PS_NETWORK_STATE_CHANGED:
+        case RIL_UNSOL_RESPONSE_IMS_NETWORK_STATE_CHANGED:
+        case RIL_UNSOL_SIGNAL_STRENGTH:
+        /*sms*/
+        case RIL_UNSOL_RESPONSE_NEW_SMS:
+        /*sim*/
+        //case RIL_UNSOL_RESPONSE_SIM_STATUS_CHANGED:   Not supported at present
+        /*call*/
+        case RIL_UNSOL_RESPONSE_CALL_STATE_CHANGED:
+        case RIL_UNSOL_CALL_RING:
+        case RIL_UNSOL_RINGBACK_TONE:
+        case RIL_UNSOL_CALL_INFO_INDICATION:
+#ifdef ECALL_SUPPORT
+        case RIL_UNSOL_ECALL_INDICATIONS://9502        
+#endif       
+       /*Data*/
+        case LYNQ_URC_DATA_CALL_STATUS_IND: 
+        case LYNQ_URC_MODIFY_APNDB:
+        case LYNQ_URC_RESET_APNDB:
+            break;
+        default:
+            return false;
+    }
+    if(dataSize>urc_broadcase_shm_size_limit && dataSize <= get_max_shem_buffer_size())
+    {
+        return true;
+    }
+    return false;
+}
+
+int LYNQ_RIL_urcBroadcast(Parcel &p, int urc_id)
 {
     RLOGD("LYNQ_RIL_urcBroadcast send start");
-    int ret =0;
-    bool sendResult =false;
-    ssize_t sent = 0;
-    uint8_t dataLength[4];
-    int verify = 0x55aa;
-    p.setDataPosition(0);
+    int ret =0;   
+    ssize_t sent = 0;   
+    p.setDataPosition(0);    
     int dataSize = p.dataSize();
     const uint8_t* data = p.data();
+    RLOGD("LYNQ_RIL_urcBroadcast urc_id is %d, dataSize=%d, msg is %s", urc_id, dataSize, requestToString(urc_id));
+    if(is_need_use_shm(dataSize,urc_id))
+    {
+        int index,level;
+        if(get_cur_shem_buffer_index(dataSize,&level,&index))
+        {
+            char* p_shm_buffer=get_shem_buffer(level,index);
+            memcpy(p_shm_buffer,data,dataSize);
+            uint32_t* pFirstInt = (uint32_t*) const_cast<uint8_t*> (data);
+               *pFirstInt=*pFirstInt+((index+1)<<SHM_BUFFER_INDEX_OFFSET)+((dataSize)<<SHM_BUFFER_SIZE_OFFSET);          
+            dataSize=sizeof(int32_t)*2;
+            RLOGD("LYNQ_RIL_urcBroadcast use share mem level is %d, index is %d,pointer is %p",level,index,p_shm_buffer);
+        }        
+    }
     sent = sendto(lynq_urc_socket_fd, data, dataSize, 0, (struct sockaddr *)&urc_broadcast_addr, sizeof(urc_broadcast_addr));
     if( sent < 0 )
     {
@@ -6180,6 +6223,7 @@
                 sent,lynq_urc_socket_fd, dataSize);
         return -1;
     }
+    
     return 0;
 }
 /*Warren add for t800 RIL Service 2021/12/10 end*/
@@ -6263,7 +6307,6 @@
         } else if(utils::is_suppport_dsss()) {
             id = (RIL_SOCKET_ID)Phone_utils::get_enable_sim_for_dsss();
         }
-
         if(request == -1)
         {
             (*(command->func)) (argc, argv, id, NULL);
@@ -6697,11 +6740,6 @@
                         lynq_get_factory_data(argc,argv);
                         break;
                     }
-                    case LYNQ_GOTO_FOTA:
-                    {
-                         lynq_atfota_test(argv);
-                         break;
-                     }
                     /*rita add start*/
                     case LYNQ_GOTO_TEMP:
                     {
@@ -6941,13 +6979,19 @@
     } else {
         pRI->pCI = find_mtk_command(request);
     }
+    /*lei modify for Some requests that are not in the ril_commands.h and mtk_ril_commands.h but in commands.h*/
+    COMMAND *command = find_command(reqString);
     if(pRI->pCI == NULL){
-        RLOGE("pCI command not found!");
-        if(pRI) {
-            free(pRI);
+        if(command == NULL)
+        {
+            RLOGE("pCI command & command not found!");
+            if(pRI) {
+                free(pRI);
+            }
+            return;
         }
-        return;
     }
+    /*lei modify for Some requests that are not in the ril_commands.h and mtk_ril_commands.h but in commands.h*/
 
     if(utils::is_suppport_dsss()){
         pRI->socket_id = (RIL_SOCKET_ID)Phone_utils::get_enable_sim_for_dsss();
@@ -6956,11 +7000,10 @@
     if(utils::is_support_dsds() && (request != RIL_REQUEST_RADIO_POWER)){
         pRI->socket_id = (RIL_SOCKET_ID)get_atci_sim();
     }
-
     pRI->p_next = NULL;
 
-    COMMAND *command = find_command(reqString);
-
+    
+    RLOGD("function %s line %d reqString %s", __FUNCTION__, __LINE__, reqString);
     if(command == NULL) {
         RLOGE("ATCI request command find error!");
         if(pRI) {
@@ -7163,7 +7206,8 @@
     while (s_started == 0) {
         pthread_cond_wait(&s_startupCond, &s_startupMutex);
     }
-    /*mobiletek add*/
+    //warren delete,beacuse of update at fwk.
+    /*mobiletek add*
     s_started = 0;
     result = pthread_create(&s_tid_dispatch, &attr, eventLoop_at, NULL);
     if (result != 0) {
@@ -7174,7 +7218,7 @@
     while (s_started == 0) {
         pthread_cond_wait(&s_startupCond, &s_startupMutex);
     }
-    /*mobiletek add*/
+    *mobiletek add*/ 
     result = pthread_create(&s_tid_dispatch, &attr, responseLoop, NULL);
     if (result != 0) {
         RLOGW("Failed to create response dispatch thread: %s", strerror(result));
diff --git a/src/lynq/framework/lynq-ril-service/src/sim.cpp b/src/lynq/framework/lynq-ril-service/src/sim.cpp
index d77ab19..f1bba40 100755
--- a/src/lynq/framework/lynq-ril-service/src/sim.cpp
+++ b/src/lynq/framework/lynq-ril-service/src/sim.cpp
@@ -46,6 +46,8 @@
 #undef LOG_TAG
 #define LOG_TAG "DEMO_SIM"
 
+int g_switch_card_error = 0;
+
 static char* checkParameters(char* para){
     if (strcasecmp(para, "null") == 0) {
         return "";
@@ -182,19 +184,25 @@
         free(pRI);
         RLOGD("the paremeters numbers isn't right , so return");
         android::emResultNotify("Set failed.\n");
-        lynq_output_info("\nCME ERROR:2\n");
+        //lei modify: elt port is no longer used
+        //lynq_output_info("\nCME ERROR:2\n");
+        g_switch_card_error = 2;
         return -1;
     }
 
     if(Radio_capability_switch_util::is_sim_inserted(atoi(argv[1]))) {
         set_default_sim_all(atoi(argv[1]));
         android::emResultNotify("Set successful.\n");
-        lynq_output_info("\nOK\n");
+        //lei modify: elt port is no longer used
+        //lynq_output_info("\nOK\n");
+        g_switch_card_error = 0;
         free(pRI);
     } else {
         RLOGD("Set default all fail, SIM card absent");
         android::emResultNotify("Set default all fail, SIM card absent.\n");
-        lynq_output_info("\nCME ERROR:11\n");
+        //lei modify: elt port is no longer used
+        //lynq_output_info("\nCME ERROR:11\n");
+        g_switch_card_error = 11;
         free(pRI);
     }
 
diff --git a/src/lynq/framework/lynq-ril-service/src/sim.h b/src/lynq/framework/lynq-ril-service/src/sim.h
index fe1863c..54d2564 100755
--- a/src/lynq/framework/lynq-ril-service/src/sim.h
+++ b/src/lynq/framework/lynq-ril-service/src/sim.h
@@ -38,6 +38,8 @@
 #include <vendor-ril/telephony/ril.h>
 #include  "common.h"
 
+extern int g_switch_card_error;
+
 int getIccCardStatus(int argc, char **argv, RIL_SOCKET_ID socket_id, RequestInfo *pRI);
 int supplyIccPinForApp(int argc, char **argv, RIL_SOCKET_ID socket_id, RequestInfo *pRI);
 int changeIccPinForApp(int argc, char **argv, RIL_SOCKET_ID socket_id, RequestInfo *pRI);
diff --git a/src/lynq/framework/lynq-ril-service/src/sms/lynqSmsManager/lynq_sms_manager.cpp b/src/lynq/framework/lynq-ril-service/src/sms/lynqSmsManager/lynq_sms_manager.cpp
index e7b4d03..4b51c0d 100755
--- a/src/lynq/framework/lynq-ril-service/src/sms/lynqSmsManager/lynq_sms_manager.cpp
+++ b/src/lynq/framework/lynq-ril-service/src/sms/lynqSmsManager/lynq_sms_manager.cpp
@@ -464,7 +464,7 @@
 {
     char *zErrMsg = 0;
     int rc;
-    char sql[LYNQ_SMS_MAX_SCA_NUMBER_LEN+LYNQ_SMS_MAX_PDU_NUMBER_LEN+LYNQ_SMS_MAX_TEXT_NUMBER_LEN+3+1+100]={0};
+    //char sql[LYNQ_SMS_MAX_SCA_NUMBER_LEN+LYNQ_SMS_MAX_PDU_NUMBER_LEN+LYNQ_SMS_MAX_TEXT_NUMBER_LEN+3+1+100]={0};
     /* Open database */
     rc = sqlite3_open(path, &smsDb);
     if( rc )
@@ -475,9 +475,10 @@
     }
     LYDBGLOG("[%s] Opened database successfully",__FUNCTION__);
     /* Create SQL statement */
-    sprintf(sql,"INSERT INTO LYNQSMS (ID,SLOT,STATUS,ADDRESS,SMSC,CHARSET,PDU,CONTENT,CURRENT,TOTAL) VALUES (%d,%d,%d,'%s','%s',%d,'%s','%s',%d,%d);",id,slot_id,status,address,smsc,charset,pdu,content,current,total);
+    //sprintf(sql,"INSERT INTO LYNQSMS (ID,SLOT,STATUS,ADDRESS,SMSC,CHARSET,PDU,CONTENT,CURRENT,TOTAL) VALUES (%d,%d,%d,'%s','%s',%d,'%s','%s',%d,%d);",id,slot_id,status,address,smsc,charset,pdu,content,current,total);
     /* Execute SQL statement */
     //printf("%s\n",sql);
+    char *sql = sqlite3_mprintf("INSERT INTO LYNQSMS VALUES('%d','%d','%d','%q','%q','%d','%q','%q','%d','%d')",id,slot_id,status,address,smsc,charset,pdu,content,current,total);
     rc = sqlite3_exec(smsDb, sql, NULL,NULL, &zErrMsg);
     if( rc != SQLITE_OK )
     {
diff --git a/src/lynq/framework/lynq-ril-service/src/stateManager/stateManager.cpp b/src/lynq/framework/lynq-ril-service/src/stateManager/stateManager.cpp
index 9e16b5e..d4f3ce3 100755
--- a/src/lynq/framework/lynq-ril-service/src/stateManager/stateManager.cpp
+++ b/src/lynq/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/src/lynq/framework/lynq-sdk-ready/src/main.cpp b/src/lynq/framework/lynq-sdk-ready/src/main.cpp
index 5df9f27..0ff285c 100755
--- a/src/lynq/framework/lynq-sdk-ready/src/main.cpp
+++ b/src/lynq/framework/lynq-sdk-ready/src/main.cpp
@@ -10,8 +10,14 @@
 extern "C" {
 #endif
 
+#undef LOG_TAG
+#define LOG_TAG "LYNQ_SDK_READY"
+
 int main(void){
     RLOGD("lynq-sdk-ready begin");
+    //xf.li add in 2023.01.04 for API-696 start
+    system("hwnat -O 5");
+    //xf.li add in 2023.01.04 for API-696 end
     start_timer_request();
     while (1)
     {
diff --git a/src/lynq/framework/lynq-sdk-ready/src/timer/lynq_timer.cpp b/src/lynq/framework/lynq-sdk-ready/src/timer/lynq_timer.cpp
index e0bcffc..bbe70a0 100755
--- a/src/lynq/framework/lynq-sdk-ready/src/timer/lynq_timer.cpp
+++ b/src/lynq/framework/lynq-sdk-ready/src/timer/lynq_timer.cpp
@@ -80,11 +80,11 @@
         if(strstr(buffer,service))
         {
             pclose(fp);
-            printf("check_service 1\n");
+            RLOGD("check_service 1\n");
             return 1;
         }
     }
-    printf("check_service 0\n");
+    RLOGD("check_service 0\n");
     pclose(fp);
     return 0;
 }
@@ -143,7 +143,7 @@
         bzero(res_data, MAX_LEN);
         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);
-        printf("send_num %d\n", send_num);
+        RLOGD("send_num %d\n", send_num);
         if(send_num == 0)  
         {
             RLOGD("__FUNCTION__ %s Close to end %s\n", __FUNCTION__, strerror(errno));
@@ -162,7 +162,7 @@
         }
         //get data msg
         recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN,0,(struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
-        printf("recv_num %d\n", recv_num);
+        RLOGD("recv_num %d\n", recv_num);
         if(recv_num == 0)
         {
             RLOGD("__FUNCTION__ %s Close to end\n", __FUNCTION__);
diff --git a/src/lynq/lib/libautosuspend/libautosuspend.c b/src/lynq/lib/libautosuspend/libautosuspend.c
index d39bab1..58412a6 100644
--- a/src/lynq/lib/libautosuspend/libautosuspend.c
+++ b/src/lynq/lib/libautosuspend/libautosuspend.c
@@ -28,6 +28,7 @@
 
 static bool libautosuspend_inited;
 
+bool feedback_flag = true; //add for after sleeping once calling lynq_wailt_wakeup_event does not return sleep time
 // static bool libautosuspend_enabled;
 
 // static pthread_mutex_t get_feedback_mutex = PTHREAD_MUTEX_INITIALIZER;
@@ -468,7 +469,16 @@
    int *socket_timeout = NULL;
    struct time_info_t time_info;
    int ret = 0;
-    
+   /*add for after sleeping once calling lynq_wailt_wakeup_event does not return sleep time start*/
+   if(feedback_flag == true)
+   {
+       if(libautosuspend_init() != 0)
+       {
+           return -1;
+       }
+   }
+   feedback_flag = false; 
+   /*add for after sleeping once calling lynq_wailt_wakeup_event does not return sleep time end*/
    memset(&time_info,0,sizeof(struct time_info_t));
    if(sleep_start_time == NULL || wakeup_time == NULL )
    {
diff --git a/src/lynq/lib/liblynq-at-common/LICENSE b/src/lynq/lib/liblynq-at-common/LICENSE
new file mode 100755
index 0000000..382fc78
--- /dev/null
+++ b/src/lynq/lib/liblynq-at-common/LICENSE
@@ -0,0 +1,31 @@
+Copyright Statement:
+
+This software/firmware and related documentation ("Mobiletek Software") are
+protected under relevant copyright laws. The information contained herein is
+confidential and proprietary to Mobiletek Inc. and/or its licensors. Without
+the prior written permission of Mobiletek inc. and/or its licensors, any
+reproduction, modification, use or disclosure of Mobiletek Software, and
+information contained herein, in whole or in part, shall be strictly
+prohibited.
+
+Mobiletek Inc. (C) 2015. All rights reserved.
+
+BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("Mobiletek SOFTWARE")
+RECEIVED FROM Mobiletek AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
+ON AN "AS-IS" BASIS ONLY. Mobiletek EXPRESSLY DISCLAIMS ANY AND ALL
+WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
+WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+NONINFRINGEMENT. NEITHER DOES Mobiletek PROVIDE ANY WARRANTY WHATSOEVER WITH
+RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
+INCORPORATED IN, OR SUPPLIED WITH THE Mobiletek SOFTWARE, AND RECEIVER AGREES
+TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
+RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
+OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN Mobiletek
+SOFTWARE. Mobiletek SHALL ALSO NOT BE RESPONSIBLE FOR ANY Mobiletek SOFTWARE
+RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND Mobiletek'S
+ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE Mobiletek SOFTWARE
+RELEASED HEREUNDER WILL BE, AT Mobiletek'S OPTION, TO REVISE OR REPLACE THE
+Mobiletek SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
+CHARGE PAID BY RECEIVER TO Mobiletek FOR SUCH Mobiletek SOFTWARE AT ISSUE.
\ No newline at end of file
diff --git a/src/lynq/lib/liblynq-at-common/atci_at_util.cpp b/src/lynq/lib/liblynq-at-common/atci_at_util.cpp
new file mode 100755
index 0000000..4c215a7
--- /dev/null
+++ b/src/lynq/lib/liblynq-at-common/atci_at_util.cpp
@@ -0,0 +1,171 @@
+#include <string.h>
+#include <stdlib.h>
+#include <log/log.h>
+#include "atci_at_util.h"
+
+#undef LOG_TAG
+#define LOG_TAG "AT_COMMON"
+
+int atci_at_skip_space(char **p_cur) {
+  if (*p_cur == NULL) {
+    return SYS_FAIL;
+  }
+  while (**p_cur == ATCI_SPACE) {
+    (*p_cur)++;
+  }
+  return SYS_SUCC;
+}
+int atci_at_hasmore(char **p_cur) {
+  if (*p_cur == NULL || **p_cur == ATCI_END_CHAR) {
+    return SYS_FAIL;
+  }
+  return SYS_SUCC;
+}
+
+int atci_at_to_equal(char **p_cur) {
+  if (*p_cur == NULL) {
+    return SYS_FAIL;
+  }
+  *p_cur = strchr(*p_cur, ATCI_EQUAL);
+  if (*p_cur == NULL) {
+    return SYS_FAIL;
+  }
+  (*p_cur)++;
+  return SYS_SUCC;
+}
+int atci_at_to_colon(char **p_cur) {
+  if (*p_cur == NULL) {
+    return SYS_FAIL;
+  }
+  *p_cur = strchr(*p_cur, ATCI_COLON);
+  if (*p_cur == NULL) {
+    return SYS_FAIL;
+  }
+  (*p_cur)++;
+  return SYS_SUCC;
+}
+int atci_at_skip_next_comma(char **p_cur) {
+  if (*p_cur == NULL) {
+    return SYS_FAIL;
+  }
+  *p_cur = strchr(*p_cur, ATCI_COMMA);
+  if (*p_cur == NULL) {
+    return SYS_FAIL;
+  }
+  (*p_cur)++;
+  return SYS_SUCC;
+}
+int atci_at_get_next_key(char **p_cur, char **p_out) {
+  if (*p_cur == NULL) {
+    return SYS_FAIL;
+  }
+  atci_at_skip_space(p_cur);
+  if (**p_cur == ATCI_DOUBLE_QUOTE) {
+    (*p_cur)++;
+    *p_out = strsep(p_cur, "\"");
+    atci_at_skip_next_comma(p_cur);
+  } else {
+    *p_out = strsep(p_cur, ",");
+  }
+  return SYS_SUCC;
+}
+
+/**
+ * Parses the next integer in the  line and places it in *p_out
+ * "uns" is indicate in unsigned or not
+ * returns SYS_SUCC on success
+ * returns SYS_FAIL  on fail
+ * updates *p_cur
+ * "base" is the same as the base param in strtol
+ */
+int atci_at_get_nextint_base(char **p_cur, int *p_out, int base, int uns) {
+  char *ret;
+  if (*p_cur == NULL) {
+    return SYS_FAIL;
+  }
+  if (SYS_FAIL == atci_at_get_next_key(p_cur, &ret)) {
+    return SYS_FAIL;
+  } else {
+    long l;
+    char *end;
+    if (uns) {
+      l = strtoul(ret, &end, base);
+    } else {
+      l = strtol(ret, &end, base);
+    }
+    *p_out = (int) l;
+    if (end == ret) {
+      return SYS_FAIL;
+    }
+  }
+  return SYS_SUCC;
+}
+int atci_at_get_nextint(char **p_cur, int *p_out) {
+  return atci_at_get_nextint_base(p_cur, p_out, 10, 0);
+}
+int atci_at_get_nexthexint(char **p_cur, int *p_out) {
+  return atci_at_get_nextint_base(p_cur, p_out, 16, 1);
+}
+int atci_get_cmd_mode(char *line) {
+  int reasult = AT_WRONG_MODE;
+  char *p_cur = NULL;
+  if (NULL == line) {
+    reasult = AT_WRONG_MODE;
+    RLOGD("atci_get_cmd_mode error, input is NULL");
+    return reasult;
+  }
+  p_cur = strchr(line, ATCI_EQUAL);
+  if (NULL == p_cur) {
+    p_cur = strchr(line, ATCI_QUESTION_MARK);
+    if (NULL == p_cur) {
+      reasult = AT_ACTIVE_MODE;
+    } else {
+      reasult = AT_READ_MODE;
+    }
+  } else {
+    p_cur++;
+    atci_at_skip_space(&p_cur);
+    if (ATCI_QUESTION_MARK == *p_cur) {
+      reasult = AT_TEST_MODE;
+    } else {
+      reasult = AT_SET_MODE;
+    }
+  }
+  RLOGD("atci_get_cmd_mode success[%d]", reasult);
+  return reasult;
+}
+
+char* atci_get_cmd_prefix(char *line) {
+  int buf_len;
+  char *prefix;
+  char *end_ptr;
+  if (NULL == line) {
+    RLOGD("input is null");
+    return NULL;
+  }
+  end_ptr = line;
+  while (!ATCI_IS_CAHR(*end_ptr, ATCI_EQUAL)
+      && !ATCI_IS_CAHR(*end_ptr, ATCI_QUESTION_MARK)
+      && !ATCI_IS_CAHR(*end_ptr, ATCI_END_CHAR)
+      && !ATCI_IS_CAHR(*end_ptr, ATCI_CR) && !ATCI_IS_CAHR(*end_ptr, ATCI_LF)) {
+    end_ptr++;
+  }
+  buf_len = end_ptr - line + 1;
+  prefix = (char *) calloc(buf_len, 1);
+  if (prefix) {
+    int i;
+    char *in_ptr = line;
+    char *out_ptr = prefix;
+    for (i = 0; i < buf_len - 1; i++) {
+      if (!ATCI_IS_CAHR(*in_ptr, ATCI_SPACE)) {
+        *out_ptr = ATCI_UPPER_TO_LOWER(*in_ptr);
+        out_ptr++;
+      }
+      in_ptr++;
+    }
+    *out_ptr = ATCI_END_CHAR;
+  }
+  RLOGD("get cmd prefix [%d][%s]", buf_len, prefix);
+  return prefix;
+}
+
diff --git a/src/lynq/lib/liblynq-at-common/atci_at_util.h b/src/lynq/lib/liblynq-at-common/atci_at_util.h
new file mode 100755
index 0000000..d84fd63
--- /dev/null
+++ b/src/lynq/lib/liblynq-at-common/atci_at_util.h
@@ -0,0 +1,128 @@
+#ifndef _ATCI_AT_UTIL_H_
+#define _ATCI_AT_UTIL_H_
+
+#define SYS_SUCC                    0
+#define SYS_FAIL                    -1
+
+typedef enum {
+  ATCI_SPACE = ' ',
+  ATCI_EQUAL = '=',
+  ATCI_COMMA = ',',
+  ATCI_SEMICOLON = ';',
+  ATCI_COLON = ':',
+  ATCI_AT = '@',
+  ATCI_HAT = '^',
+  ATCI_MONEY = '$',
+  ATCI_DOUBLE_QUOTE = '"',
+  ATCI_QUESTION_MARK = '?',
+  ATCI_EXCLAMATION_MARK = '!',
+  ATCI_FORWARD_SLASH = '/',
+  ATCI_L_ANGLE_BRACKET = '<',
+  ATCI_R_ANGLE_BRACKET = '>',
+  ATCI_R_BRACKET = ')',
+  ATCI_L_BRACKET = '(',
+  ATCI_L_SQ_BRACKET = '[',
+  ATCI_R_SQ_BRACKET = ']',
+  ATCI_L_CURLY_BRACKET = '{',
+  ATCI_R_CURLY_BRACKET = '}',
+  ATCI_CHAR_STAR = '*',
+  ATCI_CHAR_POUND = '#',
+  ATCI_CHAR_AMPSAND = '&',
+  ATCI_CHAR_PERCENT = '%',
+  ATCI_CHAR_PLUS = '+',
+  ATCI_CHAR_MINUS = '-',
+  ATCI_CHAR_DOT = '.',
+  ATCI_CHAR_ULINE = '_',
+  ATCI_CHAR_TILDE = '~',
+  ATCI_CHAR_REVERSE_SOLIDUS = '\\',
+  ATCI_CHAR_VERTICAL_LINE = '|',
+  ATCI_END_CHAR = '\0',
+  ATCI_CR = '\r',
+  ATCI_LF = '\n',
+  ATCI_CHAR_0 = '0',
+  ATCI_CHAR_1 = '1',
+  ATCI_CHAR_2 = '2',
+  ATCI_CHAR_3 = '3',
+  ATCI_CHAR_4 = '4',
+  ATCI_CHAR_5 = '5',
+  ATCI_CHAR_6 = '6',
+  ATCI_CHAR_7 = '7',
+  ATCI_CHAR_8 = '8',
+  ATCI_CHAR_9 = '9',
+  ATCI_CHAR_A = 'A',
+  ATCI_CHAR_B = 'B',
+  ATCI_CHAR_C = 'C',
+  ATCI_CHAR_D = 'D',
+  ATCI_CHAR_E = 'E',
+  ATCI_CHAR_F = 'F',
+  ATCI_CHAR_G = 'G',
+  ATCI_CHAR_H = 'H',
+  ATCI_CHAR_I = 'I',
+  ATCI_CHAR_J = 'J',
+  ATCI_CHAR_K = 'K',
+  ATCI_CHAR_L = 'L',
+  ATCI_CHAR_M = 'M',
+  ATCI_CHAR_N = 'N',
+  ATCI_CHAR_O = 'O',
+  ATCI_CHAR_P = 'P',
+  ATCI_CHAR_Q = 'Q',
+  ATCI_CHAR_R = 'R',
+  ATCI_CHAR_S = 'S',
+  ATCI_CHAR_T = 'T',
+  ATCI_CHAR_U = 'U',
+  ATCI_CHAR_V = 'V',
+  ATCI_CHAR_W = 'W',
+  ATCI_CHAR_X = 'X',
+  ATCI_CHAR_Y = 'Y',
+  ATCI_CHAR_Z = 'Z',
+  ATCI_CHAR_a = 'a',
+  ATCI_CHAR_b = 'b',
+  ATCI_CHAR_c = 'c',
+  ATCI_CHAR_d = 'd',
+  ATCI_CHAR_e = 'e',
+  ATCI_CHAR_f = 'f',
+  ATCI_CHAR_g = 'g',
+  ATCI_CHAR_h = 'h',
+  ATCI_CHAR_i = 'i',
+  ATCI_CHAR_j = 'j',
+  ATCI_CHAR_k = 'k',
+  ATCI_CHAR_l = 'l',
+  ATCI_CHAR_m = 'm',
+  ATCI_CHAR_n = 'n',
+  ATCI_CHAR_o = 'o',
+  ATCI_CHAR_p = 'p',
+  ATCI_CHAR_q = 'q',
+  ATCI_CHAR_r = 'r',
+  ATCI_CHAR_s = 's',
+  ATCI_CHAR_t = 't',
+  ATCI_CHAR_u = 'u',
+  ATCI_CHAR_v = 'v',
+  ATCI_CHAR_w = 'w',
+  ATCI_CHAR_x = 'x',
+  ATCI_CHAR_y = 'y',
+  ATCI_CHAR_z = 'z',
+} atci_char_enum;
+
+typedef enum {
+  AT_WRONG_MODE, AT_SET_MODE, //Ex: at+eample=xxx
+  AT_READ_MODE, //Ex: at+eample?
+  AT_TEST_MODE, //Ex: at+eample=?
+  AT_ACTIVE_MODE //Ex: at+eample
+} atci_cmd_mode_e;
+
+#define ATCI_LOWER_TO_UPPER(alpha_char) (((alpha_char >= ATCI_CHAR_a)&&(alpha_char <= ATCI_CHAR_z)) ?  (alpha_char-32): (alpha_char))
+#define ATCI_UPPER_TO_LOWER(alpha_char) (((alpha_char >= ATCI_CHAR_A)&&(alpha_char <= ATCI_CHAR_Z)) ?  (alpha_char+32): (alpha_char))
+#define ATCI_IS_CAHR(input ,alpha_char) ((alpha_char == input)? 1 : 0)
+
+char* atci_get_cmd_prefix(char *line);
+int atci_get_cmd_mode(char *line);
+int atci_at_skip_space(char **p_cur);
+int atci_at_hasmore(char **p_cur);
+int atci_at_to_equal(char **p_cur);
+int atci_at_to_colon(char **p_cur);
+int atci_at_skip_next_comma(char **p_cur);
+int atci_at_get_nextint_base(char **p_cur, int *p_out, int base, int uns);
+int atci_at_get_nextint(char **p_cur, int *p_out);
+int atci_at_get_nexthexint(char **p_cur, int *p_out);
+int atci_at_get_next_key(char **p_cur, char **p_out);
+#endif
diff --git a/src/lynq/lib/liblynq-at-common/include/libat_common/lynq_at_common.h b/src/lynq/lib/liblynq-at-common/include/libat_common/lynq_at_common.h
new file mode 100755
index 0000000..6f68e04
--- /dev/null
+++ b/src/lynq/lib/liblynq-at-common/include/libat_common/lynq_at_common.h
@@ -0,0 +1,23 @@
+/*============================================================================= 
+#     FileName: lynq_at_factory.h
+#     Desc: about at of factory
+#     Author: lei 
+#     Version: V1.0
+#     LastChange: 2022-12-14 
+#     History: 
+      copyright:Mobiletek
+=============================================================================*/
+#ifndef LYNQ_AT_COMMON_H
+#define LYNQ_AT_COMMON_H 1
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef void ( *lynq_atsvc_incb )( const char *input,const int length);
+typedef void ( *lynq_atsvc_outcb )(char *output, int out_max_size, int mode);
+lynq_atsvc_incb lynq_register_at_common(lynq_atsvc_outcb out_cb);
+
+#ifdef __cplusplus
+}
+#endif
+#endif
\ No newline at end of file
diff --git a/src/lynq/lib/liblynq-at-common/lynq_at_common.cpp b/src/lynq/lib/liblynq-at-common/lynq_at_common.cpp
new file mode 100755
index 0000000..ce8476a
--- /dev/null
+++ b/src/lynq/lib/liblynq-at-common/lynq_at_common.cpp
@@ -0,0 +1,402 @@
+
+
+#include <string.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <log/log.h>
+#include "include/libat_common/lynq_at_common.h"
+#include "atci_at_util.h"
+
+#undef LOG_TAG
+#define LOG_TAG "AT_COMMON"
+
+int g_mnetcall_mode = 0;
+int g_gtarndis_mode = 0;
+int g_version_mode = 0;
+
+lynq_atsvc_outcb handle_output;
+
+typedef struct
+{
+    char *cmd;
+    void (*func)(char *input,int mode);
+}Command;
+
+enum
+{
+    Response = 0,
+    Urc
+};
+
+void lynq_response_ok()
+{
+    char *str = "\r\nOK\r\n";
+    handle_output(str, strlen(str), Response);
+}
+
+void lynq_response_error()
+{
+    char *str = "\r\n+CME ERROR:100\r\n";
+    handle_output(str, strlen(str), Response);
+}
+
+static void lynq_get_poepn_buf(char *cmd)
+{
+    FILE *fp;
+    char buf[128] = {0};
+    fp = popen(cmd,"r");
+    while(fgets(buf, sizeof(buf), fp) != NULL){}
+    pclose(fp);
+    RLOGD("buf is %s size %d\n", buf, sizeof(buf));
+    handle_output(buf, strlen(buf), Response);
+    return;
+}
+
+void lynq_handle_rndis(char *input,int type)
+{
+    RLOGD("lynq_handle_rndis type %d\n", type);
+    char buf[128] = {0}; 
+    if(type == AT_SET_MODE)//set
+    {
+        int mode;
+        if (SYS_FAIL == atci_at_to_equal(&input))
+        {
+            lynq_response_error();
+            return SYS_FAIL;
+        }
+        if (SYS_FAIL == atci_at_get_nexthexint(&input, &mode))
+        {
+            lynq_response_error();
+            return SYS_FAIL;
+        }
+        if(mode == 1)
+        {
+            g_mnetcall_mode = mode;
+            system("connmanctl enable gadget");
+            system("connmanctl tether gadget on");
+            lynq_response_ok();
+        }
+        else if (mode == 0)
+        {
+            g_mnetcall_mode = mode;
+            system("connmanctl disable gadget");
+            lynq_response_ok();
+        }
+        else
+        {
+            lynq_response_error();
+        }
+    }
+    else if(type == AT_TEST_MODE)//list
+    {
+        sprintf(buf,"+MNETCALL:(0-1)");
+        handle_output(buf, strlen(buf), Response);
+        lynq_response_ok();
+    }
+    else if(type == AT_READ_MODE)//get
+    {
+        sprintf(buf,"+MNETCALL:%d", g_mnetcall_mode);
+        handle_output(buf, strlen(buf), Response);
+        lynq_response_ok();
+    }
+    else
+    {
+        lynq_response_error();
+    }
+    return;
+}
+
+void lynq_handle_rndis_configure(char *input,int type)
+{
+    RLOGD("lynq_handle_rndis_configure type %d\n", type);
+    char buf[128] = {0}; 
+    if(type == AT_SET_MODE)//set
+    {
+        int mode;
+        if (SYS_FAIL == atci_at_to_equal(&input))
+        {
+            lynq_response_error();
+            return SYS_FAIL;
+        }
+        if (SYS_FAIL == atci_at_get_nexthexint(&input, &mode))
+        {
+            lynq_response_error();
+            return SYS_FAIL;
+        }
+        if(mode == 1)
+        {
+            g_gtarndis_mode = mode;
+            system("uci set lynq_uci.rndis=lynq_rndis");
+            system("uci set lynq_uci.rndis.status='1'");
+            system("uci commit");
+            lynq_response_ok();
+        }
+        else if (mode == 0)
+        {
+            g_gtarndis_mode = mode;
+            system("uci set lynq_uci.rndis=lynq_rndis");
+            system("uci set lynq_uci.rndis.status='0'");
+            system("uci commit");
+            lynq_response_ok();
+        }
+        else
+        {
+            lynq_response_error();
+        }
+    }
+    else if(type == AT_TEST_MODE)//list
+    {
+        sprintf(buf,"+GTARNDIS:(0-1)");
+        handle_output(buf, strlen(buf), Response);
+        lynq_response_ok();
+    }
+    else if(type == AT_READ_MODE)//get
+    {
+        sprintf(buf,"+GTARNDIS:%d", g_gtarndis_mode);
+        handle_output(buf, strlen(buf), Response);
+        lynq_response_ok();
+    }
+    else
+    {
+        lynq_response_error();
+    }
+    return;
+}
+
+void lynq_handle_version(char *input,int type)
+{
+    RLOGD("lynq_handle_version type %d\n", type);
+    char buf[128] = {0}; 
+    if(type == AT_SET_MODE)//set
+    {
+        int mode;
+        if (SYS_FAIL == atci_at_to_equal(&input))
+        {
+            lynq_response_error();
+            return SYS_FAIL;
+        }
+        if (SYS_FAIL == atci_at_get_nexthexint(&input, &mode))
+        {
+            lynq_response_error();
+            return SYS_FAIL;
+        }
+        if(mode == 1)
+        {
+            g_version_mode = mode;
+            lynq_get_poepn_buf("uci get lynq_uci_ro.lynq_version.LYNQ_SW_INSIDE_VERSION");
+            //handle_output(buf, strlen(buf), Response);
+            lynq_response_ok();
+        }
+        else if (mode == 0)
+        {
+            g_version_mode = mode;
+            lynq_get_poepn_buf("uci get lynq_uci_ro.lynq_version.LYNQ_SW_VERSION");
+            //handle_output(buf, strlen(buf), Response);
+            lynq_response_ok();
+        }
+        else
+        {
+            lynq_response_error();
+        }
+    }
+    else if(type == AT_TEST_MODE)//list
+    {
+        sprintf(buf,"+CGIR:(0-1)");
+        handle_output(buf, strlen(buf), Response);
+        lynq_response_ok();
+    }
+    else if(type == AT_READ_MODE)//get
+    {
+        sprintf(buf,"+CGIR:%d", g_version_mode);
+        handle_output(buf, strlen(buf), Response);
+        lynq_response_ok();
+    }
+    else if(type == AT_ACTIVE_MODE)//active
+    {
+        if(g_version_mode == 0)
+        {
+            lynq_get_poepn_buf("uci get lynq_uci_ro.lynq_version.LYNQ_SW_VERSION");
+            //handle_output(buf, strlen(buf), Response);
+            lynq_response_ok();
+        }
+        else if(g_version_mode == 1)
+        {
+            lynq_get_poepn_buf("uci get lynq_uci_ro.lynq_version.LYNQ_SW_INSIDE_VERSION");
+            //handle_output(buf, strlen(buf), Response);
+            lynq_response_ok();
+        }
+    }
+    return;
+}
+
+void lynq_display_modem_mode(const char *cmd)
+{
+    FILE *fp;
+    char buf[128] = {0};
+    fp = popen(cmd,"r");
+    while(fgets(buf, sizeof(buf), fp) != NULL){}
+    pclose(fp);
+    RLOGD("buf is %s size %d\n", buf, sizeof(buf));
+    char tmp[16] = {0};
+    sprintf(tmp, "+LGMDS: %c", buf[4]);
+    handle_output(tmp, strlen(tmp), Response);
+    return;
+}
+
+void lynq_handle_modem_status(char *input,int type)
+{
+    RLOGD("lynq_handle_modem_status type %d\n", type); 
+    if(type == AT_ACTIVE_MODE)//active
+    {
+        lynq_display_modem_mode("cat /sys/kernel/ccci/boot");
+        lynq_response_ok();
+    }
+    return;
+}
+
+void lynq_tmp_handle_rndis(char *input,int type)
+{
+     RLOGD("lynq_tmp_handle_rndis type %d\n", type);
+    char *connman_cmd1 = NULL;
+    char *connman_cmd2 = NULL;
+    if(type == AT_SET_MODE)//set
+    {
+        if (SYS_FAIL == atci_at_to_equal(&input))
+        {
+            lynq_response_error();
+            return ;
+        }
+        if (SYS_FAIL == atci_at_get_next_key(&input, &connman_cmd1))
+        {
+            lynq_response_error();
+            return ;
+        }
+         if (SYS_FAIL == atci_at_get_next_key(&input, &connman_cmd2))
+        {
+            //lynq_response_error();
+            //return SYS_FAIL;
+        }
+        if((connman_cmd1 != NULL) && (connman_cmd2 != NULL))
+        {
+            if(!strcmp(connman_cmd1, "connmanctl enable gadget"))
+            {
+                system("connmanctl enable gadget");
+            }
+            else
+            {
+                lynq_response_error();
+                return;
+            }
+            if(!strcmp(connman_cmd2, "connmanctl tether gadget on"))
+            {
+                system("connmanctl tether gadget on");
+            }
+            else
+            {
+                lynq_response_error();
+                return;
+            }
+            lynq_response_ok();
+        }
+        if(connman_cmd2 == NULL)
+        {
+            if(!strcmp(connman_cmd1, "connmanctl disable gadget"))
+            {
+                system("connmanctl disable gadget");
+            }
+            else
+            {
+                lynq_response_error();
+                return;
+            }
+            lynq_response_ok();
+        }
+    }
+    // else if(type == AT_TEST_MODE)//list
+    // {
+    //     sprintf(buf,"+MNETCALL:(0-1)");
+    //     handle_output(buf, strlen(buf), Response);
+    //     lynq_response_ok();
+    // }
+    // else if(type == AT_READ_MODE)//get
+    // {
+    //     sprintf(buf,"+MNETCALL:%d", g_mnetcall_mode);
+    //     handle_output(buf, strlen(buf), Response);
+    //     lynq_response_ok();
+    // }
+    else
+    {
+        lynq_response_error();
+    }
+    return;
+}
+
+static Command commands[] = 
+{
+{"at+mnetcall",lynq_handle_rndis},
+{"at+gtarndis",lynq_handle_rndis_configure},
+{"at+cgir",lynq_handle_version},
+{"at+lgmds",lynq_handle_modem_status},
+{"at+lrndishandle",lynq_tmp_handle_rndis},//tmp plan
+{NULL, NULL}
+};
+
+Command* find_command (char *input)
+{
+    RLOGD("function %s line %d input %s\n", __FUNCTION__, __LINE__, input);
+    int i;
+    int ret = -1;
+    for (i = 0; commands[i].cmd; i++)
+    {
+        ret = strcmp(input, commands[i].cmd);
+        if(ret == 0)
+        {
+            RLOGD("function %s line %d find input %s commands[i].cmd %s  strlen %d ret %d\n", __FUNCTION__, __LINE__, input, commands[i].cmd, strlen(commands[i].cmd), ret);
+            return (&commands[i]);
+        }
+    }
+    RLOGD("function %s line %d not find ret %d \n", __FUNCTION__, __LINE__, ret);
+    return ((Command *)NULL);
+}
+
+void lynq_at_common_cb(char *input, int input_max_size)
+{
+    if(handle_output != NULL)
+    {
+        RLOGD("function %s line %d input %s\n", __FUNCTION__, __LINE__, input);
+        if(input != NULL)
+        {
+            char *prefix = NULL;
+            prefix = atci_get_cmd_prefix(input);
+            if (NULL == prefix) {
+                RLOGD("atci_cut_cmd_prefix error");
+                return;
+            }
+            RLOGD("find prefix [%s]", prefix);
+            Command *cmd = find_command(prefix);
+            if(cmd != NULL)
+            {
+                int cmd_mode = atci_get_cmd_mode(input);
+                RLOGD("function %s line %d\n", __FUNCTION__, __LINE__);
+                (*(cmd->func))(input,cmd_mode);
+                free(prefix);
+                return;
+            }
+            else
+            {
+                RLOGD("not find prefix in list");
+            }
+            free(prefix);
+        }
+    }
+}
+
+lynq_atsvc_incb lynq_register_at_common(lynq_atsvc_outcb out_cb)
+{
+    if(out_cb != NULL)
+    {
+        handle_output = out_cb;
+        RLOGD("function %s line %d\n", __FUNCTION__, __LINE__);
+        return lynq_at_common_cb;
+    }
+}
diff --git a/src/lynq/lib/liblynq-at-common/makefile b/src/lynq/lib/liblynq-at-common/makefile
new file mode 100755
index 0000000..3f9f757
--- /dev/null
+++ b/src/lynq/lib/liblynq-at-common/makefile
@@ -0,0 +1,72 @@
+
+SHELL = /bin/sh
+RM = rm -f
+
+LOCAL_CFLAGS := -Wall \
+                -std=gnu++14 \
+                -g -Os \
+                -flto \
+                -DRIL_SHLIB \
+                -DATCI_PARSE \
+                -fPIC \
+                -DKEEP_ALIVE \
+                -DECALL_SUPPORT \
+                -fpermissive \
+
+$(warning ################# lynq at factory demo ROOT: $(ROOT),includedir:$(includedir))
+LOCAL_PATH   = .
+
+LOCAL_C_INCLUDES = \
+  -I. \
+  -I$(LOCAL_PATH)/include/libat \
+  -I$(ROOT)$(includedir)/logger \
+  -I$(ROOT)$(includedir)/liblog \
+  -I$(ROOT)$(includedir)/vendor-ril \
+
+
+LOCAL_LIBS := \
+    -L. \
+    -ldl \
+    -lstdc++ \
+    -llog \
+    -lcutils \
+    -lutils \
+    -lbinder \
+    -lpthread \
+
+
+SOURCES = $(wildcard *.cpp)
+
+EXECUTABLE = liblynq-at-common.so
+
+OBJECTS=$(SOURCES:.cpp=.o)
+
+.PHONY: build clean install pack_rootfs
+
+all: build
+$(EXECUTABLE): $(OBJECTS)
+	$(CXX) -shared -Wl,--no-undefined $(OBJECTS) $(LOCAL_LIBS) $(LOCAL_CFLAGS) $(LOCAL_C_INCLUDES) -o $@
+
+%.o : %.cpp
+	$(CXX) $(LOCAL_C_INCLUDES) $(LOCAL_CFLAGS) $(LOCAL_LIBS) -o $@ -c $<
+
+build:  $(EXECUTABLE)
+	$(warning ########## build $(EXECUTABLE)  ##########)
+
+install:
+	mkdir -p $(ROOT)$(base_libdir)/
+	install $(EXECUTABLE) $(ROOT)$(base_libdir)/
+	mkdir -p $(ROOT)$(includedir)/$(NAME)/sdk
+
+pack_rootfs:
+	mkdir -p $(PACK_INITRAMFS_TO)$(base_libdir)/
+	cp -af $(EXECUTABLE) $(PACK_INITRAMFS_TO)$(base_libdir)/
+	$(CROSS)strip $(PACK_INITRAMFS_TO)$(base_libdir)/$(EXECUTABLE)
+	mkdir -p $(PACK_TO)$(base_libdir)/
+	cp -af $(EXECUTABLE) $(PACK_TO)$(base_libdir)/
+	$(CROSS)strip $(PACK_TO)$(base_libdir)/$(EXECUTABLE)
+	
+.PHONY: clean
+clean:
+	$(RM) $(OBJECTS) $(EXECUTABLE)
+	-find . -name "*.o" -delete
diff --git a/src/lynq/lib/liblynq-at-extension/include/lib_at/lynq_at.h b/src/lynq/lib/liblynq-at-extension/include/lib_at/lynq_at.h
index 1a17fe9..0049eb1 100755
--- a/src/lynq/lib/liblynq-at-extension/include/lib_at/lynq_at.h
+++ b/src/lynq/lib/liblynq-at-extension/include/lib_at/lynq_at.h
@@ -10,9 +10,9 @@
 
 #ifndef __LYNQ_AT__
 #define __LYNQ_AT__
-#ifdef __cplusplus
-extern "C" {
-#endif
+//#ifdef __cplusplus
+//extern "C" {
+//#endif
 
 /**
  * @brief
@@ -31,8 +31,8 @@
  */
 int lynq_reg_third_at(const char *ext_at, LYNQ_AT_CALLBACK callback);
 
-#ifdef __cplusplus
-}
-#endif
+//#ifdef __cplusplus
+//}
+//#endif
 
 #endif
\ No newline at end of file
diff --git a/src/lynq/lib/liblynq-at-extension/lynq_at.cpp b/src/lynq/lib/liblynq-at-extension/lynq_at.cpp
index a7c6b2e..8785310 100755
--- a/src/lynq/lib/liblynq-at-extension/lynq_at.cpp
+++ b/src/lynq/lib/liblynq-at-extension/lynq_at.cpp
@@ -1,20 +1,25 @@
-#include<sys/types.h>
-#include<sys/socket.h>
-#include<unistd.h>
-#include<arpa/inet.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <sys/un.h>
+#include <unistd.h>
+#include <arpa/inet.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <signal.h>
 #include <string.h>
 #include <log/log.h>
 #include <pthread.h>
+#include <errno.h>
 #include "liblog/lynq_deflog.h"
 #include "include/lib_at/lynq_at.h"
 
 #define LYNQ_AT_SERVICE_PORT 8087
 #define OUT_MAX_SIZE 1024
 #define USER_LOG_TAG "LYNQ_AT"
-
+#define AT_EXTERSION_SOCKET_NAME "/dev/socket/lynq_atsvc_socket_1"
+#define LINE __LINE__
+#define FUNC __FUNCTION__
+static pthread_mutex_t s_startupMutex = PTHREAD_MUTEX_INITIALIZER;
 typedef enum
 {
     A_SUCCESS = 0,
@@ -28,8 +33,15 @@
 char *output = NULL;
 char buffer_at[OUT_MAX_SIZE] = {0};
 struct sockaddr_in addr_serv;
+struct sockaddr_un addr_server;
+
+
 socklen_t len;
 LYNQ_AT_CALLBACK tmp = NULL;
+bool connect_state = false;
+#define SOCKET_ZERO   0
+#define SOCKET_SUCC   1
+#define SOCKET_FAIL  -1
 
 /**
  * @brief Catch exceptions and free malloc's memory
@@ -66,6 +78,84 @@
     }
 }
 
+
+int socket_local_client (char* name) {
+    //struct sockaddr_un server;
+    //int fd = 0;
+    LYINFLOG("[%d][%s] enter",LINE,FUNC);
+    sockfd = socket(AF_UNIX, SOCK_STREAM, 0);
+    if (sockfd < 0)
+    {
+        LYDBGLOG("Can't open stream socket (%s)", name);
+        return -1;
+    }
+    addr_server.sun_family = AF_UNIX;
+    memset(addr_server.sun_path, '\0', sizeof(addr_server.sun_path));
+    strncpy(addr_server.sun_path, name, sizeof(addr_server.sun_path) - 1);
+    if (connect(sockfd, (struct sockaddr *) &addr_server, sizeof(struct sockaddr_un)) < 0)
+    {
+        close(sockfd);
+        LYDBGLOG("Can't connect to server side, path: %s, errno:%d", name, errno);
+        return -1;
+    }
+    LYINFLOG("[%d][%s] connect %s success",LINE,FUNC,name);
+    return sockfd;
+}
+bool send_msg_to_service(int fd,char *msg,int size)
+{
+    LYDBGLOG("[%d][%s] enter",LINE,FUNC);
+    if (fd < 0)
+    {
+        LYDBGLOG("fd invalid when send to atci service. errno = %d", errno);
+        return false;
+    }
+    if(NULL == msg)
+    {
+        LYDBGLOG("atcmd is null.");
+        return false;
+    }
+    int sendLen = send(fd, msg, size, 0);
+    if (sendLen != size)
+    {
+        LYDBGLOG("lose data when send to atci service. errno = %d", errno);
+        return false;
+    }
+    LYDBGLOG("send to app demo: %s", msg);
+    return true;
+}
+
+int atsvc_cmd_recv(int fd, char *buf, int len)
+{
+    int ret = 0;
+    fd_set rfds;
+    //FD_CLR(fd, &rfds);
+    FD_SET(fd, &rfds);
+    ret = select(fd + 1, &rfds, NULL, NULL, NULL);
+    if (ret <= 0)
+    {
+        LYDBGLOG("acti_cmd_recv select error, ret=%d, error=%s(%d),fd=%d", ret,strerror(errno), errno, fd);
+        return SOCKET_FAIL;
+    }
+    if (FD_ISSET(fd, &rfds))
+    {
+        ret = recv(fd, buf, len, 0);
+        if (ret < 0)
+        {
+            LYDBGLOG("acti_cmd_recv select error, ret=%d, error=%s(%d),fd=%d", ret,strerror(errno), errno, fd);
+            return SOCKET_FAIL;
+        }
+        else if(ret == 0)
+        {
+            LYDBGLOG("acti_cmd_recv recv error, ret=%d, error=%s(%d),fd=%d", ret,strerror(errno), errno, fd);
+            return SOCKET_ZERO;
+    }
+    else
+    {
+      //buf[ret] = '\0';
+    }
+  }
+  return SOCKET_SUCC;
+}
 /**
  * @brief send third cmd to service and receive input,then send output to service
  * 
@@ -74,53 +164,73 @@
  */
 void *thread_recv(void *parm)
 {
-    signal(SIGPIPE, signal_handler);
-    signal(SIGABRT, signal_handler);
-    signal(SIGBUS, signal_handler);
-    signal(SIGFPE, signal_handler);
-    signal(SIGILL, signal_handler);
-    signal(SIGSEGV, signal_handler);
+    //signal(SIGPIPE, signal_handler);
+    //signal(SIGABRT, signal_handler);
+    //signal(SIGBUS, signal_handler);
+    //signal(SIGFPE, signal_handler);
+    //signal(SIGILL, signal_handler);
+    //signal(SIGSEGV, signal_handler);
+    LYINFLOG("[%d][%s] enter",LINE,FUNC);
     int recv = 0;
     int send = 0;
     char at_cmd[100] = {0};
-    sockfd=socket(AF_INET,SOCK_DGRAM,0);
-    memset(&addr_serv, 0, sizeof(addr_serv));
-    addr_serv.sin_family =AF_INET;
-    addr_serv.sin_port =htons(LYNQ_AT_SERVICE_PORT);
-    addr_serv.sin_addr.s_addr = htonl(INADDR_ANY); 
-    len=sizeof(addr_serv);
-    int len_buf = strlen(buffer_at);
-    send = sendto(sockfd, buffer_at, len_buf,0,(struct sockaddr*)&addr_serv,len);
-    if(send < 0)
+    int fd = -1;
+    int ret = 0;
+    fd = socket_local_client(AT_EXTERSION_SOCKET_NAME);
+    if(fd <= 0)
     {
-        LYDBGLOG("thread_recv send fail\n");
-        result = send;
+        connect_state = false;
+        pthread_mutex_unlock(&s_startupMutex);
         return NULL;
     }
+    int len_buf = strlen(buffer_at);
+    if(!send_msg_to_service(fd,buffer_at,len_buf))
+    {
+        connect_state = false;
+        pthread_mutex_unlock(&s_startupMutex);
+        return NULL;
+    }
+    connect_state = true;
+    pthread_mutex_unlock(&s_startupMutex);
     char *input = NULL;
     output = (char *)malloc(sizeof(char)*OUT_MAX_SIZE);
     if(NULL == output)
     {
         LYDBGLOG("thread_recv malloc fail\n");
-        result = A_ERROR;
         return NULL;
     }
+    TryNewLink:
+    if(connect_state == false)
+    {
+        if (connect(fd, (struct sockaddr *) &addr_server, sizeof(struct sockaddr_un)) < 0)
+        {
+            close(fd);
+            LYDBGLOG("Can't connect to server side, path: %s, errno:%d", AT_EXTERSION_SOCKET_NAME, errno);
+            return NULL;
+        }
+        connect_state = true;
+    }
     while (1)
     {
         /*receive at cmd*/
-        LYDBGLOG("lynq_reg_third_at receive at cmd\n");
-        recv = recvfrom(sockfd,at_cmd,sizeof(at_cmd),0,(struct sockaddr*)&addr_serv,&len);
-        if(recv < 0)
+        memset(at_cmd, 0, sizeof(at_cmd));
+        ret = atsvc_cmd_recv(fd, at_cmd,sizeof(at_cmd));
+        if (ret < 0)
         {
-            LYDBGLOG("thread_recv recv fail\n");
+            LYDBGLOG("[%d][%s]receive CMD error",LINE,FUNC);
             continue;
         }
+        else if(ret == SOCKET_ZERO)
+        {
+            ALOGE("maybe client socket closed 1. retry new link!");
+            connect_state = false;
+            goto TryNewLink;
+        }
         input = at_cmd;
         //begin deal with callback
         tmp(input, output, OUT_MAX_SIZE);
         LYDBGLOG("lynq_reg_third_at send output to service\n");
-        send = sendto(sockfd, output, strlen(output),0,(struct sockaddr*)&addr_serv,len);
-        if(send < 0)
+        if(!send_msg_to_service(fd,output, strlen(output)))
         {
             LYDBGLOG("thread_recv send fail\n");
             continue;
@@ -128,9 +238,9 @@
     }
     free(output);
     output = NULL;
-    if(sockfd != 0)
+    if(fd != 0)
     {
-        close(sockfd);
+        close(fd);
     }
     return NULL;
 }
@@ -142,11 +252,15 @@
  */
 int lynq_connect_service_start(void)
 {
+    LYINFLOG("[%d][%s] enter",LINE,FUNC);
     pthread_t lynq_at_tid = -1;
     int rt = pthread_create(&lynq_at_tid, NULL, thread_recv, NULL);
-    if(rt < 0)
+    pthread_mutex_lock(&s_startupMutex);
+    LYINFLOG("[%d][%s] pthread mutex unlock",LINE,FUNC);
+    LYINFLOG(",rt:%d,connect state:%d\n",rt,connect_state);
+    if((connect_state != true) && rt < 0)
     {
-        LYERRLOG("urc loop failure!!!\n");
+        LYERRLOG("connect fail,rt:%d,connect state:%d\n",rt,connect_state);
         return -1;
     }
     return 0;
@@ -166,15 +280,17 @@
     }
     memcpy(buffer_at, ext_at, strlen(ext_at));
     tmp = callback;
-    LYLOGSET(LOG_INFO);
+    LYLOGSET(LOG_DEBUG);
     LYLOGEINIT(USER_LOG_TAG);
     LYDBGLOG("lynq_reg_third_at start\n");
     int ret = lynq_connect_service_start();
+    
     if(ret != 0)
     {
         LYDBGLOG("lynq_connect_service_start start failed\n");
         return A_ERROR;
     }
-    return result;
+    LYDBGLOG("lynq_connect_service_start success ret:%d\n",ret);
+    return A_SUCCESS;
 }
 
diff --git a/src/lynq/lib/liblynq-at-extension/makefile b/src/lynq/lib/liblynq-at-extension/makefile
index 0a6c2d3..257de29 100755
--- a/src/lynq/lib/liblynq-at-extension/makefile
+++ b/src/lynq/lib/liblynq-at-extension/makefile
@@ -6,10 +6,7 @@
                 -g -Os \
                 -flto \
                 -DRIL_SHLIB \
-                -DATCI_PARSE \
                 -fPIC \
-                -DKEEP_ALIVE \
-                -DECALL_SUPPORT \
                 -fpermissive \
 
 
@@ -19,6 +16,7 @@
 
 LOCAL_C_INCLUDES = \
   -I. \
+  -I$(ROOT)/usr/include/binder \
   -I$(LOCAL_PATH)/include/lib_at \
   -I$(ROOT)$(includedir)/logger \
   -I$(ROOT)$(includedir)/liblog \
@@ -31,6 +29,7 @@
     -llog \
     -lpthread \
     -llynq-log \
+    -lbinder \
 
 
 SOURCES = $(wildcard *.cpp)
diff --git a/src/lynq/lib/liblynq-at-factory/LICENSE b/src/lynq/lib/liblynq-at-factory/LICENSE
new file mode 100755
index 0000000..382fc78
--- /dev/null
+++ b/src/lynq/lib/liblynq-at-factory/LICENSE
@@ -0,0 +1,31 @@
+Copyright Statement:
+
+This software/firmware and related documentation ("Mobiletek Software") are
+protected under relevant copyright laws. The information contained herein is
+confidential and proprietary to Mobiletek Inc. and/or its licensors. Without
+the prior written permission of Mobiletek inc. and/or its licensors, any
+reproduction, modification, use or disclosure of Mobiletek Software, and
+information contained herein, in whole or in part, shall be strictly
+prohibited.
+
+Mobiletek Inc. (C) 2015. All rights reserved.
+
+BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("Mobiletek SOFTWARE")
+RECEIVED FROM Mobiletek AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
+ON AN "AS-IS" BASIS ONLY. Mobiletek EXPRESSLY DISCLAIMS ANY AND ALL
+WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
+WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+NONINFRINGEMENT. NEITHER DOES Mobiletek PROVIDE ANY WARRANTY WHATSOEVER WITH
+RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
+INCORPORATED IN, OR SUPPLIED WITH THE Mobiletek SOFTWARE, AND RECEIVER AGREES
+TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
+RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
+OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN Mobiletek
+SOFTWARE. Mobiletek SHALL ALSO NOT BE RESPONSIBLE FOR ANY Mobiletek SOFTWARE
+RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND Mobiletek'S
+ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE Mobiletek SOFTWARE
+RELEASED HEREUNDER WILL BE, AT Mobiletek'S OPTION, TO REVISE OR REPLACE THE
+Mobiletek SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
+CHARGE PAID BY RECEIVER TO Mobiletek FOR SUCH Mobiletek SOFTWARE AT ISSUE.
\ No newline at end of file
diff --git a/src/lynq/lib/liblynq-at-factory/include/libat/lynq_at_factory.h b/src/lynq/lib/liblynq-at-factory/include/libat/lynq_at_factory.h
new file mode 100755
index 0000000..b90270c
--- /dev/null
+++ b/src/lynq/lib/liblynq-at-factory/include/libat/lynq_at_factory.h
@@ -0,0 +1,23 @@
+/*============================================================================= 
+#     FileName: lynq_at_factory.h
+#     Desc: about at of factory
+#     Author: lei 
+#     Version: V1.0
+#     LastChange: 2022-12-14 
+#     History: 
+      copyright:Mobiletek
+=============================================================================*/
+#ifndef LYNQ_AT_FACTORY_H
+#define LYNQ_AT_FACTORY_H 1
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef void ( *lynq_atsvc_incb )( const char *input,const int length);
+typedef void ( *lynq_atsvc_outcb )(char *output, int out_max_size, int mode);
+lynq_atsvc_incb lynq_register_at_factory(lynq_atsvc_outcb out_cb);
+
+#ifdef __cplusplus
+}
+#endif
+#endif
\ No newline at end of file
diff --git a/src/lynq/lib/liblynq-at-factory/lynq_at_factory.cpp b/src/lynq/lib/liblynq-at-factory/lynq_at_factory.cpp
new file mode 100755
index 0000000..3f1bfa9
--- /dev/null
+++ b/src/lynq/lib/liblynq-at-factory/lynq_at_factory.cpp
@@ -0,0 +1,489 @@
+
+
+#include <string.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <log/log.h>
+#include <liblog/lynq_deflog.h>
+#include "include/libat/lynq_at_factory.h"
+
+#define FACTORY_STRING "AT+LYNQFACTORY="
+#define USER_LOG_TAG "AT_FACTORY"
+
+#undef LOG_TAG
+#define LOG_TAG "AT_FACTORY"
+
+static const char *usb3_speed = "super-speed";
+static const char *usb2_speed = "high-speed";
+
+lynq_atsvc_outcb handle_output;
+
+typedef struct
+{
+    char *cmd;
+    void (*func)(char *input);
+}Command;
+
+enum
+{
+    Response = 0,
+    Urc
+};
+
+void lynq_handle_adc(char *input)
+{
+    FILE *fp;
+    char lynq_adc_dev[126] = {0};
+    char lynq_adc_buf[32] = {0};
+    int lynq_adc_num = atoi(input+4);
+    char flag[64] = {0};
+    if(lynq_adc_num == 0)
+    {
+        sprintf(lynq_adc_dev,"cat /sys/bus/iio/devices/iio:device1/in_voltage0_input  2>&1");
+    }
+    else if(lynq_adc_num == 1)
+    {
+        sprintf(lynq_adc_dev,"cat /sys/bus/iio/devices/iio:device1/in_voltage1_input  2>&1");
+    }
+    else if(lynq_adc_num == 2)
+    {
+        sprintf(lynq_adc_dev,"cat /sys/bus/iio/devices/iio:device1/in_voltage2_input  2>&1");
+    }
+    else if(lynq_adc_num == 3)
+    {
+        sprintf(lynq_adc_dev,"cat /sys/bus/iio/devices/iio:device1/in_voltage3_input  2>&1");
+    }
+    fp=popen(lynq_adc_dev, "r");
+    fgets(lynq_adc_buf,sizeof(lynq_adc_buf),fp);
+    sprintf(flag,"%s %s", "ADC:", lynq_adc_buf);
+    if(handle_output != NULL)
+    {
+        handle_output(flag, strlen(flag), Response);
+    }
+    pclose(fp);
+}
+
+void lynq_handle_sink(char *input)
+{
+    FILE *fp;
+    char lynq_usb_dev[512] = {0};
+    char lynq_usb_buf[512] = {0};
+    char buf[512] = {0};
+    int sink[3][3] = {{255,0,0},{0,255,0},{0,0,255}};
+    char dev_buf[][40]={{"green:cellular-radio/brightness"},{"green:cellular-quality/brightness"},{"red:system/brightness"}};
+    int i;
+    int j;
+    int k = 15;
+    char flag_buf[64] = {0};
+    for(i = 0;i < 3;i++){
+        bzero(flag_buf, 64);
+        bzero(lynq_usb_buf, 512);
+        bzero(buf, 512);
+        k = 15;
+        for(j = 0;j < 3;j++){
+            bzero(lynq_usb_dev, 512);
+            sprintf(lynq_usb_dev,"echo %d >  /sys/class/leds/led95%d:%s  2>&1", sink[i][j], k++, dev_buf[j]);
+            fp=popen(lynq_usb_dev, "r");
+        }
+        usleep(10000);
+        sprintf(lynq_usb_buf,"cat /sys/bus/iio/devices/iio:device1/in_voltage4_input  2>&1");
+        fp=popen(lynq_usb_buf, "r");
+        
+        fgets(buf, sizeof(buf), fp);
+        sprintf(flag_buf, "%s%d%s%s%s", "SINK[", i+1, "]: ", buf, "\n");
+        handle_output(flag_buf, strlen(flag_buf), Response);
+    }
+    pclose(fp);
+}
+
+void lynq_handle_emmc(char *input)
+{
+    FILE *fp;
+    char emmc_buf[100] = {0};
+    char buf[100] = {0};
+    sprintf(emmc_buf, "ls /dev | grep mmcblk0  2>&1");
+    fp=popen(emmc_buf, "r");
+    if(!fp){
+        char *str = "\n+CME: POPEN ERROR\n";
+        handle_output(str, strlen(str), Response);
+        return;
+    }
+    while(fgets(buf, sizeof(buf), fp) != NULL){
+        char *str = "+EMMC: OK \n";
+        handle_output(str, strlen(str), Response); 
+        pclose(fp);
+        return;   
+    }
+    char *str = "\033[47;31m+EMMC: ERROR\033[0m\n";
+    handle_output(str, strlen(str), Response);
+    pclose(fp);
+}
+
+void lynq_handle_gpio(char *input)
+{
+    FILE *fp;
+    int lynq_gpio_arr[85] = {230,231,232,233,234,102,104,103,101,186 ,188 ,187 ,185 ,194 ,196 ,195 ,193 ,205 ,204 ,203 ,202, 201 ,190 ,192 ,191 ,189 ,173 ,174 ,175 ,176 ,170 ,169 ,184 ,183 ,182 ,181 ,24 ,25 ,157 ,158 ,155 ,156 ,143 ,144 ,140 ,141 ,153 ,154 ,180 ,179 ,29 ,30 ,178, 177, 7 ,5 ,4 ,113 ,112, 116 ,115 ,114, 107, 108, 105, 106, 100 ,99 ,98, 97, 94, 93, 92, 91, 1 ,130 ,41 ,67 ,69, 68, 63, 22, 23, 199, 200};
+    char lynq_set_gpio_arr[256] = {0};
+    char lynq_get_gpio_state[512] = {0};
+    char lynq_show_gpio_state[64] = {0};
+    int lynq_gpio_low = 0;
+    int lynq_gpio_hig = 0;
+    int i = 0,m = 0;
+    int lynq_gpio_beta_state = 1;
+
+    for(m = 0; m < 85; m++)
+    {
+        bzero(lynq_set_gpio_arr, 256);
+        sprintf(lynq_set_gpio_arr,"echo mode %d 0 > /sys/devices/platform/10005000.pinctrl/mt_gpio",(char*)lynq_gpio_arr[m]);
+        system(lynq_set_gpio_arr);
+        bzero(lynq_set_gpio_arr, 256);
+        sprintf(lynq_set_gpio_arr,"echo out %d 0 > /sys/devices/platform/10005000.pinctrl/mt_gpio",(char*)lynq_gpio_arr[m]);
+        system(lynq_set_gpio_arr);
+    }
+
+    for(i = 0; i < 85; i++)
+    {
+        lynq_gpio_low = 0;
+        lynq_gpio_hig = 0;
+
+        bzero(lynq_set_gpio_arr, 256);
+        sprintf(lynq_set_gpio_arr,"echo mode %d 0 > /sys/devices/platform/10005000.pinctrl/mt_gpio",(char*)lynq_gpio_arr[i]);
+        system(lynq_set_gpio_arr);
+
+        bzero(lynq_set_gpio_arr, 256);
+        sprintf(lynq_set_gpio_arr,"echo out %d 1 > /sys/devices/platform/10005000.pinctrl/mt_gpio",(char*)lynq_gpio_arr[i]);
+        system(lynq_set_gpio_arr);
+
+        bzero(lynq_set_gpio_arr, 256);
+        sprintf(lynq_set_gpio_arr,"cat /sys/devices/platform/10005000.pinctrl/mt_gpio | grep 006");
+        fp=popen(lynq_set_gpio_arr, "r");
+        bzero(lynq_get_gpio_state, 512);
+        fgets(lynq_get_gpio_state,sizeof(lynq_get_gpio_state),fp);
+        pclose(fp);
+        if(lynq_get_gpio_state[7] == '1')
+        {
+            lynq_gpio_hig = 1;
+        }
+
+        bzero(lynq_set_gpio_arr, 256);
+        sprintf(lynq_set_gpio_arr,"echo out %d 0 > /sys/devices/platform/10005000.pinctrl/mt_gpio",(char*)lynq_gpio_arr[i]);
+        system(lynq_set_gpio_arr);
+        
+        bzero(lynq_set_gpio_arr, 256);
+        sprintf(lynq_set_gpio_arr,"cat /sys/devices/platform/10005000.pinctrl/mt_gpio | grep 006");
+        fp=popen(lynq_set_gpio_arr, "r");
+        bzero(lynq_get_gpio_state, 512);
+        fgets(lynq_get_gpio_state,sizeof(lynq_get_gpio_state),fp);
+        pclose(fp);
+        if(lynq_get_gpio_state[7] == '0')
+        {
+            lynq_gpio_low = 1;
+        }
+        bzero(lynq_show_gpio_state, 64);
+        if((lynq_gpio_low != 1) || (lynq_gpio_hig != 1))
+        {
+            lynq_gpio_beta_state = 0;
+            sprintf(lynq_show_gpio_state,"[gpio%d][result]:FAIL \n",(char *)lynq_gpio_arr[i]);
+            handle_output(lynq_show_gpio_state, strlen(lynq_show_gpio_state), Response);
+        }
+        else
+        {
+            sprintf(lynq_show_gpio_state,"gpio%d\n",(char *)lynq_gpio_arr[i]);
+            handle_output(lynq_show_gpio_state, strlen(lynq_show_gpio_state), Response);
+        }
+    }
+    if(lynq_gpio_beta_state == 1)
+    {
+        sprintf(lynq_show_gpio_state,"[gpio][result]:PASS \n");
+        handle_output(lynq_show_gpio_state, strlen(lynq_show_gpio_state), Response);
+    }
+}
+
+void lynq_handle_pcie(char *input)
+{
+    FILE *fp;
+    char lynq_usb_dev[128] = {0};
+    char lynq_get_gpio_state[512] = {0};
+    sprintf(lynq_usb_dev,"cat sys/devices/platform/10005000.pinctrl/mt_gpio |grep 097  2>&1");
+    fp=popen(lynq_usb_dev, "r");
+    fgets(lynq_get_gpio_state,sizeof(lynq_get_gpio_state),fp);
+    pclose(fp);
+    if(lynq_get_gpio_state[6] == '1')
+    {
+        char *str = "+PCIE: OK\n";
+        handle_output(str, strlen(str), Response);
+    }
+    else
+    {
+        char *str = "+PCIE: ERROR\n";
+        handle_output(str, strlen(str), Response);
+    }
+}
+
+void lynq_handle_rgmii(char *input)
+{
+    char *ipv4 = input+6;
+    char cmd[128] = {0};
+    FILE *fp;
+    sprintf(cmd, "%s %s %s %s", "ping -I eth2", ipv4, "-c4", "2>&1");
+    fp=popen(cmd, "r");
+    if(NULL == fp){
+        char *str = "popen errorn\n";
+        handle_output(str, strlen(str), Response);
+    }
+    char lynq_factory_buf[1024] = {0};
+    while (NULL != fgets(lynq_factory_buf,sizeof(lynq_factory_buf),fp))
+    {
+        if(strstr(lynq_factory_buf, "Usage"))
+        {
+            char *str  = "RGMII cannot recognize IP addresses\nERROR\n";
+            handle_output(str, strlen(str), Response);
+            pclose(fp);
+        }
+        handle_output(lynq_factory_buf, strlen(lynq_factory_buf), Response);
+    }
+    char *str = "OK\n";
+    handle_output(str, strlen(str), Response);
+    pclose(fp);
+}
+
+void lynq_handle_sgmii(char *input)
+{
+    char *ipv4 = input+6;
+    char cmd[128] = {0};
+    FILE *fp;
+    sprintf(cmd, "%s %s %s %s", "ping -I eth1", ipv4, "-c4", "2>&1");
+    fp=popen(cmd, "r");
+    if(NULL == fp){
+        char *str = "popen errorn\n";
+        handle_output(str, strlen(str), Response);
+    }
+    char lynq_factory_buf[1024] = {0};
+    while (NULL != fgets(lynq_factory_buf,sizeof(lynq_factory_buf),fp))
+    {
+        if(strstr(lynq_factory_buf, "Usage"))
+        {
+            char *str  = "RGMII cannot recognize IP addresses\nERROR\n";
+            handle_output(str, strlen(str), Response);
+            pclose(fp);
+        }
+        handle_output(lynq_factory_buf, strlen(lynq_factory_buf), Response);
+    }
+    char *str = "OK\n";
+    handle_output(str, strlen(str), Response);
+    pclose(fp);
+}
+
+void lynq_handle_inside_version(char *input)
+{
+    FILE *fp;
+    char buf[64] = {0};
+    fp=popen("uci get lynq_uci_ro.lynq_version.LYNQ_SW_INSIDE_VERSION 2>&1", "r");
+    if(NULL == fp){
+        char *str = "popen errorn\n";
+        handle_output(str, strlen(str), Response);
+    }
+    fgets(buf, sizeof(buf), fp);
+    handle_output(buf, strlen(buf), Response);
+    char *str = "OK\n";
+    handle_output(str, strlen(str), Response);
+    pclose(fp);
+}
+
+void lynq_handle_usb(char *input)
+{
+    FILE *fp;
+    char lynq_usb_dev[512] = {0};
+    char lynq_usb_buf[512];
+    bzero(lynq_usb_buf, 512);
+    bzero(lynq_usb_dev,512);
+    sprintf(lynq_usb_dev,"cat /sys/devices/platform/11201000.usb/udc/11201000.usb/current_speed  2>&1");
+    fp=popen(lynq_usb_dev, "r");
+    fgets(lynq_usb_buf,sizeof(lynq_usb_buf),fp);
+    if(!strncmp(lynq_usb_buf,usb3_speed,strlen(usb3_speed)))
+    {
+        char *res = "[usb][result],3.0";
+        handle_output(res, strlen(res), Response);
+        char *str = "OK\n";
+        handle_output(str, strlen(str), Response);
+    }
+    else if(!strncmp(lynq_usb_buf,usb2_speed,strlen(usb2_speed)))
+    {
+        char *res = "[usb][result],2.0";
+        handle_output(res, strlen(res), Response);
+        char *str = "OK\n";
+        handle_output(str, strlen(str), Response);
+    }
+    pclose(fp);
+    return 1;
+}
+
+
+static Command commands[] = 
+{
+{"adc",lynq_handle_adc},
+{"sink",lynq_handle_sink},
+{"emmc",lynq_handle_emmc},
+{"gpio",lynq_handle_gpio},
+{"pcie",lynq_handle_pcie},
+{"rgmii",lynq_handle_rgmii},
+{"sgmii",lynq_handle_sgmii},
+{"usb",lynq_handle_usb},
+{NULL, NULL}
+};
+
+Command* find_command (char *input)
+{
+    RLOGD("function %s line %d input %s\n", __FUNCTION__, __LINE__, input);
+    int i;
+    int ret = -1;
+    for (i = 0; commands[i].cmd; i++)
+    {
+        ret = strncmp(input, commands[i].cmd, strlen(commands[i].cmd));
+        if(ret == 0)
+        {
+            RLOGD("function %s line %d find input %s commands[i].cmd %s  strlen %d ret %d\n", __FUNCTION__, __LINE__, input, commands[i].cmd, strlen(commands[i].cmd), ret);
+            return (&commands[i]);
+        }
+    }
+    RLOGD("function %s line %d not find ret %d \n", __FUNCTION__, __LINE__, ret);
+    return ((Command *)NULL);
+}
+
+/*
+int g_number(const char *p){
+    int cnt = 0;
+    while(*p != '\0'){
+        if(*p == ','){
+            cnt++;
+        }
+        *p++;
+    }
+    return cnt+4;//for count character string
+
+}
+
+void lynqSetArgv(char **argv, char** Point,const char* value)
+{
+    *argv=*Point;
+     sprintf(*argv, "%s", value);    
+     (*Point) += (strlen(value)+1);
+}
+
+int lynqParseUsbCommand(const char* cmd,char *argv[],char test[],char* parser_buf,int maxArgc)
+{
+    char *token;
+    char *str = test;
+    char *string;
+    char *parameter;
+    char* Point=parser_buf;
+    int cnt = g_number(cmd);
+    memcpy(test, cmd, strlen(cmd));
+    test[strlen(cmd)] = '\0';
+    argv[1] = (char *)cmd;
+    if(strstr(cmd,"=?"))
+    {
+        token = strtok(str, "=?");
+        //argv[0] = token;
+        argv[0] = strstr(token, "+")+1; 
+        lynqSetArgv(&(argv[2]),&Point,"1");
+        while (token != NULL)
+        {
+            string = token;
+            token = strtok(NULL, "=?");
+        }
+        parameter = strtok(string, ",");
+        int i = 3;
+        while (parameter != NULL)
+        {
+            argv[i++] = parameter;
+            parameter = strtok(NULL, ",");
+        }
+    }
+    else if(strstr(cmd,"="))
+    {
+        lynqSetArgv(&(argv[2]),&Point,"0");
+        token = strtok(str, "=");
+        //argv[0] = token;
+        if(strstr(token, "+"))
+        {
+            argv[0] = strstr(token, "+")+1;
+            while (token != NULL)
+            {
+                string = token;
+                token = strtok(NULL, "=");
+            }
+            parameter = strtok(string, ",");
+            int i = 3;
+            while (parameter != NULL)
+            {
+                argv[i++] = parameter;
+                parameter = strtok(NULL, ",");
+            }
+        }
+        else
+        {
+            argv[0] = token;
+        }
+    }
+    else if(strstr(cmd,"?"))
+    {
+        lynqSetArgv(&(argv[2]),&Point,"2");
+        token = strtok(str, "?");
+        //argv[0] = token;
+        argv[0] = strstr(token, "+")+1;
+        while (token != NULL)
+        {
+            string = token;
+            token = strtok(NULL, "?");
+        }
+        parameter = strtok(string, ",");
+        int i = 3;
+        while (parameter != NULL)
+        {
+            argv[i++] = parameter;
+            parameter = strtok(NULL, ",");
+        }
+    } 
+    if(cnt > maxArgc)
+        return -1;
+    return cnt;
+}
+*/
+
+
+
+void lynq_at_factory_cb(char *input, int input_max_size)
+{
+    if(handle_output != NULL)
+    {
+        RLOGD("function %s line %d input %s\n", __FUNCTION__, __LINE__, input);
+        if(input != NULL)
+        {
+            char *handle_string = input + strlen(FACTORY_STRING);
+            if(!strlen(handle_string))
+            {
+                RLOGD("function %s line %d strlen %d\n", __FUNCTION__, __LINE__, strlen(handle_string));
+                return;
+            }
+            RLOGD("function %s line %d  handle_string %s\n", __FUNCTION__, __LINE__, handle_string);
+            Command *cmd = find_command(handle_string);
+            if(cmd != NULL)
+            {
+                RLOGD("function %s line %d\n", __FUNCTION__, __LINE__);
+                (*(cmd->func))(handle_string);
+                return;
+            }
+        }
+    }
+}
+
+lynq_atsvc_incb lynq_register_at_factory(lynq_atsvc_outcb out_cb)
+{
+    if(out_cb != NULL)
+    {
+        handle_output = out_cb;
+        RLOGD("function %s line %d\n", __FUNCTION__, __LINE__);
+        return lynq_at_factory_cb;
+    }
+}
diff --git a/src/lynq/lib/liblynq-at-factory/makefile b/src/lynq/lib/liblynq-at-factory/makefile
new file mode 100755
index 0000000..f621678
--- /dev/null
+++ b/src/lynq/lib/liblynq-at-factory/makefile
@@ -0,0 +1,73 @@
+
+SHELL = /bin/sh
+RM = rm -f
+
+LOCAL_CFLAGS := -Wall \
+                -std=gnu++14 \
+                -g -Os \
+                -flto \
+                -DRIL_SHLIB \
+                -DATCI_PARSE \
+                -fPIC \
+                -DKEEP_ALIVE \
+                -DECALL_SUPPORT \
+                -fpermissive \
+
+$(warning ################# lynq at factory demo ROOT: $(ROOT),includedir:$(includedir))
+LOCAL_PATH   = .
+
+LOCAL_C_INCLUDES = \
+  -I. \
+  -I$(LOCAL_PATH)/include/libat \
+  -I$(ROOT)$(includedir)/logger \
+  -I$(ROOT)$(includedir)/liblog \
+  -I$(ROOT)$(includedir)/vendor-ril \
+
+
+LOCAL_LIBS := \
+    -L. \
+    -ldl \
+    -lstdc++ \
+    -llog \
+    -lcutils \
+    -lutils \
+    -lbinder \
+    -lpthread \
+    -llynq-log \
+
+
+SOURCES = $(wildcard *.cpp)
+
+EXECUTABLE = liblynq-at-factory.so
+
+OBJECTS=$(SOURCES:.cpp=.o)
+
+.PHONY: build clean install pack_rootfs
+
+all: build
+$(EXECUTABLE): $(OBJECTS)
+	$(CXX) -shared -Wl,--no-undefined $(OBJECTS) $(LOCAL_LIBS) $(LOCAL_CFLAGS) $(LOCAL_C_INCLUDES) -o $@
+
+%.o : %.cpp
+	$(CXX) $(LOCAL_C_INCLUDES) $(LOCAL_CFLAGS) $(LOCAL_LIBS) -o $@ -c $<
+
+build:  $(EXECUTABLE)
+	$(warning ########## build $(EXECUTABLE)  ##########)
+
+install:
+	mkdir -p $(ROOT)$(base_libdir)/
+	install $(EXECUTABLE) $(ROOT)$(base_libdir)/
+	mkdir -p $(ROOT)$(includedir)/$(NAME)/sdk
+
+pack_rootfs:
+	mkdir -p $(PACK_INITRAMFS_TO)$(base_libdir)/
+	cp -af $(EXECUTABLE) $(PACK_INITRAMFS_TO)$(base_libdir)/
+	$(CROSS)strip $(PACK_INITRAMFS_TO)$(base_libdir)/$(EXECUTABLE)
+	mkdir -p $(PACK_TO)$(base_libdir)/
+	cp -af $(EXECUTABLE) $(PACK_TO)$(base_libdir)/
+	$(CROSS)strip $(PACK_TO)$(base_libdir)/$(EXECUTABLE)
+	
+.PHONY: clean
+clean:
+	$(RM) $(OBJECTS) $(EXECUTABLE)
+	-find . -name "*.o" -delete
diff --git a/src/lynq/lib/liblynq-at-fota/LICENSE b/src/lynq/lib/liblynq-at-fota/LICENSE
new file mode 100755
index 0000000..382fc78
--- /dev/null
+++ b/src/lynq/lib/liblynq-at-fota/LICENSE
@@ -0,0 +1,31 @@
+Copyright Statement:
+
+This software/firmware and related documentation ("Mobiletek Software") are
+protected under relevant copyright laws. The information contained herein is
+confidential and proprietary to Mobiletek Inc. and/or its licensors. Without
+the prior written permission of Mobiletek inc. and/or its licensors, any
+reproduction, modification, use or disclosure of Mobiletek Software, and
+information contained herein, in whole or in part, shall be strictly
+prohibited.
+
+Mobiletek Inc. (C) 2015. All rights reserved.
+
+BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("Mobiletek SOFTWARE")
+RECEIVED FROM Mobiletek AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
+ON AN "AS-IS" BASIS ONLY. Mobiletek EXPRESSLY DISCLAIMS ANY AND ALL
+WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
+WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+NONINFRINGEMENT. NEITHER DOES Mobiletek PROVIDE ANY WARRANTY WHATSOEVER WITH
+RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
+INCORPORATED IN, OR SUPPLIED WITH THE Mobiletek SOFTWARE, AND RECEIVER AGREES
+TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
+RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
+OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN Mobiletek
+SOFTWARE. Mobiletek SHALL ALSO NOT BE RESPONSIBLE FOR ANY Mobiletek SOFTWARE
+RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND Mobiletek'S
+ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE Mobiletek SOFTWARE
+RELEASED HEREUNDER WILL BE, AT Mobiletek'S OPTION, TO REVISE OR REPLACE THE
+Mobiletek SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
+CHARGE PAID BY RECEIVER TO Mobiletek FOR SUCH Mobiletek SOFTWARE AT ISSUE.
\ No newline at end of file
diff --git a/src/lynq/lib/liblynq-at-fota/include/libat/lynq_at_fota.h b/src/lynq/lib/liblynq-at-fota/include/libat/lynq_at_fota.h
new file mode 100755
index 0000000..dd32d26
--- /dev/null
+++ b/src/lynq/lib/liblynq-at-fota/include/libat/lynq_at_fota.h
@@ -0,0 +1,31 @@
+/*=============================================================================
+#     FileName: lynq_at_fota.h
+#     Desc: about at of fota
+#     Author: jb.qi
+#     Version: V1.0
+#     LastChange: 2023-01-09
+#     History:
+      copyright:Mobiletek
+=============================================================================*/
+#ifndef __LYNQ_FOTA_H__
+#define __LYNQ_FOTA_H__ 1
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define LYNQ_E_FTP_LOGIN_FAIL 9002 /*Ftp login fail*/
+#define LYNQ_E_FTP_SEND_FAIL 9003 /*Ftp send log fail*/
+#define LYNQ_E_GET_LOG_FAIL 9004 /*Get log fail*/
+#define LYNQ_E_LOG_CMD_ERROR 9005 /*cmd error*/
+
+typedef void ( *lynq_atsvc_incb )( const char *input,const int length);
+typedef void ( *lynq_atsvc_outcb )(char *output, int out_max_size, int mode);
+lynq_atsvc_incb lynq_register_fota(lynq_atsvc_outcb out_cb);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif //__LYNQ_LOGSEND_TEST_H__
+
diff --git a/src/lynq/lib/liblynq-at-fota/lynq_at_fota.cpp b/src/lynq/lib/liblynq-at-fota/lynq_at_fota.cpp
new file mode 100755
index 0000000..148214c
--- /dev/null
+++ b/src/lynq/lib/liblynq-at-fota/lynq_at_fota.cpp
@@ -0,0 +1,300 @@
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include "include/libat/lynq_at_fota.h"
+#ifdef __cplusplus
+extern "C" {
+#endif
+#include <log/log.h>
+#include "mtk_device_wrap.h"
+#include "include/iot_rock.h"
+
+#define UPDATA_ADDR "/tmp/fota.delta"
+#define READ_BLOCK_SIZE 0x40000
+#define FLASH_DEV_DELTA       "/dev/mtd41"
+#define LOG_TAG "AT-FOTA"
+
+lynq_atsvc_outcb g_handle_output;
+char str[128];
+char g_buffer[128] = {0};
+int Response = 0;
+int g_lynq_fota_md5_flag = -1;
+char g_put_addr[64];
+char g_put_path[35];
+char g_cmd[128];
+
+void *deal_download()
+{
+    int ret;
+    RLOGD("start deal_download !!!\n");
+    ret = system(g_cmd);
+    RLOGD("ret:%d \n", ret);
+    if(ret != 0)
+    {
+         strcpy(str, "+FOTA: fota download fail\n");
+         g_handle_output(str, strlen(str), Response);
+         return NULL;
+    }
+    else
+    {
+         strcpy(str, "+FOTA: fota download success\n");
+         g_handle_output(str, strlen(str), Response);
+    }
+    return NULL;
+}
+
+
+int lynq_download_package(char (*string)[35])
+{
+    int ret = 0;
+    int str_num = -1;
+    pthread_t tid;
+
+    RLOGD("function %s start\n", __FUNCTION__);
+    for(int i = 0; i < 9; i++)
+    {
+        if(string[i] == NULL)
+        {
+            strcpy(str, "+FOTA: download data null\n");
+            g_handle_output(str, strlen(str), Response);
+            return 1;
+        }
+    }
+
+    if(strlen(string[9]) == 0)
+    {
+        ret = chdir("/tmp/");
+        if( 0 != ret)
+        {
+             RLOGD("/tmp/ is error\n");
+             strcpy(str, "+FOTA: the tmp is error\n");
+             g_handle_output(str, strlen(str), Response);
+             return ret;
+        }
+        strcpy(g_put_path, "/tmp/");
+    }
+    else
+    {
+        ret = chdir(string[9]);
+        if( 0 != ret)
+        {
+             RLOGD("%s is error directory \n", string[9]);
+             strcpy(str, "+FOTA: NO such directory\n");
+             g_handle_output(str, strlen(str), Response);
+             return ret;
+        }
+        strcpy(g_put_path, string[9]);
+    }
+
+    sprintf(g_cmd,"wget ftp://%s:%s@%s:%s%s%s",string[2],string[3],string[0],string[1],string[7],string[8]);
+    RLOGD("g_cmd:%s\n", g_cmd);
+    str_num = strlen(g_put_path);
+
+    if(g_put_path[str_num - 1] == '/')
+    {
+        sprintf(g_put_addr,"%s%s", g_put_path, string[8]);
+    }
+    else
+    {
+        sprintf(g_put_addr,"%s/%s", g_put_path, string[8]);
+    }
+    RLOGD("g_put_addr: %s\n", g_put_addr);
+    if(lynq_fota_set_addr_value(g_put_addr,strlen(g_put_addr)))
+    {
+         strcpy(str, "+FOTA: set fota addr fail\n");
+         g_handle_output(str, strlen(str), Response);
+    }
+
+    pthread_create(&tid,NULL,deal_download,NULL);
+    pthread_detach(tid);
+
+    return ret;
+}
+
+/*
+ * @brief Differential subcontracting MD5 check
+ *
+ * @param string:MD5 value,Subcontracting address,Refer to the fota documentation
+ */
+
+int lynq_md5_package(char (*string)[35])
+{
+    char input_md5_data[64] = {0};
+    RLOGD("function %s start\n", __FUNCTION__);
+    for(int i = 0; i < 2; i++)
+    {
+        if(string[i] == NULL)
+        {
+            strcpy(str, "+FOTA: md5 value null\n");
+            g_handle_output(str, strlen(str), Response);
+            return 1;
+        }
+    }
+
+    sprintf(input_md5_data,"%s",string[0]);
+    RLOGD("input_md5_data: %s\n", string[0]);
+    g_lynq_fota_md5_flag = lynq_md5_file_verfy(g_put_addr, input_md5_data);
+    if(g_lynq_fota_md5_flag != 0)
+    {
+        strcpy(str, "+FOTA: md5 fail\n");
+        g_handle_output(str, strlen(str), Response);
+        return 1;
+    }
+    return 0;
+}
+
+/**
+ * @brief fota
+ * 
+ * @param void
+ */
+int lynq_fota_try(void)
+{
+    RLOGD("function %s start\n", __FUNCTION__);
+    if(g_lynq_fota_md5_flag == 0) //upgrade success ,device reboot ,lynq_fota_md5_flag no need to reset
+    {
+        if(0 != lynq_rock_main(1))
+        {
+            g_lynq_fota_md5_flag = -1;
+            strcpy(str, "+FOTA: update fail\n");
+            g_handle_output(str, strlen(str), Response);
+            return 1;
+        }
+    }
+    else
+    {
+        strcpy(str, "+FOTA: md5 verify fail\n");
+        g_handle_output(str, strlen(str), Response);
+        return 1;
+    }
+    
+    return 0;
+}
+
+void lynq_at_fota(char (*argv)[35])
+{
+    int result;
+    RLOGD("function %s start\n", __FUNCTION__);
+    RLOGD("buffer: %s",g_buffer);
+    if(!(strcmp(argv[0], "AT+FOTA?")))
+    {
+        if(strlen(g_buffer) == 0)
+        {
+            strcpy(str, "+FOTA: OK\n");
+        }
+        else
+        {
+            sprintf(str, "+FOTA: %s\n",g_buffer);
+            
+        }
+        g_handle_output(str, strlen(str), Response);
+        return ;
+    }
+    else if(!(strcmp(argv[0], "AT+FOTA=?")))
+    {
+        strcpy(str, "+FOTA:(0-2),""\n");
+        g_handle_output(str, strlen(str), Response);
+        return ;
+
+    }
+    if(!(strcmp(argv[0], "AT+FOTA=0")) || !(strcmp(argv[0], "AT+LYNQFOTA=download")))
+    {
+        RLOGD("argv[0]: %s\n", argv[0]);
+        if(!(strcmp(argv[1], "ftp")))
+        {
+            result = lynq_download_package(&argv[2]);
+            if(result != 0)
+            {
+                strcpy(str, "+FOTA: DOWNLOAD FAIL\n");
+            }
+            else
+            {
+                strcpy(str, "+FOTA: DOWNLOAD START\n");
+            }
+        }
+        else
+        {
+            strcpy(str, "+FOTA: NO FTP DOWNLOAD\n");
+        }
+    }
+
+    else if(!(strcmp(argv[0], "AT+FOTA=1")) || !(strcmp(argv[0], "AT+LYNQFOTA=md5")))
+    {
+        RLOGD("argv[0]: %s\n", argv[0]);
+        result = lynq_md5_package(&argv[1]);
+        if(result != 0)
+        {
+            strcpy(str, "+FOTA: MD5 FAIL\n");
+        }
+        else
+        {
+            strcpy(str, "+FOTA: MD5 SUCCESS\n");
+        }
+    }
+    else if(!(strcmp(argv[0], "AT+FOTA=2")) || !(strcmp(argv[0], "AT+LYNQFOTA=upgrade")))
+    {
+        RLOGD("argv[0]: %s\n", argv[0]);
+        result = lynq_fota_try();
+        if(result == 0)
+        {
+            strcpy(str, "+FOTA: UPDATE SUCCESS\n");
+        }
+        else
+        {
+            strcpy(str, "+FOTA: UPDATE FAIL\n");
+        }
+    }
+    else
+    {
+        strcpy(str, "+CME: ERROR: 100\n");
+
+    }
+    g_handle_output(str, strlen(str), Response);
+    
+}
+
+void lynq_at_fota_cb(char *input, int input_max_size)
+{
+    char arry[20][35]={};
+    char *p = NULL;
+    int i = 0;
+    
+    if(input[8] == '0')
+    {
+        strcpy(g_buffer, input);
+    }
+    if(g_handle_output != NULL)
+    {
+        RLOGD("function %s start,input: %s \n", __FUNCTION__, input);
+        if(input != NULL)
+        {
+            while(( p = strsep(&input,",")) != NULL)
+            {
+                strcpy(arry[i],p);
+                i++;
+            }  
+            lynq_at_fota(arry);
+        }
+    }
+    
+}
+
+
+lynq_atsvc_incb lynq_register_fota(lynq_atsvc_outcb out_cb)
+{
+    if(out_cb != NULL)
+    {
+        g_handle_output = out_cb;
+        RLOGD("function %s start\n", __FUNCTION__);
+        return lynq_at_fota_cb;
+    }
+}
+
+
+#ifdef __cplusplus
+}
+#endif
+
+
+
+
diff --git a/src/lynq/lib/liblynq-at-fota/makefile b/src/lynq/lib/liblynq-at-fota/makefile
new file mode 100755
index 0000000..4368444
--- /dev/null
+++ b/src/lynq/lib/liblynq-at-fota/makefile
@@ -0,0 +1,87 @@
+
+SHELL = /bin/sh
+RM = rm -f
+
+LOCAL_CFLAGS := -Wall \
+                -std=gnu++14 \
+                -g -Os \
+                -flto \
+                -DRIL_SHLIB \
+                -DATCI_PARSE \
+                -fPIC \
+                -DKEEP_ALIVE \
+                -DECALL_SUPPORT \
+                -fpermissive \
+
+$(warning ################# lynq at factory demo ROOT: $(ROOT),includedir:$(includedir))
+
+ifeq ($(strip $(MOBILETEK_FOTA_CFG)), PLATFORM)
+    LOCAL_CFLAGS += -DMOBILETEK_FOTA_CFG
+endif
+
+ifeq ($(strip $(MOBILETEK_FOTA_CFG)), GSW)
+    LOCAL_CFLAGS += -DGSW_FOTA_CFG
+endif
+
+
+LOCAL_PATH   = .
+
+LOCAL_C_INCLUDES = \
+  -I. \
+  -I$(LOCAL_PATH)/include/libat \
+  -I$(ROOT)$(includedir)/logger \
+  -I$(ROOT)$(includedir)/liblog \
+  -I$(ROOT)$(includedir)/vendor-ril \
+  -I$(ROOT)$(includedir)/ftp \
+  
+
+
+LOCAL_LIBS := \
+    -L. \
+    -ldl \
+    -lstdc++ \
+    -llog \
+    -lcutils \
+    -lutils \
+    -lbinder \
+    -lpthread \
+    -llynq-log \
+    -llynq-fota \
+    -llynq-protcl \
+
+
+SOURCES = $(wildcard *.cpp)
+
+EXECUTABLE = liblynq-at-fota.so
+
+OBJECTS=$(SOURCES:.cpp=.o)
+
+.PHONY: build clean install pack_rootfs
+
+all: build
+$(EXECUTABLE): $(OBJECTS)
+	$(CXX) -shared -Wl,--no-undefined $(OBJECTS) $(LOCAL_LIBS) $(LOCAL_CFLAGS) $(LOCAL_C_INCLUDES) -o $@
+
+%.o : %.cpp
+	$(CXX) $(LOCAL_C_INCLUDES) $(LOCAL_CFLAGS) $(LOCAL_LIBS) -o $@ -c $<
+
+build:  $(EXECUTABLE)
+	$(warning ########## build $(EXECUTABLE)  ##########)
+
+install:
+	mkdir -p $(ROOT)$(base_libdir)/
+	install $(EXECUTABLE) $(ROOT)$(base_libdir)/
+	mkdir -p $(ROOT)$(includedir)/$(NAME)/sdk
+
+pack_rootfs:
+	mkdir -p $(PACK_INITRAMFS_TO)$(base_libdir)/
+	cp -af $(EXECUTABLE) $(PACK_INITRAMFS_TO)$(base_libdir)/
+	$(CROSS)strip $(PACK_INITRAMFS_TO)$(base_libdir)/$(EXECUTABLE)
+	mkdir -p $(PACK_TO)$(base_libdir)/
+	cp -af $(EXECUTABLE) $(PACK_TO)$(base_libdir)/
+	$(CROSS)strip $(PACK_TO)$(base_libdir)/$(EXECUTABLE)
+	
+.PHONY: clean
+clean:
+	$(RM) $(OBJECTS) $(EXECUTABLE)
+	-find . -name "*.o" -delete
diff --git a/src/lynq/lib/liblynq-call/LICENSE b/src/lynq/lib/liblynq-call/LICENSE
index 77f59ed..605b7ea 100755
--- a/src/lynq/lib/liblynq-call/LICENSE
+++ b/src/lynq/lib/liblynq-call/LICENSE
@@ -1,31 +1,31 @@
 Copyright Statement:
 
-This software/firmware and related documentation ("MediaTek Software") are
+This software/firmware and related documentation ("MobileTek Software") are
 protected under relevant copyright laws. The information contained herein is
-confidential and proprietary to MediaTek Inc. and/or its licensors. Without
-the prior written permission of MediaTek inc. and/or its licensors, any
-reproduction, modification, use or disclosure of MediaTek Software, and
+confidential and proprietary to MobileTek Inc. and/or its licensors. Without
+the prior written permission of MobileTek inc. and/or its licensors, any
+reproduction, modification, use or disclosure of MobileTek Software, and
 information contained herein, in whole or in part, shall be strictly
 prohibited.
 
-MediaTek Inc. (C) 2015. All rights reserved.
+MobileTek Inc. (C) 2015. All rights reserved.
 
 BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
-THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
-RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
-ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL
+THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MobileTek SOFTWARE")
+RECEIVED FROM MobileTek AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
+ON AN "AS-IS" BASIS ONLY. MobileTek EXPRESSLY DISCLAIMS ANY AND ALL
 WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
 WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
-NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH
+NONINFRINGEMENT. NEITHER DOES MobileTek PROVIDE ANY WARRANTY WHATSOEVER WITH
 RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
-INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES
+INCORPORATED IN, OR SUPPLIED WITH THE MobileTek SOFTWARE, AND RECEIVER AGREES
 TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
 RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
-OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK
-SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE
+OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MobileTek
+SOFTWARE. MobileTek SHALL ALSO NOT BE RESPONSIBLE FOR ANY MobileTek SOFTWARE
 RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
-STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S
-ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE
-RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE
-MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
-CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MobileTek'S
+ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MobileTek SOFTWARE
+RELEASED HEREUNDER WILL BE, AT MobileTek'S OPTION, TO REVISE OR REPLACE THE
+MobileTek SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
+CHARGE PAID BY RECEIVER TO MobileTek FOR SUCH MobileTek SOFTWARE AT ISSUE.
diff --git a/src/lynq/lib/liblynq-call/include/libcall/lynq_call.h b/src/lynq/lib/liblynq-call/include/libcall/lynq_call.h
index b9efae9..0b1b86e 100755
--- a/src/lynq/lib/liblynq-call/include/libcall/lynq_call.h
+++ b/src/lynq/lib/liblynq-call/include/libcall/lynq_call.h
@@ -6,7 +6,7 @@
 #define LYNQ_PHONE_NUMBER_MAX 32
 #define INDEX_IS_NUMBER( alpha_char )   \
    ( ( (alpha_char >= '0') && (alpha_char <= '9') ) ? 1 : 0 )
-#define LYNQ_CALL_MAX 10
+#define LYNQ_CALL_MAX 3
 #define LYNQ_CALL_FAIL_VENDOR_CAUSE 64
 #define MAX_IP_LENGTH 128
 #define MAX_VLAN_INFO_LENGTH 128
@@ -48,7 +48,6 @@
 int lynq_call_answer();
 int lynq_call_hungup(int*handle);
 int lynq_call_hungup_all();
-int lynq_wait_incoming_call(int *handle);
 int lynq_set_auto_answercall(const int mode);
 int lynq_get_mute_mic(int *status);
 int lynq_set_mute_mic(const int enable);
@@ -63,6 +62,16 @@
 int lynq_switch_waiting_or_holding_and_active(void);
 int lynq_hangup_waiting_or_background(void);
 int lynq_hangup_foreground_resume_background(void);
+
+/*lei add for API-163/API-164 2023/1/3*/
+/**
+ * @brief                  wait_call_state_change
+ *                        
+ * @param  handle            call_id            
+ * @return int
+ */
+int lynq_wait_call_state_change(int *handle);
+/*lei add for API-163/API-164 2023/1/3*/
 /*lei add for T8TSK-17 2022/7/20*/
 
 #ifdef ECALL_SUPPORT
diff --git a/src/lynq/lib/liblynq-call/lynq_call.cpp b/src/lynq/lib/liblynq-call/lynq_call.cpp
index 0270aa1..d1e2293 100755
--- a/src/lynq/lib/liblynq-call/lynq_call.cpp
+++ b/src/lynq/lib/liblynq-call/lynq_call.cpp
@@ -74,9 +74,9 @@
 static int s_module_isDial = 0;
 static pthread_mutex_t call_state_change_mutex = PTHREAD_MUTEX_INITIALIZER;
 static pthread_cond_t call_state_change_cond = PTHREAD_COND_INITIALIZER;
-static int s_IncomingCallId = 0;
-static pthread_mutex_t s_incoming_call_mutex = PTHREAD_MUTEX_INITIALIZER;
-static pthread_cond_t s_incoming_call_cond = PTHREAD_COND_INITIALIZER;
+static int s_CallId = 0;
+static pthread_mutex_t s_call_state_change_mutex = PTHREAD_MUTEX_INITIALIZER;
+static pthread_cond_t s_call_state_change_cond = PTHREAD_COND_INITIALIZER;
 
 static int s_module_call_state =CALL_OFF;
 static int s_call_auto_answer = 0;
@@ -299,6 +299,8 @@
     s_call_lists[lynq_call_id].used = 0;
     memset(s_call_lists[lynq_call_id].addr,0,sizeof(s_call_lists[lynq_call_id].addr));
 }
+
+
 int getUnusedElement()
 {
     for(int i=0;i < LYNQ_CALL_MAX; i++)
@@ -329,15 +331,15 @@
     callList->direction = direction;   
     return;
 }
-int waitIncomingCall()
+
+void wait_call_state()
 {
-    LYINFLOG("wait incming call");
-    int ret = 0;
-    pthread_mutex_lock(&s_incoming_call_mutex);
-    ret = pthread_cond_wait(&s_incoming_call_cond,&s_incoming_call_mutex);
-    pthread_mutex_unlock(&s_incoming_call_mutex);
-    return ret;
+    LYINFLOG("call state changed");
+    pthread_mutex_lock(&s_call_state_change_mutex);
+    pthread_cond_wait(&s_call_state_change_cond,&s_call_state_change_mutex);
+    pthread_mutex_unlock(&s_call_state_change_mutex);
 }
+
 int checkHasCall(char addr[])
 {
     for(int i = 0;i<LYNQ_CALL_MAX;i++)
@@ -384,18 +386,25 @@
     pthread_cond_signal(&call_state_change_cond);
     pthread_mutex_unlock(&call_state_change_mutex);
 }
-void sendSignalIncomingCall()
+void send_call_state_change()
 {
-    LYINFLOG("send incoming call signal");
-    pthread_mutex_lock(&s_incoming_call_mutex);
-    pthread_cond_signal(&s_incoming_call_cond);
-    pthread_mutex_unlock(&s_incoming_call_mutex);
+    LYINFLOG("send call state change");
+    pthread_mutex_lock(&s_call_state_change_mutex);
+    pthread_cond_signal(&s_call_state_change_cond);
+    pthread_mutex_unlock(&s_call_state_change_mutex);
 }
 
 void cleanup_call_list_mutex(void *arg)
 {
     pthread_mutex_unlock(&s_notice_get_call_list_mutex);
 }
+
+void update_end_state(int lynq_call_id)
+{
+    LYINFLOG("update_end_state local idx is %d, id is %d",lynq_call_id,s_call_lists[lynq_call_id].call_id);
+    s_call_lists[lynq_call_id].call_state = (int)LYNQ_CALL_END;
+}
+
 void *triggerGetCallList(void *parg)
 {
     int ret=0;
@@ -447,8 +456,11 @@
                 }
                 if(call_end == 0)
                 {
-                    LYINFLOG("MT hungup,then clean call info local idx is %d id is %d",i, s_call_lists[i].call_id);
-                    cleanCallList(i);                   
+                    LYINFLOG("MT/MO hungup,then clean call info local idx is %d id is %d",i, s_call_lists[i].call_id);
+                    //update_end_state(i);//lei modify for:update end state for this call
+                    cleanCallList(i);
+                    send_call_state_change();//means mt/mo call is end
+                    //cleanCallList(i);
                 }
             } //fix bug API-54
             else 
@@ -494,8 +506,8 @@
                 {
                     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);
-                    s_IncomingCallId = call_list[i].call_id;
-                    sendSignalIncomingCall();
+                    s_CallId = call_list[i].call_id;
+                    send_call_state_change();
                 }
                 else if(s_call_lists[n].call_state == call_list[i].call_state)
                 {
@@ -507,15 +519,16 @@
                         **fix bug API-54
                         */
                         LYINFLOG("resend incoming call signal");
-                        sendSignalIncomingCall();
+                        send_call_state_change();
                     }
                 }
                 else 
                 {
                     LYINFLOG("state changed from %d to %d",s_call_lists[n].call_state,call_list[i].call_state);
                     
-                    updateCallList(&s_call_lists[n],call_list[i].call_id,call_list[i].call_state,call_list[i].toa,call_list[i].direction);
-                }                               
+                    updateCallList(&s_call_lists[n],call_list[i].call_id,call_list[i].call_state,call_list[i].toa,call_list[i].direction);//update mt call
+                    send_call_state_change();
+                }                            
             }
             else
             {     
@@ -527,17 +540,18 @@
                     {
                         if(s_call_lists[n].call_id==0)
                         {
-                             LYINFLOG("add a call id");
-                             update=1;
+                            LYINFLOG("add a call id");
+                            update=1;//for send sigal
+                            s_CallId = call_list[i].call_id;
                         }
                         LYINFLOG("local idx %d updated, original call id is %d origial addr is %s original state is %d",n,s_call_lists[n].call_id,s_call_lists[n].addr,s_call_lists[n].call_state);                    
                         updateCallList(&s_call_lists[n],call_list[i].call_id,call_list[i].call_state,call_list[i].toa,call_list[i].direction);
                         call_end = 1;
+                        send_call_state_change();//means mo call is success
                         break;
                     }                    
                 }
-
-                if(call_end == 0)
+                if(call_end == 0)//1.there is no space to use 2.can't find addr in buffer 3.call_id not equal   eg:when call is error return 8004/handle <= 0 will into this
                 {  
                     LYINFLOG("need to hangup id %d", call_list[i].call_id);
 #ifdef ECALL_SUPPORT
@@ -550,6 +564,7 @@
                     LYINFLOG("hang up service call id %d",call_list[i].call_id); 
                     lynq_call_hungup(&(call_list[i].call_id));
                 }
+
             }
             LYDBGLOG("servie idx %d end",i);
         }
@@ -751,7 +766,7 @@
 
     g_module_Global_uToken = utoken; 
 
-    int ret = lynq_urc_socket_start();
+    int ret = lynq_start_all_urc_socket_thread();
     if(ret != RESULT_OK)
     {
         LYERRLOG("init socket urc fail!!!");
@@ -759,11 +774,11 @@
         return LYNQ_E_INNER_ERROR;
     }
 
-    ret = lynq_server_socket_start();
+    ret = lynq_start_all_rc_socket_thread();
     if(ret !=RESULT_OK)
     {
         LYERRLOG("init socket client fail!!!");
-        lynq_close_urc_thread();
+        lynq_close_all_urc_socket_thread();
         g_module_init_flag = MODULE_CLOSED;
         return LYNQ_E_INNER_ERROR;
     }
@@ -773,8 +788,8 @@
     if(ret != RESULT_OK)
     {
         LYERRLOG("lynq_start_call_list_loop fail!!!");
-        lynq_close_urc_thread();
-        lynq_close_rc_thread();
+        lynq_close_all_urc_socket_thread();
+        lynq_close_all_rc_socket_thread();
         g_module_init_flag = MODULE_CLOSED;
         return LYNQ_E_INNER_ERROR;
     }      
@@ -795,8 +810,8 @@
     lynq_call_hungup_all();  
     lynq_set_voice_audio_mode(AUDIO_MODE_CODEC);
     g_module_init_flag = MODULE_SWITCHING;
-    lynq_close_urc_thread();
-    lynq_close_rc_thread();    
+    lynq_close_all_urc_socket_thread();
+    lynq_close_all_rc_socket_thread();    
     lynq_stop_call_list_loop();
     g_module_init_flag = MODULE_CLOSED;
     return 0;
@@ -891,6 +906,7 @@
     return s_module_isDial;
 }
 
+
 int lynq_call(int* handle,char addr[])
 {
     if(g_module_init_flag != MODULE_RUNNING)
@@ -921,25 +937,23 @@
         return LYNQ_E_ECALL_BEING_RUNNING;
     }
 #endif   
-
     Parcel* p=NULL;
     lynq_call_id = addAddr(addr,0);
     int ret=lynq_send_common_request(p,g_wait_time,RIL_REQUEST_DIAL,2,"%s %d",addr, 0);
     if(ret!=0)
     {
-        cleanCallList(lynq_call_id);       
+        cleanCallList(lynq_call_id);  
         return ret;      
-    }
-    
-    delete p;        
- 
+    }       
+    delete p;
     s_module_isDial = 1;
     if(waitCallstateChange(6000)==ETIMEDOUT)//6000ms
     {
         //if timeout,this call need destroy.
         s_module_isDial = 0;      
         LYERRLOG("lynq_call timeout:wait Call state fail!!! clear local idx %d",lynq_call_id);
-        cleanCallList(lynq_call_id);            
+        cleanCallList(lynq_call_id);
+        send_call_state_change();
         return LYNQ_E_TIME_OUT;
     }
     s_module_isDial = 0;
@@ -952,10 +966,12 @@
     else 
     {   
         LYERRLOG("lynq_call dial addr %s fail, invalid id",addr);
-        cleanCallList(lynq_call_id);      
+        cleanCallList(lynq_call_id);
+        send_call_state_change();
         return LYNQ_E_INVALID_ID_ANONALY;
-    }                 
+    }        
 }
+
 int lynq_call_answer()
 {
     if(g_module_init_flag != MODULE_RUNNING)
@@ -972,6 +988,7 @@
     }        
     return ret;
 }
+
 int lynq_call_hungup(int* handle)
 {
     if(g_module_init_flag != MODULE_RUNNING)
@@ -1018,17 +1035,18 @@
     }        
     return ret;   
 }
-int lynq_wait_incoming_call(int *handle)
+
+int lynq_wait_call_state_change(int *handle)
 {
     if(g_module_init_flag != MODULE_RUNNING)
     {
         LYERRLOG("%s module state %d error",__func__,g_module_init_flag);
         return LYNQ_E_CONFLICT;
     }
-    waitIncomingCall();
-    *handle = s_IncomingCallId;
-    LYINFLOG("lynq incoming call id:%d",s_IncomingCallId);
-    return RESULT_OK;   
+    wait_call_state();
+    *handle = s_CallId;
+    LYINFLOG("lynq mo/mt call id:%d",s_CallId);
+    return RESULT_OK;
 }
 
 int lynq_set_auto_answercall(const int mode)
@@ -1042,6 +1060,19 @@
     LYINFLOG("auto answer call mode =%d",mode);
     return RESULT_OK;   
 }
+
+int lynq_find_already_end()
+{
+    for(int i=0;i < LYNQ_CALL_MAX; i++)
+    {
+        if(s_call_lists[i].call_state == 6)
+        {
+            return 0;
+        }
+    }
+    return INVALID_ID;
+}
+
 int lynq_get_current_call_state(int *handle,    int *call_state,int *toa,int *direction,char addr[])
 {
     if(g_module_init_flag != MODULE_RUNNING)
@@ -1056,16 +1087,26 @@
         LYERRLOG("handle is NULL");
         return LYNQ_E_PARAMETER_ANONALY;
     }
+    LYINFLOG("lynq_get_current_call_state %d\n ", *handle);
     lynq_call_id = find_call_id_with_call_id(*handle);
     if(lynq_call_id==INVALID_ID)
     {
-        return LYNQ_E_INVALID_ID_ANONALY;
+        //find end state
+        if((*handle) >= 0)
+        {
+            *call_state = (int)LYNQ_CALL_END;
+            return RESULT_OK; 
+        }
+        else
+        {
+            return LYNQ_E_INVALID_ID_ANONALY;
+        }
     }
     *call_state = s_call_lists[lynq_call_id].call_state;
     *toa = s_call_lists[lynq_call_id].toa;
     *direction = s_call_lists[lynq_call_id].direction;
     memcpy(addr,s_call_lists[lynq_call_id].addr,strlen(s_call_lists[lynq_call_id].addr)+1);
-    return RESULT_OK;   
+    return RESULT_OK;
 }
 
 int lynq_get_current_call_number()
@@ -1389,16 +1430,36 @@
 }
 /*audio end*/
 
+
+
+bool is_support_urc(int urc_id)
+{
+    switch(urc_id)
+    {
+        case RIL_UNSOL_RESPONSE_CALL_STATE_CHANGED:
+        case RIL_UNSOL_CALL_RING:
+        case RIL_UNSOL_RINGBACK_TONE:
+        case RIL_UNSOL_CALL_INFO_INDICATION:
+#ifdef ECALL_SUPPORT
+        case RIL_UNSOL_ECALL_INDICATIONS://9502        
+#endif
+            return true;                
+        default:
+            return false;
+    }    
+}
+
 void urc_msg_process(Parcel *p)
 { 
     int resp_type;
     int urcid;
     int slot_id;
-    
+
+    int size=p->dataSize();
     p->readInt32(&resp_type);
     p->readInt32(&urcid);
     p->readInt32(&slot_id);
-    LYINFLOG("urc id = %d, slot_id = %d",urcid,slot_id);
+    LYINFLOG("%s urc id = %d, slot_id = %d, size is %d, msg is %s",__func__, urcid,slot_id,size,requestToString(urcid));
     switch (urcid)
     {
         case RIL_UNSOL_RESPONSE_CALL_STATE_CHANGED://1001
diff --git a/src/lynq/lib/liblynq-call/lynq_call_ecall.cpp b/src/lynq/lib/liblynq-call/lynq_call_ecall.cpp
index 0c76262..d25675a 100755
--- a/src/lynq/lib/liblynq-call/lynq_call_ecall.cpp
+++ b/src/lynq/lib/liblynq-call/lynq_call_ecall.cpp
@@ -479,7 +479,7 @@
     }
     if(enable<0)
     {
-       if(enable >-100)
+       if(enable >-200)
        {
            goto set_ivs_end;
 //         lynq_set_common_request(RIL_REQUEST_ECALL_SET_IVS,1,"%d",enable);
@@ -490,7 +490,7 @@
        } 
        else
        {
-           s_ecall_whether_preempt= ((-100-enable) & 0x11);           
+           s_ecall_whether_preempt= ((-200-enable) & 0x11);           
        }
        return RESULT_OK;   
     }
diff --git a/src/lynq/lib/liblynq-call/lynq_call_rtp.cpp b/src/lynq/lib/liblynq-call/lynq_call_rtp.cpp
index f217c25..e22b016 100755
--- a/src/lynq/lib/liblynq-call/lynq_call_rtp.cpp
+++ b/src/lynq/lib/liblynq-call/lynq_call_rtp.cpp
@@ -84,9 +84,7 @@
         system(cmd);    
     }
     else 
-    {
-        sprintf(cmd, "amixer -D mtk_phonecall cset name=\"Speech_on\" %d", 1);
-        system(cmd);
+    {        
         sprintf(cmd, "amixer -D mtk_phonecall cset name=\"M2M_Speech_on\" %d", 0);
         system(cmd);
         sprintf(cmd, "amixer -c0 cset name=\"PCM_2_PB_CH1 DL2_CH1\" %d", 0);
@@ -97,6 +95,8 @@
         system(cmd);
         sprintf(cmd, "amixer -c0 cset name=\"UL2_CH2 PCM_2_CAP_CH1\" %d", 0);
         system(cmd);    
+        sprintf(cmd, "amixer -D mtk_phonecall cset name=\"Speech_on\" %d", 1);
+        system(cmd);
     }    
 }
 
diff --git a/src/lynq/lib/liblynq-call/lynq_module_common.h b/src/lynq/lib/liblynq-call/lynq_module_common.h
index 9e70d6c..590971a 100755
--- a/src/lynq/lib/liblynq-call/lynq_module_common.h
+++ b/src/lynq/lib/liblynq-call/lynq_module_common.h
@@ -5,29 +5,31 @@
 #define RESULT_ERROR (-1)
 
 /*the same with lynq_interface.h begin*/
-#define LYNQ_REQUEST_VENDOR_BASE 8000
-#define LYNQ_URC_VENDOR_BASE 9000
-#define LYNQ_AT_SNED (LYNQ_REQUEST_VENDOR_BASE +1)
-#define LYNQ_URC_CALL_STATUS_IND (LYNQ_URC_VENDOR_BASE+1)
-#define LYNQ_URC_DATA_STATUS_IND (LYNQ_URC_VENDOR_BASE+2)
-#define LYNQ_URC_DATA_CALL_STATUS_IND (LYNQ_URC_VENDOR_BASE+3)
-#define LYNQ_AUTO_ANSWER_CALL (LYNQ_REQUEST_VENDOR_BASE +2)
-#define LYNQ_REQUEST_SET_DTMF_VOLUME (LYNQ_REQUEST_VENDOR_BASE +3)
-#define LYNQ_URC_MODIFY_APNDB (LYNQ_URC_VENDOR_BASE+4)
-#define LYNQ_URC_RESET_APNDB (LYNQ_URC_VENDOR_BASE+5)
-
-
-#define LYNQ_REQUEST_WRITE_SMS_TO_MEMORY (LYNQ_REQUEST_VENDOR_BASE +4)
-#define LYNQ_REQUEST_READ_SMS_FROM_MEMORY (LYNQ_REQUEST_VENDOR_BASE + 5)
-#define LYNQ_REQUEST_DELETE_SMS_FROM_MEMORY (LYNQ_REQUEST_VENDOR_BASE + 6)
-#define LYNQ_REQUEST_LIST_SMS_FROM_MEMORY (LYNQ_REQUEST_VENDOR_BASE + 7)
-#define LYNQ_REQUEST_SET_DEFAULT_SIM_ALL (LYNQ_REQUEST_VENDOR_BASE + 8)
-
-#define LYNQ_REQUEST_SET_SPEECH_VOLUME (LYNQ_REQUEST_VENDOR_BASE +9)
-#define LYNQ_REQUEST_GET_SPEECH_VOLUME (LYNQ_REQUEST_VENDOR_BASE +10)
-#define LYNQ_REQUEST_RECORD  (LYNQ_REQUEST_VENDOR_BASE +11)
-#define LYNQ_REQUEST_OOS_RECOVER_TIMER_INTERVAL (LYNQ_REQUEST_VENDOR_BASE +12)
+#define LYNQ_REQUEST_VENDOR_BASE 8000
+#define LYNQ_URC_VENDOR_BASE 9000
+#define LYNQ_AT_SNED (LYNQ_REQUEST_VENDOR_BASE +1)
+#define LYNQ_URC_CALL_STATUS_IND (LYNQ_URC_VENDOR_BASE+1)
+#define LYNQ_URC_DATA_STATUS_IND (LYNQ_URC_VENDOR_BASE+2)
+#define LYNQ_URC_DATA_CALL_STATUS_IND (LYNQ_URC_VENDOR_BASE+3)
+#define LYNQ_AUTO_ANSWER_CALL (LYNQ_REQUEST_VENDOR_BASE +2)
+#define LYNQ_REQUEST_SET_DTMF_VOLUME (LYNQ_REQUEST_VENDOR_BASE +3)
+#define LYNQ_URC_MODIFY_APNDB (LYNQ_URC_VENDOR_BASE+4)
+#define LYNQ_URC_RESET_APNDB (LYNQ_URC_VENDOR_BASE+5)
+
+
+#define LYNQ_REQUEST_WRITE_SMS_TO_MEMORY (LYNQ_REQUEST_VENDOR_BASE +4)
+#define LYNQ_REQUEST_READ_SMS_FROM_MEMORY (LYNQ_REQUEST_VENDOR_BASE + 5)
+#define LYNQ_REQUEST_DELETE_SMS_FROM_MEMORY (LYNQ_REQUEST_VENDOR_BASE + 6)
+#define LYNQ_REQUEST_LIST_SMS_FROM_MEMORY (LYNQ_REQUEST_VENDOR_BASE + 7)
+#define LYNQ_REQUEST_SET_DEFAULT_SIM_ALL (LYNQ_REQUEST_VENDOR_BASE + 8)
+
+#define LYNQ_REQUEST_SET_SPEECH_VOLUME (LYNQ_REQUEST_VENDOR_BASE +9)
+#define LYNQ_REQUEST_GET_SPEECH_VOLUME (LYNQ_REQUEST_VENDOR_BASE +10)
+#define LYNQ_REQUEST_RECORD  (LYNQ_REQUEST_VENDOR_BASE +11)
+#define LYNQ_REQUEST_OOS_RECOVER_TIMER_INTERVAL (LYNQ_REQUEST_VENDOR_BASE +12)
 #define LYNQ_REQUEST_OOS_DEEP_SLEEP_RECOVER_TIMER_INTERVAL (LYNQ_REQUEST_VENDOR_BASE +13)
+#define LYNQ_REQUEST_CHANGE_SCREEN_STATE (LYNQ_REQUEST_VENDOR_BASE + 14)/*jb.qi add for two sim suspend 2022/9/19*/
+#define LYNQ_REQUEST_CHANGE_RADIO (LYNQ_REQUEST_VENDOR_BASE + 15)
 /*the same with lynq_interface.h end*/
 
 typedef enum{
diff --git a/src/lynq/lib/liblynq-call/lynq_module_socket.cpp b/src/lynq/lib/liblynq-call/lynq_module_socket.cpp
index 71862a8..ff45c02 100755
--- a/src/lynq/lib/liblynq-call/lynq_module_socket.cpp
+++ b/src/lynq/lib/liblynq-call/lynq_module_socket.cpp
@@ -15,6 +15,7 @@
 #include "lynq_module_common.h"
 #include "lynq_module_socket.h"
 #include "liblog/lynq_deflog.h"
+#include "lynq_shm.h"
 
 #define LYNQ_SERVICE_PORT 8088
 #define LYNQ_ADDRESS "127.0.0.1"
@@ -40,6 +41,11 @@
     int error;
 }lynq_resp_t;
 
+typedef struct{
+    int resp_type;
+    int urcid;   
+}lynq_head_t;
+
 lynq_client_t client_t;
 lynq_resp_t response;
 
@@ -67,6 +73,21 @@
 const int waitResponse(int token,int time_out);
 /*hq add for set waiting time 2022/09/13 end*/
 
+/*hq add for urc process asynchronous 2022/12/26 begin*/
+static pthread_mutex_t s_ProcessUrcMsgBlockMutex = PTHREAD_MUTEX_INITIALIZER;
+static pthread_cond_t s_WaitProcessUrcMsgCond = PTHREAD_COND_INITIALIZER;
+
+#define BLOCK_PROCESS_URC_MSG_INIT() pthread_mutex_init(&s_ProcessUrcMsgBlockMutex,NULL)
+#define BLOCK_PROCESS_URC_MSG_LOCK() pthread_mutex_lock(&s_ProcessUrcMsgBlockMutex)
+#define BLOCK_PROCESS_URC_MSG_UNLOCK() pthread_mutex_unlock(&s_ProcessUrcMsgBlockMutex)
+#define BLOCK_WAIT_PROCESS_URC_MSG() pthread_cond_wait(&s_WaitProcessUrcMsgCond, &s_ProcessUrcMsgBlockMutex)
+#define BLOCK_WAKEUP_PROCESS_URC_MSG() pthread_cond_broadcast(&s_WaitProcessUrcMsgCond)
+static std::list<Parcel*> s_recv_urc_parcel_list;
+void *thread_urc_process(void *p);
+pthread_t module_urc_process_tid = -1;
+int module_urc_process_status = 1;
+/*hq add for urc process asynchronous 2022/12/26 end*/
+
 int g_module_Global_uToken = 0;
 int g_wait_time=5;
 
@@ -118,7 +139,7 @@
     std::list<Parcel*>::iterator iter;
     int cnt=0;
     
-	gettimeofday(&now,NULL);
+    gettimeofday(&now,NULL);
     timeout.tv_sec = now.tv_sec+time_out; //timeout is 1min
     timeout.tv_nsec = now.tv_usec*1000;
 
@@ -268,6 +289,295 @@
     return ret;    
 }
 
+/*hq add for urc broadcase optimisson 2023/01/03 begin*/
+#define SHM_BUFFER_INDEX_OFFSET 1
+#define SHM_BUFFER_SIZE_OFFSET 16
+#define SHM_BUFFER_INDEX_MASK 0x0000007F
+#define SHM_BUFFER_SIZE_MASK 0x0000FFFF
+
+bool urc_data_is_in_shm_data(int responseType,int& level, int& index, int& size)
+{
+    int shm_index=((responseType>>SHM_BUFFER_INDEX_OFFSET)&SHM_BUFFER_INDEX_MASK);
+    if (shm_index>0)
+    {
+        index=shm_index-1;    
+        size=((responseType>>SHM_BUFFER_SIZE_OFFSET)&SHM_BUFFER_SIZE_MASK);
+        if(size>=sizeof(int32_t)*3 && get_shem_buffer_level(size,&level))
+        {
+            LYINFLOG("urc_data_is_in_shm_data level is %d, index is %d size is %d",level,index,size);
+            return true;                            
+        }        
+    }
+    LYINFLOG("urc_data_is_in_shm_data return false, responseType is %d",responseType);
+    return false;
+}
+/*hq add for urc broadcase optimisson 2023/01/03 end*/
+
+void *thread_urc_recv(void *p)
+{
+    Parcel *urc_p =NULL;
+    char urc_data[LYNQ_REC_BUF];    
+    int res = 0;
+    lynq_head_t* phead;
+    int level,index,size;
+	uint8_t * shm_buffer;
+   
+    LYINFLOG("urc recv thread is running");
+    while(module_urc_status)
+    {
+        bzero(urc_data,LYNQ_REC_BUF);
+        res = recvfrom(module_urc_sock_fd,urc_data,sizeof(urc_data),0,(struct sockaddr *)&module_urc_addr_serv,(socklen_t*)&module_len_urc_addr_serv);
+        if(res<sizeof(int32_t)*2)
+        {
+            LYERRLOG("thread_urc_recv step2 fail: res is %d",res);
+            continue;
+        }
+
+        phead=(lynq_head_t*) urc_data;
+        if(is_support_urc(phead->urcid)==false)
+        {
+            continue;
+        }
+        urc_p = new Parcel();
+        if(urc_p == NULL)
+        {
+            LYERRLOG("new parcel failure!!!");
+            continue;
+        }      
+        if(urc_data_is_in_shm_data(phead->resp_type,level,index,size))
+        {
+            shm_buffer = (uint8_t *) get_shem_buffer(level,index);
+            LYINFLOG("shm pointer is %p", shm_buffer); 
+            urc_p->setData(shm_buffer,size); // p.setData((uint8_t *) buffer, buflen);                        
+        }
+        else if(res>=sizeof(int32_t)*3)
+        {
+            urc_p->setData((uint8_t *)urc_data,res); // p.setData((uint8_t *) buffer, buflen);            
+        }
+        else 
+        {    
+               LYERRLOG("res %d error!!!", res);
+            delete urc_p;
+            urc_p = NULL;
+            continue;
+        }
+        urc_p->setDataPosition(0);
+        if(urc_p->dataAvail()>0)
+        {
+            BLOCK_PROCESS_URC_MSG_LOCK();
+            s_recv_urc_parcel_list.push_back(urc_p);            
+            BLOCK_WAKEUP_PROCESS_URC_MSG();
+            BLOCK_PROCESS_URC_MSG_UNLOCK();
+        }
+        else 
+        {
+            delete urc_p;
+            urc_p = NULL;
+        }        
+    }
+    LYINFLOG("urc recv thread ended");
+    return NULL;
+}
+
+void cleanup_urc_process_mutex(void *arg)
+{
+    BLOCK_PROCESS_URC_MSG_UNLOCK();
+}
+
+void *thread_urc_process(void *p)
+{
+    Parcel *urc_p =NULL;
+    std::list<Parcel*>::iterator iter;
+   
+    LYINFLOG("urc process thread is running");
+    pthread_cleanup_push(cleanup_urc_process_mutex, NULL); // thread cleanup handler
+    while(module_urc_process_status)
+    {
+        BLOCK_PROCESS_URC_MSG_LOCK();
+        while(s_recv_urc_parcel_list.empty())
+        {
+            BLOCK_WAIT_PROCESS_URC_MSG();
+        }  
+        iter=s_recv_urc_parcel_list.begin();
+        urc_p=(*iter);
+        s_recv_urc_parcel_list.erase(iter);
+        BLOCK_PROCESS_URC_MSG_UNLOCK();             
+        urc_p->setDataPosition(0);
+        if(urc_p->dataAvail()>0)
+        {          
+            pthread_mutex_lock(&s_urc_mutex);
+            urc_msg_process(urc_p);            
+            pthread_mutex_unlock(&s_urc_mutex);
+        }
+        delete urc_p;
+        urc_p = NULL;
+    }
+    pthread_cleanup_pop(0);
+    LYINFLOG("urc process thread ended");
+    return NULL;
+}
+
+void lynq_close_urc_rev_thread()
+{
+    int ret;
+
+    BLOCK_PROCESS_URC_MSG_LOCK();  //just cancel urc process tid when recv from
+    module_urc_status = 0;    
+    if(module_urc_tid!=-1)
+    {
+        ret = pthread_cancel(module_urc_tid);
+        LYINFLOG("pthread cancel urc rev ret = %d",ret);            
+    }
+    BLOCK_PROCESS_URC_MSG_UNLOCK();
+    if(module_urc_tid != -1)
+    {
+        ret = pthread_join(module_urc_tid,NULL);
+        LYINFLOG("pthread join urc tid ret = %d",ret);
+        module_urc_tid =-1;
+    }       
+}
+
+void lynq_close_urc_process_thread()
+{
+    int ret;
+    BLOCK_PROCESS_URC_MSG_LOCK();  //just cancel urc process tid when not process urc msg in list 
+    pthread_mutex_lock(&s_urc_mutex); //just cancel urc process tid when not process urg msg avoid mutual lock for tid may call pthread_cond_wait
+    module_urc_process_status = 0;    
+    if(module_urc_process_tid!=-1)
+    {
+        ret = pthread_cancel(module_urc_process_tid);
+        LYINFLOG("pthread cancel urc process ret = %d",ret);            
+    }
+    pthread_mutex_unlock(&s_urc_mutex);
+    BLOCK_PROCESS_URC_MSG_UNLOCK();
+    if(module_urc_process_tid != -1)
+    {
+        ret = pthread_join(module_urc_process_tid,NULL);
+        LYINFLOG("pthread join urc process tid ret = %d",ret);
+        module_urc_process_tid =-1;
+    }
+}
+
+int lynq_setup_urc_socket()
+{
+    int on = 1;
+    int ret = 0;
+    module_len_urc_addr_serv = sizeof(sockaddr_in);
+    module_urc_sock_fd = socket(AF_INET, SOCK_DGRAM, 0);
+    if (module_urc_sock_fd <0){
+        LYERRLOG("urc socket error");
+        return RESULT_ERROR;  
+    }
+    module_urc_addr_serv.sin_family = AF_INET;
+    module_urc_addr_serv.sin_port = htons(LYNQ_URC_SERVICE_PORT);
+    module_urc_addr_serv.sin_addr.s_addr = inet_addr(LYNQ_URC_ADDRESS);
+    /* Set socket to allow reuse of address and port, SO_REUSEADDR value is 2*/
+    ret = setsockopt(module_urc_sock_fd,SOL_SOCKET,SO_REUSEADDR,&on,sizeof on);
+    if(ret <0)
+    {
+        LYERRLOG("urc socket set error");
+        close(module_urc_sock_fd);
+        module_urc_sock_fd =-1;
+        return RESULT_ERROR;  
+    }
+    ret = bind(module_urc_sock_fd ,(struct sockaddr*)&module_urc_addr_serv, sizeof(module_urc_addr_serv));
+    if(ret <0)
+    {
+        LYERRLOG("urc socket bind error");
+        close(module_urc_sock_fd);
+        module_urc_sock_fd =-1;
+        return RESULT_ERROR;  
+    }
+    return RESULT_OK;
+}
+
+void lynq_close_urc_socket()
+{
+    if (module_urc_sock_fd >= 0)
+    {
+        close(module_urc_sock_fd);
+        module_urc_sock_fd =-1;
+    }  
+}
+
+int lynq_start_all_urc_socket_thread()
+{  
+    
+    if(ril_init_mem()!=0)
+    {
+        LYERRLOG("ril_init_mem fail");        
+        return RESULT_ERROR;
+    }
+
+    int ret= lynq_setup_urc_socket();
+    if(ret!=RESULT_OK)
+    {
+        LYERRLOG("call lynq_setup_urc_socket fail");
+        ril_deinit_mem();
+        return RESULT_ERROR;
+    }
+    
+    BLOCK_PROCESS_URC_MSG_INIT();
+    BLOCK_PROCESS_URC_MSG_LOCK();    
+    std::list<Parcel*>::iterator iter;
+    for(iter=s_recv_urc_parcel_list.begin();iter!=s_recv_urc_parcel_list.end();++iter)
+    {
+        delete (*iter);        
+    }
+    s_recv_urc_parcel_list.clear(); 
+    BLOCK_PROCESS_URC_MSG_UNLOCK(); 
+    
+    pthread_mutex_init(&s_urc_mutex, NULL);    
+    
+    module_urc_status = 1;
+  //  pthread_attr_init(&attr);
+  //  pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
+    ret = pthread_create(&module_urc_tid,/*&attr*/NULL,thread_urc_recv,NULL);
+    if(ret <0)
+    {
+        LYERRLOG("urc recv pthread create error");
+        module_urc_status = 0;
+        lynq_close_urc_socket();
+        ril_deinit_mem();
+        return RESULT_ERROR;  
+    }
+
+    module_urc_process_status = 1;
+    ret = pthread_create(&module_urc_process_tid,/*&attr*/NULL,thread_urc_process,NULL);
+    if(ret <0)
+    {
+        LYERRLOG("urc process pthread create error");
+        module_urc_process_status = 0;
+        lynq_close_urc_socket();
+        lynq_close_urc_rev_thread();
+        ril_deinit_mem();
+        return RESULT_ERROR;  
+    }
+    
+    LYINFLOG("urc start success");
+    
+    return RESULT_OK;  
+}
+
+void lynq_close_all_urc_socket_thread()
+{
+ 
+    lynq_close_urc_rev_thread();
+    lynq_close_urc_socket();
+    lynq_close_urc_process_thread();        
+    
+    BLOCK_PROCESS_URC_MSG_LOCK();    
+    std::list<Parcel*>::iterator iter;
+    for(iter=s_recv_urc_parcel_list.begin();iter!=s_recv_urc_parcel_list.end();++iter)
+    {
+        delete (*iter);        
+    }
+    s_recv_urc_parcel_list.clear(); 
+    BLOCK_PROCESS_URC_MSG_UNLOCK(); 
+    
+    ril_deinit_mem();    
+}
+
 /**@ a thread just for recv\buffer solicited msg's response and notice waiting thread
 * @param p [IN]: no meaning
 * @return
@@ -347,44 +657,7 @@
     return NULL;
 }
 
-void *thread_urc_recv(void *p)
-{
-    Parcel *urc_p =NULL;
-    char urc_data[LYNQ_REC_BUF];    
-    int res = 0;
-   
-    LYINFLOG("urc thread is running");
-    while(module_urc_status)
-    {
-        bzero(urc_data,LYNQ_REC_BUF);
-        res = recvfrom(module_urc_sock_fd,urc_data,sizeof(urc_data),0,(struct sockaddr *)&module_urc_addr_serv,(socklen_t*)&module_len_urc_addr_serv);
-        if(res<=0)
-        {
-            LYERRLOG("thread_urc_recv step2 fail:");
-            break;
-        }
-        urc_p = new Parcel();
-        if(urc_p == NULL)
-        {
-            LYERRLOG("new parcel failure!!!");
-            break;
-        }
-        urc_p->setData((uint8_t *)urc_data,res); // p.setData((uint8_t *) buffer, buflen);
-        urc_p->setDataPosition(0);
-        if(urc_p->dataAvail()>0)
-        {
-            pthread_mutex_lock(&s_urc_mutex);
-            urc_msg_process(urc_p);            
-            pthread_mutex_unlock(&s_urc_mutex);
-        }
-        delete urc_p;
-        urc_p = NULL;
-    }
-    LYINFLOG("urc thread ended");
-    return NULL;
-}
-
-int lynq_server_socket_start()
+int lynq_start_all_rc_socket_thread()
 {
     module_rc_sock_fd = socket(AF_INET, SOCK_DGRAM, 0);
     if(module_rc_sock_fd < 0)
@@ -434,87 +707,12 @@
     return RESULT_OK;  
 }
 
-int lynq_urc_socket_start()
-{
-//    pthread_t tid;
-//    pthread_attr_t attr;
-    int on = 1;
-    int ret = 0;
-    module_len_urc_addr_serv = sizeof(sockaddr_in);
-    module_urc_sock_fd = socket(AF_INET, SOCK_DGRAM, 0);
-    if (module_urc_sock_fd <0){
-        LYERRLOG("urc socket error");
-        return RESULT_ERROR;  
-    }
-    module_urc_addr_serv.sin_family = AF_INET;
-    module_urc_addr_serv.sin_port = htons(LYNQ_URC_SERVICE_PORT);
-    module_urc_addr_serv.sin_addr.s_addr = inet_addr(LYNQ_URC_ADDRESS);
-    /* Set socket to allow reuse of address and port, SO_REUSEADDR value is 2*/
-    ret = setsockopt(module_urc_sock_fd,SOL_SOCKET,SO_REUSEADDR,&on,sizeof on);
-    if(ret <0)
-    {
-        LYERRLOG("urc socket set error");
-        close(module_urc_sock_fd);
-        module_urc_sock_fd =-1;
-        return RESULT_ERROR;  
-    }
-    ret = bind(module_urc_sock_fd ,(struct sockaddr*)&module_urc_addr_serv, sizeof(module_urc_addr_serv));
-    if(ret <0)
-    {
-        LYERRLOG("urc socket bind error");
-        close(module_urc_sock_fd);
-        module_urc_sock_fd =-1;
-        return RESULT_ERROR;  
-    }
-
-    module_urc_status = 1;
-  //  pthread_attr_init(&attr);
-  //  pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
-    ret = pthread_create(&module_urc_tid,/*&attr*/NULL,thread_urc_recv,NULL);
-    if(ret <0)
-    {
-        LYERRLOG("urc pthread create error");
-        module_urc_status = 0;
-        close(module_urc_sock_fd);
-        module_urc_sock_fd =-1;
-        return RESULT_ERROR;  
-    }
-    LYINFLOG("urc start success");
-    
-    return RESULT_OK;  
-}
-
-void lynq_close_urc_thread()
-{
-    int ret;
-
-    pthread_mutex_lock(&s_urc_mutex); //just cancel urc tid when recvfrom avoid mutual lock for tid may call pthread_cond_wait
-    module_urc_status = 0;    
-    if(module_urc_tid!=-1)
-    {
-        ret = pthread_cancel(module_urc_tid);
-        LYINFLOG("pthread cancel urc ret = %d",ret);            
-    }
-    pthread_mutex_unlock(&s_urc_mutex);
-    if(module_urc_tid != -1)
-    {
-        ret = pthread_join(module_urc_tid,NULL);
-        LYINFLOG("pthread join urc tid ret = %d",ret);
-        module_urc_tid =-1;
-    }
-    if (module_urc_sock_fd > 0)
-    {
-        close(module_urc_sock_fd);
-        module_urc_sock_fd =-1;
-    }  
-}
-
-void lynq_close_rc_thread()
+void lynq_close_all_rc_socket_thread()
 {
     int ret;
     BLOCK_RECV_MSG_LOCK(); 
-    module_rc_status = 0;
-    BLOCK_WAKEUP_RECV_MSG();    
+    module_rc_status = 0;    
+    BLOCK_WAKEUP_RECV_MSG(); 
     if(module_rc_tid != -1)
     {
         ret = pthread_cancel(module_rc_tid);
@@ -523,11 +721,11 @@
     BLOCK_RECV_MSG_UNLOCK();     
     if(module_rc_tid != -1)
     {
-        ret = pthread_join(module_rc_tid,NULL);      
+        ret = pthread_join(module_rc_tid,NULL);
         module_rc_tid =-1;
-        LYINFLOG("pthread join rc tid ret = %d",ret);       
-    }
-    
+        LYINFLOG("pthread join rc tid ret = %d",ret);
+        
+    }    
 
     if (module_rc_sock_fd > 0)
     {
@@ -545,3 +743,273 @@
     BLOCK_RECV_MSG_UNLOCK(); 
 }
 
+const char * requestToString(int request) 
+{
+    /*
+     cat libs/telephony/ril_commands.h \
+     | egrep "^ *{RIL_" \
+     | sed -re 's/\{RIL_([^,]+),[^,]+,([^}]+).+/case RIL_\1: return "\1";/'
+    
+    
+     cat libs/telephony/ril_unsol_commands.h \
+     | egrep "^ *{RIL_" \
+     | sed -re 's/\{RIL_([^,]+),([^}]+).+/case RIL_\1: return "\1";/'
+    
+    */
+    switch(request) {
+        case RIL_REQUEST_GET_SIM_STATUS: return "GET_SIM_STATUS";
+        case RIL_REQUEST_ENTER_SIM_PIN: return "ENTER_SIM_PIN";
+        case RIL_REQUEST_ENTER_SIM_PUK: return "ENTER_SIM_PUK";
+        case RIL_REQUEST_ENTER_SIM_PIN2: return "ENTER_SIM_PIN2";
+        case RIL_REQUEST_ENTER_SIM_PUK2: return "ENTER_SIM_PUK2";
+        case RIL_REQUEST_CHANGE_SIM_PIN: return "CHANGE_SIM_PIN";
+        case RIL_REQUEST_CHANGE_SIM_PIN2: return "CHANGE_SIM_PIN2";
+        case RIL_REQUEST_ENTER_NETWORK_DEPERSONALIZATION: return "ENTER_NETWORK_DEPERSONALIZATION";
+        case RIL_REQUEST_GET_CURRENT_CALLS: return "GET_CURRENT_CALLS";
+        case RIL_REQUEST_DIAL: return "DIAL";
+        case RIL_REQUEST_GET_IMSI: return "GET_IMSI";
+        case RIL_REQUEST_HANGUP: return "HANGUP";
+        case RIL_REQUEST_HANGUP_WAITING_OR_BACKGROUND: return "HANGUP_WAITING_OR_BACKGROUND";
+        case RIL_REQUEST_HANGUP_FOREGROUND_RESUME_BACKGROUND: return "HANGUP_FOREGROUND_RESUME_BACKGROUND";
+        case RIL_REQUEST_SWITCH_WAITING_OR_HOLDING_AND_ACTIVE: return "SWITCH_WAITING_OR_HOLDING_AND_ACTIVE";
+        case RIL_REQUEST_CONFERENCE: return "CONFERENCE";
+        case RIL_REQUEST_UDUB: return "UDUB";
+        case RIL_REQUEST_LAST_CALL_FAIL_CAUSE: return "LAST_CALL_FAIL_CAUSE";
+        case RIL_REQUEST_SIGNAL_STRENGTH: return "SIGNAL_STRENGTH";
+        case RIL_REQUEST_VOICE_REGISTRATION_STATE: return "VOICE_REGISTRATION_STATE";
+        case RIL_REQUEST_DATA_REGISTRATION_STATE: return "DATA_REGISTRATION_STATE";
+        case RIL_REQUEST_OPERATOR: return "OPERATOR";
+        case RIL_REQUEST_RADIO_POWER: return "RADIO_POWER";
+        case RIL_REQUEST_DTMF: return "DTMF";
+        case RIL_REQUEST_SEND_SMS: return "SEND_SMS";
+        case RIL_REQUEST_SEND_SMS_EXPECT_MORE: return "SEND_SMS_EXPECT_MORE";
+        case RIL_REQUEST_SETUP_DATA_CALL: return "SETUP_DATA_CALL";
+        case RIL_REQUEST_SIM_IO: return "SIM_IO";
+        case RIL_REQUEST_SEND_USSD: return "SEND_USSD";
+        case RIL_REQUEST_CANCEL_USSD: return "CANCEL_USSD";
+        case RIL_REQUEST_GET_CLIR: return "GET_CLIR";
+        case RIL_REQUEST_SET_CLIR: return "SET_CLIR";
+        case RIL_REQUEST_QUERY_CALL_FORWARD_STATUS: return "QUERY_CALL_FORWARD_STATUS";
+        case RIL_REQUEST_SET_CALL_FORWARD: return "SET_CALL_FORWARD";
+        case RIL_REQUEST_QUERY_CALL_WAITING: return "QUERY_CALL_WAITING";
+        case RIL_REQUEST_SET_CALL_WAITING: return "SET_CALL_WAITING";
+        case RIL_REQUEST_SMS_ACKNOWLEDGE: return "SMS_ACKNOWLEDGE";
+        case RIL_REQUEST_GET_IMEI: return "GET_IMEI";
+        case RIL_REQUEST_GET_IMEISV: return "GET_IMEISV";
+        case RIL_REQUEST_ANSWER: return "ANSWER";
+        case RIL_REQUEST_DEACTIVATE_DATA_CALL: return "DEACTIVATE_DATA_CALL";
+        case RIL_REQUEST_QUERY_FACILITY_LOCK: return "QUERY_FACILITY_LOCK";
+        case RIL_REQUEST_SET_FACILITY_LOCK: return "SET_FACILITY_LOCK";
+        case RIL_REQUEST_CHANGE_BARRING_PASSWORD: return "CHANGE_BARRING_PASSWORD";
+        case RIL_REQUEST_QUERY_NETWORK_SELECTION_MODE: return "QUERY_NETWORK_SELECTION_MODE";
+        case RIL_REQUEST_SET_NETWORK_SELECTION_AUTOMATIC: return "SET_NETWORK_SELECTION_AUTOMATIC";
+        case RIL_REQUEST_SET_NETWORK_SELECTION_MANUAL: return "SET_NETWORK_SELECTION_MANUAL";
+        case RIL_REQUEST_QUERY_AVAILABLE_NETWORKS : return "QUERY_AVAILABLE_NETWORKS ";
+        case RIL_REQUEST_DTMF_START: return "DTMF_START";
+        case RIL_REQUEST_DTMF_STOP: return "DTMF_STOP";
+        case RIL_REQUEST_BASEBAND_VERSION: return "BASEBAND_VERSION";
+        case RIL_REQUEST_SEPARATE_CONNECTION: return "SEPARATE_CONNECTION";
+        case RIL_REQUEST_SET_PREFERRED_NETWORK_TYPE: return "SET_PREFERRED_NETWORK_TYPE";
+        case RIL_REQUEST_GET_PREFERRED_NETWORK_TYPE: return "GET_PREFERRED_NETWORK_TYPE";
+        case RIL_REQUEST_GET_NEIGHBORING_CELL_IDS: return "GET_NEIGHBORING_CELL_IDS";
+        case RIL_REQUEST_SET_MUTE: return "SET_MUTE";
+        case RIL_REQUEST_GET_MUTE: return "GET_MUTE";
+        case RIL_REQUEST_QUERY_CLIP: return "QUERY_CLIP";
+        case RIL_REQUEST_LAST_DATA_CALL_FAIL_CAUSE: return "LAST_DATA_CALL_FAIL_CAUSE";
+        case RIL_REQUEST_DATA_CALL_LIST: return "DATA_CALL_LIST";
+        case RIL_REQUEST_RESET_RADIO: return "RESET_RADIO";
+        case RIL_REQUEST_OEM_HOOK_RAW: return "OEM_HOOK_RAW";
+        case RIL_REQUEST_OEM_HOOK_STRINGS: return "OEM_HOOK_STRINGS";
+        case RIL_REQUEST_SET_BAND_MODE: return "SET_BAND_MODE";
+        case RIL_REQUEST_QUERY_AVAILABLE_BAND_MODE: return "QUERY_AVAILABLE_BAND_MODE";
+        case RIL_REQUEST_STK_GET_PROFILE: return "STK_GET_PROFILE";
+        case RIL_REQUEST_STK_SET_PROFILE: return "STK_SET_PROFILE";
+        case RIL_REQUEST_STK_SEND_ENVELOPE_COMMAND: return "STK_SEND_ENVELOPE_COMMAND";
+        case RIL_REQUEST_STK_SEND_TERMINAL_RESPONSE: return "STK_SEND_TERMINAL_RESPONSE";
+        case RIL_REQUEST_STK_HANDLE_CALL_SETUP_REQUESTED_FROM_SIM: return "STK_HANDLE_CALL_SETUP_REQUESTED_FROM_SIM";
+        case RIL_REQUEST_SCREEN_STATE: return "SCREEN_STATE";
+        case RIL_REQUEST_EXPLICIT_CALL_TRANSFER: return "EXPLICIT_CALL_TRANSFER";
+        case RIL_REQUEST_SET_LOCATION_UPDATES: return "SET_LOCATION_UPDATES";
+        case RIL_REQUEST_CDMA_SET_SUBSCRIPTION_SOURCE:return"CDMA_SET_SUBSCRIPTION_SOURCE";
+        case RIL_REQUEST_CDMA_SET_ROAMING_PREFERENCE:return"CDMA_SET_ROAMING_PREFERENCE";
+        case RIL_REQUEST_CDMA_QUERY_ROAMING_PREFERENCE:return"CDMA_QUERY_ROAMING_PREFERENCE";
+        case RIL_REQUEST_SET_TTY_MODE:return"SET_TTY_MODE";
+        case RIL_REQUEST_QUERY_TTY_MODE:return"QUERY_TTY_MODE";
+        case RIL_REQUEST_CDMA_SET_PREFERRED_VOICE_PRIVACY_MODE:return"CDMA_SET_PREFERRED_VOICE_PRIVACY_MODE";
+        case RIL_REQUEST_CDMA_QUERY_PREFERRED_VOICE_PRIVACY_MODE:return"CDMA_QUERY_PREFERRED_VOICE_PRIVACY_MODE";
+        case RIL_REQUEST_CDMA_FLASH:return"CDMA_FLASH";
+        case RIL_REQUEST_CDMA_BURST_DTMF:return"CDMA_BURST_DTMF";
+        case RIL_REQUEST_CDMA_SEND_SMS:return"CDMA_SEND_SMS";
+        case RIL_REQUEST_CDMA_SMS_ACKNOWLEDGE:return"CDMA_SMS_ACKNOWLEDGE";
+        case RIL_REQUEST_GSM_GET_BROADCAST_SMS_CONFIG:return"GSM_GET_BROADCAST_SMS_CONFIG";
+        case RIL_REQUEST_GSM_SET_BROADCAST_SMS_CONFIG:return"GSM_SET_BROADCAST_SMS_CONFIG";
+        case RIL_REQUEST_GSM_SMS_BROADCAST_ACTIVATION:return "GSM_SMS_BROADCAST_ACTIVATION";
+        case RIL_REQUEST_CDMA_GET_BROADCAST_SMS_CONFIG:return "CDMA_GET_BROADCAST_SMS_CONFIG";
+        case RIL_REQUEST_CDMA_SET_BROADCAST_SMS_CONFIG:return "CDMA_SET_BROADCAST_SMS_CONFIG";
+        case RIL_REQUEST_CDMA_SMS_BROADCAST_ACTIVATION:return "CDMA_SMS_BROADCAST_ACTIVATION";
+        case RIL_REQUEST_CDMA_VALIDATE_AND_WRITE_AKEY: return"CDMA_VALIDATE_AND_WRITE_AKEY";
+        case RIL_REQUEST_CDMA_SUBSCRIPTION: return"CDMA_SUBSCRIPTION";
+        case RIL_REQUEST_CDMA_WRITE_SMS_TO_RUIM: return "CDMA_WRITE_SMS_TO_RUIM";
+        case RIL_REQUEST_CDMA_DELETE_SMS_ON_RUIM: return "CDMA_DELETE_SMS_ON_RUIM";
+        case RIL_REQUEST_DEVICE_IDENTITY: return "DEVICE_IDENTITY";
+        case RIL_REQUEST_EXIT_EMERGENCY_CALLBACK_MODE: return "EXIT_EMERGENCY_CALLBACK_MODE";
+        case RIL_REQUEST_GET_SMSC_ADDRESS: return "GET_SMSC_ADDRESS";
+        case RIL_REQUEST_SET_SMSC_ADDRESS: return "SET_SMSC_ADDRESS";
+        case RIL_REQUEST_REPORT_SMS_MEMORY_STATUS: return "REPORT_SMS_MEMORY_STATUS";
+        case RIL_REQUEST_REPORT_STK_SERVICE_IS_RUNNING: return "REPORT_STK_SERVICE_IS_RUNNING";
+        case RIL_REQUEST_CDMA_GET_SUBSCRIPTION_SOURCE: return "CDMA_GET_SUBSCRIPTION_SOURCE";
+        case RIL_REQUEST_ISIM_AUTHENTICATION: return "ISIM_AUTHENTICATION";
+        case RIL_REQUEST_ACKNOWLEDGE_INCOMING_GSM_SMS_WITH_PDU: return "RIL_REQUEST_ACKNOWLEDGE_INCOMING_GSM_SMS_WITH_PDU";
+        case RIL_REQUEST_STK_SEND_ENVELOPE_WITH_STATUS: return "RIL_REQUEST_STK_SEND_ENVELOPE_WITH_STATUS";
+        case RIL_REQUEST_VOICE_RADIO_TECH: return "VOICE_RADIO_TECH";
+        case RIL_REQUEST_GET_CELL_INFO_LIST: return"GET_CELL_INFO_LIST";
+        case RIL_REQUEST_SET_UNSOL_CELL_INFO_LIST_RATE: return"SET_UNSOL_CELL_INFO_LIST_RATE";
+        case RIL_REQUEST_SET_INITIAL_ATTACH_APN: return "RIL_REQUEST_SET_INITIAL_ATTACH_APN";
+        case RIL_REQUEST_IMS_REGISTRATION_STATE: return "IMS_REGISTRATION_STATE";
+        case RIL_REQUEST_IMS_SEND_SMS: return "IMS_SEND_SMS";
+        case RIL_REQUEST_SIM_TRANSMIT_APDU_BASIC: return "SIM_TRANSMIT_APDU_BASIC";
+        case RIL_REQUEST_SIM_OPEN_CHANNEL: return "SIM_OPEN_CHANNEL";
+        case RIL_REQUEST_SIM_CLOSE_CHANNEL: return "SIM_CLOSE_CHANNEL";
+        case RIL_REQUEST_SIM_TRANSMIT_APDU_CHANNEL: return "SIM_TRANSMIT_APDU_CHANNEL";
+        case RIL_REQUEST_GET_RADIO_CAPABILITY: return "RIL_REQUEST_GET_RADIO_CAPABILITY";
+        case RIL_REQUEST_SET_RADIO_CAPABILITY: return "RIL_REQUEST_SET_RADIO_CAPABILITY";
+        case RIL_REQUEST_SET_UICC_SUBSCRIPTION: return "SET_UICC_SUBSCRIPTION";
+        case RIL_REQUEST_ALLOW_DATA: return "ALLOW_DATA";
+        case RIL_REQUEST_GET_HARDWARE_CONFIG: return "GET_HARDWARE_CONFIG";
+        case RIL_REQUEST_SIM_AUTHENTICATION: return "SIM_AUTHENTICATION";
+        case RIL_REQUEST_GET_DC_RT_INFO: return "GET_DC_RT_INFO";
+        case RIL_REQUEST_SET_DC_RT_INFO_RATE: return "SET_DC_RT_INFO_RATE";
+        case RIL_REQUEST_SET_DATA_PROFILE: return "SET_DATA_PROFILE";
+        case RIL_UNSOL_RESPONSE_RADIO_STATE_CHANGED: return "UNSOL_RESPONSE_RADIO_STATE_CHANGED";
+        case RIL_UNSOL_RESPONSE_CALL_STATE_CHANGED: return "UNSOL_RESPONSE_CALL_STATE_CHANGED";
+        case RIL_UNSOL_RESPONSE_VOICE_NETWORK_STATE_CHANGED: return "UNSOL_RESPONSE_VOICE_NETWORK_STATE_CHANGED";
+        case RIL_UNSOL_RESPONSE_PS_NETWORK_STATE_CHANGED: return "UNSOL_RESPONSE_VOICE_NETWORK_STATE_CHANGED";
+        case RIL_UNSOL_RESPONSE_NEW_SMS: return "UNSOL_RESPONSE_NEW_SMS";
+        case RIL_UNSOL_RESPONSE_NEW_SMS_STATUS_REPORT: return "UNSOL_RESPONSE_NEW_SMS_STATUS_REPORT";
+        case RIL_UNSOL_RESPONSE_NEW_SMS_ON_SIM: return "UNSOL_RESPONSE_NEW_SMS_ON_SIM";
+        case RIL_UNSOL_ON_USSD: return "UNSOL_ON_USSD";
+        case RIL_UNSOL_ON_USSD_REQUEST: return "UNSOL_ON_USSD_REQUEST(obsolete)";
+        case RIL_UNSOL_NITZ_TIME_RECEIVED: return "UNSOL_NITZ_TIME_RECEIVED";
+        case RIL_UNSOL_SIGNAL_STRENGTH: return "UNSOL_SIGNAL_STRENGTH";
+        case RIL_UNSOL_STK_SESSION_END: return "UNSOL_STK_SESSION_END";
+        case RIL_UNSOL_STK_PROACTIVE_COMMAND: return "UNSOL_STK_PROACTIVE_COMMAND";
+        case RIL_UNSOL_STK_EVENT_NOTIFY: return "UNSOL_STK_EVENT_NOTIFY";
+        case RIL_UNSOL_STK_CALL_SETUP: return "UNSOL_STK_CALL_SETUP";
+        case RIL_UNSOL_SIM_SMS_STORAGE_FULL: return "UNSOL_SIM_SMS_STORAGE_FUL";
+        case RIL_UNSOL_SIM_REFRESH: return "UNSOL_SIM_REFRESH";
+        case RIL_UNSOL_DATA_CALL_LIST_CHANGED: return "UNSOL_DATA_CALL_LIST_CHANGED";
+        case RIL_UNSOL_CALL_RING: return "UNSOL_CALL_RING";
+        case RIL_UNSOL_RESPONSE_SIM_STATUS_CHANGED: return "UNSOL_RESPONSE_SIM_STATUS_CHANGED";
+        case RIL_UNSOL_RESPONSE_CDMA_NEW_SMS: return "UNSOL_NEW_CDMA_SMS";
+        case RIL_UNSOL_RESPONSE_NEW_BROADCAST_SMS: return "UNSOL_NEW_BROADCAST_SMS";
+        case RIL_UNSOL_CDMA_RUIM_SMS_STORAGE_FULL: return "UNSOL_CDMA_RUIM_SMS_STORAGE_FULL";
+        case RIL_UNSOL_RESTRICTED_STATE_CHANGED: return "UNSOL_RESTRICTED_STATE_CHANGED";
+        case RIL_UNSOL_ENTER_EMERGENCY_CALLBACK_MODE: return "UNSOL_ENTER_EMERGENCY_CALLBACK_MODE";
+        case RIL_UNSOL_CDMA_CALL_WAITING: return "UNSOL_CDMA_CALL_WAITING";
+        case RIL_UNSOL_CDMA_OTA_PROVISION_STATUS: return "UNSOL_CDMA_OTA_PROVISION_STATUS";
+        case RIL_UNSOL_CDMA_INFO_REC: return "UNSOL_CDMA_INFO_REC";
+        case RIL_UNSOL_OEM_HOOK_RAW: return "UNSOL_OEM_HOOK_RAW";
+        case RIL_UNSOL_RINGBACK_TONE: return "UNSOL_RINGBACK_TONE";
+        case RIL_UNSOL_RESEND_INCALL_MUTE: return "UNSOL_RESEND_INCALL_MUTE";
+        case RIL_UNSOL_CDMA_SUBSCRIPTION_SOURCE_CHANGED: return "UNSOL_CDMA_SUBSCRIPTION_SOURCE_CHANGED";
+        case RIL_UNSOL_CDMA_PRL_CHANGED: return "UNSOL_CDMA_PRL_CHANGED";
+        case RIL_UNSOL_EXIT_EMERGENCY_CALLBACK_MODE: return "UNSOL_EXIT_EMERGENCY_CALLBACK_MODE";
+        case RIL_UNSOL_RIL_CONNECTED: return "UNSOL_RIL_CONNECTED";
+        case RIL_UNSOL_VOICE_RADIO_TECH_CHANGED: return "UNSOL_VOICE_RADIO_TECH_CHANGED";
+        case RIL_UNSOL_CELL_INFO_LIST: return "UNSOL_CELL_INFO_LIST";
+        case RIL_UNSOL_RESPONSE_IMS_NETWORK_STATE_CHANGED: return "RESPONSE_IMS_NETWORK_STATE_CHANGED";
+        case RIL_UNSOL_UICC_SUBSCRIPTION_STATUS_CHANGED: return "UNSOL_UICC_SUBSCRIPTION_STATUS_CHANGED";
+        case RIL_UNSOL_SRVCC_STATE_NOTIFY: return "UNSOL_SRVCC_STATE_NOTIFY";
+        case RIL_UNSOL_HARDWARE_CONFIG_CHANGED: return "HARDWARE_CONFIG_CHANGED";
+        case RIL_UNSOL_DC_RT_INFO_CHANGED: return "UNSOL_DC_RT_INFO_CHANGED";
+        case RIL_REQUEST_SHUTDOWN: return "SHUTDOWN";
+        case RIL_UNSOL_RADIO_CAPABILITY: return "RIL_UNSOL_RADIO_CAPABILITY";
+        case RIL_REQUEST_SET_TRM: return "RIL_REQUEST_SET_TRM";
+        case RIL_REQUEST_SET_IMS_ENABLE:return "RIL_REQUEST_SET_IMS_ENABLE";
+        case RIL_REQUEST_SET_AUDIO_PATH: return "SET_AUDIO_PATH";
+        case RIL_REQUEST_HANGUP_ALL: return "HANGUP_ALL";
+        case RIL_REQUEST_FORCE_RELEASE_CALL: return "FORCE_RELEASE_CALL";
+        case RIL_REQUEST_EMERGENCY_DIAL: return "RIL_REQUEST_EMERGENCY_DIAL";
+        case RIL_REQUEST_SET_ECC_SERVICE_CATEGORY: return "RIL_REQUEST_SET_ECC_SERVICE_CATEGORY";
+        case RIL_REQUEST_SET_ECC_LIST: return "RIL_REQUEST_SET_ECC_LIST";
+        case RIL_REQUEST_AT_COMMAND_WITH_PROXY: return "AT_COMMAND_WITH_PROXY";
+        case RIL_REQUEST_SET_SUPP_SVC_NOTIFICATION: return "RIL_REQUEST_SET_SUPP_SVC_NOTIFICATION";
+        case RIL_REQUEST_SET_CLIP: return "RIL_REQUEST_SET_CLIP";
+        case RIL_REQUEST_GET_COLP: return "RIL_REQUEST_GET_COLP";
+        case RIL_REQUEST_SET_COLP: return "RIL_REQUEST_SET_COLP";
+        case RIL_REQUEST_GET_COLR: return "RIL_REQUEST_GET_COLR";
+        case RIL_REQUEST_ADD_IMS_CONFERENCE_CALL_MEMBER: return "ADD_IMS_CONFERENCE_CALL_MEMBER";
+        case RIL_REQUEST_REMOVE_IMS_CONFERENCE_CALL_MEMBER: return "REMOVE_IMS_CONFERENCE_CALL_MEMBER";
+        case RIL_REQUEST_CONFERENCE_DIAL: return "CONFERENCE_DIAL";
+        case RIL_REQUEST_DIAL_WITH_SIP_URI: return "DIAL_WITH_SIP_URI";
+        case RIL_REQUEST_HOLD_CALL: return "HOLD_CALL";
+        case RIL_REQUEST_RESUME_CALL: return "RESUME_CALL";
+        case RIL_UNSOL_ECONF_SRVCC_INDICATION : return "ECONF_SRVCC_INDICATION";
+        case RIL_UNSOL_ECONF_RESULT_INDICATION : return "ECONF_RESULT_INDICATION";
+        case RIL_UNSOL_MAL_AT_INFO : return "UNSOL_MAL_AT_INFO";
+        case RIL_REQUEST_MODEM_POWEROFF: return "MODEM_POWEROFF";
+        case RIL_REQUEST_MODEM_POWERON: return "MODEM_POWERON";
+        case RIL_REQUEST_WRITE_SMS_TO_SIM: return "WRITE_SMS_TO_SIM";
+        case RIL_REQUEST_QUERY_ICCID: return "RIL_REQUEST_QUERY_ICCID";
+        case RIL_UNSOL_TX_POWER: return "RIL_UNSOL_TX_POWER";
+        case RIL_UNSOL_NETWORK_INFO: return "RIL_UNSOL_NETWORK_INFO";
+        case RIL_REQUEST_DELETE_SMS_ON_SIM: return "DELETE_SMS_ON_SIM";
+        case RIL_REQUEST_SET_IMSCFG: return "RIL_REQUEST_SET_IMSCFG";
+#ifdef ECALL_SUPPORT
+        case RIL_REQUEST_ECALL_FAST_MAKE_ECALL: return "ECALL_FAST_MAKE_ECALL";
+        case RIL_REQUEST_ECALL_SET_IVS: return "RIL_REQUEST_ECALL_SET_IVS";
+        case RIL_REQUEST_ECALL_SET_PSAP: return "RIL_REQUEST_ECALL_SET_PSAP";
+        case RIL_REQUEST_ECALL_MAKE_ECALL: return "RIL_REQUEST_ECALL_MAKE_ECALL";
+        case RIL_REQUEST_ECALL_IVS_PUSH_MSD: return "RIL_REQUEST_ECALL_IVS_PUSH_MSD";
+        case RIL_REQUEST_ECALL_PSAP_PULL_MSD: return "RIL_REQUEST_ECALL_PSAP_PULL_MSD";
+        case RIL_UNSOL_ECALL_MSDHACK : return "ECALL_MSDHACK";
+        case RIL_REQUEST_ECALL_SET_MSD: return "RIL_REQUEST_ECALL_SET_MSD";
+        case RIL_REQUEST_ECALL_CTRL_SEQUENCE: return "ECALL_SET_CTRL_SEQUENCE";
+        case RIL_UNSOL_ECALL_INDICATIONS : return "ECALL_INDICATIONS";
+        case RIL_REQUEST_ECALL_RESET_IVS: return "RIL_REQUEST_ECALL_RESET_IVS";
+        case RIL_REQUEST_ECALL_SET_PRI: return "RIL_REQUEST_ECALL_SET_PRI";
+        case RIL_REQUEST_ECALL_SET_TEST_NUM: return "RIL_REQUEST_ECALL_SET_TEST_NUM";
+        case RIL_REQUEST_ECALL_SET_RECONF_NUM: return "RIL_REQUEST_ECALL_SET_RECONF_NUM";
+        case RIL_REQUEST_SYNC_DATA_SETTINGS_TO_MD: return "RIL_REQUEST_SYNC_DATA_SETTINGS_TO_MD";
+        case RIL_REQUEST_ECALL_SET_NAD_DEREGISTRATION_TIME: return "RIL_REQUEST_ECALL_SET_NAD_DEREGISTRATION_TIME";
+        case RIL_REQUEST_ECALL_SET_REGISTRATION_STATE: return "RIL_REQUEST_ECALL_SET_REGISTRATION_STATE";
+#endif /*ECALL_SUPPORT*/
+#ifdef KEEP_ALIVE
+        case RIL_REQUEST_START_KEEPALIVE_PRO: return "RIL_REQUEST_START_KEEPALIVE_PRO";
+        case RIL_REQUEST_STOP_KEEPALIVE_PRO: return "RIL_REQUEST_STOP_KEEPALIVE_PRO";
+        case RIL_UNSOL_KEEPALIVE_STATUS_PRO: return "RIL_UNSOL_KEEPALIVE_STATUS_PRO";
+#endif /*KEEP_ALIVE*/
+        case RIL_REQUEST_SEND_USSI: return "SEND_USSI";
+        case RIL_REQUEST_CANCEL_USSI: return "CANCEL_USSI";
+        case RIL_REQUEST_GET_SMS_SIM_MEM_STATUS: return "GET_SMS_SIM_MEM_STATUS";
+        case RIL_UNSOL_SIP_CALL_PROGRESS_INDICATOR: return "RIL_UNSOL_SIP_CALL_PROGRESS_INDICATOR";
+        case RIL_REQUEST_REPORT_AIRPLANE_MODE: return "RIL_REQUEST_REPORT_AIRPLANE_MODE";
+        case RIL_REQUEST_SET_ECC_NUM: return "RIL_REQUEST_SET_ECC_NUM";
+        case RIL_REQUEST_GET_ECC_NUM: return "RIL_REQUEST_GET_ECC_NUM";
+        case RIL_UNSOL_ECC_NUM: return "RIL_UNSOL_ECC_NUM";
+        case RIL_REQUEST_QUERY_AVAILABLE_NETWORKS_WITH_ACT: return "RIL_REQUEST_QUERY_AVAILABLE_NETWORKS_WITH_ACT";
+        case RIL_REQUEST_GSM_GET_BROADCAST_LANGUAGE: return "RIL_REQUEST_GSM_GET_BROADCAST_LANGUAGE";
+        case RIL_REQUEST_GSM_SET_BROADCAST_LANGUAGE: return "RIL_REQUEST_GSM_SET_BROADCAST_LANGUAGE";
+        case RIL_UNSOL_CALL_INFO_INDICATION: return "RIL_UNSOL_CALL_INFO_INDICATION";
+        case RIL_REQUEST_MODIFY_APN: return "RIL_REQUEST_MODIFY_APN";
+        case RIL_REQUEST_RESET_APN: return "RIL_REQUEST_RESET_APN";
+        case RIL_REQUEST_QUERY_SIM_RETRY_COUNT: return "RIL_REQUEST_QUERY_SIM_RETRY_COUNT";
+        case RIL_REQUEST_QUERY_EID: return "RIL_REQUEST_QUERY_EID";
+        case LYNQ_REQUEST_SET_DTMF_VOLUME: return "RIL_REQUEST_SET_DTMF_VOLUME";
+        case LYNQ_REQUEST_SET_SPEECH_VOLUME: return "RIL_REQUEST_SET_SPEECH_VOLUME";
+        case LYNQ_REQUEST_GET_SPEECH_VOLUME: return "RIL_REQUEST_GET_SPEECH_VOLUME";
+        case LYNQ_REQUEST_RECORD: return "RIL_REQUEST_RECORD";
+        /*warren add for t800 ril service 2022/1/22 start*/
+        case LYNQ_REQUEST_WRITE_SMS_TO_MEMORY: return "LYNQ_REQUEST_WRITE_SMS_TO_MEMORY";
+        case LYNQ_REQUEST_READ_SMS_FROM_MEMORY: return "LYNQ_REQUEST_READ_SMS_FROM_MEMORY";
+        case LYNQ_REQUEST_DELETE_SMS_FROM_MEMORY: return "LYNQ_REQUEST_DELETE_SMS_FROM_MEMORY";
+        case LYNQ_REQUEST_LIST_SMS_FROM_MEMORY: return "LYNQ_REQUEST_LIST_SMS_FROM_MEMORY";
+        case LYNQ_REQUEST_SET_DEFAULT_SIM_ALL:return "SET_DEFAULT_SIM_ALL";
+        case LYNQ_REQUEST_CHANGE_SCREEN_STATE:return "LYNQ_REQUEST_CHANGE_SCREEN_STATE";/*jb.qi add for two sim sleep 2022/9/19*/
+        case LYNQ_REQUEST_CHANGE_RADIO:return "LYNQ_REQUEST_CHANGE_RADIO";/*lei add for factory test of sleep 2022/9/19*/
+        /*warren add for t800 ril service 2022/1/22 end*/
+        default: return "<unknown request>";
+    }
+}
+
+
diff --git a/src/lynq/lib/liblynq-call/lynq_module_socket.h b/src/lynq/lib/liblynq-call/lynq_module_socket.h
index 57466f6..41c0d1c 100755
--- a/src/lynq/lib/liblynq-call/lynq_module_socket.h
+++ b/src/lynq/lib/liblynq-call/lynq_module_socket.h
@@ -4,15 +4,18 @@
 using ::android::Parcel;
 
 int lynq_set_test_network(const int test_mode);
-int lynq_send_common_request(Parcel*& p, int time_out, int request_id, int argc, const char* format,...);
-int lynq_server_socket_start();
-int lynq_urc_socket_start();
-void lynq_close_urc_thread();
-void lynq_close_rc_thread();
 
 extern int g_module_Global_uToken;
 extern int g_wait_time;
+int lynq_send_common_request(Parcel*& p, int time_out, int request_id,  int argc, const char* format,...);
+int lynq_start_all_urc_socket_thread();
+void lynq_close_all_urc_socket_thread();
+int lynq_start_all_rc_socket_thread();
+void lynq_close_all_rc_socket_thread();
+
+const char * requestToString(int request);
 
 void urc_msg_process(Parcel *p);
+bool is_support_urc(int urc_id);
 
 #endif
diff --git a/src/lynq/lib/liblynq-call/makefile b/src/lynq/lib/liblynq-call/makefile
index 0e021c5..40415dc 100755
--- a/src/lynq/lib/liblynq-call/makefile
+++ b/src/lynq/lib/liblynq-call/makefile
@@ -23,6 +23,7 @@
   -I$(ROOT)$(includedir)/logger \
   -I$(ROOT)$(includedir)/liblog \
   -I$(ROOT)$(includedir)/vendor-ril \
+  -I$(ROOT)$(includedir)/lynq_shm \
 
 
 LOCAL_LIBS := \
@@ -35,7 +36,7 @@
     -lbinder \
     -lpthread \
     -llynq-log \
-
+    -llynq-shm \
 
 SOURCES = $(wildcard *.cpp)
 
diff --git a/src/lynq/lib/liblynq-data/lynq_data.cpp b/src/lynq/lib/liblynq-data/lynq_data.cpp
index 5473fb2..fbd120d 100755
--- a/src/lynq/lib/liblynq-data/lynq_data.cpp
+++ b/src/lynq/lib/liblynq-data/lynq_data.cpp
@@ -15,8 +15,10 @@
 #include <sys/time.h>
 #include <include/lynq_uci.h>
 #include <errno.h>
+#include <vector>
+#include "lynq_data_urc.h"
+
 #define LYNQ_SERVICE_PORT 8088
-#define LYNQ_URC_SERVICE_PORT 8086
 #define LYNQ_REC_BUF 8192
 #define LYNQ_REQUEST_PARAM_BUF 8192
 #define LYQN_SEDN_BUF 1024*8+sizeof(int)*3
@@ -24,9 +26,6 @@
 
 #define LYNQ_DATA_UCI_BUF 258
 
-
-
-
 using ::android::Parcel;
 typedef struct{
     int uToken;
@@ -56,16 +55,19 @@
 
 int lynq_client_sockfd = 0;
 int Global_uToken = 0;
-bool data_urc_recive_status = 1;
+
 int lynq_data_call_change_id = -1;
 pthread_t lynq_data_tid =-1;
 static pthread_mutex_t s_data_call_state_change_mutex = PTHREAD_MUTEX_INITIALIZER;
 static pthread_cond_t s_data_call_state_change_cond = PTHREAD_COND_INITIALIZER;
-static pthread_mutex_t s_pdn_change_mutex = PTHREAD_MUTEX_INITIALIZER;
-static pthread_cond_t s_pdn_change_cond = PTHREAD_COND_INITIALIZER;
+
 static pthread_mutex_t s_lynq_apn_change_mutex = PTHREAD_MUTEX_INITIALIZER;
 static pthread_cond_t s_lynq_apn_change_cond = PTHREAD_COND_INITIALIZER;
 
+pthread_t data_list_urc_vector_tid = -1;
+int data_urc_vector_status = 0;
+static pthread_mutex_t s_lynq_urc_vector_mutex = PTHREAD_MUTEX_INITIALIZER;
+static pthread_cond_t s_lynq_urc_vector_cond = PTHREAD_COND_INITIALIZER;
 /**g_lynq_data_sendto_mutex
 * @brief mark data send request mutex
 */
@@ -82,6 +84,8 @@
 */
 char g_lynq_apn_result[1024] = {};
 
+static std::vector<int> s_data_urc_wait_list;
+
 typedef struct
 {
     char apn[LYNQ_APN_MAX_LEN];
@@ -93,16 +97,7 @@
 lynq_apn_t lynq_apn_table[LYNQ_APN_CHANNEL_MAX] = {};
 lynq_data_call_response_v11_t lynq_data_call_lists[LYNQ_APN_CHANNEL_MAX] = {};
 int lynq_data_call = 0;
-int millli_sleep_with_restart(int millisecond)
-{
-    int left = millisecond*1000;
-    while (left > 0) 
-    { 
-        left = usleep(left);
-    }
 
-    return 0;
-}
 int getLynqApnID(char apnType[])
 {
     int ret = 0;
@@ -115,6 +110,7 @@
     }
     return -1;
 }
+
 void updateApnTable(lynq_apn_t *apn_table,char apn[],char apntype[],char ifaceName[])
 {
     LYDBGLOG("[updateApnTable] apn:%s,apntype:%s,ifaceName:%s",apn,apntype,ifaceName);
@@ -130,6 +126,7 @@
     apn_table->hasUsed = 1;
     return;
 }
+
 void cleanOnceApnTable(int apnId)
 {
     LYDBGLOG("apn id:%d",apnId);
@@ -207,9 +204,9 @@
 int waitPdnChange()
 {
     int ret = 0;
-    pthread_mutex_lock(&s_pdn_change_mutex);
-    ret = pthread_cond_wait(&s_pdn_change_cond,&s_pdn_change_mutex);
-    pthread_mutex_unlock(&s_pdn_change_mutex);
+    pthread_mutex_lock(&s_lynq_urc_vector_mutex);
+    ret = pthread_cond_wait(&s_lynq_urc_vector_cond,&s_lynq_urc_vector_mutex);
+    pthread_mutex_unlock(&s_lynq_urc_vector_mutex);
     return ret;
 }
 int waitDataCallstateChange(int mtime)
@@ -238,9 +235,9 @@
 }
 void sendSignalPdnChange()
 {
-    pthread_mutex_lock(&s_pdn_change_mutex);
-    pthread_cond_signal(&s_pdn_change_cond);
-    pthread_mutex_unlock(&s_pdn_change_mutex);
+    pthread_mutex_lock(&s_lynq_urc_vector_mutex);
+    pthread_cond_signal(&s_lynq_urc_vector_cond);
+    pthread_mutex_unlock(&s_lynq_urc_vector_mutex);
     return;
 }
 
@@ -301,7 +298,6 @@
     return strndup16to8(s16, stringlen);
 }
 
-
 /*Warren add for T800 platform 2021/11/19 start*/
 int lynq_socket_client_start()
 {
@@ -335,144 +331,146 @@
     }
     return 0;
 }
-void *thread_urc_recv(void *parg)
+
+bool is_support_urc(int urc_id)
 {
-    int socket_fd = (int64_t)parg;
-    int len=0;
-    socklen_t addr_len=0;
-    uint8_t *dataLength = NULL;
-    char urc_data[LYNQ_REC_BUF];
+    switch(urc_id)
+    {
+        case LYNQ_URC_DATA_CALL_STATUS_IND:
+
+        case LYNQ_URC_MODIFY_APNDB:
+        case LYNQ_URC_RESET_APNDB:
+            return true;                
+        default:
+            return false;
+    }    
+}
+
+void urc_msg_process(Parcel *p)
+{
+    int len;
+    int resp_type;
+    int urcid;
+    int slot_id;
+
+    int pdnState = 0;
     char apn[LYNQ_APN_MAX_LEN];
     char apnType[LYNQ_APN_TYPE_MAX_LEN];
-    int pdnState = 0;
     char ifaceName[LYNQ_IFACE_NAME_MAX_LEN];
-    int slot_id = -1;
-    int resp_type = -1;
-    int urcid = -1;
     char *urc_msg = NULL;
-    Parcel *p = NULL;
-    struct sockaddr_in dest_addr;
-    LYINFLOG("thread_urc_recv in running....\n");
-    while(data_urc_recive_status)
+
+    int size = p->dataSize();
+    p->readInt32(&resp_type);
+    p->readInt32(&urcid);
+    p->readInt32(&slot_id);
+    LYINFLOG("data lib recv urc:resp_type=%d,urcid=%d,slot_id=%d,size=%d\n",resp_type,urcid,slot_id,size);
+    switch(urcid)
     {
-        bzero(urc_data,LYNQ_REC_BUF);
-        //get data msg
-        len = recvfrom(socket_fd,urc_data,LYNQ_REC_BUF,0,(struct sockaddr *)&dest_addr,&addr_len);
-        if(len <= 0)
-        {
-            perror("thread_urc_recv step2 fail:");
-            millli_sleep_with_restart(1);
-            break;
-        }
-        LYDBGLOG("=====>urc data len<=====:%d\n",len);
-        p = new Parcel();
-        if(p==NULL)
-        {
-            RLOGD("new parcel failure!!!");
-            break;
-        }
-        p->setData((uint8_t *)urc_data,len); // p.setData((uint8_t *) buffer, buflen);
-        p->setDataPosition(0);
-        if(p->dataAvail() > 0)
-        {
-            p->readInt32(&resp_type);
-            p->readInt32(&urcid);
-            p->readInt32(&slot_id);
-            //LYDBGLOG("*******Warren test*******:resp_type=%d,urcid=%d,slot_id=%d\n",resp_type,urcid,slot_id);
-            switch (urcid)
+        case LYNQ_URC_DATA_CALL_STATUS_IND:
+            p->readInt32(&pdnState);
+            bzero(apn,LYNQ_APN_MAX_LEN);
+            bzero(apnType,LYNQ_APN_TYPE_MAX_LEN);
+            bzero(ifaceName,LYNQ_IFACE_NAME_MAX_LEN);
+            if(pdnState!=4)//PDN_DISCONNECTED
             {
-                case 9003://LYNQ_URC_DATA_CALL_STATUS_IND
-                {
-                    LYINFLOG("**************:resp_type=%d,urcid=%d,slot_id=%d\n",resp_type,urcid,slot_id);
-                    p->readInt32(&pdnState);
-                    bzero(apn,LYNQ_APN_MAX_LEN);
-                    bzero(apnType,LYNQ_APN_TYPE_MAX_LEN);
-                    bzero(ifaceName,LYNQ_IFACE_NAME_MAX_LEN);
-                    if(pdnState!=4)//PDN_DISCONNECTED
-                    {
-                        urc_msg = strdupReadString_p(p);
-                        int len = strlen(urc_msg);
-                        if(len < LYNQ_APN_MAX_LEN-1)
-                        {
-                            memcpy(apn,urc_msg,len+1);
-                        }
-                        urc_msg = strdupReadString_p(p);
-                        len = strlen(urc_msg);
-                        if(len < LYNQ_APN_TYPE_MAX_LEN-1)
-                        {
-                            memcpy(apnType,urc_msg,len+1);
-                        }
-                        urc_msg = strdupReadString_p(p);
-                        len = strlen(urc_msg);
-                        if(len < LYNQ_IFACE_NAME_MAX_LEN-1)
-                        {
-                            memcpy(ifaceName,urc_msg,strlen(urc_msg)+1);
-                        }
-                        //sendSignalDataCallStateChange();
-                        int apnId = getLynqApnID(apnType);
-                        if(apnId >= 0)
-                        {
-                            if(lynq_apn_table[apnId].hasTimeout==1)
-                            {
-                                LYERRLOG("apn:%s has time out",lynq_apn_table[apnId].apn);
-                                lynq_deactive_data_call(&apnId);
-                                continue;
-                            }
-                            updateApnTable(&lynq_apn_table[apnId], apn,apnType,ifaceName);
-                        }
-                        lynq_data_call_change_id = apnId;
-                        sendSignalPdnChange();
-                        LYDBGLOG("data call state:%d",lynq_data_call);
-                        if(lynq_data_call==1)
-                        {
-                            sendSignalDataCallStateChange();
-                            lynq_data_call = 0;
-                        }
-                    }
-                    else
-                    {
-                        urc_msg = strdupReadString_p(p);
-                        len = strlen(urc_msg);
-                        if(len < LYNQ_APN_TYPE_MAX_LEN-1)
-                        {
-                            memcpy(apnType,urc_msg,len+1);
-                        }
-                        LYDBGLOG("[data thread_urc_recv] apntype:%s",apnType);
-                        int apnId = getLynqApnID(apnType);
-                        if(apnId >= 0)
-                        {
-                            lynq_data_call_change_id = apnId;
-                            bzero(lynq_apn_table[apnId].apnType,LYNQ_APN_TYPE_MAX_LEN);//async clean
-                        }
-                        sendSignalPdnChange();
-                        LYDBGLOG("data call state:%d",lynq_data_call);
-                        if(lynq_data_call==1)
-                        {
-                            sendSignalDataCallStateChange();
-                            lynq_data_call = 0;
-                        }
-                    }
-                    break;
-                }
-            case 9004:
-            {
-                LYINFLOG("**************:resp_type=%d,urcid=%d,slot_id=%d\n",resp_type,urcid,slot_id);
                 urc_msg = strdupReadString_p(p);
-                if (NULL == urc_msg)
+                int len = strlen(urc_msg);
+                if(len < LYNQ_APN_MAX_LEN-1)
                 {
-                    LYERRLOG("error apn msg");
+                    memcpy(apn,urc_msg,len+1);
                 }
+                urc_msg = strdupReadString_p(p);
+                len = strlen(urc_msg);
+                if(len < LYNQ_APN_TYPE_MAX_LEN-1)
+                {
+                    memcpy(apnType,urc_msg,len+1);
+                }
+                urc_msg = strdupReadString_p(p);
+                len = strlen(urc_msg);
+                if(len < LYNQ_IFACE_NAME_MAX_LEN-1)
+                {
+                    memcpy(ifaceName,urc_msg,strlen(urc_msg)+1);
+                }
+                //sendSignalDataCallStateChange();
+                int apnId = getLynqApnID(apnType);
+                if(apnId >= 0)
+                {
+                    if(lynq_apn_table[apnId].hasTimeout==1)
+                    {
+                        LYERRLOG("apn:%s has time out,deacive this apn",lynq_apn_table[apnId].apn);
+                        if (NULL != lynq_apn_table[apnId].apn && NULL != NULL != lynq_apn_table[apnId].apnType)
+                        {
+                            LYERRLOG("deactive this time out APN");
+                            lynq_deactive_data_call(&apnId);
+                        }
+                        else 
+                        {
+                            LYERRLOG("this table is invalid");
+                        }
+                        break;
+                    }
+                    updateApnTable(&lynq_apn_table[apnId],apn,apnType,ifaceName);
+                }
+                /*To be completed*/
                 else
                 {
-                    bzero(g_lynq_apn_result, 1024);
-                    strcpy(g_lynq_apn_result, urc_msg);
-                    sendSignalApnChange();
+                    LYERRLOG("invalid apnId");
+                    break;
                 }
-                break;
+                pthread_mutex_lock(&s_lynq_urc_vector_mutex);
+                s_data_urc_wait_list.push_back(apnId);
+                pthread_mutex_unlock(&s_lynq_urc_vector_mutex);
+                lynq_data_call_change_id = apnId;
+                //sendSignalPdnChange();
+                LYDBGLOG("data call state:%d",lynq_data_call);
+                if(lynq_data_call==1)
+                {
+                    sendSignalDataCallStateChange();
+                    lynq_data_call = 0;
+                }
             }
-            case 9005:
+            else
             {
-                LYINFLOG("**************:resp_type=%d,urcid=%d,slot_id=%d\n",resp_type,urcid,slot_id);
+                urc_msg = strdupReadString_p(p);
+                len = strlen(urc_msg);
+                if(len < LYNQ_APN_TYPE_MAX_LEN-1)
+                {
+                    memcpy(apnType,urc_msg,len+1);
+                }
+                LYDBGLOG("[data thread_urc_recv] apntype:%s",apnType);
+                int apnId = getLynqApnID(apnType);
+                if(apnId >= 0)
+                {
+                    lynq_data_call_change_id = apnId;
+                    bzero(lynq_apn_table[apnId].apnType,LYNQ_APN_TYPE_MAX_LEN);//async clean
+                }
+                pthread_mutex_lock(&s_lynq_urc_vector_mutex);
+                s_data_urc_wait_list.push_back(apnId);
+                pthread_mutex_unlock(&s_lynq_urc_vector_mutex);
+                //sendSignalPdnChange();
+                LYDBGLOG("data call state:%d",lynq_data_call);
+                if(lynq_data_call==1)
+                {
+                    sendSignalDataCallStateChange();
+                    lynq_data_call = 0;
+                }
+            }
+            break;
+        case LYNQ_URC_MODIFY_APNDB:
+            urc_msg = strdupReadString_p(p);
+            if (NULL == urc_msg)
+            {
+                LYERRLOG("error apn msg");
+            }
+            else
+            {
+                bzero(g_lynq_apn_result, 1024);
+                strcpy(g_lynq_apn_result, urc_msg);
+                sendSignalApnChange();
+            }
+            break;
+        case LYNQ_URC_RESET_APNDB:
+            {
                 urc_msg = strdupReadString_p(p);
                 if (NULL == urc_msg)
                 {
@@ -485,56 +483,76 @@
                     sendSignalApnChange();
                 }
             }
-                default:
-                    break;
-            }
-        }
-        delete p;
-        p = NULL;
+        default:
+            break;
     }
-    close(socket_fd);
+    
 }
-int lynq_socket_urc_start()
+
+void cleanup_urc_vector_mutex(void *arg)
 {
-    int socket_fd=0;
-    int rt=0;
-    int len=0;
-    int on=1;
-    struct sockaddr_in urc_local_addr;
-    pthread_attr_t attr;
-    socket_fd = socket(AF_INET,SOCK_DGRAM,0);
-    if(socket_fd < 0)
+    pthread_mutex_unlock(&s_lynq_urc_vector_mutex);
+}
+
+void *thread_urc_vector()
+{
+    pthread_cleanup_push(cleanup_urc_vector_mutex, NULL);
+    while (data_urc_vector_status)
     {
-        perror("creaet socket for udp fail");
+        while (!s_data_urc_wait_list.empty())
+        {
+            sendSignalPdnChange();
+            usleep(10);
+        }
+        usleep(1);
+    }
+    pthread_cleanup_pop(0);
+}
+
+void cancel_urc_vector_signal_thread()
+{
+    int ret;
+    
+    data_urc_vector_status = 0;
+    pthread_mutex_lock(&s_lynq_urc_vector_mutex);
+    if (data_list_urc_vector_tid != -1)
+    {
+        ret = pthread_cancel(data_list_urc_vector_tid);
+        LYDBGLOG("pthread cancel ret = %d",ret);
+    }
+    pthread_mutex_unlock(&s_lynq_urc_vector_mutex);
+
+    if (data_list_urc_vector_tid != -1)
+    {
+        ret = pthread_join(data_list_urc_vector_tid,NULL);
+        LYDBGLOG("pthread join ret = %d",ret);
+        data_list_urc_vector_tid = -1;
+    }
+    pthread_mutex_lock(&s_lynq_urc_vector_mutex);
+    s_data_urc_wait_list.clear();
+    pthread_mutex_unlock(&s_lynq_urc_vector_mutex);
+}
+
+int create_urc_vector_signal_thread()
+{
+    int ret;
+
+    data_urc_vector_status = 1;
+    pthread_mutex_init(&s_lynq_urc_vector_mutex,NULL);
+    ret = pthread_create(&data_list_urc_vector_tid,NULL,thread_urc_vector,NULL);
+    if (ret < 0)
+    {
+        LYERRLOG("urc vector signal pthread create error");
+        lynq_deinit_data_urc_thread();
+        data_urc_vector_status = 0;
         return -1;
     }
-    urc_local_addr.sin_family = AF_INET;
-    urc_local_addr.sin_port = htons(LYNQ_URC_SERVICE_PORT);
-    urc_local_addr.sin_addr.s_addr = htons(INADDR_ANY);
-    /* Set socket to allow reuse of address and port, SO_REUSEADDR value is 2*/
-    rt = setsockopt(socket_fd,SOL_SOCKET,SO_REUSEADDR,&on,sizeof on);
-    if(rt<0)
-    {
-        perror("SO_REUSEADDR fail\n");
-        return -1;
-    }
-    rt = bind(socket_fd ,(struct sockaddr*)&urc_local_addr, sizeof(urc_local_addr));
-    if (rt == -1)
-    {
-        perror("bind failed");
-        return -1;
-    }
-    pthread_attr_init(&attr);
-    pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
-    rt = pthread_create(&lynq_data_tid,&attr,thread_urc_recv,(void *)socket_fd);
-    if(rt < 0)
-    {
-        LYERRLOG("urc loop failure!!!\n");
-        return -1;
-    }
-    LYDBGLOG("urc loop success!!!\n");
+    pthread_mutex_lock(&s_lynq_urc_vector_mutex);
+    s_data_urc_wait_list.clear();
+    pthread_mutex_unlock(&s_lynq_urc_vector_mutex);
     return 0;
 }
+
 int lynq_init_data(int uToken)
 {
     if (g_lynq_data_init_flag == 1)
@@ -545,7 +563,6 @@
     g_lynq_data_init_flag = 1;
     int result = 0;
     Global_uToken = uToken;
-    data_urc_recive_status = 1;
     LYLOGSET(LOG_INFO);
     LYLOGEINIT(USER_LOG_TAG);
     result = lynq_socket_client_start();
@@ -555,7 +572,14 @@
         LYERRLOG("init socket client fail!!!");
         return -1;
     }
-    result = lynq_socket_urc_start();
+    result = lynq_init_data_urc_thread();
+    if(result!=0)
+    {
+        LYERRLOG("init socket urc fail!!!");
+        return -1;
+    }
+
+    result = create_urc_vector_signal_thread();
     if(result!=0)
     {
         LYERRLOG("init socket urc fail!!!");
@@ -586,14 +610,13 @@
     {
         close(lynq_client_sockfd);
     }
-    data_urc_recive_status = 0;
-    if (lynq_data_tid > 0)
+    ret = lynq_deinit_data_urc_thread();
+    if (ret != 0)
     {
-        ret = pthread_cancel(lynq_data_tid);
-        LYDBGLOG("pthread cancel ret = %d",ret);
-        ret = pthread_join(lynq_data_tid,NULL);
-        LYDBGLOG("pthread join ret = %d",ret);
+        LYERRLOG("lynq_deinit_data_urc_thread fail");
+        return ret;
     }
+    cancel_urc_vector_signal_thread();
     return 0;
 }
 int lynq_setup_data_call(int *handle)
@@ -604,7 +627,6 @@
     int request = -1;
     int slot_id = -1;
     int error = -1;
-    char iface = NULL;
     int lynq_data_call_id = 0;
     if(handle==NULL)
     {
@@ -642,6 +664,7 @@
     }
     return error;
 }
+
 int lynq_deactive_data_call(int *handle)
 {
     Parcel p;
@@ -700,7 +723,6 @@
     int request = -1;
     int slot_id = -1;
     int error = -1;
-    char iface = NULL;
     int lynq_data_call_id = -1;
     char *argv[10] = {};
     if(handle==NULL||apn==NULL||apnType==NULL)
@@ -769,7 +791,7 @@
     lynq_data_call = 1;
     if(error==0)
     {
-        if(waitDataCallstateChange(20000)==ETIMEDOUT)//20s
+        if(waitDataCallstateChange(60000)==ETIMEDOUT)//60s
         {
             error = LYNQ_E_TIME_OUT;
             LYERRLOG("timeout:wait data Call state fail!!!");
@@ -823,7 +845,6 @@
     int error = -1;
     int version =0;
     int num = 0;
-    int temp_int =0;
     char *temp_char = NULL;
     if(dataCallList==NULL)
     {
@@ -924,8 +945,16 @@
 }
 int lynq_wait_data_call_state_change(int *handle)
 {
+    
+    std::vector<int>::iterator iter;
     waitPdnChange();
-    *handle = lynq_data_call_change_id;
+
+    pthread_mutex_lock(&s_lynq_urc_vector_mutex);
+    iter = s_data_urc_wait_list.begin();
+    handle = (*iter);
+    s_data_urc_wait_list.erase(iter);
+    pthread_mutex_unlock(&s_lynq_urc_vector_mutex);
+    
     LYINFLOG("lynq data call id:%d",lynq_data_call_change_id);
     return 0;
 }
@@ -1214,7 +1243,6 @@
     }
     lynq_client_t client;
     char argc[512];
-    char recvline[LYNQ_REC_BUF];
     int res = 0;
     Parcel p;
     if (cmd == 0) // insert apn db
diff --git a/src/lynq/lib/liblynq-data/lynq_data_urc.cpp b/src/lynq/lib/liblynq-data/lynq_data_urc.cpp
new file mode 100755
index 0000000..9f211eb
--- /dev/null
+++ b/src/lynq/lib/liblynq-data/lynq_data_urc.cpp
@@ -0,0 +1,331 @@
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <arpa/inet.h>
+#include <string.h>
+#include <unistd.h>
+#include <binder/Parcel.h>
+#include <log/log.h>
+#include <cutils/jstring.h>
+#include <pthread.h>
+#include <list>
+#include "lynq_data.h"
+#include "lynq_data_urc.h"
+#include "liblog/lynq_deflog.h"
+#include "lynq_shm.h"
+
+#define LYNQ_REC_BUF 8192
+
+static std::list<Parcel*> s_urc_recv_parcel_list;
+
+int lynq_len_urc_addr_serv;
+struct sockaddr_in urc_local_addr;
+static int lynq_urc_sockfd = -1;
+bool data_urc_recive_status = 1;
+static pthread_mutex_t s_lynq_urc_mutex = PTHREAD_MUTEX_INITIALIZER;
+static pthread_cond_t s_lynq_urc_cond = PTHREAD_COND_INITIALIZER;
+
+/*recv*/
+pthread_t data_urc_recv_tid = -1;
+static pthread_mutex_t s_lynq_urc_recv_mutex = PTHREAD_MUTEX_INITIALIZER;
+static pthread_cond_t s_lynq_urc_recv_cond = PTHREAD_COND_INITIALIZER;
+
+/*process*/
+pthread_t data_urc_process_tid = -1;
+bool data_urc_process_status = 1;
+static pthread_mutex_t s_lynq_urc_process_mutex = PTHREAD_MUTEX_INITIALIZER;
+static pthread_cond_t s_lynq_urc_process_cond = PTHREAD_COND_INITIALIZER;
+
+#define SHM_BUFFER_INDEX_OFFSET 1
+#define SHM_BUFFER_SIZE_OFFSET 16
+#define SHM_BUFFER_INDEX_MASK 0x0000007F
+#define SHM_BUFFER_SIZE_MASK 0x0000FFFF
+
+bool urc_data_is_in_shm_data(int responseType,int& level, int& index, int& size)
+{
+    int shm_index=((responseType>>SHM_BUFFER_INDEX_OFFSET)&SHM_BUFFER_INDEX_MASK);
+    if (shm_index>0)
+    {
+        index=shm_index-1;    
+        size=((responseType>>SHM_BUFFER_SIZE_OFFSET)&SHM_BUFFER_SIZE_MASK);
+        if(size>=sizeof(int32_t)*3 && get_shem_buffer_level(size,&level))
+        {
+            LYINFLOG("urc_data_is_in_shm_data level is %d, index is %d size is %d",level,index,size);
+            return true;                            
+        }        
+    }
+    LYINFLOG("urc_data_is_in_shm_data return false, responseType is %d",responseType);
+    return false;
+}
+
+void cleanup_urc_process_mutex(void *arg)
+{
+    pthread_mutex_unlock(&s_lynq_urc_process_mutex);
+}
+
+void *thread_urc_recv()
+{
+    Parcel *urc_p =NULL;
+    char urc_data[LYNQ_REC_BUF];    
+    int res = 0;
+    lynq_head_t* phead;
+    int level,index,size;
+    uint8_t * shm_buffer;
+
+    LYINFLOG("urc recv thread is running");
+    while(data_urc_recive_status)
+    {
+        bzero(urc_data,LYNQ_REC_BUF);
+        res = recvfrom(lynq_urc_sockfd,urc_data,sizeof(urc_data),0,(struct sockaddr *)&urc_local_addr,(socklen_t*)&lynq_len_urc_addr_serv);
+        
+        if(res<sizeof(int32_t)*2)
+        {
+            LYERRLOG("thread_urc_recv step2 fail: res is %d",res);
+            continue;
+        }
+
+        phead=(lynq_head_t*) urc_data;
+        if(is_support_urc(phead->urcid)==false)
+        {
+            continue;
+        }
+        urc_p = new Parcel();
+        if(urc_p == NULL)
+        {
+            LYERRLOG("new parcel failure!!!");
+            continue;
+        }
+        if(urc_data_is_in_shm_data(phead->resp_type,level,index,size))
+        {
+            shm_buffer = (uint8_t *)get_shem_buffer(level,index); // p.setData((uint8_t *) buffer, buflen);  
+            LYINFLOG("shm pointer is %p", shm_buffer);        
+            urc_p->setData(shm_buffer,size);       
+        }
+        else if(res>=sizeof(int32_t)*3)
+        {
+            urc_p->setData((uint8_t *)urc_data,res); // p.setData((uint8_t *) buffer, buflen);            
+        }
+        else 
+        {
+            LYERRLOG("res %d error!!!", res);
+            delete urc_p;
+            urc_p = NULL;
+            continue;
+        }
+        urc_p->setDataPosition(0);
+        if(urc_p->dataAvail()>0)
+        {
+            pthread_mutex_lock(&s_lynq_urc_process_mutex);
+            s_urc_recv_parcel_list.push_back(urc_p);
+            pthread_cond_broadcast(&s_lynq_urc_process_cond);
+            pthread_mutex_unlock(&s_lynq_urc_process_mutex);
+        }
+        else 
+        {
+            delete urc_p;
+            urc_p = NULL;
+        }        
+    }
+    LYINFLOG("urc recv thread ended");
+    return NULL;
+}
+
+void *thread_urc_process()
+{
+    Parcel *urc_p =NULL;
+    std::list<Parcel*>::iterator iter;
+
+    LYINFLOG("urc process thread is running");
+    pthread_cleanup_push(cleanup_urc_process_mutex, NULL); // thread cleanup handler
+    while (data_urc_process_status)
+    {
+        pthread_mutex_lock(&s_lynq_urc_process_mutex);
+        while(s_urc_recv_parcel_list.empty())
+        {
+            pthread_cond_wait(&s_lynq_urc_process_cond,&s_lynq_urc_process_mutex);
+        }
+        iter=s_urc_recv_parcel_list.begin();
+        urc_p = (*iter);
+        s_urc_recv_parcel_list.erase(iter);
+        pthread_mutex_unlock(&s_lynq_urc_process_mutex);
+        urc_p->setDataPosition(0);
+        if(urc_p->dataAvail()>0)
+        {
+            pthread_mutex_lock(&s_lynq_urc_mutex);
+            urc_msg_process(urc_p);
+            pthread_mutex_unlock(&s_lynq_urc_mutex);
+        }
+        delete urc_p;
+        urc_p = NULL;
+    }
+    pthread_cleanup_pop(0);
+    LYINFLOG("urc process thread ended");
+    return NULL;
+}
+
+int lynq_socket_recv_start()
+{
+    int rt=0;
+    int on=1;
+    struct sockaddr_in urc_local_addr;
+    pthread_attr_t attr;
+    lynq_urc_sockfd = socket(AF_INET,SOCK_DGRAM,0);
+    if(lynq_urc_sockfd < 0)
+    {
+        LYERRLOG("create socket for udp fail");
+        return -1;
+    }
+    urc_local_addr.sin_family = AF_INET;
+    urc_local_addr.sin_port = htons(LYNQ_URC_SERVICE_PORT);
+    urc_local_addr.sin_addr.s_addr = htons(INADDR_ANY);
+    /* Set socket to allow reuse of address and port, SO_REUSEADDR value is 2*/
+    rt = setsockopt(lynq_urc_sockfd,SOL_SOCKET,SO_REUSEADDR,&on,sizeof on);
+    if(rt<0)
+    {
+        LYERRLOG("SO_REUSEADDR fail");
+        close(lynq_urc_sockfd);
+        lynq_urc_sockfd = -1;
+        return -1;
+    }
+    rt = bind(lynq_urc_sockfd ,(struct sockaddr*)&urc_local_addr, sizeof(urc_local_addr));
+    if (rt == -1)
+    {
+        LYERRLOG("bind failed");
+        close(lynq_urc_sockfd);
+        lynq_urc_sockfd = -1;
+        return -1;
+    }
+    return 0;
+}
+
+int lynq_socket_recv_stop()
+{
+    if (lynq_urc_sockfd >=0)
+    {
+        close(lynq_urc_sockfd);
+        lynq_urc_sockfd = -1;
+    }
+    return 0;
+}
+
+void lynq_urc_recv_thread_stop()
+{
+    int ret;
+
+    pthread_mutex_lock(&s_lynq_urc_process_mutex);
+    data_urc_recive_status = 0;
+    if (data_urc_recv_tid != -1)
+    {
+        ret = pthread_cancel(data_urc_recv_tid);
+        LYDBGLOG("pthread cancel ret = %d",ret);
+    }
+    pthread_mutex_unlock(&s_lynq_urc_process_mutex);
+
+    if (data_urc_recv_tid != -1)
+    {
+        ret = pthread_join(data_urc_recv_tid,NULL);
+        LYDBGLOG("pthread join ret = %d",ret);
+        data_urc_recv_tid = -1;
+    }
+}
+
+void lynq_urc_process_thread_stop()
+{
+    int ret;
+
+    pthread_mutex_lock(&s_lynq_urc_process_mutex);
+    pthread_mutex_lock(&s_lynq_urc_mutex);
+
+    data_urc_process_status = 0;
+    if (data_urc_process_tid != -1)
+    {
+        ret = pthread_cancel(data_urc_process_tid);
+        LYDBGLOG("pthread cancel ret = %d",ret);
+    }
+    pthread_mutex_unlock(&s_lynq_urc_mutex);
+    pthread_mutex_unlock(&s_lynq_urc_process_mutex);
+
+    if (data_urc_process_tid != -1)
+    {
+        ret = pthread_join(data_urc_process_tid,NULL);
+        LYDBGLOG("pthread join ret = %d",ret);
+        data_urc_process_tid = -1;
+    }
+}
+
+
+int lynq_init_data_urc_thread()
+{
+    int ret = 0;
+    if(ril_init_mem()!=0)
+    {
+        LYERRLOG("ril_init_mem fail");
+        return -1;
+    }
+
+    ret = lynq_socket_recv_start();
+    if (ret != 0)
+    {
+        LYERRLOG("lynq_socket_recv_start fail");
+        ril_deinit_mem();
+        return -1;
+    }
+
+    pthread_mutex_init(&s_lynq_urc_process_mutex,NULL);
+    pthread_mutex_init(&s_lynq_urc_recv_mutex,NULL);
+
+    pthread_mutex_lock(&s_lynq_urc_process_mutex);
+    std::list<Parcel*>::iterator iter;
+    for (iter=s_urc_recv_parcel_list.begin();iter!=s_urc_recv_parcel_list.end();++iter)
+    {
+        delete(*iter);
+    }
+    s_urc_recv_parcel_list.clear(); 
+    pthread_mutex_unlock(&s_lynq_urc_process_mutex);
+
+    pthread_mutex_init(&s_lynq_urc_mutex,NULL);
+    data_urc_recive_status = 1;
+
+    ret = pthread_create(&data_urc_recv_tid,NULL,thread_urc_recv,NULL);
+    if (ret < 0)
+    {
+        LYERRLOG("urc recv pthread create error");
+        data_urc_recive_status = 0;
+        lynq_socket_recv_stop();
+        ril_deinit_mem();
+        return -1;
+    }
+
+    data_urc_process_status = 1;
+    ret = pthread_create(&data_urc_process_tid,NULL,thread_urc_process,NULL);
+    if (ret < 0)
+    {
+        LYERRLOG("urc recv pthread create error");
+
+        data_urc_process_status = 0;
+        lynq_socket_recv_stop();
+        lynq_urc_recv_thread_stop();
+
+        return -1;
+    }
+    return 0;
+}
+
+int lynq_deinit_data_urc_thread()
+{
+    lynq_socket_recv_stop();
+    lynq_urc_recv_thread_stop();
+    lynq_urc_process_thread_stop();
+
+    pthread_mutex_lock(&s_lynq_urc_process_mutex);
+    std::list<Parcel*>::iterator iter;
+    for (iter=s_urc_recv_parcel_list.begin();iter!=s_urc_recv_parcel_list.end();++iter)
+    {
+        delete(*iter);
+    }
+    s_urc_recv_parcel_list.clear(); 
+    pthread_mutex_unlock(&s_lynq_urc_process_mutex);
+
+    ril_deinit_mem();
+    return 0;
+}
diff --git a/src/lynq/lib/liblynq-data/lynq_data_urc.h b/src/lynq/lib/liblynq-data/lynq_data_urc.h
new file mode 100755
index 0000000..7ac4f75
--- /dev/null
+++ b/src/lynq/lib/liblynq-data/lynq_data_urc.h
@@ -0,0 +1,30 @@
+#ifndef LYNQ_DATA_URC_H
+#define LYNQ_DATA_URC_H
+
+using ::android::Parcel;
+
+#define LYNQ_URC_SERVICE_PORT 8086
+
+/*the same with lynq_interface.h begin*/
+#define LYNQ_REQUEST_VENDOR_BASE 8000
+#define LYNQ_URC_VENDOR_BASE 9000
+#define LYNQ_AT_SNED (LYNQ_REQUEST_VENDOR_BASE +1)
+#define LYNQ_URC_CALL_STATUS_IND (LYNQ_URC_VENDOR_BASE+1)
+#define LYNQ_URC_DATA_STATUS_IND (LYNQ_URC_VENDOR_BASE+2)
+#define LYNQ_URC_DATA_CALL_STATUS_IND (LYNQ_URC_VENDOR_BASE+3)
+#define LYNQ_AUTO_ANSWER_CALL (LYNQ_REQUEST_VENDOR_BASE +2)
+#define LYNQ_REQUEST_SET_DTMF_VOLUME (LYNQ_REQUEST_VENDOR_BASE +3)
+#define LYNQ_URC_MODIFY_APNDB (LYNQ_URC_VENDOR_BASE+4)
+#define LYNQ_URC_RESET_APNDB (LYNQ_URC_VENDOR_BASE+5)
+
+typedef struct{
+    int resp_type;
+    int urcid;   
+}lynq_head_t;
+
+int lynq_init_data_urc_thread();
+int lynq_deinit_data_urc_thread();
+bool is_support_urc(int urc_id);
+void urc_msg_process(Parcel *p);
+
+#endif
\ No newline at end of file
diff --git a/src/lynq/lib/liblynq-data/makefile b/src/lynq/lib/liblynq-data/makefile
index 183ebaa..53ed1d4 100755
--- a/src/lynq/lib/liblynq-data/makefile
+++ b/src/lynq/lib/liblynq-data/makefile
@@ -20,6 +20,7 @@
 LOCAL_C_INCLUDES = \
   -I. \
   -I$(LOCAL_PATH)/include/libdata \
+  -I$(ROOT)$(includedir)/lynq_shm \
   -I$(ROOT)$(includedir)/logger \
   -I$(ROOT)$(includedir)/liblog \
 
@@ -35,6 +36,7 @@
     -lpthread \
     -llynq-log \
     -llynq-uci \
+    -llynq-shm \
 
 
 SOURCES = $(wildcard *.cpp)
diff --git a/src/lynq/lib/liblynq-fota/include/iot_rock.h b/src/lynq/lib/liblynq-fota/include/iot_rock.h
index b9915c1..36d37a8 100755
--- a/src/lynq/lib/liblynq-fota/include/iot_rock.h
+++ b/src/lynq/lib/liblynq-fota/include/iot_rock.h
@@ -26,6 +26,7 @@
 #define PATCH_MD1IMG   (4)
 #define PATCH_MD1DSP   (5)
 #define PATCH_VBMETA   (6)
+
 #ifdef MOBILETEK_FOTA_CFG
 #define PATCH_BL33     (7)
 #define FULL_SYSTEM    (8)
@@ -125,9 +126,10 @@
 
     char fota_flag[32];	    //fota 标志保留 
     int  update_result;     //升级结果
-	int  ota_run;            //  
-	char cid[32];
-	char did[32];
+    int  ota_run;            //
+    char cid[32];
+    char did[32];
+    char addr[64];
 } UPDATE_INFO;
 
 
diff --git a/src/lynq/lib/liblynq-fota/rock_ua/rock_ua.c b/src/lynq/lib/liblynq-fota/rock_ua/rock_ua.c
index c68e9c2..8ef06e7 100755
--- a/src/lynq/lib/liblynq-fota/rock_ua/rock_ua.c
+++ b/src/lynq/lib/liblynq-fota/rock_ua/rock_ua.c
@@ -9,7 +9,7 @@
 #include "iot_rock.h"
 #include "iot_rock_ipl.h"
 #include "sha.h"
-
+#include <log/log.h>
 #include <stdarg.h>
 #include <errno.h>
 #include <fcntl.h>
@@ -22,7 +22,6 @@
 
 //#define off64_t __off64_t
 
-
 #include <hardware/boot_control.h>
 #include <hardware/hardware.h>
 #include <sys/reboot.h>
@@ -36,8 +35,11 @@
 #define ROCK_DEFAULT_BLOCK_SIZE 0x40000
 #define ROCK_RAM_LEN  (1024*1024)
 
-
+#define LOG_TAG "LYNQ_FOTA"
 #define ROCK_BACKUP_LEN ROCK_DEFAULT_BLOCK_SIZE
+#ifdef GSW_FOTA_CFG
+#define READ_BLOCK_SIZE 0x40000
+#endif
 
 
 #define DEV_SYSTEM_A    "/dev/disk/by-partlabel/system_a"
@@ -115,6 +117,9 @@
 
 OTA_STATUS  fota_status;
 
+#ifdef MOBILETEK_FOTA_CFG
+UPDATE_INFO up_info;
+#endif
 
 extern const hw_module_t HAL_MODULE_INFO_SYM;
 boot_control_module_t* module;
@@ -123,6 +128,13 @@
 static void lynq_fota_grab_artial_wake_lock(void);
 static void lynq_fota_release_wake_lock(void);
 
+#ifdef MOBILETEK_FOTA_CFG
+int matchString(char* buf, char* sub);
+int reset_fota_flag(void);
+int get_fota_flag(void);
+void check_ril_service(void);
+#endif
+
 int rock_mismatch(void* ctx, unsigned char* buf, unsigned int start, unsigned int size, 
 					        unsigned int source_hash,unsigned int target_hash) {
 
@@ -136,84 +148,71 @@
 void rock_trace(void* ctx, const char* fmt, ...) {
 
     va_list     ap;
-	memset(rock_debug_buffer,0x0,sizeof(rock_debug_buffer));
+    memset(rock_debug_buffer,0x0,sizeof(rock_debug_buffer));
     va_start (ap, fmt);
-
-    
     vsnprintf(rock_debug_buffer,sizeof(rock_debug_buffer),fmt,ap);
-	LYDBGLOG("+[UA]: %s",rock_debug_buffer);
-	
-
+    LYDBGLOG("+[UA]: %s",rock_debug_buffer);
     va_end (ap);
 
 }
 
 static int save_fota_status()
 {
-	int err;
+    int err;
     fd_fota_status = open(FILE_FOTA_STATE,O_RDWR | O_CREAT,0777);
-	//fd_update_status = open(FILE_UPDATE_STATE,O_RDWR);
 
     if (fd_fota_status < 0) {
         err = errno;
-        LYERRLOG("+[UA]: Error opening metadata file: %s\n",strerror(errno));
+        RLOGD("+[UA]: save_fota_status: Error opening metadata file: %s\n",strerror(errno));
         return -err;
     }
-    
-	write(fd_fota_status, &fota_status,sizeof(fota_status));
-	sync();
-	
-	close(fd_fota_status);
+
+    write(fd_fota_status, &fota_status,sizeof(fota_status));
+    sync();
+    close(fd_fota_status);
 }
 
 
 void rock_progress(void* ctx, int percent) {
-	int i = 0;
+    int i = 0;
     rock_trace(ctx, "rock update progress %d\n", percent);
-	if (percent > 20) {
+    if (percent > 20) {
         i = fota_status.ota_run;
-		if (fota_status.update_status[i-1].check_delta != PASS) {
-			fota_status.update_status[i-1].check_delta = PASS;
-			fota_status.update_status[i-1].check_rom= PASS;
-			save_fota_status();
-		}
-	}
+        if (fota_status.update_status[i-1].check_delta != PASS) {
+            fota_status.update_status[i-1].check_delta = PASS;
+            fota_status.update_status[i-1].check_rom= PASS;
+            save_fota_status();
+        }
+    }
 }
 
 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) {
-		    write(fd_backup,data,ROCK_DEFAULT_BLOCK_SIZE);
-		    sync();
-		    writen += ROCK_DEFAULT_BLOCK_SIZE;
-		}
-		close(fd_backup);
-		return size;
-	}
-	
-	
-	
-	writen = 0;
-   
+    int err,ret;
+
+    if (start == BACKUP_ADDR_FLAG) {
+        int fd_backup = open(FILE_BACKUP,O_RDWR | O_CREAT,0777);
+        while (writen < size) {
+            write(fd_backup,data,ROCK_DEFAULT_BLOCK_SIZE);
+            sync();
+            writen += ROCK_DEFAULT_BLOCK_SIZE;
+        }
+        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;
-    } 
+        return err;
+    }
 
     while (writen < size) {
         ret = mtk_device_wrap_write(fd_write,data+writen, ROCK_DEFAULT_BLOCK_SIZE);
         writen += ROCK_DEFAULT_BLOCK_SIZE;
-    }   	
-	
-	
+    }
     return size;
 }
 
@@ -308,7 +307,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;
@@ -351,7 +350,7 @@
 /* ROCK IPL end */
 
 
-
+#ifdef GSW_FOTA_CFG
 static int init_dev_fd()
 {
 
@@ -361,77 +360,119 @@
     {
         return E_ROCK_FOTA_ADDR;
     }
-    LYERRLOG("+[UA]: get fota pack addr: %s\n",lynq_fota_addr);
-    //fd_delta = mtk_device_wrap_open(DEV_DELTA,O_RDONLY);
+    RLOGD("+[UA]: get fota pack addr: %s\n", lynq_fota_addr);
     fd_delta = open(lynq_fota_addr,O_RDWR);
 
     if (fd_delta < 0) {
         err = errno;
-        LYERRLOG("+[UA]: Error opening metadata file: %s\n",strerror(errno));
+        RLOGD("+[UA]: Error opening metadata file: %s\n",strerror(errno));
         return -err;
     }
 
     fd_update_status = open(FILE_UPDATE_STATE,O_RDWR | O_CREAT,0777);
-	//fd_update_status = open(FILE_UPDATE_STATE,O_RDWR);
-
     if (fd_update_status < 0) {
         err = errno;
-        LYERRLOG("+[UA]: Error opening metadata file: %s\n",strerror(errno));
+        RLOGD("+[UA]: Error opening fd_delta file: %s\n",strerror(errno));
         return -err;
     }
 
     return 0;
 }
+#endif
+#ifdef MOBILETEK_FOTA_CFG
+static int init_dev_fd()
+{
+
+    int err, result;
+    char lynq_fota_addr[35];
+    if(0 != lynq_fota_get_addr_value(lynq_fota_addr))
+    {
+        return E_ROCK_FOTA_ADDR;
+    }
+    RLOGD("lynq_fota_addr: %s\n", lynq_fota_addr);
+    if(!(strcmp(lynq_fota_addr, "/tmp/fota.delta")))
+    {
+        result = test_write_delta(lynq_fota_addr, DEV_DELTA);
+        if(result != 0)
+        {
+            RLOGD("fota.delta write into mtd fail !\n");
+        }
+        strcpy(lynq_fota_addr, DEV_DELTA);
+    }
+    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) {
+        err = errno;
+        RLOGD("+[UA]: Error opening fd_delta file: %s\n",strerror(errno));
+        return -err;
+    }
+    get_fota_flag();
+    return 0;
+}
+#endif
 
 
 
-
-
+#ifdef MOBILETEK_FOTA_CFG
+static int reboot_device()
+{
+    sleep(5);
+    sync();
+    sleep(5);
+    system("reboot");
+}
+#endif
+#ifdef GSW_FOTA_CFG
 static int close_dev_fd(int fd)
 {
     close(fd);
 }
 
 
-
 static int reboot_device() {
 	
   reboot(RB_AUTOBOOT);
   
   while (1) pause();
 }
+#endif
 
 
 
 int test_write_delta(char *source, char *target)
 {
     int fd_source,fd_target,size;
-	 
-	char delta_data[ROCK_DEFAULT_BLOCK_SIZE];
-	 
+
+	char delta_data[ROCK_DEFAULT_BLOCK_SIZE]; 
 	fd_source = open(source,O_RDONLY);
-	 
+
 	if (fd_source < 0) {
-	    LYERRLOG("+[UA]: open source  error\n");
+	    RLOGD("+[UA]: open source  error\n");
 	    return 1;
 	}
 
     fd_target = mtk_device_wrap_open(target,O_RDWR);
- 
     if (fd_target < 0) {
         mtk_device_wrap_close(fd_target);
-	    close(fd_source);
-        LYERRLOG("+[UA]: open target  error\n");
+        close(fd_source);
+        RLOGD("+[UA]: open target  error\n");
         return 1;
-    } 
-	
-	while(( size = read(fd_source,delta_data,ROCK_DEFAULT_BLOCK_SIZE))>0) {
-    	   mtk_device_wrap_write(fd_target,delta_data,ROCK_DEFAULT_BLOCK_SIZE);
     }
-	
-	mtk_device_wrap_close(fd_target);
-	close(fd_source);
-	return 0;
+#ifdef MOBILETEK_FOTA_CFG
+    system("flash_eraseall /dev/mtd41");
+#endif
+    while(( size = read(fd_source,delta_data,ROCK_DEFAULT_BLOCK_SIZE))>0) {
+           mtk_device_wrap_write(fd_target,delta_data,ROCK_DEFAULT_BLOCK_SIZE);
+    }
+
+    mtk_device_wrap_close(fd_target);
+    close(fd_source);
+    return 0;
 }
 
 
@@ -444,7 +485,7 @@
 	fd_source = mtk_device_wrap_open(source,O_RDONLY);
 	 
 	if (fd_source < 0) {
-	    LYERRLOG("+[UA]: open source  error\n");
+	    RLOGD("+[UA]: open source  error\n");
 	    return 1;
 	}
 
@@ -453,7 +494,7 @@
     if (fd_target < 0) {
         mtk_device_wrap_close(fd_target);
 		mtk_device_wrap_close(fd_source);
-        LYERRLOG("+[UA]: open target  error\n");
+        RLOGD("+[UA]: open target  error\n");
         return 1;
     } 
 	
@@ -518,27 +559,35 @@
 
 
 static int rock_update_main(unsigned int rom_base,  unsigned int backup_base, unsigned int backup_len, int read_rom_directly, int first_run) {
-	int status,err,start;
+    int status,err;
+#ifdef MOBILETEK_FOTA_CFG
+    int start;
+#endif
     int ret = 0;
-	int i = 0;
-	int retry_cnt = 0;
-	
-	IOT_UPDATA_CONTEXT ctx;
+    int i = 0;
+    int retry_cnt = 0;
+
+    IOT_UPDATA_CONTEXT ctx;
+#ifdef GSW_FOTA_CFG
 	UPDATE_INFO up_info;
 	//OTA_STATUS  fota_status;
-
+#endif
 
     const hw_module_t* hw_module;
     unsigned int  slot;
+#ifdef MOBILETEK_FOTA_CFG
+    unsigned int  update_mode = -1;
+#endif
 
+#ifdef GSW_FOTA_CFG
 	unsigned int  update_mode = MODE_NORMAL;
-	unsigned int  delta_size;
+#endif
+    unsigned int  delta_size;
     unsigned char full_header[9];
-	
-	char digest_s[SHA_DIGEST_SIZE];
-	char digest_t[SHA_DIGEST_SIZE];
 
-	
+    char digest_s[SHA_DIGEST_SIZE];
+    char digest_t[SHA_DIGEST_SIZE];
+    
     hw_module = &HAL_MODULE_INFO_SYM;
 
     if (!hw_module ||
@@ -546,7 +595,7 @@
         ret = -EINVAL;
     }
     if (ret != 0) {
-        LYERRLOG("+[UA]: Error loading boot_control HAL implementation.\n");
+        RLOGD("+[UA]: Error loading boot_control HAL implementation.\n");
         return -1;
     }
 
@@ -555,8 +604,8 @@
 
 
     if (module == NULL) {
-        LYERRLOG("+[UA]: Error getting bootctrl module.\n");
-	    return  -1;
+        RLOGD("+[UA]: Error getting bootctrl module.\n");
+        return  -1;
     }
 
     lynq_init_wake_lock_func();
@@ -567,60 +616,77 @@
     
     int is_successful = module->isSlotMarkedSuccessful(module, current_slot);
   
-    LYVERBLOG("Booting slot = %d, : isSlotMarkedSuccessful= %d\n",current_slot,is_successful);  
-		
+    RLOGD("+[UA]: Booting slot = %d, : isSlotMarkedSuccessful= %d\n",current_slot,is_successful);
 
 
-	memset(&ctx, 0, sizeof(ctx));
-	ctx.rom_base = 0;
-	ctx.ram_base =(unsigned char *)&ram_buffer[0];
-	ctx.ram_len = ROCK_RAM_LEN;
-	ctx.backup_base = BACKUP_ADDR_FLAG;
-	ctx.backup_len = ROCK_DEFAULT_BLOCK_SIZE;	
-	ctx.update_nvram = 0;
-	ctx.read_rom_directly = read_rom_directly;
+    memset(&ctx, 0, sizeof(ctx));
+    ctx.rom_base = 0;
+    ctx.ram_base =(unsigned char *)&ram_buffer[0];
+    ctx.ram_len = ROCK_RAM_LEN;
+    ctx.backup_base = BACKUP_ADDR_FLAG;
+    ctx.backup_len = ROCK_DEFAULT_BLOCK_SIZE;	
+    ctx.update_nvram = 0;
+    ctx.read_rom_directly = read_rom_directly;
     //ctx.first_run = first_run;
     ctx.first_run = 1;
-
+#ifdef MOBILETEK_FOTA_CFG
+    get_fota_flag();
+#endif
     if(0 != init_dev_fd())
     {
-        LYVERBLOG("+[UA]: get fota addr error\n");
+        RLOGD("+[UA]: get fota addr error\n");
         lynq_fota_release_wake_lock();
         return E_ROCK_FOTA_ADDR;
     }
 
+
+#ifdef GSW_FOTA_CFG
     memset(&up_info, 0, sizeof(up_info));
 	
 	memset(&fota_status,0,sizeof(fota_status));
-
+#endif
+#ifdef MOBILETEK_FOTA_CFG
+    fd_update_status = open(FILE_UPDATE_STATE,O_RDWR | O_CREAT,0777);
+    if (fd_update_status < 0) {
+        err = errno;
+        RLOGD("+[UA]: Error opening fd_update_status file: %s\n",strerror(errno));
+        return -err;
+    }
+#endif 
 	
     lseek(fd_update_status,0,SEEK_SET);
+#ifdef MOBILETEK_FOTA_CFG
+    memset(&up_info, 0, sizeof(up_info));
+#endif
     read(fd_update_status,(unsigned char *)&up_info,sizeof(up_info));
 
-	LYVERBLOG("+[UA]: up_info.ota_run = %d\n",up_info.ota_run);
-	
-	
-	if ((up_info.ota_run>PATCH_BL33)||(up_info.ota_run<PATCH_SYSTEM))
-	{
-		up_info.ota_run = 0;
-	}	
-	
-	up_info.ota_run = 0;
-	
-	if((up_info.fota_flag[0]=='A')&&(up_info.fota_flag[1]=='-')&&(up_info.fota_flag[2]=='B')){
-		update_mode = MODE_A2B;
-	}else if((up_info.fota_flag[0]=='B')&&(up_info.fota_flag[1]=='-')&&(up_info.fota_flag[2]=='A')){
-		update_mode = MODE_B2A;
-	}else{
-		update_mode = MODE_NORMAL;
-	}
-	
-	LYVERBLOG("+[UA]: up_info.fota_flag = %s\n",up_info.fota_flag);
-	LYVERBLOG("+[UA]: update_mode = %d\n",update_mode);
-	
+    RLOGD("+[UA]: up_info.ota_run = %d\n",up_info.ota_run);
+#ifdef MOBILETEK_FOTA_CFG
+    RLOGD("+[UA]: up_info.fota_flag = %s\n",up_info.fota_flag);
+#endif
+    if ((up_info.ota_run>PATCH_BL33)||(up_info.ota_run<PATCH_SYSTEM))
+    {
+        up_info.ota_run = 0;
+    }
+    up_info.ota_run = 0;
+    if((up_info.fota_flag[0]=='A')&&(up_info.fota_flag[1]=='-')&&(up_info.fota_flag[2]=='B'))
+    {
+        update_mode = MODE_A2B;
+    }
+    else if((up_info.fota_flag[0]=='B')&&(up_info.fota_flag[1]=='-')&&(up_info.fota_flag[2]=='A'))
+    {
+        update_mode = MODE_B2A;
+    }
+    else
+    {
+        update_mode = MODE_NORMAL;
+    }
+#ifdef GSW_FOTA_CFG
+	RLOGD("+[UA]: up_info.fota_flag = %s\n",up_info.fota_flag);
+#endif
+    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));
+    read(fd_delta, (unsigned char*)&da_head, sizeof(da_head));
 
 #ifdef GSW_FOTA_CFG
     rock_trace(&ctx, "da_head.sys:%d,da_head.boot:%d,da_head.tee:%d,da_head.md1img=%d,da_head.md1dsp=%d,da_head.vbmeta=%d,da_head.oemapp=%d,da_head.oemapp2=%d,da_head.bl33=%d\n", 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.bl33);
@@ -756,7 +822,7 @@
 	        fd_system_a = mtk_device_wrap_open(DEV_SYSTEM_A,O_RDWR);
             if (fd_system_a < 0) {
                 err = errno;
-                LYERRLOG("+[UA]: Error opening metadata file: %s\n",strerror(errno));
+                RLOGD("+[UA]: Error opening system file: %s\n",strerror(errno));
                 lynq_fota_release_wake_lock();
                 return -err;
             }
@@ -765,7 +831,7 @@
 	        fd_system_b = mtk_device_wrap_open(DEV_SYSTEM_B,O_RDWR);
             if (fd_system_b < 0) {
                 err = errno;
-                LYERRLOG("+[UA]: Error opening metadata file: %s\n",strerror(errno));
+                RLOGD("+[UA]: Error opening system file: %s\n",strerror(errno));
                 lynq_fota_release_wake_lock();
                 return -err;
             }
@@ -795,13 +861,10 @@
 		sync();
 		
 		
-		LYVERBLOG("+[UA]: Start upgrading system.\n");
+		RLOGD("+[UA]: Start upgrading system.\n");
         status = iot_patch(&ctx);
-		LYVERBLOG("+[UA]: system upgrade result:%d\n",status);
+		RLOGD("+[UA]: system upgrade result:%d\n",status);
 		
-		//up_info.ota_run = 0;
-		
-        //fota_status.ota_run = 0;
 		fota_status.update_status[PATCH_SYSTEM -1].update_result= status; 
 		fota_status.update_result= status;
 
@@ -810,6 +873,7 @@
 
             fota_status.update_status[PATCH_SYSTEM -1].check_delta = PASS;
 		    fota_status.update_status[PATCH_SYSTEM -1].check_rom = PASS;
+            RLOGD("system upgrade success!!!\n");
                
 		}else if(status == E_ROCK_INVALID_DELTA) {
             fota_status.update_status[PATCH_SYSTEM -1].check_delta = ERROR;
@@ -881,7 +945,7 @@
 	        fd_boot_a = mtk_device_wrap_open(DEV_BOOT_A,O_RDWR);
             if (fd_boot_a < 0) {
                 err = errno;
-                LYERRLOG("+[UA]: Error opening metadata file: %s\n",strerror(errno));
+                RLOGD("+[UA]: Error opening boot file: %s\n",strerror(errno));
                 lynq_fota_release_wake_lock();
                 return -err;
             }
@@ -890,7 +954,7 @@
 	        fd_boot_b = mtk_device_wrap_open(DEV_BOOT_B,O_RDWR);
             if (fd_boot_b < 0) {
                 err = errno;
-                LYERRLOG("+[UA]: Error opening metadata file: %s\n",strerror(errno));
+                RLOGD("+[UA]: Error opening boot file: %s\n",strerror(errno));
                 lynq_fota_release_wake_lock();
                 return -err;
             }
@@ -922,9 +986,9 @@
 		
 		
 		
-        LYVERBLOG("+[UA]: Start upgrading boot.\n");
+        RLOGD("+[UA]: Start upgrading boot.\n");
         status = iot_patch(&ctx);
-		LYVERBLOG("+[UA]: boot upgrade result:%d\n",status);
+		RLOGD("+[UA]: boot upgrade result:%d\n",status);
         //up_info.ota_run = 0;
 
         //fota_status.ota_run = 0;
@@ -936,6 +1000,7 @@
 
             fota_status.update_status[PATCH_BOOT-1].check_delta = PASS;
 		    fota_status.update_status[PATCH_BOOT-1].check_rom = PASS;
+            RLOGD("boot upgrade success!!!\n");
                
 		}else if(status == E_ROCK_INVALID_DELTA) {
             fota_status.update_status[PATCH_BOOT-1].check_delta = ERROR;
@@ -1007,7 +1072,7 @@
 	        fd_tee_a = mtk_device_wrap_open(DEV_TEE_A,O_RDWR);
             if (fd_tee_a < 0) {
                 err = errno;
-                LYERRLOG("+[UA]: Error opening metadata file: %s\n",strerror(errno));
+                RLOGD("+[UA]: Error opening tee file: %s\n",strerror(errno));
                 lynq_fota_release_wake_lock();
                 return -err;
             }
@@ -1016,7 +1081,7 @@
 	        fd_tee_b = mtk_device_wrap_open(DEV_TEE_B,O_RDWR);
             if (fd_tee_b < 0) {
                 err = errno;
-                LYERRLOG("+[UA]: Error opening metadata file: %s\n",strerror(errno));
+                RLOGD("+[UA]: Error opening tee file: %s\n",strerror(errno));
                 lynq_fota_release_wake_lock();
                 return -err;
             }
@@ -1046,9 +1111,9 @@
 	    write(fd_update_status, &up_info,sizeof(up_info));
 		sync();
 
-        LYVERBLOG("+[UA]: Start upgrading tee.\n");
+        RLOGD("+[UA]: Start upgrading tee.\n");
         status = iot_patch(&ctx);
-		LYVERBLOG("+[UA]: tee upgrade result:%d\n",status);
+		RLOGD("+[UA]: tee upgrade result:%d\n",status);
         //up_info.ota_run = 0;
         //fota_status.ota_run = 0;
 		fota_status.update_status[PATCH_TEE-1].update_result= status; 
@@ -1059,6 +1124,7 @@
 
             fota_status.update_status[PATCH_TEE-1].check_delta = PASS;
 		    fota_status.update_status[PATCH_TEE-1].check_rom = PASS;
+            RLOGD("tee upgrade success!!!\n");
                
 		}else if(status == E_ROCK_INVALID_DELTA) {
             fota_status.update_status[PATCH_TEE-1].check_delta = ERROR;
@@ -1127,7 +1193,7 @@
 	        fd_md1img_a = mtk_device_wrap_open(DEV_MD1IMG_A,O_RDWR);
             if (fd_md1img_a < 0) {
                 err = errno;
-                LYERRLOG("+[UA]: Error opening metadata file: %s\n",strerror(errno));
+                RLOGD("+[UA]: Error opening md1img file: %s\n",strerror(errno));
                 lynq_fota_release_wake_lock();
                 return -err;
             }
@@ -1136,7 +1202,7 @@
 	        fd_md1img_b = mtk_device_wrap_open(DEV_MD1IMG_B,O_RDWR);
             if (fd_md1img_b < 0) {
                 err = errno;
-                LYERRLOG("+[UA]: Error opening metadata file: %s\n",strerror(errno));
+                RLOGD("+[UA]: Error opening md1img file: %s\n",strerror(errno));
                 lynq_fota_release_wake_lock();
                 return -err;
             }
@@ -1166,9 +1232,9 @@
 		sync();		
 		
 
-        LYVERBLOG("+[UA]: Start upgrading md1img.\n");
+        RLOGD("+[UA]: Start upgrading md1img.\n");
         status = iot_patch(&ctx);
-		LYVERBLOG("+[UA]: md1img upgrade result:%d\n",status);
+		RLOGD("+[UA]: md1img upgrade result:%d\n",status);
 
         //fota_status.ota_run = 0;
 		fota_status.update_status[PATCH_MD1IMG-1].update_result= status; 
@@ -1179,6 +1245,7 @@
 
             fota_status.update_status[PATCH_MD1IMG-1].check_delta = PASS;
 		    fota_status.update_status[PATCH_MD1IMG-1].check_rom = PASS;
+            RLOGD("md1img upgrade success!!!\n");
                
 		}else if(status == E_ROCK_INVALID_DELTA) {
             fota_status.update_status[PATCH_MD1IMG-1].check_delta = ERROR;
@@ -1247,7 +1314,7 @@
 	        fd_md1dsp_a = mtk_device_wrap_open(DEV_MD1DSP_A,O_RDWR);
             if (fd_md1dsp_a < 0) {
                 err = errno;
-                LYERRLOG("+[UA]: Error opening metadata file: %s\n",strerror(errno));
+                RLOGD("+[UA]: Error opening md1dsp file: %s\n",strerror(errno));
                 lynq_fota_release_wake_lock();
                 return -err;
             }
@@ -1256,7 +1323,7 @@
 	        fd_md1dsp_b = mtk_device_wrap_open(DEV_MD1DSP_B,O_RDWR);
             if (fd_md1dsp_b < 0) {
                 err = errno;
-                LYERRLOG("+[UA]: Error opening metadata file: %s\n",strerror(errno));
+                RLOGD("+[UA]: Error opening md1dsp file: %s\n",strerror(errno));
                 lynq_fota_release_wake_lock();
                 return -err;
             }
@@ -1288,9 +1355,9 @@
 		sync();
 
 
-        LYVERBLOG("+[UA]: Start upgrading md1dsp.\n");
+        RLOGD("+[UA]: Start upgrading md1dsp.\n");
         status = iot_patch(&ctx);
-		LYVERBLOG("+[UA]: md1dsp upgrade result:%d\n",status);
+		RLOGD("+[UA]: md1dsp upgrade result:%d\n",status);
 
         //fota_status.ota_run = 0;
 		fota_status.update_status[PATCH_MD1DSP-1].update_result= status; 
@@ -1301,6 +1368,7 @@
 
             fota_status.update_status[PATCH_MD1DSP-1].check_delta = PASS;
 		    fota_status.update_status[PATCH_MD1DSP-1].check_rom = PASS;
+            RLOGD("md1dsp upgrade success!!!\n");
                
 		}else if(status == E_ROCK_INVALID_DELTA) {
             fota_status.update_status[PATCH_MD1DSP-1].check_delta = ERROR;
@@ -1368,7 +1436,7 @@
 	        fd_vbmeta_a = mtk_device_wrap_open(DEV_VBMETA_A,O_RDWR);
             if (fd_vbmeta_a < 0) {
                 err = errno;
-                LYERRLOG("+[UA]: Error opening metadata file: %s\n",strerror(errno));
+                RLOGD("+[UA]: Error opening vbmeta file: %s\n",strerror(errno));
                 lynq_fota_release_wake_lock();
                 return -err;
             }
@@ -1377,7 +1445,7 @@
 	        fd_vbmeta_b = mtk_device_wrap_open(DEV_VBMETA_B,O_RDWR);
             if (fd_vbmeta_b < 0) {
                 err = errno;
-                LYERRLOG("+[UA]: Error opening metadata file: %s\n",strerror(errno));
+                RLOGD("+[UA]: Error opening vbmeta file: %s\n",strerror(errno));
                 lynq_fota_release_wake_lock();
                 return -err;
             }
@@ -1406,9 +1474,9 @@
 	    write(fd_update_status, &up_info,sizeof(up_info));
 		sync();
 
-        LYVERBLOG("+[UA]: Start upgrading vbmeta.\n");
+        RLOGD("+[UA]: Start upgrading vbmeta.\n");
         status = iot_patch(&ctx);
-		LYVERBLOG("+[UA]: vbmeta upgrade result:%d\n",status);
+		RLOGD("+[UA]: vbmeta upgrade result:%d\n",status);
         
 		up_info.ota_run = 0;
         //fota_status.ota_run = 0;
@@ -1420,6 +1488,7 @@
 
             fota_status.update_status[PATCH_VBMETA-1].check_delta = PASS;
 		    fota_status.update_status[PATCH_VBMETA-1].check_rom = PASS;
+            RLOGD("vbmeta upgrade success!!!\n");
                
 		}else if(status == E_ROCK_INVALID_DELTA) {
             fota_status.update_status[PATCH_VBMETA-1].check_delta = ERROR;
@@ -1720,7 +1789,7 @@
 	    fd_bl33 = mtk_device_wrap_open(DEV_BL33,O_RDWR);
         if (fd_bl33 < 0) {
             err = errno;
-            LYERRLOG("+[UA]: Error opening metadata file: %s\n",strerror(errno));
+            RLOGD("+[UA]: Error opening metadata file: %s\n",strerror(errno));
             lynq_fota_release_wake_lock();
             return -err;
         }
@@ -1739,9 +1808,9 @@
 	    write(fd_update_status, &up_info,sizeof(up_info));
 		sync();
 		
-        LYVERBLOG("+[UA]: Start upgrading bl33.\n");
+        RLOGD("+[UA]: Start upgrading bl33.\n");
         status = iot_patch(&ctx);
-		LYVERBLOG("+[UA]: bl33 upgrade result:%d\n",status);
+		RLOGD("+[UA]: bl33 upgrade result:%d\n",status);
         
 		up_info.ota_run = 0;
 		
@@ -1753,6 +1822,7 @@
 
             fota_status.update_status[PATCH_BL33-1].check_delta = PASS;
 		    fota_status.update_status[PATCH_BL33-1].check_rom = PASS;
+            RLOGD("bl33 upgrade success!!!\n");
                
 		}else if(status == E_ROCK_INVALID_DELTA) {
             fota_status.update_status[PATCH_BL33-1].check_delta = ERROR;
@@ -1812,7 +1882,7 @@
 		
 	    if (lseek(fd_delta, DELTA_HEARD_SIZE + delta_size, SEEK_SET) < 0) {
             err = errno;
-            LYERRLOG("+[UA]: mtk_device_wrap_seek df_delta err\n");
+            RLOGD("+[UA]: mtk_device_wrap_seek df_delta err\n");
             lynq_fota_release_wake_lock();
 		    return -1;
         }
@@ -1821,7 +1891,7 @@
 		
 
 	    if (memcmp(full_header, "full-ota", DELTA_FULL_HEARD_SIZE) != 0) {
-	        LYERRLOG("+[UA]: invalid full delta header\r\n");
+	        RLOGD("+[UA]: invalid full delta header\r\n");
 		    up_info.fota_flag[0] = 'e';
 	        up_info.fota_flag[1] = 'n';
 	        up_info.fota_flag[2] = 'd';
@@ -1866,7 +1936,7 @@
 	        fd_system_a = mtk_device_wrap_open(DEV_SYSTEM_A,O_RDWR);
             if (fd_system_a < 0) {
                 err = errno;
-                LYERRLOG("+[UA]: Error opening metadata file: %s\n",strerror(errno));
+                RLOGD("+[UA]: Error opening full_sys file: %s\n",strerror(errno));
                 lynq_fota_release_wake_lock();
                 return -err;
             }
@@ -1875,7 +1945,7 @@
 	        fd_system_b = mtk_device_wrap_open(DEV_SYSTEM_B,O_RDWR);
             if (fd_system_b < 0) {
                 err = errno;
-                LYERRLOG("+[UA]: Error opening metadata file: %s\n",strerror(errno));
+                RLOGD("+[UA]: Error opening full_sys file: %s\n",strerror(errno));
                 lynq_fota_release_wake_lock();
                 return -err;
             }
@@ -1885,7 +1955,7 @@
         save_fota_status();
 		
 		retry_cnt = 0;
-		LYVERBLOG("+[UA]: Start upgrading system full.\n");
+		RLOGD("+[UA]: Start upgrading system full.\n");
         do{
             status = delta_copyto_nand(delta_offset,da_head.full_sys);
 
@@ -1896,7 +1966,7 @@
 		
 		mtk_device_wrap_close(fd_curr);
 		
-		LYVERBLOG("+[UA]: system full retry_cnt = %d\n",retry_cnt);
+		RLOGD("+[UA]: system full retry_cnt = %d\n",retry_cnt);
         
 		if (retry_cnt>3) {
 		    if (status == 0) {
@@ -1910,7 +1980,7 @@
 			}
 		}
 		
-		LYVERBLOG("+[UA]: system full upgrade result:%d\n",status);
+		RLOGD("+[UA]: system full upgrade result:%d\n",status);
 
 		fota_status.update_result = status;
 		fota_status.update_status[FULL_SYSTEM-1].update_result = status;
@@ -1951,7 +2021,7 @@
 	        fd_boot_a = mtk_device_wrap_open(DEV_BOOT_A,O_RDWR);
             if (fd_boot_a < 0) {
                 err = errno;
-                LYERRLOG("+[UA]: Error opening metadata file: %s\n",strerror(errno));
+                RLOGD("+[UA]: Error opening full_boot file: %s\n",strerror(errno));
                 lynq_fota_release_wake_lock();
                 return -err;
             }
@@ -1960,7 +2030,7 @@
 	        fd_boot_b = mtk_device_wrap_open(DEV_BOOT_B,O_RDWR);
             if (fd_boot_b < 0) {
                 err = errno;
-                LYERRLOG("+[UA]: Error opening metadata file: %s\n",strerror(errno));
+                RLOGD("+[UA]: Error opening full_boot file: %s\n",strerror(errno));
                 lynq_fota_release_wake_lock();
                 return -err;
             }
@@ -1969,7 +2039,7 @@
 		fota_status.ota_run = FULL_BOOT;
         save_fota_status();
         retry_cnt = 0;
-		LYVERBLOG("+[UA]: Start upgrading boot full.\n");
+		RLOGD("+[UA]: Start upgrading boot full.\n");
         do{
             status = delta_copyto_nand(delta_offset,da_head.full_boot);
             ROCK_SHA_FILE_COMMON(fd_delta,delta_offset,da_head.full_boot,digest_s);
@@ -1977,7 +2047,7 @@
             retry_cnt++;
 		}while((strncmp(digest_s,digest_t,SHA_DIGEST_SIZE)!=0)&&(retry_cnt <= 3));
 		
-		LYVERBLOG("+[UA]: boot full retry_cnt = %d\n",retry_cnt);
+		RLOGD("+[UA]: boot full retry_cnt = %d\n",retry_cnt);
 		mtk_device_wrap_close(fd_curr);
 		
 		if (retry_cnt>3) {
@@ -1993,7 +2063,7 @@
 		}
 		
 		
-		LYVERBLOG("+[UA]: boot full upgrade result:%d\n",status);
+		RLOGD("+[UA]: boot full upgrade result:%d\n",status);
 		fota_status.update_result = status;
 		fota_status.update_status[FULL_BOOT-1].update_result = status;
 		save_fota_status();
@@ -2032,7 +2102,7 @@
 	        fd_tee_a = mtk_device_wrap_open(DEV_TEE_A,O_RDWR);
             if (fd_tee_a < 0) {
                 err = errno;
-                LYERRLOG("+[UA]: Error opening metadata file: %s\n",strerror(errno));
+                RLOGD("+[UA]: Error opening full_tee file: %s\n",strerror(errno));
                 lynq_fota_release_wake_lock();
                 return -err;
             }
@@ -2041,7 +2111,7 @@
 	        fd_tee_b = mtk_device_wrap_open(DEV_TEE_B,O_RDWR);
             if (fd_tee_b < 0) {
                 err = errno;
-                LYERRLOG("+[UA]: Error opening metadata file: %s\n",strerror(errno));
+                RLOGD("+[UA]: Error opening full_tee file: %s\n",strerror(errno));
                 lynq_fota_release_wake_lock();
                 return -err;
             }
@@ -2050,7 +2120,7 @@
 		fota_status.ota_run = FULL_TEE;
         save_fota_status();
         retry_cnt = 0;
-		LYVERBLOG("+[UA]: Start upgrading tee full.\n");
+		RLOGD("+[UA]: Start upgrading tee full.\n");
         do{
             status = delta_copyto_nand(delta_offset,da_head.full_tee);
             ROCK_SHA_FILE_COMMON(fd_delta,delta_offset,da_head.full_tee,digest_s);
@@ -2058,7 +2128,7 @@
             retry_cnt++;
 		}while((strncmp(digest_s,digest_t,SHA_DIGEST_SIZE)!=0)&&(retry_cnt <= 3));
 		mtk_device_wrap_close(fd_curr);
-		LYVERBLOG("+[UA]: tee full retry_cnt = %d\n",retry_cnt);		
+		RLOGD("+[UA]: tee full retry_cnt = %d\n",retry_cnt);		
 		if (retry_cnt>3) {
 		    if (status == 0) {
 				status = retry_cnt;
@@ -2110,7 +2180,7 @@
 	        fd_md1img_a = mtk_device_wrap_open(DEV_MD1IMG_A,O_RDWR);
             if (fd_md1img_a < 0) {
                 err = errno;
-                LYERRLOG("+[UA]: Error opening metadata file: %s\n",strerror(errno));
+                RLOGD("+[UA]: Error opening full_md1img file: %s\n",strerror(errno));
                 lynq_fota_release_wake_lock();
                 return -err;
             }
@@ -2119,7 +2189,7 @@
 	        fd_md1img_b = mtk_device_wrap_open(DEV_MD1IMG_B,O_RDWR);
             if (fd_md1img_b < 0) {
                 err = errno;
-                LYERRLOG("+[UA]: Error opening metadata file: %s\n",strerror(errno));
+                RLOGD("+[UA]: Error opening full_md1img file: %s\n",strerror(errno));
                 lynq_fota_release_wake_lock();
                 return -err;
             }
@@ -2128,7 +2198,7 @@
 		fota_status.ota_run = FULL_MD1IMG;
         save_fota_status();
         retry_cnt = 0;
-		LYVERBLOG("+[UA]: Start upgrading md1img full.\n");
+		RLOGD("+[UA]: Start upgrading md1img full.\n");
         do{
             status = delta_copyto_nand(delta_offset,da_head.full_md1img);
             ROCK_SHA_FILE_COMMON(fd_delta,delta_offset,da_head.full_md1img,digest_s);
@@ -2137,7 +2207,7 @@
 		}while((strncmp(digest_s,digest_t,SHA_DIGEST_SIZE)!=0)&&(retry_cnt <= 3));
 		mtk_device_wrap_close(fd_curr);
 		
-		LYVERBLOG("+[UA]: md1img full retry_cnt = %d\n",retry_cnt);
+		RLOGD("+[UA]: md1img full retry_cnt = %d\n",retry_cnt);
 		if (retry_cnt>3) {
 		    if (status == 0) {
 				status = retry_cnt;
@@ -2150,7 +2220,7 @@
 			}
 		}
 				
-		LYVERBLOG("+[UA]: md1img upgrade result:%d\n",status);
+		RLOGD("+[UA]: md1img upgrade result:%d\n",status);
 		fota_status.update_result = status;
 		fota_status.update_status[FULL_MD1IMG-1].update_result = status;
 		save_fota_status();
@@ -2189,7 +2259,7 @@
 	        fd_md1dsp_a = mtk_device_wrap_open(DEV_MD1DSP_A,O_RDWR);
             if (fd_md1dsp_a < 0) {
                 err = errno;
-                LYERRLOG("+[UA]: Error opening metadata file: %s\n",strerror(errno));
+                RLOGD("+[UA]: Error opening full_md1dsp file: %s\n",strerror(errno));
                 lynq_fota_release_wake_lock();
                 return -err;
             }
@@ -2198,7 +2268,7 @@
 	        fd_md1dsp_b = mtk_device_wrap_open(DEV_MD1DSP_B,O_RDWR);
             if (fd_md1dsp_b < 0) {
                 err = errno;
-                LYERRLOG("+[UA]: Error opening metadata file: %s\n",strerror(errno));
+                RLOGD("+[UA]: Error opening full_md1dsp file: %s\n",strerror(errno));
                 lynq_fota_release_wake_lock();
                 return -err;
             }
@@ -2207,7 +2277,7 @@
 		fota_status.ota_run = FULL_MD1DSP;
         save_fota_status();
         retry_cnt = 0;
-		LYVERBLOG("+[UA]: Start upgrading md1dsp full.\n");
+		RLOGD("+[UA]: Start upgrading md1dsp full.\n");
         do{
             status = delta_copyto_nand(delta_offset,da_head.full_md1dsp);
             ROCK_SHA_FILE_COMMON(fd_delta,delta_offset,da_head.full_md1dsp,digest_s);
@@ -2216,7 +2286,7 @@
 		}while((strncmp(digest_s,digest_t,SHA_DIGEST_SIZE)!=0)&&(retry_cnt <= 3));
 		mtk_device_wrap_close(fd_curr);
 		
-		LYVERBLOG("+[UA]: md1dsp full retry_cnt = %d\n",retry_cnt);
+		RLOGD("+[UA]: md1dsp full retry_cnt = %d\n",retry_cnt);
 		if (retry_cnt>3) {
 		    if (status == 0) {
 				status = retry_cnt;
@@ -2229,7 +2299,7 @@
 			}
 		}
 				
-		LYVERBLOG("+[UA]: md1dsp upgrade result:%d\n",status);
+		RLOGD("+[UA]: md1dsp upgrade result:%d\n",status);
 		fota_status.update_result = status;
 		fota_status.update_status[FULL_MD1DSP-1].update_result = status;
 		save_fota_status();
@@ -2268,7 +2338,7 @@
 	        fd_vbmeta_a = mtk_device_wrap_open(DEV_VBMETA_A,O_RDWR);
             if (fd_vbmeta_a < 0) {
                 err = errno;
-                LYERRLOG("+[UA]: Error opening metadata file: %s\n",strerror(errno));
+                RLOGD("+[UA]: Error opening full_vbmeta file: %s\n",strerror(errno));
                 lynq_fota_release_wake_lock();
                 return -err;
             }
@@ -2277,7 +2347,7 @@
 	        fd_vbmeta_b = mtk_device_wrap_open(DEV_VBMETA_B,O_RDWR);
             if (fd_vbmeta_b < 0) {
                 err = errno;
-                LYERRLOG("+[UA]: Error opening metadata file: %s\n",strerror(errno));
+                RLOGD("+[UA]: Error opening full_vbmeta file: %s\n",strerror(errno));
                 lynq_fota_release_wake_lock();
                 return -err;
             }
@@ -2286,7 +2356,7 @@
 		fota_status.ota_run = FULL_VBMETA;
         save_fota_status();
         retry_cnt = 0;
-		LYVERBLOG("+[UA]: Start upgrading vbmeta full.\n");
+		RLOGD("+[UA]: Start upgrading vbmeta full.\n");
         do{
             status = delta_copyto_nand(delta_offset,da_head.full_vbmeta);
             ROCK_SHA_FILE_COMMON(fd_delta,delta_offset,da_head.full_vbmeta,digest_s);
@@ -2295,7 +2365,7 @@
 		}while((strncmp(digest_s,digest_t,SHA_DIGEST_SIZE)!=0)&&(retry_cnt <= 3));
 		mtk_device_wrap_close(fd_curr);
 		
-		LYVERBLOG("+[UA]: vbmeta full retry_cnt = %d\n",retry_cnt);
+		RLOGD("+[UA]: vbmeta full retry_cnt = %d\n",retry_cnt);
 		if (retry_cnt>3) {
 		    if (status == 0) {
 				status = retry_cnt;
@@ -2308,7 +2378,7 @@
 			}
 		}
 				
-		LYVERBLOG("+[UA]: vbmeta upgrade result:%d\n",status);
+		RLOGD("+[UA]: vbmeta upgrade result:%d\n",status);
 		fota_status.update_result = status;
 		fota_status.update_status[FULL_VBMETA-1].update_result = status;
 		save_fota_status();
@@ -2496,132 +2566,284 @@
 
     if(update_mode == MODE_NORMAL){ //need A VS B
 	    if(current_slot == SLOT_A) {
+            up_info.fota_flag[0] = 'B';
+            up_info.fota_flag[1] = '-';
+            up_info.fota_flag[2] = 'A';
+	
+		}
+        else
+        {
 
-	        up_info.fota_flag[0] = 'B';
-	        up_info.fota_flag[1] = '-';
-	        up_info.fota_flag[2] = 'A';		
-		
-		}else{
-			
 	        up_info.fota_flag[0] = 'A';
 	        up_info.fota_flag[1] = '-';
 	        up_info.fota_flag[2] = 'B';	
 			
 		}
-	
-	}else{
-	    up_info.fota_flag[0] = 'e';
-	    up_info.fota_flag[1] = 'n';
-	    up_info.fota_flag[2] = 'd';		
-		
-	}
-
-
-	up_info.update_result = status;
+    }
+    else
+    {
+        up_info.fota_flag[0] = 'e';
+        up_info.fota_flag[1] = 'n';
+        up_info.fota_flag[2] = 'd';
+    }
+    up_info.update_result = status;
     up_info.ota_run = 0;
-    lseek(fd_update_status,0,SEEK_SET);       
-	write(fd_update_status, &up_info,sizeof(up_info));
+    lseek(fd_update_status,0,SEEK_SET);
+    RLOGD("up_info: fota_flag: %s\n",up_info.fota_flag);
+    write(fd_update_status, &up_info,sizeof(up_info));
     sync();
-           
+#ifdef MOBILETEK_FOTA_CFG
+    close(fd_delta);
+#endif
+#ifdef GSW_FOTA_CFG
     close_dev_fd(fd_delta);
-
+#endif
     //close_dev_fd(fd_curr);
 	
 
 	
     close(fd_update_status);
-	sync();
-	
+    sync();
 
-	slot = (current_slot == 0) ? 1 : 0;
-	
-	LYVERBLOG("+[UA]: slot SLOT = %d\n",slot);
-	
-	if(update_mode==MODE_NORMAL){
-	    module->setActiveBootSlot(module,slot);
-		LYVERBLOG("+[UA]: upgrade is success!!!!\n");
-	}
+    slot = (current_slot == 0) ? 1 : 0;
+    RLOGD("+[UA]: slot SLOT = %d\n",slot);
+#ifdef MOBILETEK_FOTA_CFG
+    if(update_mode==MODE_NORMAL)
+	{
+        module->setActiveBootSlot(module,slot);
+        RLOGD("+[UA]:slot %d upgrade is success!!!!\n", slot);
+    }
 
+#endif
+#ifdef GSW_FOTA_CFG
+        if(switch_slot_flag==1)
+        {
+            module->setActiveBootSlot(module,slot);
+            RLOGD("+[UA]: upgrade is success!!!!\n");
+        }
+#endif
     fota_status.ota_run = 0;
-	fota_status.switch_slot = PASS;
-	fota_status.update_result = status;
+    fota_status.switch_slot = PASS;
+    fota_status.update_result = status;
     save_fota_status();
-    
     lynq_fota_release_wake_lock();
-    
-	if(update_mode==MODE_NORMAL){
-	reboot_device();
-	}	
-	
-	return status;
+
+    if(update_mode==MODE_NORMAL)
+    {
+        reboot_device();
+    }
+
+    return status;
 }
 
 
-
-static void rock_fail_handler() {
-	
+#ifdef GSW_FOTA_CFG
+static void rock_fail_handler()
+{
+    int ret = 0;
+    RLOGD("rock_fail_handler start\n");
+    ret = rock_update_main(0, 0, 0, 0, 1, 1);
+    if(ret)
+    {
+        RLOGD("fota update fail again!\n");
+    }
 }
 
+#endif
 
 
 
 /* main entrpoint */
-int lynq_rock_main(int first_run)  {
+int lynq_rock_main(int first_run)
+{
+    int ret = 0;
 
-	int ret = 0;
-    
 #if 0
-	
-	printf("-********copy delta ***-\n");
-	test_write_delta("/data/delta",DEV_DELTA);
-
-#endif 
-	
+    
+    printf("-********copy delta ***-\n");
+    test_write_delta("/data/delta",DEV_DELTA);
+#endif
+#ifdef MOBILETEK_FOTA_CFG
 	ret = rock_update_main(0, 0, 0, 0, first_run);
-	if(ret) {
-		rock_fail_handler();
-	}
-	return ret;
+#endif
+#ifdef GSW_FOTA_CFG
+    ret = rock_update_main(0, 0, 0, 0, first_run, 1);
+#endif 
+    RLOGD("rock_update_main ret = %d\n", ret);
+    if(ret)
+	{
+        RLOGD("fota update fail!\n");
+    }
+    return ret;
 }
 
 #endif
 
 //lt add @2021.9.23 for  deal with power down \ backup or upgrade.
+#ifdef GSW_FOTA_CFG
 int lynq_fota_func(void) 
 {
+    int fd;
+    int first_run = 1;   
+    int ret = 0;
+    UPDATE_INFO lynq_up_info;
+    memset(&lynq_up_info, 0, sizeof(lynq_up_info));
+    fd = open(FILE_UPDATE_STATE,O_RDWR | O_CREAT,0777);
+    if (fd < 0)
+    {
+        return -1;
+    }
+    read(fd,(unsigned char *)&lynq_up_info,sizeof(lynq_up_info));
+    close(fd);
 
- int fd;
- int first_run = 1;   
- UPDATE_INFO lynq_up_info;
-
- memset(&lynq_up_info, 0, sizeof(lynq_up_info));
-
- fd = open(FILE_UPDATE_STATE,O_RDWR | O_CREAT,0777);
-
- if (fd < 0) {
-  return -1;
- }
-
- read(fd,(unsigned char *)&lynq_up_info,sizeof(lynq_up_info));
- close(fd);
-
- if(lynq_up_info.ota_run != 0) { 
-      //Power off, call UA
-	    LYVERBLOG("[+UP]: ***Power off, call UA***\n");
-	   lynq_rock_main(first_run);
- }else if (((lynq_up_info.fota_flag[0]=='A')&&(lynq_up_info.fota_flag[1]=='-')&&(lynq_up_info.fota_flag[2]=='B'))||((lynq_up_info.fota_flag[0]=='B')&&(lynq_up_info.fota_flag[1]=='-')&&(lynq_up_info.fota_flag[2]=='A'))){
-      //Upgrade the other side and call UA
-	  LYVERBLOG("[+UP]: ***Upgrade the other side and call UA***\n");
-	   lynq_rock_main(first_run);
- }
-/*
- else{
-      //Normal procedure before, to check the upgrade package
-//	LYVERBLOG("[+UP]: ***Normal procedure before, to check the upgrade package***\n");
-//	lynq_rock_main(first_run);
- }*/
- return 0;
+    if(lynq_up_info.ota_run != 0)
+    { 
+        //Power off, call UA
+        RLOGD("[+UP]: ***Power off, call UA***\n");
+        ret = rock_update_main(0, 0, 0, 0, first_run, 1);
+        RLOGD("rock_update_main ret = %d\n", ret);
+        if(ret) 
+        {
+            RLOGD("fota update fail!\n");
+        }
+    }
+    if(((lynq_up_info.fota_flag[0]=='A')&&(lynq_up_info.fota_flag[1]=='-')&&(lynq_up_info.fota_flag[2]=='B'))||
+        ((lynq_up_info.fota_flag[0]=='B')&&(lynq_up_info.fota_flag[1]=='-')&&(lynq_up_info.fota_flag[2]=='A')))
+    {
+        //Upgrade the other side and call UA
+        RLOGD("[+UP]: ***Upgrade the other side and call UA***\n");
+        ret = rock_update_main(0, 0, 0, 0, first_run, 0);
+        RLOGD("rock_update_main ret = %d\n", ret);
+        if(ret)
+        {
+            RLOGD("fota update fail!\n");
+        }
+    }
+    return 0;
 }	
+#endif
+#ifdef MOBILETEK_FOTA_CFG
+int lynq_fota_func(void) 
+{
+    int fd;
+    int first_run = 1;
+    UPDATE_INFO lynq_up_info;
+    memset(&lynq_up_info, 0, sizeof(lynq_up_info));
+    fd = open(FILE_UPDATE_STATE,O_RDWR | O_CREAT,0777);
+    if (fd < 0)
+    {
+        return -1;
+    }
+    read(fd,(unsigned char *)&lynq_up_info,sizeof(lynq_up_info));
+    close(fd);
+    RLOGD("lynq_up_info: fota_flag: %s\n",lynq_up_info.fota_flag);
+    if(lynq_up_info.ota_run != 0)
+    { 
+        //Power off, call UA
+        RLOGD("[+UP]: ***Power off, call UA***\n");
+        lynq_rock_main(first_run);
+    }
+    if (((lynq_up_info.fota_flag[0]=='A')&&(lynq_up_info.fota_flag[1]=='-')&&(lynq_up_info.fota_flag[2]=='B'))||
+        ((lynq_up_info.fota_flag[0]=='B')&&(lynq_up_info.fota_flag[1]=='-')&&(lynq_up_info.fota_flag[2]=='A')))
+    {
+        //Upgrade the other side and call UA
+        RLOGD("[+UP]: ***Upgrade the other side and call UA***\n");
+        lynq_rock_main(first_run);
+        if( 0 != reset_fota_flag())
+        {
+            RLOGD("reset_fota_flag fail\n");
+        }
+    }
+    sleep(120);
+    check_ril_service();
+    return 0;
+}	
+
+int reset_fota_flag(void)
+{
+    int err = 0;
+    fd_update_status = open(FILE_UPDATE_STATE,O_RDWR | O_CREAT,0777);
+    if (fd_update_status < 0) {
+        err = errno;
+        RLOGD("+[UA]: Error opening metadata file: %s\n",strerror(errno));
+        return err;
+    }
+    lseek(fd_update_status,0,SEEK_SET);
+    up_info.fota_flag[0] = 'e';
+    up_info.fota_flag[1] = 'n';
+    up_info.fota_flag[2] = 'd';	
+    write(fd_update_status, &up_info,sizeof(up_info));
+    sync();
+    close(fd_update_status);
+    sync();
+    return err;
+
+}
+
+int get_fota_flag(void)
+{
+    int err = 0;
+    fd_update_status = open(FILE_UPDATE_STATE,O_RDWR | O_CREAT,0777);
+    if (fd_update_status < 0) {
+        err = errno;
+        RLOGD("+[UA]: Error opening metadata file: %s\n",strerror(errno));
+        return err;
+    }
+    lseek(fd_update_status,0,SEEK_SET);
+    memset(&up_info, 0, sizeof(up_info));
+    read(fd_update_status,(unsigned char *)&up_info,sizeof(up_info));
+    close(fd_update_status);
+    sync();
+    RLOGD("get_fota_flag: %s\n", up_info.fota_flag);
+    return err;
+}
+
+void check_ril_service(void)
+{
+    FILE *fp;
+    int ril_flag = 0;
+    char dtr_buffer[180];
+    char buffer[50] = "/usr/bin/lynq-ril-service";
+    fp = popen("ps -ef|grep lynq-ril","r");
+    fgets(dtr_buffer, sizeof(dtr_buffer), fp);
+    if(matchString(dtr_buffer, buffer) == 0)
+    {
+        ril_flag = 1;
+    }
+    pclose(fp);
+    if(ril_flag == 1)
+    {
+        reboot_device();
+    }
+}
+
+int matchString(char* buf, char* sub) {
+    char* tbuf = buf;
+    char* tsub = sub;
+    int i = 0;
+    int j = 0;
+    while (i <= strlen(tbuf ) - 1 && j <= strlen(tsub )-1)
+    {
+        if (tbuf [i] == tsub [j])
+        {
+            i++;
+            j++;
+        }
+        else
+        {
+            i = i - j + 1;
+            j = 0;
+        }
+    }
+
+    if (j == strlen(tsub))
+    {
+        return 1;
+    }
+
+    return 0;
+}
+#endif
 
 int lynq_nand_open(const char *pathname, int flags)
 {
@@ -2695,13 +2917,18 @@
  */
 int lynq_fota_nrestart(void)
 {
-	int status,err,start;
+	int status,err;
+#ifdef GSW_FOTA_CFG
+	int start;
+#endif
     int ret = 0;
 	int i = 0;
 	int retry_cnt = 0;
 	
 	IOT_UPDATA_CONTEXT ctx;
+#ifdef GSW_FOTA_CFG
 	UPDATE_INFO up_info;
+#endif
 	//OTA_STATUS  fota_status;
 
 
@@ -2723,7 +2950,7 @@
         ret = -EINVAL;
     }
     if (ret != 0) {
-        LYERRLOG("+[UA]: Error loading boot_control HAL implementation.\n");
+        RLOGD("+[UA]: Error loading boot_control HAL implementation.\n");
         return -1;
     }
 
@@ -2732,7 +2959,7 @@
 
 
     if (module == NULL) {
-        LYERRLOG("+[UA]: Error getting bootctrl module.\n");
+        RLOGD("+[UA]: Error getting bootctrl module.\n");
 	    return  -1;
     }
 
@@ -2744,7 +2971,7 @@
     
     int is_successful = module->isSlotMarkedSuccessful(module, current_slot);
   
-    LYVERBLOG("Booting slot = %d, : isSlotMarkedSuccessful= %d\n",current_slot,is_successful);  
+    RLOGD("Booting slot = %d, : isSlotMarkedSuccessful= %d\n",current_slot,is_successful);  
 		
 
 
@@ -2761,20 +2988,21 @@
 
     if(0 != init_dev_fd())
     {
-        LYVERBLOG("+[UA]: get fota addr error\n");
+        RLOGD("+[UA]: get fota addr error\n");
         lynq_fota_release_wake_lock();
         return E_ROCK_FOTA_ADDR;
     }
 
-    memset(&up_info, 0, sizeof(up_info));
-	
+    
+#ifdef GSW_FOTA_CFG
 	memset(&fota_status,0,sizeof(fota_status));
-
+#endif
 	
     lseek(fd_update_status,0,SEEK_SET);
+    memset(&up_info, 0, sizeof(up_info));
     read(fd_update_status,(unsigned char *)&up_info,sizeof(up_info));
 
-	LYVERBLOG("+[UA]: up_info.ota_run = %d\n",up_info.ota_run);
+	RLOGD("+[UA]: up_info.ota_run = %d\n",up_info.ota_run);
 	
 	
 	if ((up_info.ota_run>PATCH_BL33)||(up_info.ota_run<PATCH_SYSTEM))
@@ -2792,8 +3020,8 @@
 		update_mode = MODE_NORMAL;
 	}
 	
-	LYVERBLOG("+[UA]: up_info.fota_flag = %s\n",up_info.fota_flag);
-	LYVERBLOG("+[UA]: update_mode = %d\n",update_mode);
+	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));
 
@@ -3987,7 +4215,7 @@
 		
 	    if (lseek(fd_delta, DELTA_HEARD_SIZE + delta_size, SEEK_SET) < 0) {
             err = errno;
-            LYERRLOG("+[UA]: mtk_device_wrap_seek df_delta err\n");
+            RLOGD("+[UA]: mtk_device_wrap_seek df_delta err\n");
             lynq_fota_release_wake_lock();
 		    return -1;
         }
@@ -3996,8 +4224,8 @@
 		
 
 	    if (memcmp(full_header, "full-ota", DELTA_FULL_HEARD_SIZE) != 0) {
-	        LYERRLOG("+[UA]: invalid full delta header\r\n");
-		    up_info.fota_flag[0] = 'e';
+            RLOGD("+[UA]: invalid full delta header\r\n");
+	        up_info.fota_flag[0] = 'e';
 	        up_info.fota_flag[1] = 'n';
 	        up_info.fota_flag[2] = 'd';
 	        up_info.update_result = -1;
@@ -4041,7 +4269,7 @@
 	        fd_system_a = mtk_device_wrap_open(DEV_SYSTEM_A,O_RDWR);
             if (fd_system_a < 0) {
                 err = errno;
-                LYERRLOG("+[UA]: Error opening metadata file: %s\n",strerror(errno));
+                RLOGD("+[UA]: Error opening metadata file: %s\n",strerror(errno));
                 lynq_fota_release_wake_lock();
                 return -err;
             }
@@ -4050,7 +4278,7 @@
 	        fd_system_b = mtk_device_wrap_open(DEV_SYSTEM_B,O_RDWR);
             if (fd_system_b < 0) {
                 err = errno;
-                LYERRLOG("+[UA]: Error opening metadata file: %s\n",strerror(errno));
+                RLOGD("+[UA]: Error opening metadata file: %s\n",strerror(errno));
                 lynq_fota_release_wake_lock();
                 return -err;
             }
@@ -4060,7 +4288,7 @@
         save_fota_status();
 		
 		retry_cnt = 0;
-		LYVERBLOG("+[UA]: Start upgrading system full.\n");
+               RLOGD("+[UA]: Start upgrading system full.\n");
         do{
             status = delta_copyto_nand(delta_offset,da_head.full_sys);
 
@@ -4071,7 +4299,7 @@
 		
 		mtk_device_wrap_close(fd_curr);
 		
-		LYVERBLOG("+[UA]: system full retry_cnt = %d\n",retry_cnt);
+                RLOGD("+[UA]: system full retry_cnt = %d\n",retry_cnt);
         
 		if (retry_cnt>3) {
 		    if (status == 0) {
@@ -4085,7 +4313,7 @@
 			}
 		}
 		
-		LYVERBLOG("+[UA]: system full upgrade result:%d\n",status);
+                RLOGD("+[UA]: system full upgrade result:%d\n",status);
 
 		fota_status.update_result = status;
 		fota_status.update_status[FULL_SYSTEM-1].update_result = status;
@@ -4126,7 +4354,7 @@
 	        fd_boot_a = mtk_device_wrap_open(DEV_BOOT_A,O_RDWR);
             if (fd_boot_a < 0) {
                 err = errno;
-                LYERRLOG("+[UA]: Error opening metadata file: %s\n",strerror(errno));
+                RLOGD("+[UA]: Error opening metadata file: %s\n",strerror(errno));
                 lynq_fota_release_wake_lock();
                 return -err;
             }
@@ -4135,7 +4363,7 @@
 	        fd_boot_b = mtk_device_wrap_open(DEV_BOOT_B,O_RDWR);
             if (fd_boot_b < 0) {
                 err = errno;
-                LYERRLOG("+[UA]: Error opening metadata file: %s\n",strerror(errno));
+                RLOGD("+[UA]: Error opening metadata file: %s\n",strerror(errno));
                 lynq_fota_release_wake_lock();
                 return -err;
             }
@@ -4144,7 +4372,7 @@
 		fota_status.ota_run = FULL_BOOT;
         save_fota_status();
         retry_cnt = 0;
-		LYVERBLOG("+[UA]: Start upgrading boot full.\n");
+                RLOGD("+[UA]: Start upgrading boot full.\n");
         do{
             status = delta_copyto_nand(delta_offset,da_head.full_boot);
             ROCK_SHA_FILE_COMMON(fd_delta,delta_offset,da_head.full_boot,digest_s);
@@ -4152,7 +4380,7 @@
             retry_cnt++;
 		}while((strncmp(digest_s,digest_t,SHA_DIGEST_SIZE)!=0)&&(retry_cnt <= 3));
 		
-		LYVERBLOG("+[UA]: boot full retry_cnt = %d\n",retry_cnt);
+                RLOGD("+[UA]: boot full retry_cnt = %d\n",retry_cnt);
 		mtk_device_wrap_close(fd_curr);
 		
 		if (retry_cnt>3) {
@@ -4168,7 +4396,7 @@
 		}
 		
 		
-		LYVERBLOG("+[UA]: boot full upgrade result:%d\n",status);
+                RLOGD("+[UA]: boot full upgrade result:%d\n",status);
 		fota_status.update_result = status;
 		fota_status.update_status[FULL_BOOT-1].update_result = status;
 		save_fota_status();
@@ -4207,7 +4435,7 @@
 	        fd_tee_a = mtk_device_wrap_open(DEV_TEE_A,O_RDWR);
             if (fd_tee_a < 0) {
                 err = errno;
-                LYERRLOG("+[UA]: Error opening metadata file: %s\n",strerror(errno));
+                RLOGD("+[UA]: Error opening metadata file: %s\n",strerror(errno));
                 lynq_fota_release_wake_lock();
                 return -err;
             }
@@ -4216,7 +4444,7 @@
 	        fd_tee_b = mtk_device_wrap_open(DEV_TEE_B,O_RDWR);
             if (fd_tee_b < 0) {
                 err = errno;
-                LYERRLOG("+[UA]: Error opening metadata file: %s\n",strerror(errno));
+                RLOGD("+[UA]: Error opening metadata file: %s\n",strerror(errno));
                 lynq_fota_release_wake_lock();
                 return -err;
             }
@@ -4225,7 +4453,7 @@
 		fota_status.ota_run = FULL_TEE;
         save_fota_status();
         retry_cnt = 0;
-		LYVERBLOG("+[UA]: Start upgrading tee full.\n");
+        RLOGD("+[UA]: Start upgrading tee full.\n");
         do{
             status = delta_copyto_nand(delta_offset,da_head.full_tee);
             ROCK_SHA_FILE_COMMON(fd_delta,delta_offset,da_head.full_tee,digest_s);
@@ -4233,7 +4461,7 @@
             retry_cnt++;
 		}while((strncmp(digest_s,digest_t,SHA_DIGEST_SIZE)!=0)&&(retry_cnt <= 3));
 		mtk_device_wrap_close(fd_curr);
-		LYVERBLOG("+[UA]: tee full retry_cnt = %d\n",retry_cnt);		
+        RLOGD("+[UA]: tee full retry_cnt = %d\n",retry_cnt);		
 		if (retry_cnt>3) {
 		    if (status == 0) {
 				status = retry_cnt;
@@ -4246,7 +4474,7 @@
 			}
 		}
 		
-		printf("+[UA] tee full upgrade result:%d\n",status);
+        RLOGD("+[UA] tee full upgrade result:%d\n",status);
 		fota_status.update_result = status;
 		fota_status.update_status[FULL_TEE-1].update_result = status;
 		save_fota_status();
@@ -4285,7 +4513,7 @@
 	        fd_md1img_a = mtk_device_wrap_open(DEV_MD1IMG_A,O_RDWR);
             if (fd_md1img_a < 0) {
                 err = errno;
-                LYERRLOG("+[UA]: Error opening metadata file: %s\n",strerror(errno));
+                RLOGD("+[UA]: Error opening metadata file: %s\n",strerror(errno));
                 lynq_fota_release_wake_lock();
                 return -err;
             }
@@ -4294,7 +4522,7 @@
 	        fd_md1img_b = mtk_device_wrap_open(DEV_MD1IMG_B,O_RDWR);
             if (fd_md1img_b < 0) {
                 err = errno;
-                LYERRLOG("+[UA]: Error opening metadata file: %s\n",strerror(errno));
+                RLOGD("+[UA]: Error opening metadata file: %s\n",strerror(errno));
                 lynq_fota_release_wake_lock();
                 return -err;
             }
@@ -4303,7 +4531,7 @@
 		fota_status.ota_run = FULL_MD1IMG;
         save_fota_status();
         retry_cnt = 0;
-		LYVERBLOG("+[UA]: Start upgrading md1img full.\n");
+        RLOGD("+[UA]: Start upgrading md1img full.\n");
         do{
             status = delta_copyto_nand(delta_offset,da_head.full_md1img);
             ROCK_SHA_FILE_COMMON(fd_delta,delta_offset,da_head.full_md1img,digest_s);
@@ -4312,7 +4540,7 @@
 		}while((strncmp(digest_s,digest_t,SHA_DIGEST_SIZE)!=0)&&(retry_cnt <= 3));
 		mtk_device_wrap_close(fd_curr);
 		
-		LYVERBLOG("+[UA]: md1img full retry_cnt = %d\n",retry_cnt);
+        RLOGD("+[UA]: md1img full retry_cnt = %d\n",retry_cnt);
 		if (retry_cnt>3) {
 		    if (status == 0) {
 				status = retry_cnt;
@@ -4325,7 +4553,7 @@
 			}
 		}
 				
-		LYVERBLOG("+[UA]: md1img upgrade result:%d\n",status);
+        RLOGD("+[UA]: md1img upgrade result:%d\n",status);
 		fota_status.update_result = status;
 		fota_status.update_status[FULL_MD1IMG-1].update_result = status;
 		save_fota_status();
@@ -4364,7 +4592,7 @@
 	        fd_md1dsp_a = mtk_device_wrap_open(DEV_MD1DSP_A,O_RDWR);
             if (fd_md1dsp_a < 0) {
                 err = errno;
-                LYERRLOG("+[UA]: Error opening metadata file: %s\n",strerror(errno));
+                RLOGD("+[UA]: Error opening metadata file: %s\n",strerror(errno));
                 lynq_fota_release_wake_lock();
                 return -err;
             }
@@ -4373,7 +4601,7 @@
 	        fd_md1dsp_b = mtk_device_wrap_open(DEV_MD1DSP_B,O_RDWR);
             if (fd_md1dsp_b < 0) {
                 err = errno;
-                LYERRLOG("+[UA]: Error opening metadata file: %s\n",strerror(errno));
+                RLOGD("+[UA]: Error opening metadata file: %s\n",strerror(errno));
                 lynq_fota_release_wake_lock();
                 return -err;
             }
@@ -4382,7 +4610,7 @@
 		fota_status.ota_run = FULL_MD1DSP;
         save_fota_status();
         retry_cnt = 0;
-		LYVERBLOG("+[UA]: Start upgrading md1dsp full.\n");
+        RLOGD("+[UA]: Start upgrading md1dsp full.\n");
         do{
             status = delta_copyto_nand(delta_offset,da_head.full_md1dsp);
             ROCK_SHA_FILE_COMMON(fd_delta,delta_offset,da_head.full_md1dsp,digest_s);
@@ -4391,7 +4619,7 @@
 		}while((strncmp(digest_s,digest_t,SHA_DIGEST_SIZE)!=0)&&(retry_cnt <= 3));
 		mtk_device_wrap_close(fd_curr);
 		
-		LYVERBLOG("+[UA]: md1dsp full retry_cnt = %d\n",retry_cnt);
+        RLOGD("+[UA]: md1dsp full retry_cnt = %d\n",retry_cnt);
 		if (retry_cnt>3) {
 		    if (status == 0) {
 				status = retry_cnt;
@@ -4404,7 +4632,7 @@
 			}
 		}
 				
-		LYVERBLOG("+[UA]: md1dsp upgrade result:%d\n",status);
+        RLOGD("+[UA]: md1dsp upgrade result:%d\n",status);
 		fota_status.update_result = status;
 		fota_status.update_status[FULL_MD1DSP-1].update_result = status;
 		save_fota_status();
@@ -4447,7 +4675,7 @@
 	        fd_vbmeta_a = mtk_device_wrap_open(DEV_VBMETA_A,O_RDWR);
             if (fd_vbmeta_a < 0) {
                 err = errno;
-                LYERRLOG("+[UA]: Error opening metadata file: %s\n",strerror(errno));
+                RLOGD("+[UA]: Error opening metadata file: %s\n",strerror(errno));
                 lynq_fota_release_wake_lock();
                 return -err;
             }
@@ -4456,7 +4684,7 @@
 	        fd_vbmeta_b = mtk_device_wrap_open(DEV_VBMETA_B,O_RDWR);
             if (fd_vbmeta_b < 0) {
                 err = errno;
-                LYERRLOG("+[UA]: Error opening metadata file: %s\n",strerror(errno));
+                RLOGD("+[UA]: Error opening metadata file: %s\n",strerror(errno));
                 lynq_fota_release_wake_lock();
                 return -err;
             }
@@ -4465,7 +4693,7 @@
 		fota_status.ota_run = FULL_VBMETA;
         save_fota_status();
         retry_cnt = 0;
-		LYVERBLOG("+[UA]: Start upgrading vbmeta full.\n");
+		RLOGD("+[UA]: Start upgrading vbmeta full.\n");
         do{
             status = delta_copyto_nand(delta_offset,da_head.full_vbmeta);
             ROCK_SHA_FILE_COMMON(fd_delta,delta_offset,da_head.full_vbmeta,digest_s);
@@ -4474,7 +4702,7 @@
 		}while((strncmp(digest_s,digest_t,SHA_DIGEST_SIZE)!=0)&&(retry_cnt <= 3));
 		mtk_device_wrap_close(fd_curr);
 		
-		LYVERBLOG("+[UA]: vbmeta full retry_cnt = %d\n",retry_cnt);
+		RLOGD("+[UA]: vbmeta full retry_cnt = %d\n",retry_cnt);
 		if (retry_cnt>3) {
 		    if (status == 0) {
 				status = retry_cnt;
@@ -4487,7 +4715,7 @@
 			}
 		}
 				
-		LYVERBLOG("+[UA]: vbmeta upgrade result:%d\n",status);
+		RLOGD("+[UA]: vbmeta upgrade result:%d\n",status);
 		fota_status.update_result = status;
 		fota_status.update_status[FULL_VBMETA-1].update_result = status;
 		save_fota_status();
@@ -4525,7 +4753,7 @@
 	        fd_oemapp_a = mtk_device_wrap_open(DEV_OEMAPP_A,O_RDWR);
             if (fd_oemapp_a < 0) {
                 err = errno;
-                LYERRLOG("+[UA]: Error opening metadata file: %s\n",strerror(errno));
+                RLOGD("+[UA]: Error opening metadata file: %s\n",strerror(errno));
                 lynq_fota_release_wake_lock();
                 return -err;
             }
@@ -4534,7 +4762,7 @@
 	        fd_oemapp_b = mtk_device_wrap_open(DEV_OEMAPP_B,O_RDWR);
             if (fd_oemapp_b < 0) {
                 err = errno;
-                LYERRLOG("+[UA]: Error opening metadata file: %s\n",strerror(errno));
+                RLOGD("+[UA]: Error opening metadata file: %s\n",strerror(errno));
                 lynq_fota_release_wake_lock();
                 return -err;
             }
@@ -4543,7 +4771,7 @@
         fota_status.ota_run = FULL_OEMAPP;
         save_fota_status();
         retry_cnt = 0;
-		LYVERBLOG("+[UA]: Start upgrading oemapp full.\n");
+		RLOGD("+[UA]: Start upgrading oemapp full.\n");
         do {       
 		    status = delta_copyto_nand(delta_offset,da_head.full_oemapp);
 		    ROCK_SHA_FILE_COMMON(fd_delta,delta_offset,da_head.full_oemapp,digest_s);
@@ -4552,7 +4780,7 @@
 		}while((strncmp(digest_s,digest_t,SHA_DIGEST_SIZE)!=0)&&(retry_cnt <= 3));
 		mtk_device_wrap_close(fd_curr);
 
-		LYVERBLOG("+[UA]: oemapp full retry_cnt = %d\n",retry_cnt);
+		RLOGD("+[UA]: oemapp full retry_cnt = %d\n",retry_cnt);
 		if (retry_cnt>3) {
 		    if (status == 0) {
 				status = retry_cnt;
@@ -4565,7 +4793,7 @@
 			}
 		}
 
-		LYVERBLOG("+[UA]: oemapp upgrade result:%d\n",status);
+		RLOGD("+[UA]: oemapp upgrade result:%d\n",status);
 		fota_status.update_result = status;
 		fota_status.update_status[FULL_OEMAPP-1].update_result = status;
 		save_fota_status();
@@ -4602,7 +4830,7 @@
 	        fd_oemapp2_a = mtk_device_wrap_open(DEV_OEMAPP2_A,O_RDWR);
             if (fd_oemapp2_a < 0) {
                 err = errno;
-                LYERRLOG("+[UA]: Error opening metadata file: %s\n",strerror(errno));
+                RLOGD("+[UA]: Error opening metadata file: %s\n",strerror(errno));
                 lynq_fota_release_wake_lock();
                 return -err;
             }
@@ -4611,7 +4839,7 @@
 	        fd_oemapp2_b = mtk_device_wrap_open(DEV_OEMAPP2_B,O_RDWR);
             if (fd_oemapp2_b < 0) {
                 err = errno;
-                LYERRLOG("+[UA]: Error opening metadata file: %s\n",strerror(errno));
+                RLOGD("+[UA]: Error opening metadata file: %s\n",strerror(errno));
                 lynq_fota_release_wake_lock();
                 return -err;
             }
@@ -4620,7 +4848,7 @@
 		fota_status.ota_run = FULL_OEMAPP2;
         save_fota_status();
         retry_cnt = 0;
-		LYVERBLOG("+[UA]: Start upgrading oemapp2 full.\n");
+		RLOGD("+[UA]: Start upgrading oemapp2 full.\n");
         do {
 		    status = delta_copyto_nand(delta_offset,da_head.full_oemapp2);
 		    ROCK_SHA_FILE_COMMON(fd_delta,delta_offset,da_head.full_oemapp2,digest_s);
@@ -4628,7 +4856,7 @@
 		    retry_cnt++;
 		}while((strncmp(digest_s,digest_t,SHA_DIGEST_SIZE)!=0)&&(retry_cnt <= 3));
 		mtk_device_wrap_close(fd_curr);
-        LYVERBLOG("+[UA]: oemapp2 full retry_cnt = %d\n",retry_cnt);
+        RLOGD("+[UA]: oemapp2 full retry_cnt = %d\n",retry_cnt);
 		if (retry_cnt>3) {
 		    if (status == 0) {
 				status = retry_cnt;
@@ -4640,7 +4868,7 @@
 			    nand_copyto_nand(DEV_OEMAPP2_A,DEV_OEMAPP2_B);
 			}
 		}		
-		LYVERBLOG("+[UA]: oemapp2 upgrade result:%d\n",status);
+		RLOGD("+[UA]: oemapp2 upgrade result:%d\n",status);
 		fota_status.update_result = status;
 		fota_status.update_status[FULL_OEMAPP2-1].update_result = status;
 		save_fota_status();
@@ -4691,34 +4919,42 @@
 	}
 
 
-	up_info.update_result = status;
+    up_info.update_result = status;
     up_info.ota_run = 0;
     lseek(fd_update_status,0,SEEK_SET);       
-	write(fd_update_status, &up_info,sizeof(up_info));
+    write(fd_update_status, &up_info,sizeof(up_info));
     sync();
-           
+#ifdef GSW_FOTA_CFG
     close_dev_fd(fd_delta);
+#endif 
 
-    //close_dev_fd(fd_curr);
+#ifdef MOBILETEK_FOTA_CFG
+	close(fd_delta);
+#endif
 	
 
 	
     close(fd_update_status);
-	sync();
-	
+    sync();
 
-	slot = (current_slot == 0) ? 1 : 0;
-	
-	LYVERBLOG("+[UA]: slot SLOT = %d\n",slot);
-    
-	if(update_mode==MODE_NORMAL){
-	    module->setActiveBootSlot(module,slot);
-		LYVERBLOG("+[UA]: upgrade is success!!!!\n");
-	}
+    slot = (current_slot == 0) ? 1 : 0;
+    RLOGD("+[UA]: slot SLOT = %d\n",slot);
+#ifdef MOBILETEK_FOTA_CFG
+    if(update_mode==MODE_NORMAL)
+    {
+        module->setActiveBootSlot(module,slot);
+        RLOGD("+[UA]: upgrade is success!!!!\n");
+    }
+#endif
+
+#ifdef GSW_FOTA_CFG
+    module->setActiveBootSlot(module,slot);
+    RLOGD("+[UA]: upgrade is success!!!!\n");
+#endif 
 
     fota_status.ota_run = 0;
-	fota_status.switch_slot = PASS;
-	fota_status.update_result = status;
+    fota_status.switch_slot = PASS;
+    fota_status.update_result = status;
     save_fota_status();
 
     lynq_fota_release_wake_lock();
@@ -4732,6 +4968,51 @@
  * @param1 szie:fota addr length
  * @return 0:set success other:set fail
  */
+#ifdef MOBILETEK_FOTA_CFG
+int lynq_fota_set_addr_value(char *value,int size)
+{
+    int err = 0;
+    fd_update_status = open(FILE_UPDATE_STATE,O_RDWR | O_CREAT,0777);
+    if (fd_update_status < 0) {
+        err = errno;
+        RLOGD("+[UA]: Error opening metadata file: %s\n",strerror(errno));
+        return err;
+    }
+    lseek(fd_update_status,0,SEEK_SET);
+    strcpy(up_info.addr,value);
+    write(fd_update_status, &up_info,sizeof(up_info));
+    sync();
+    close(fd_update_status);
+    sync();
+    return err;
+}
+/**
+ * @brief get the upgrade package address
+ * 
+ * @param1 value:fota addr
+ * @return 0:get success other:set fail
+ */
+int lynq_fota_get_addr_value(char *tmp)
+{
+    int err;
+    fd_update_status = open(FILE_UPDATE_STATE,O_RDWR | O_CREAT,0777);
+    if (fd_update_status < 0) {
+        err = errno;
+        RLOGD("+[UA]: Error opening metadata file: %s\n",strerror(errno));
+        return err;
+    }
+    lseek(fd_update_status,0,SEEK_SET);
+    memset(&up_info, 0, sizeof(up_info));
+    read(fd_update_status,(unsigned char *)&up_info,sizeof(up_info));
+    strcpy(tmp, up_info.addr);
+    sync();
+    close(fd_update_status);
+    sync();
+    return 0;
+}
+#endif
+
+#ifdef GSW_FOTA_CFG
 int lynq_fota_set_addr_value(char *value,int size)
 {
     if(size < 64)
@@ -4740,6 +5021,7 @@
     }
     return -1;
 }
+
 /**
  * @brief get the upgrade package address
  * 
@@ -4750,7 +5032,7 @@
 {
 	return lynq_get_value(FOTA_UCI_FILE, FOTA_UCI_MODULE,FOTA_UCI_ADDR, tmp);
 }
-
+#endif
 /**
  * @brief The following is the wake up
  * start
diff --git a/src/lynq/lib/liblynq-gnss/include/lynq_gnss.h b/src/lynq/lib/liblynq-gnss/include/lynq_gnss.h
index e7e3816..362baaf 100755
--- a/src/lynq/lib/liblynq-gnss/include/lynq_gnss.h
+++ b/src/lynq/lib/liblynq-gnss/include/lynq_gnss.h
@@ -78,6 +78,10 @@
     gnss_measurement_ext_callback lynq_measurement_callback;
 }lynq_raw_gnss_cbs;
 
+typedef void ( *lynq_atsvc_incb )(const char *input,const int length);
+typedef void ( *lynq_atsvc_outcb )(char *output,int out_size,int type);
+lynq_atsvc_incb lynq_register_gnss(lynq_atsvc_outcb out_cb);
+lynq_atsvc_outcb atsvc_gnss_outcb;
 
 int lynq_gnss_init(void);
 
@@ -107,6 +111,10 @@
 
 int lynq_gnss_output_frequency_set(int frequency);
 
+int lynq_agps_set_enabled(LYNQ_CONF_SWITCH agps_status);
+
+int lynq_agps_get_enabled_status(int *status);
+
 #ifdef __cplusplus
 }
 #endif
diff --git a/src/lynq/lib/liblynq-gnss/makefile b/src/lynq/lib/liblynq-gnss/makefile
index 4d7cc72..f1ca7fc 100755
--- a/src/lynq/lib/liblynq-gnss/makefile
+++ b/src/lynq/lib/liblynq-gnss/makefile
@@ -15,7 +15,6 @@
   -std=c++11 \
 
 LOCAL_PATH = .
-$(warning ################# ZHOUQUNCHAO LOCAL_PATH:$(LOCAL_PATH),ROOT: $(ROOT),includedir:$(includedir),libdir:$(libdir))
 
 LOCAL_C_INCLUDES = \
     -I$(LOCAL_PATH)/include \
diff --git a/src/lynq/lib/liblynq-gnss/src/lynq_agps.c b/src/lynq/lib/liblynq-gnss/src/lynq_agps.c
new file mode 100644
index 0000000..762e36c
--- /dev/null
+++ b/src/lynq/lib/liblynq-gnss/src/lynq_agps.c
@@ -0,0 +1,509 @@
+#include <stdio.h>
+#include <sys/socket.h>
+#include <string.h>
+#include <stdlib.h>
+#include <errno.h>
+#include <netinet/in.h>
+#include <sys/un.h>
+#include <log/log.h>
+
+
+#include "lynq_gnss.h"
+#include "lynq_agps.h"
+
+#define LOG_TAG "LYNQ_AGPS"
+
+
+// -1 means failure
+int do_socket_connect(const char* path)
+{
+    struct sockaddr_un addr;
+    int fd = socket(PF_LOCAL, SOCK_STREAM, 0);
+    if(fd < 0) {
+        RLOGD("socket() failed fd=%d\n", fd);
+        return -1;
+    }
+
+    memset(&addr, 0, sizeof(addr));
+    addr.sun_path[0] = 0;
+    memcpy(addr.sun_path + 1, path, strlen(path));
+    addr.sun_family = AF_UNIX;
+
+    if (connect(fd, (struct sockaddr *)&addr, sizeof(addr)) < 0) {
+        RLOGD("connect failed reason=[%s] path=[%s]\n", strerror(errno), path);
+        close(fd);
+        return -1;
+    }
+
+    return fd;
+}
+
+//get
+char get_byte(char* buff, int* offset)
+{
+    char ret = buff[*offset];
+    *offset += 1;
+    return ret;
+}
+
+short get_short(char* buff, int* offset)
+{
+    short ret = 0;
+    ret |= get_byte(buff, offset) & 0xff;
+    ret |= (get_byte(buff, offset) << 8);
+    return ret;
+}
+
+int get_int(char* buff, int* offset)
+{
+    int ret = 0;
+    ret |= get_short(buff, offset) & 0xffff;
+    ret |= (get_short(buff, offset) << 16);
+    return ret;
+}
+
+int socket_connect() {
+    return do_socket_connect("agpsd2");
+}
+
+//-1 means failure
+static int safe_write(int fd, void* buf, int len)
+{
+    int n, retry = 10;
+
+    if(fd < 0 || buf == NULL || len < 0) {
+        RLOGD("safe_write fd=%d buf=%p len=%d\n", fd, buf, len);
+        return -1;
+    }
+
+    while((n = write(fd, buf, len)) != len) {
+        if(errno == EINTR) continue;
+        if(errno == EAGAIN) {
+            if(retry-- > 0) {
+                usleep(100 * 1000);
+                continue;
+            }
+            goto exit;
+        }
+        goto exit;
+    }
+    return n;
+exit:
+    RLOGD("safe_write reason=[%s]%d\n", strerror(errno), errno);
+    return -1;
+}
+
+//-1 means failure
+static int safe_read(int fd, void* buf, int len)
+{
+    int n, retry = 10;
+
+    if(fd < 0 || buf == NULL || len < 0)
+    {
+        RLOGD("safe_read fd=%d buf=%p len=%d\n", fd, buf, len);
+        return -1;
+    }
+
+    if(len == 0)
+    {
+        return 0;
+    }
+
+    while((n = read(fd, buf, len)) < 0)
+    {
+        if(errno == EINTR) 
+        {
+            RLOGD("safe read interrupt");
+            continue;
+        }
+        if(errno == EAGAIN)
+        {
+            if(retry-- > 0)
+            {
+                usleep(100 * 1000);
+                continue;
+            }
+            goto exit;
+        }
+        goto exit;
+    }
+    return n;
+
+exit:
+    if(errno != EAGAIN)
+    {
+        RLOGD("safe_read reason=[%s] fd=%d len=%d buf=%p\n",
+            strerror(errno), fd, len, buf);
+    }
+    return -1;
+}
+
+static char socket_get_byte(int fd)
+{
+    int read_len = 0;
+    char buff[1] = {0};
+    int offset = 0;
+
+    read_len = safe_read(fd, buff, sizeof(buff));
+    if(read_len != sizeof(buff))
+    {
+        RLOGD("socket_get_byte read_len=%d\n", read_len);
+    }
+    return get_byte(buff, &offset);
+}
+
+static int socket_get_int(int fd)
+{
+    int read_len = 0;
+    char buff[4] = {0};
+    int offset = 0;
+
+    read_len = safe_read(fd, buff, sizeof(buff));
+    if(read_len != sizeof(buff))
+    {
+        RLOGD("socket_get_int read_len=%d\n", read_len);
+    }
+    return get_int(buff, &offset);
+}
+
+static char* socket_get_string(int fd, char* buff, int buff_len)
+{
+    int read_len = 0;
+
+    char ret = socket_get_byte(fd);
+    if(ret == 0)
+    {
+        return NULL;
+    }
+    else
+    {
+        int len = socket_get_int(fd);
+        if(len > buff_len)
+        {
+            RLOGD("socket_get_string your buff len=%d is too small, need len=%d\n",
+                buff_len, len);
+            return NULL;
+        }
+
+        read_len = safe_read(fd, buff, len);
+        if(read_len != len)
+        {
+            RLOGD("socket_get_string read_len=%d len=%d\n", read_len, len);
+            return NULL;
+        }
+
+        return buff;
+    }
+}
+
+
+static int socket_get_binary(int fd, char* buff)
+{
+    int read_len = 0;
+
+    int len = socket_get_int(fd);
+    if(len > 0)
+    {
+        read_len = safe_read(fd, buff, len);
+        if(read_len != len)
+        {
+            RLOGD("socket_get_binary read_len=%d len=%d\n", read_len, len);
+            return 0;
+        }
+    }
+    return len;
+}
+
+void put_byte(char* buff, int* offset, const char input)
+{
+    *((char*)&buff[*offset]) = input;
+    *offset += 1;
+}
+
+void put_short(char* buff, int* offset, const short input)
+{
+    put_byte(buff, offset, input & 0xff);
+    put_byte(buff, offset, (input >> 8) & 0xff);
+}
+
+void put_int(char* buff, int* offset, const int input)
+{
+    put_short(buff, offset, input & 0xffff);
+    put_short(buff, offset, (input >> 16) & 0xffff);
+}
+
+int set_template_1(app_mgr_cmd_enum cmd,char data)
+{
+    char buff[MAX_BUFF_SIZE] = {0};
+    int offset = 0;
+    int fd = 0;
+
+    fd = socket_connect();
+    if(fd < 0)
+    {
+        RLOGD("Socket connect fail");
+        return -1;
+    }
+    RLOGD("Set template start fd:%d cmd:%d data:%d",fd,cmd,data);
+    // write
+    put_int(buff, &offset, cmd);
+    put_byte(buff, &offset, data);
+    if(safe_write(fd, buff, offset) == -1)
+    {
+        RLOGD("set_template_1 Safe write fail");
+        close(fd);
+        return -1;
+    }
+
+    // read ACK
+    socket_get_byte(fd);
+
+    close(fd);
+    return 0;
+}
+
+int get_template_agps_config(app_mgr_cmd_enum cmd,agps_intf_agps_config *config)
+{
+    char buff[MAX_BUFF_SIZE] = {0};
+    int offset = 0;
+    int fd = 0;
+
+    fd = socket_connect();
+    if(fd < 0)
+    {
+        RLOGD("Socket connect fail");
+        return -1;
+    }
+    RLOGD("get_template_agps_config start fd:%d cmd:%d",fd,cmd);
+
+    // write
+    put_int(buff, &offset, cmd);
+    if(safe_write(fd, buff, offset) == -1)
+    {
+        RLOGD("get_template_agps_config Safe write fail");
+        close(fd);
+        return -1;
+    }
+
+    // read
+    config->agps_setting.agps_enable = socket_get_byte(fd);
+    config->agps_setting.agps_protocol = socket_get_int(fd);
+    config->agps_setting.gpevt = socket_get_byte(fd);
+
+    config->cp_setting.molr_pos_method = socket_get_int(fd);
+    config->cp_setting.external_addr_enable = socket_get_byte(fd);
+    socket_get_string(fd, config->cp_setting.external_addr, sizeof(config->cp_setting.external_addr));
+    config->cp_setting.mlc_number_enable = socket_get_byte(fd);
+    socket_get_string(fd, config->cp_setting.mlc_number, sizeof(config->cp_setting.mlc_number));
+    config->cp_setting.cp_auto_reset = socket_get_byte(fd);
+    config->cp_setting.epc_molr_lpp_payload_enable = socket_get_byte(fd);
+    config->cp_setting.epc_molr_lpp_payload_len =
+        socket_get_binary(fd, config->cp_setting.epc_molr_lpp_payload);
+
+    config->up_setting.ca_enable = socket_get_byte(fd);
+    config->up_setting.ni_request = socket_get_byte(fd);
+    config->up_setting.roaming = socket_get_byte(fd);
+    config->up_setting.cdma_preferred = socket_get_int(fd);
+    config->up_setting.pref_method = socket_get_int(fd);
+    config->up_setting.supl_version = socket_get_int(fd);
+    config->up_setting.tls_version = socket_get_int(fd);
+    config->up_setting.supl_log = socket_get_byte(fd);
+    config->up_setting.msa_enable = socket_get_byte(fd);
+    config->up_setting.msb_enable = socket_get_byte(fd);
+    config->up_setting.ecid_enable = socket_get_byte(fd);
+    config->up_setting.otdoa_enable = socket_get_byte(fd);
+    config->up_setting.qop_hacc = socket_get_int(fd);
+    config->up_setting.qop_vacc = socket_get_int(fd);
+    config->up_setting.qop_loc_age = socket_get_int(fd);
+    config->up_setting.qop_delay = socket_get_int(fd);
+    config->up_setting.lpp_enable = socket_get_byte(fd);
+    config->up_setting.cert_from_sdcard = socket_get_byte(fd);
+    if(cmd >= APP_MGR_CMD_GET_CONFIG_V14)
+    {
+        config->up_setting.auto_profile_enable = socket_get_byte(fd);
+        config->up_setting.ut2 = socket_get_byte(fd);
+        config->up_setting.ut3 = socket_get_byte(fd);
+        config->up_setting.apn_enable = socket_get_byte(fd);
+        config->up_setting.sync_to_slp = socket_get_byte(fd);
+        config->up_setting.udp_enable = socket_get_byte(fd);
+        config->up_setting.autonomous_enable = socket_get_byte(fd);
+        config->up_setting.aflt_enable = socket_get_byte(fd);
+        config->up_setting.imsi_enable = socket_get_byte(fd);
+
+        config->gnss_setting.sib8_sib16_enable = socket_get_byte(fd);
+        config->gnss_setting.gps_satellite_enable = socket_get_byte(fd);
+        config->gnss_setting.glonass_satellite_enable = socket_get_byte(fd);
+        config->gnss_setting.beidou_satellite_enable = socket_get_byte(fd);
+        config->gnss_setting.galileo_satellite_enable = socket_get_byte(fd);
+        config->gnss_setting.gps_satellite_support = socket_get_byte(fd);
+        config->gnss_setting.glonass_satellite_support = socket_get_byte(fd);
+        config->gnss_setting.beidou_satellite_support = socket_get_byte(fd);
+        config->gnss_setting.galileo_satellite_support = socket_get_byte(fd);
+
+        config->up_setting.supl_ver_minor = socket_get_byte(fd);
+        config->up_setting.supl_ver_ser_ind = socket_get_byte(fd);
+
+        config->gnss_setting.a_glonass_satellite_enable = socket_get_byte(fd);
+    }
+
+    socket_get_string(fd, config->cur_supl_profile.name, sizeof(config->cur_supl_profile.name));
+    socket_get_string(fd, config->cur_supl_profile.addr, sizeof(config->cur_supl_profile.addr));
+    config->cur_supl_profile.port = socket_get_int(fd);
+    config->cur_supl_profile.tls = socket_get_byte(fd);
+    socket_get_string(fd, config->cur_supl_profile.mcc_mnc, sizeof(config->cur_supl_profile.mcc_mnc));
+    socket_get_string(fd, config->cur_supl_profile.app_id, sizeof(config->cur_supl_profile.app_id));
+    socket_get_string(fd, config->cur_supl_profile.provider_id, sizeof(config->cur_supl_profile.provider_id));
+    socket_get_string(fd, config->cur_supl_profile.default_apn, sizeof(config->cur_supl_profile.default_apn));
+    socket_get_string(fd, config->cur_supl_profile.optional_apn, sizeof(config->cur_supl_profile.optional_apn));
+    socket_get_string(fd, config->cur_supl_profile.optional_apn_2, sizeof(config->cur_supl_profile.optional_apn_2));
+    socket_get_string(fd, config->cur_supl_profile.address_type, sizeof(config->cur_supl_profile.address_type));
+
+    if(cmd >= APP_MGR_CMD_GET_CONFIG_V14)
+    {
+        socket_get_string(fd, config->cdma_profile.name, sizeof(config->cdma_profile.name));
+        config->cdma_profile.mcp_enable = socket_get_byte(fd);;
+        socket_get_string(fd, config->cdma_profile.mcp_addr, sizeof(config->cdma_profile.mcp_addr));
+        config->cdma_profile.mcp_port = socket_get_int(fd);;
+        config->cdma_profile.pde_addr_valid = socket_get_byte(fd);;
+        config->cdma_profile.pde_ip_type = socket_get_int(fd);;
+        socket_get_string(fd, config->cdma_profile.pde_addr, sizeof(config->cdma_profile.pde_addr));
+        config->cdma_profile.pde_port = socket_get_int(fd);;
+        config->cdma_profile.pde_url_valid = socket_get_byte(fd);;
+        socket_get_string(fd, config->cdma_profile.pde_url_addr, sizeof(config->cdma_profile.pde_url_addr));
+    }
+
+    if(cmd >= APP_MGR_CMD_GET_CONFIG_V20)
+    {
+        //V15
+        config->agps_setting.e911_gps_icon_enable = socket_get_byte(fd);
+        //V16
+        config->agps_setting.e911_open_gps = socket_get_byte(fd);
+        //V17
+        config->gnss_setting.a_gps_satellite_enable = socket_get_byte(fd);
+        config->gnss_setting.a_beidou_satellite_enable = socket_get_byte(fd);
+        config->gnss_setting.a_galileo_satellite_enable = socket_get_byte(fd);
+        //V18
+        config->up_setting.sha_version = socket_get_int(fd);
+        config->up_setting.preferred_2g3g_cell_age = socket_get_int(fd);
+        config->up_setting.ut1 = socket_get_byte(fd);
+        config->up_setting.no_sensitive_log = socket_get_byte(fd);
+        config->up_setting.tls_reuse_enable = socket_get_byte(fd);
+        config->up_setting.imsi_cache_enable = socket_get_byte(fd);
+        config->up_setting.supl_raw_data_enable = socket_get_byte(fd);
+        config->up_setting.tc10_enable = socket_get_byte(fd);
+        config->up_setting.tc10_use_apn = socket_get_byte(fd);
+        config->up_setting.tc10_use_fw_dns = socket_get_byte(fd);
+        config->up_setting.allow_ni_for_gps_off = socket_get_byte(fd);
+        config->up_setting.force_otdoa_assist_req = socket_get_byte(fd);
+        config->cp_setting.reject_non911_nilr_enable = socket_get_byte(fd);
+        config->cp_setting.cp_2g_disable = socket_get_byte(fd);
+        config->cp_setting.cp_3g_disable = socket_get_byte(fd);
+        config->cp_setting.cp_4g_disable = socket_get_byte(fd);
+        config->agps_setting.tc10_ignore_fw_config = socket_get_byte(fd);
+        config->agps_setting.lppe_hide_wifi_bt_status = socket_get_byte(fd);
+        //V19
+        config->agps_setting.lppe_network_location_disable = socket_get_byte(fd);
+        config->cp_setting.cp_lppe_enable = socket_get_byte(fd);
+        config->up_setting.up_lppe_enable = socket_get_byte(fd);
+        //V20
+        config->cp_setting.support_cp_lppe = socket_get_byte(fd);
+        config->gnss_setting.mnl_support_lppe = socket_get_byte(fd);
+    }
+
+    if(cmd >= APP_MGR_CMD_GET_CONFIG_V21)
+    {
+        config->agps_setting.agps_nvram_enable = socket_get_byte(fd);
+        config->agps_setting.lbs_log_enable = socket_get_byte(fd);
+        config->agps_setting.lppe_crowd_source_confident = socket_get_int(fd);
+
+        config->up_setting.esupl_apn_mode = socket_get_int(fd);
+        config->up_setting.tcp_keepalive = socket_get_int(fd);
+        config->up_setting.aosp_profile_enable = socket_get_byte(fd);
+        config->up_setting.bind_nlp_setting_to_supl = socket_get_byte(fd);
+    }
+
+    if(cmd >= APP_MGR_CMD_GET_CONFIG_V22)
+    {
+        config->agps_setting.ignore_si_for_e911 = socket_get_byte(fd);
+        config->cp_setting.cp_lppe_wlan_enable = socket_get_byte(fd);
+        config->cp_setting.cp_lppe_srn_enable = socket_get_byte(fd);
+        config->cp_setting.cp_lppe_sensor_enable = socket_get_byte(fd);
+        config->cp_setting.cp_lppe_dbh_enable = socket_get_byte(fd);
+
+        config->up_setting.up_lppe_wlan_enable = socket_get_byte(fd);
+        config->up_setting.up_lppe_srn_enable = socket_get_byte(fd);
+        config->up_setting.up_lppe_sensor_enable = socket_get_byte(fd);
+        config->up_setting.up_lppe_dbh_enable = socket_get_byte(fd);
+        config->up_setting.ip_version_prefer = socket_get_int(fd);
+        config->up_setting.up_lppe_in_2g3g_disable = socket_get_byte(fd);
+        config->up_setting.up_rrlp_in_4g_disable = socket_get_byte(fd);
+        config->up_setting.up_si_disable = socket_get_byte(fd);
+    }
+
+    if(cmd >= APP_MGR_CMD_GET_CONFIG_V23)
+    {
+        config->up_setting.use_ni_slp = socket_get_byte(fd);
+        config->agps_setting.use_tc10_config = socket_get_byte(fd);
+        config->agps_setting.lppe_def_nlp_enable = socket_get_byte(fd);
+    }
+
+    if(cmd >= APP_MGR_CMD_GET_CONFIG_V24)
+    {
+        config->agps_setting.emergency_ext_secs = socket_get_int(fd);
+        config->up_setting.aosp_pos_mode_enable = socket_get_byte(fd);
+        config->up_setting.privacy_override_mode = socket_get_int(fd);
+    }
+
+    config->valid = 1;
+    // read ACK
+    socket_get_byte(fd);
+    RLOGD("Socket read ACK sucess, close fd");
+    close(fd);
+    return 0;
+}
+
+int agps_get_total_status(agps_intf_agps_config *config)
+{
+    if (NULL == config)
+    {
+        RLOGD("agps_get_total_status incoming paramter error");
+    }
+    int res = 0;
+    res = get_template_agps_config(APP_MGR_CMD_GET_CONFIG_V24,config);
+    return res;
+}
+
+
+int lynq_agps_set_enabled(LYNQ_CONF_SWITCH agps_status)
+{
+    int ret = -1;
+
+    ret = set_template_1(APP_MGR_CMD_SET_AGPS_ENABLE,agps_status);
+    if (ret != 0)
+    {   
+        RLOGD("set AGPS error ret = %d",ret);
+        return ret;
+    }
+    return ret;
+}
+
+int lynq_agps_get_enabled_status(int *status)
+{
+    int ret = 0;
+    if (NULL == status)
+    {
+        RLOGD("incoming paramter error");
+        return -1;
+    }
+
+    agps_intf_agps_config config;
+    memset(&config, 0, sizeof(config));
+    ret = agps_get_total_status(&config);
+    if (ret != 0)
+    {
+        RLOGD("agps get status fail");
+        return ret;
+    }
+    *status = config.agps_setting.agps_enable;
+    return ret;
+}
\ No newline at end of file
diff --git a/src/lynq/lib/liblynq-gnss/src/lynq_agps.h b/src/lynq/lib/liblynq-gnss/src/lynq_agps.h
new file mode 100644
index 0000000..f3da3d3
--- /dev/null
+++ b/src/lynq/lib/liblynq-gnss/src/lynq_agps.h
@@ -0,0 +1,393 @@
+#ifndef LYNQ_AGPS_H
+#define LYNQ_AGPS_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+/*Copy for agps_interface.h*/
+#define agps_bool char
+
+#define MAX_BUFF_SIZE 8192
+#define SUPL_PROFILES_NUM 30
+
+#define AGPS_INTF_STRING_LEN 64
+#define AGPS_SUPL_ADDR_LEN 128
+#define MNL_MCC_STRING_LEN 16
+#define EXTERNAL_ADD_LEN 20
+#define MLC_NUMBER_LEN 20
+#define EPC_MOLR_LPP_PAYLOAD_LEN 300
+#define SUPL_PROFILES_NUM 30
+#define PROFILING_MESSAGE_LEN 64
+#define PROFILING_ELEMENT_NUM 20
+
+typedef enum {
+    // Command Enum APP -> AGPSD
+    APP_MGR_CMD_CODER_TEST = 0,
+    APP_MGR_CMD_VERSION = 1,
+
+    APP_MGR_CMD_GET_CONFIG = 100,    //AgpsConfig
+    APP_MGR_CMD_GET_OMA_CP_SUPL_PROFILE = 101,
+    APP_MGR_CMD_GET_SYSTEM_PROPERTY = 102,
+    APP_MGR_CMD_GET_AGPS_PROFILING = 103,
+    APP_MGR_CMD_GET_EMULATOR_MODE = 104,
+    APP_MGR_CMD_GET_CONFIG_V2 = 105,
+    APP_MGR_CMD_GET_CONFIG_V3 = 106,    // add cert_from_sdcard
+    APP_MGR_CMD_GET_CONFIG_V14 = 117,
+    APP_MGR_CMD_GET_CONFIG_V20 = 123,
+    APP_MGR_CMD_GET_CONFIG_V21 = 124,
+    APP_MGR_CMD_GET_CONFIG_V22 = 125,
+    APP_MGR_CMD_GET_CONFIG_V23 = 126,
+    APP_MGR_CMD_GET_CONFIG_V24 = 127,
+
+    APP_MGR_CMD_SET_AGPS_ENABLE = 200,
+    APP_MGR_CMD_SET_PROTOCOL,
+    APP_MGR_CMD_SET_CDMA_PREF,
+    APP_MGR_CMD_SET_UP_PREF_METHOD,
+    APP_MGR_CMD_SET_POS_TECHNOLOGY_MSA,
+    APP_MGR_CMD_SET_POS_TECHNOLOGY_MSB,
+    APP_MGR_CMD_SET_POS_TECHNOLOGY_ECID,
+    APP_MGR_CMD_SET_POS_TECHNOLOGY_OTDOA,
+    APP_MGR_CMD_SET_SUPL_VERSION,
+    APP_MGR_CMD_SET_SUPL_PROFILE,    //AgpsProfil
+    APP_MGR_CMD_SET_QOP = 210,            //AgpsQoP
+    APP_MGR_CMD_SET_MOLR_POS_METHDO,
+    APP_MGR_CMD_SET_EXTERNAL_ADDR,
+    APP_MGR_CMD_SET_MLC_NUMBER,
+    APP_MGR_CMD_SET_CP_AUTO_RESET,
+    APP_MGR_CMD_SET_ALLOW_NI,
+    APP_MGR_CMD_SET_ALLOW_ROAMING,
+    APP_MGR_CMD_SET_SUPL_2_FILE,
+    APP_MGR_CMD_SET_RESET_TO_DEFAULT,
+    APP_MGR_CMD_SET_OMA_CP_SUPL_PROFILE,
+    APP_MGR_CMD_SET_NI_REQ = 220,  //un-implemented for test
+    APP_MGR_CMD_SET_EPC_MOLR_PDU_ENABLE,
+    APP_MGR_CMD_SET_EPC_MOLR_PDU,
+    APP_MGR_CMD_SET_TLS_VERSION,
+    APP_MGR_CMD_SET_CA_ENABLE,
+    APP_MGR_CMD_SET_UDP_ENABLE,
+    APP_MGR_CMD_SET_LPP_ENABLE,
+    APP_MGR_CMD_SET_CERT_FROM_SDCARD_ENABLE,
+    APP_MGR_CMD_SET_AUTO_PROFILE_ENABLE,
+    APP_MGR_CMD_SET_UT2,
+    APP_MGR_CMD_SET_UT3 = 230,
+    APP_MGR_CMD_SET_SUPL_APN_ENABLE,
+    APP_MGR_CMD_SET_SYNC_TO_SLP,
+    APP_MGR_CMD_SET_UDP_ENABLE_V2,
+    APP_MGR_CMD_SET_AUTONOMOUS_ENABLE,
+    APP_MGR_CMD_SET_AFLT_ENABLE,
+    APP_MGR_CMD_SET_IMSI_ENABLE,
+    APP_MGR_CMD_SET_SIB8_16_ENABLE,
+    APP_MGR_CMD_SET_GPS_ENABLE,
+    APP_MGR_CMD_SET_GLONASS_ENABLE,
+    APP_MGR_CMD_SET_BEIDOU_ENABLE = 240,
+    APP_MGR_CMD_SET_GALILEO_ENABLE,
+    APP_MGR_CMD_SET_SUPL_SHA_VERSION,
+    APP_MGR_CMD_SET_SUPL_TLS_VERSION,
+    APP_MGR_CMD_SET_SUPL_VER_MINOR,
+    APP_MGR_CMD_SET_SUPL_VER_SER_IND,
+    APP_MGR_CMD_SET_A_GLONASS_ENABLE,
+    APP_MGR_CMD_SET_PDE_PROFILE,
+    APP_MGR_CMD_SET_E911_GPS_ICON_ENABLE,
+    APP_MGR_CMD_SET_E911_OPEN_GPS_ENABLE,
+    APP_MGR_CMD_SET_A_GPS_ENABLE = 250,
+    APP_MGR_CMD_SET_A_BEIDOU_ENABLE,
+    APP_MGR_CMD_SET_A_GALILEO_ENABLE,
+    APP_MGR_CMD_SET_PREF_2G3G_CELL_AGE,
+    APP_MGR_CMD_SET_UT1,
+    APP_MGR_CMD_SET_NO_SENSITIVE_LOG,
+    APP_MGR_CMD_SET_TLS_REUSE_ENABLE,
+    APP_MGR_CMD_SET_IMSI_CACHE_ENABLE,
+    APP_MGR_CMD_SET_SUPL_RAW_DATA_ENABLE,
+    APP_MGR_CMD_SET_TC10_ENABLE,
+    APP_MGR_CMD_SET_TC10_USE_APN = 260,
+    APP_MGR_CMD_SET_TC10_USE_FW_DNS,
+    APP_MGR_CMD_SET_ALLOW_NI_FOR_GPS_OFF,
+    APP_MGR_CMD_SET_FORCE_OTDOA_ASSIST_REQ,
+    APP_MGR_CMD_SET_REJECT_NON911_NILR_ENABLE,
+    APP_MGR_CMD_SET_CP_2G_DISABLE,
+    APP_MGR_CMD_SET_CP_3G_DISABLE,
+    APP_MGR_CMD_SET_CP_4G_DISABLE,
+    APP_MGR_CMD_SET_TC10_IGNORE_FW_CONFIG,
+    APP_MGR_CMD_SET_LPPE_HIDE_WIFI_BT_STATUS,
+    APP_MGR_CMD_SET_LPPE_NETWORK_LOCATION_DISABLE = 270,
+    APP_MGR_CMD_SET_LPPE_CP_ENABLE,
+    APP_MGR_CMD_SET_LPPE_UP_ENABLE,
+    APP_MGR_CMD_SET_VZW_DEBUG_SCREEN_ENABLE,
+    APP_MGR_CMD_SET_AOSP_PROFILE_ENABLE,
+    APP_MGR_CMD_SET_BIND_NLP_SETTING_TO_SUPL,
+    APP_MGR_CMD_SET_ESUPL_APN_MODE,
+    APP_MGR_CMD_SET_TCP_KEEPALIVE,
+    APP_MGR_CMD_SET_AGPS_NVRAM_ENABLE,
+    APP_MGR_CMD_SET_LBS_LOG_ENABLE,
+    APP_MGR_CMD_SET_LPPE_CROWD_SOURCE_CONFIDENT = 280,
+    APP_MGR_CMD_SET_IGNORE_SI_FOR_E911,
+    APP_MGR_CMD_SET_LPPE_CP_WLAN_ENABLE,
+    APP_MGR_CMD_SET_LPPE_CP_SRN_ENABLE,
+    APP_MGR_CMD_SET_LPPE_CP_SENSOR_ENABLE,
+    APP_MGR_CMD_SET_LPPE_CP_DBH_ENABLE,
+    APP_MGR_CMD_SET_LPPE_UP_WLAN_ENABLE,
+    APP_MGR_CMD_SET_LPPE_UP_SRN_ENABLE,
+    APP_MGR_CMD_SET_LPPE_UP_SENSOR_ENABLE,
+    APP_MGR_CMD_SET_LPPE_UP_DBH_ENABLE,
+    APP_MGR_CMD_SET_IP_VERSION_PREFER = 290,
+    APP_MGR_CMD_SET_UP_LPP_IN_2G3G_DISABLE,
+    APP_MGR_CMD_SET_UP_RRLP_IN_4G_DISABLE,
+    APP_MGR_CMD_UP_SI_DISABLE,
+
+    // To implement
+    APP_MGR_CMD_SET_USE_NI_SLP,
+    APP_MGR_CMD_SET_USE_TC10_CONFIG,
+    APP_MGR_CMD_SET_LPPE_DEF_NLP_ENABLE,
+    APP_MGR_CMD_SET_AOSP_POS_MODE_ENABLE,
+    APP_MGR_CMD_SET_PRIVACY_OVERRIDE_MODE,
+    APP_MGR_CMD_SET_EMERGENCY_EXT_SECS, // 299
+
+
+    APP_MGR_CMD_START_PERIODIC = 300,
+    APP_MGR_CMD_ABORT_PERIODIC,
+    APP_MGR_CMD_START_AREA_EVENT,
+    APP_MGR_CMD_ABORT_AREA_EVENT,
+
+    APP_MGR_CMD_START_TEST_CASE = 400,
+    APP_MGR_CMD_START_TEST_BUTTON,
+    APP_MGR_CMD_START_RESET_AGPSD,
+    APP_MGR_CMD_START_EMULATOR_MODE,
+
+
+    // To implement
+    APP_MGR_CMD_SET_TC10_SUPL_SSL_METHOD = 500,
+    APP_MGR_CMD_SET_TC10_AUTO_SUPL_VER_FOR_NI,
+    APP_MGR_CMD_SET_TC10_SUPL_VER_SKT_NI,
+    APP_MGR_CMD_SET_TC10_USE_APN_NI,
+    APP_MGR_CMD_SET_TC10_USE_APN_SI,
+    APP_MGR_CMD_SET_CP_PRIVACY_OVERRIDE,
+    APP_MGR_CMD_SET_SUPL_ADDR_NI,
+    APP_MGR_CMD_SET_RRLP_GOOGLE_SUPL,
+    APP_MGR_CMD_SET_SUPL2_CAP_EXT_DISABLE,
+    APP_MGR_CMD_SET_NI_STATISTIC_ENABLE,
+    APP_MGR_CMD_SET_UP_OPERATION_MODE,  // 510
+    APP_MGR_CMD_SET_GLONASS_MSA_ENABLE,
+    APP_MGR_CMD_SET_GLONASS_MSB_ENABLE,
+    APP_MGR_CMD_SET_BEIDOU_MSA_ENABLE,
+    APP_MGR_CMD_SET_BEIDOU_MSB_ENABLE,
+    APP_MGR_CMD_SET_GALILEO_MSA_ENABLE,
+    APP_MGR_CMD_SET_GALILEO_MSB_ENABLE,
+    APP_MGR_CMD_SET_TC10_AUTO_SUPL_VER_FOR_ENI,
+    APP_MGR_CMD_SET_TC10_CP_LPP_GUARD_TIME_SEC,
+    APP_MGR_CMD_SET_TC10_CP_CAPABILITY_VALID_ENABLE,
+    APP_MGR_CMD_SET_TC10_CP_CAPABILITY_ENABLE, // 520
+    APP_MGR_CMD_SET_IGNORE_EMERGENCY_EXT_SECS_FROM_FRAMEWORK,
+    APP_MGR_CMD_GET_AGPSD_VERSION,
+    APP_MGR_CMD_GET_IMSI,
+} app_mgr_cmd_enum;
+
+typedef enum {
+    AGPS_INTF_PDE_IP_TYPE_IPV4 = 0,
+    AGPS_INTF_PDE_IP_TYPE_IPV6 = 1,
+} agps_intf_pde_ip_type;
+
+typedef enum {
+    AGPS_INTF_CDMA_PREFERRED_WCDMA = 0,
+    AGPS_INTF_CDMA_PREFERRED_CDMA = 1,
+    AGPS_INTF_CDMA_PREFERRED_CDMA_FORCE = 2,
+} agps_intf_cdma_preferred;
+
+typedef enum {
+    AGPS_INTF_PREF_METHOD_MSA = 0,
+    AGPS_INTF_PREF_METHOD_MSB = 1,
+    AGPS_INTF_PREF_METHOD_NO_PREF = 2,
+} agps_intf_pref_method;
+
+typedef enum {
+    AGPS_INTF_AGPS_PROTOCOL_UP = 0,
+    AGPS_INTF_AGPS_PROTOCOL_CP = 1,
+} agps_intf_agps_protocol;
+
+typedef enum {
+    AGPS_INTF_SUPL_VERSION_1 = 1,
+    AGPS_INTF_SUPL_VERSION_2 = 2,
+} agps_intf_supl_version;
+
+typedef enum {
+    AGPS_INTF_TLS_VERSION_1_0 = 0,
+    AGPS_INTF_TLS_VERSION_1_1 = 1,
+    AGPS_INTF_TLS_VERSION_1_2 = 2,
+} agps_intf_tls_version;
+
+typedef enum {
+    AGPS_INTF_ESUPL_APN_EIMS_IMS = 0,
+    AGPS_INTF_ESUPL_APN_EIMS = 1,
+    AGPS_INTF_ESUPL_APN_IMS = 2,
+    AGPS_INTF_ESUPL_APN_AS_NORMAL = 3,
+} agps_intf_esupl_apn;
+
+typedef enum {
+    AGPS_INTF_MOLR_POS_METHOD_LOC_EST = 0,
+    AGPS_INTF_MOLR_POS_METHOD_ASSIST_DATA = 1,
+} agps_intf_molr_pos_method;
+
+typedef struct {
+    char name[AGPS_INTF_STRING_LEN];
+    char addr[AGPS_SUPL_ADDR_LEN];
+    int port;
+    agps_bool tls;
+    char mcc_mnc[MNL_MCC_STRING_LEN];
+    char app_id[AGPS_INTF_STRING_LEN];
+    char provider_id[AGPS_INTF_STRING_LEN];
+    char default_apn[AGPS_INTF_STRING_LEN];
+    char optional_apn[AGPS_INTF_STRING_LEN];
+    char optional_apn_2[AGPS_INTF_STRING_LEN];
+    char address_type[AGPS_INTF_STRING_LEN];
+} agps_intf_supl_profile;
+
+typedef struct {
+    char name[AGPS_INTF_STRING_LEN];
+    agps_bool mcp_enable;
+    char mcp_addr[AGPS_INTF_STRING_LEN];
+    int mcp_port;
+    agps_bool pde_addr_valid;
+    agps_intf_pde_ip_type pde_ip_type;    //0=IPV4 1=IPV6
+    char pde_addr[AGPS_INTF_STRING_LEN];
+    int pde_port;
+    agps_bool pde_url_valid;
+    char pde_url_addr[AGPS_INTF_STRING_LEN];
+} agps_intf_cdma_profile;
+
+typedef struct {
+    agps_bool agps_enable;
+    agps_intf_agps_protocol agps_protocol;
+    agps_bool gpevt;
+    agps_bool e911_gps_icon_enable;
+    agps_bool e911_open_gps;
+    agps_bool tc10_ignore_fw_config;
+    agps_bool lppe_hide_wifi_bt_status;
+    agps_bool lppe_network_location_disable;
+    agps_bool agps_nvram_enable;
+    agps_bool lbs_log_enable;
+    int lppe_crowd_source_confident;
+    agps_bool ignore_si_for_e911; // North America operator 'V' asks us to ignore SI triggered by GMS
+    agps_bool use_tc10_config;
+    agps_bool lppe_def_nlp_enable;
+    int emergency_ext_secs;
+} agps_intf_agps_setting;
+
+typedef struct {
+    agps_intf_molr_pos_method molr_pos_method;
+    agps_bool external_addr_enable;
+    char external_addr[EXTERNAL_ADD_LEN];
+    agps_bool mlc_number_enable;
+    char mlc_number[MLC_NUMBER_LEN];
+    agps_bool cp_auto_reset;
+    agps_bool epc_molr_lpp_payload_enable;
+    int epc_molr_lpp_payload_len;
+    char epc_molr_lpp_payload[EPC_MOLR_LPP_PAYLOAD_LEN];
+    agps_bool cp_lppe_enable;
+    agps_bool support_cp_lppe;
+    agps_bool reject_non911_nilr_enable;
+    agps_bool cp_2g_disable;
+    agps_bool cp_3g_disable;
+    agps_bool cp_4g_disable;
+    agps_bool cp_lppe_wlan_enable;
+    agps_bool cp_lppe_srn_enable;
+    agps_bool cp_lppe_sensor_enable;
+    agps_bool cp_lppe_dbh_enable;
+} agps_intf_cp_setting;
+
+typedef struct {
+    agps_bool ca_enable;
+    agps_bool ni_request;
+    agps_bool roaming;
+    agps_intf_cdma_preferred cdma_preferred;
+    agps_intf_pref_method pref_method;
+    agps_intf_supl_version supl_version;
+    agps_intf_tls_version tls_version;
+    agps_bool supl_log;
+    agps_bool msa_enable;
+    agps_bool msb_enable;
+    agps_bool ecid_enable;
+    agps_bool otdoa_enable;
+    int qop_hacc;
+    int qop_vacc;
+    int qop_loc_age;
+    int qop_delay;
+    agps_bool lpp_enable;
+    agps_bool cert_from_sdcard;
+    agps_bool auto_profile_enable;
+    char ut2;
+    char ut3;
+    agps_bool apn_enable;
+    agps_bool sync_to_slp;
+    agps_bool udp_enable;
+    agps_bool autonomous_enable;
+    agps_bool aflt_enable;
+    agps_bool imsi_enable;
+    char supl_ver_minor;
+    char supl_ver_ser_ind;
+    int sha_version;    // 0: SHA1 for SUPL1.0 and SHA256 for SUPL2.0, 1: SHA1 for SUPL1.0 and SUPL2.0, 2: SHA256 for SUPL1.0 and SUPL2.0
+    int preferred_2g3g_cell_age;
+    char ut1;
+    agps_bool no_sensitive_log;
+    agps_bool tls_reuse_enable;
+    agps_bool imsi_cache_enable;
+    agps_bool supl_raw_data_enable;
+    agps_bool tc10_enable;
+    agps_bool tc10_use_apn;
+    agps_bool tc10_use_fw_dns;
+    agps_bool allow_ni_for_gps_off;
+    agps_bool force_otdoa_assist_req;
+    agps_bool up_lppe_enable;
+    agps_intf_esupl_apn esupl_apn_mode;
+    int tcp_keepalive;
+    agps_bool aosp_profile_enable;
+    agps_bool bind_nlp_setting_to_supl;
+    agps_bool up_lppe_wlan_enable;
+    agps_bool up_lppe_srn_enable;
+    agps_bool up_lppe_sensor_enable;
+    agps_bool up_lppe_dbh_enable;
+    int ip_version_prefer;            //0=IPv6 prefer   1=IPv4 prefer
+    agps_bool up_lppe_in_2g3g_disable; // For ATT SUPL server
+    agps_bool up_rrlp_in_4g_disable;  // For ATT SUPL server
+    agps_bool up_si_disable;          // For Sprint
+    agps_bool use_ni_slp;             // tc10 (ALPS04423530)
+    agps_bool aosp_pos_mode_enable;
+    int privacy_override_mode;
+} agps_intf_up_setting;
+
+typedef struct {
+    agps_bool sib8_sib16_enable;
+    agps_bool gps_satellite_enable;
+    agps_bool glonass_satellite_enable;
+    agps_bool beidou_satellite_enable;
+    agps_bool galileo_satellite_enable;
+    agps_bool a_glonass_satellite_enable;
+
+    agps_bool gps_satellite_support;
+    agps_bool glonass_satellite_support;
+    agps_bool beidou_satellite_support;
+    agps_bool galileo_satellite_support;
+
+    agps_bool a_gps_satellite_enable;
+    agps_bool a_beidou_satellite_enable;
+    agps_bool a_galileo_satellite_enable;
+
+    agps_bool mnl_support_lppe;
+} agps_intf_gnss_setting;
+
+typedef struct {
+    int supl_profiles_num;
+    agps_intf_supl_profile supl_profiles[SUPL_PROFILES_NUM];
+    agps_intf_supl_profile cur_supl_profile;
+    agps_intf_cdma_profile cdma_profile;
+    agps_intf_agps_setting agps_setting;
+    agps_intf_cp_setting cp_setting;
+    agps_intf_up_setting up_setting;
+    agps_intf_gnss_setting gnss_setting;
+    agps_bool valid;
+} agps_intf_agps_config;
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif
\ No newline at end of file
diff --git a/src/lynq/lib/liblynq-gnss/src/lynq_callback.c b/src/lynq/lib/liblynq-gnss/src/lynq_callback.c
index 09f6d2b..b8a402f 100755
--- a/src/lynq/lib/liblynq-gnss/src/lynq_callback.c
+++ b/src/lynq/lib/liblynq-gnss/src/lynq_callback.c
@@ -141,3 +141,69 @@
 {
     return &lynq_test_raw_callbacks;
 }
+
+
+void lynq_at_gps_location_callback(lynq_GpsLocation_ext* location)
+{
+
+}
+
+void lynq_at_gps_status_callback(GpsStatus* status)
+{
+
+}
+
+#define NMEA_ACC "ACCURACY"
+#define NMEA_GSA "GSA"
+#define NMEA_RMC "RMC"
+#define NMEA_GGA "GGA"
+#define NMEA_VTG "VTG"
+#define NMEA_GSV "GSV"
+
+void lynq_at_gps_nmea_callback(GpsUtcTime timestamp, const char* nmea, int length)
+{
+    if (at_gpsnmea_status == 1)
+    {
+        if(strncmp(nmea+3,NMEA_GSA,strlen(NMEA_GSA))==0 || strncmp(nmea+3,NMEA_RMC,strlen(NMEA_RMC)) == 0 || \
+            strncmp(nmea+3,NMEA_GGA,strlen(NMEA_GGA)) == 0 || strncmp(nmea+3,NMEA_VTG,strlen(NMEA_VTG)) == 0|| \
+            strncmp(nmea+3,NMEA_GSV,strlen(NMEA_GSV)) == 0)
+            {
+                atsvc_gnss_outcb(nmea,strlen(nmea),1);
+            }
+    }
+}
+
+
+
+pthread_t lynq_at_gps_create_thread(const char* name, void (*start)(void *), void* arg)
+{
+    pthread_t at_ntid = 0;
+    int ret = 0;
+
+    ret = pthread_create(&at_ntid, NULL, (void *(*)(void *))start, arg);
+
+    if(ret != 0)
+    {
+        printf("thread %s create fail(%s)!\r\n", name, strerror(errno));
+        at_ntid = 0;
+    }
+    else
+    {
+        printf("tread %s create success!\r\n", name);
+    }
+
+    return at_ntid;
+}
+
+lynq_gnss_cb lynq_at_gnss_callbacks = {
+    .size = sizeof(lynq_gnss_cb),
+    .lynq_location_cb =lynq_at_gps_location_callback,
+    .lynq_status_cb = lynq_at_gps_status_callback,
+    .lynq_nmea_cb = lynq_at_gps_nmea_callback,
+    .lynq_create_thread_cb = lynq_at_gps_create_thread,
+};
+
+lynq_gnss_cb* lynq_at_get__gnss_callbacks(void)
+{
+    return &lynq_at_gnss_callbacks;
+}
diff --git a/src/lynq/lib/liblynq-gnss/src/lynq_gnss.c b/src/lynq/lib/liblynq-gnss/src/lynq_gnss.c
index 12e717e..3565676 100755
--- a/src/lynq/lib/liblynq-gnss/src/lynq_gnss.c
+++ b/src/lynq/lib/liblynq-gnss/src/lynq_gnss.c
@@ -15,6 +15,7 @@
 #include <semaphore.h>
 #include <pthread.h>
 #include <log/log.h>
+#include <stdlib.h>
 
 #include "lynq_gnss.h"
 #include "gpshal.h"
@@ -33,6 +34,7 @@
 GpsCallbacks_ext* turn_cbs = NULL;
 GpsMeasurementCallbacks_ext* raw_cbs = NULL;
 
+lynq_gnss_cb* lynq_at_callbacks = NULL ;
 /**
  * @brief mark gnss initialization state
  * 0: deinit state
@@ -304,3 +306,274 @@
     mnld_write_cfg(LYNQ_OUTPUT_FREQUENCY,freq);
     return 0;
 }
+
+lynq_atsvc_outcb atsvc_gnss_outcb;
+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 at_gps_status = 0;
+int at_gpsnmea_status = 0;
+
+int strUpper(char * str)
+{
+    int i=0;
+    while(1)
+    {
+        if(str[i]=='\0')
+        {
+            break;
+        }
+        if(str[i]>='a'&&str[i]<='z')
+        {
+             str[i]=str[i]-32;
+        }
+        i++;
+    }
+    return 0;      
+}
+
+int gnss_at_cmd_parse(char *cmd,char *parse_cmd[],int* at_type)
+{
+    if (NULL == cmd || NULL == parse_cmd || NULL == at_type)
+    {
+        return -1;
+    }
+    int ret = 0;
+    int at_type_jug = 0;
+    int cmd_size;
+    char cmd_buf[128] = {0};
+    char buffer1[128] = {0};
+    char buffer2[128] = {0};
+    bzero(cmd_buf,128);
+    bzero(buffer1,128);
+    bzero(buffer2,128);
+    cmd_size = strlen(cmd);
+    memcpy(cmd_buf,cmd,cmd_size);
+    strUpper(cmd_buf);
+    ret = sscanf(cmd_buf, "%[^=]=%[^=]", buffer1,buffer2);
+    if (ret == 1)
+    {
+        *at_type = 1;
+        sscanf(buffer1, "%[^?]", buffer2);
+        strcpy(parse_cmd[0],buffer2);
+        return 0;
+    }
+    else if (ret == 2)
+    {
+        at_type_jug = strcmp(buffer2,"?");
+        RLOGD("at_type_jug :%d",at_type_jug);
+        if (at_type_jug == 0)
+        {
+            *at_type = 0;
+            strcpy(parse_cmd[0],buffer1);
+            return 0;
+        }
+        else 
+        {
+            *at_type = 2;
+            RLOGD("Buffertest1:buffer1 :%s  buffer2 :%s",buffer1,buffer2);
+            strcpy(parse_cmd[0],buffer1);
+            strcpy(parse_cmd[1],buffer2);
+            RLOGD("buffer1 :%s  buffer2 :%s",parse_cmd[0],parse_cmd[1]);
+            return 0;
+        }
+    }
+    else
+    {
+        RLOGD("unknown paramters");
+        return -1;
+    }
+}
+
+lynq_atsvc_incb lynq_register_gnss(lynq_atsvc_outcb out_cb)
+{
+    char reg_return[100] = {0};
+    if(NULL == out_cb)
+    {
+        RLOGD("out cb is null");
+        return NULL;
+    }
+    atsvc_gnss_outcb=out_cb;
+    memcpy(reg_return,"gnss register success\r\n",24);
+    atsvc_gnss_outcb(reg_return,24,0);
+    return atsvc_incb_entity;
+}
+
+
+void atsvc_incb_entity(const char *input,const int length)
+{
+    int res = 0;
+    int income_at_type = 0;
+    char at_cmd[512]={0};
+    char gnss_at_cmd[100] = {0};
+    char *parse_atcmd[128]; //argv[0]:at cmd,argv[2]:at paramter
+    if(NULL == input)
+    {
+        RLOGD("input is null");
+        memcpy(gnss_at_cmd,"+CME ERROR: 100\r\n",strlen("+CME ERROR: 100\r\n"));
+        atsvc_gnss_outcb(gnss_at_cmd,strlen("+CME ERROR: 100\r\n"),0);
+        return -1;
+    }
+    if (strlen(input) >= 128)
+    {
+        RLOGD("input size more than 128");
+        memcpy(gnss_at_cmd,"+CME ERROR: 100\r\n",strlen("+CME ERROR: 100\r\n"));
+        atsvc_gnss_outcb(gnss_at_cmd,strlen("+CME ERROR: 100\r\n"),0);
+        return -1;
+    }
+    bzero(at_cmd,512);
+    memcpy(at_cmd,input,strlen(input));
+    res = gnss_at_cmd_parse(at_cmd,parse_atcmd,&income_at_type);
+    if (res != 0)
+    {
+        RLOGD("parse at cmd error");
+        return -1;
+    }
+
+    if (!strcmp(parse_atcmd[0], "AT+CGPS"))
+    {
+        res = lynq_at_cgps(income_at_type,parse_atcmd[1]);
+        if (res != 0)
+        {
+            RLOGD("cgps unknown error");
+        }
+    }
+    else if (!strcmp(parse_atcmd[0], "AT+CGPSNMEA"))
+    {
+        lynq_at_cgpsnmea(income_at_type,parse_atcmd[1]);
+    }
+    else 
+    {
+        memcpy(gnss_at_cmd,"+CME ERROR: 100\r\n",strlen("+CME ERROR: 100\r\n"));
+    }
+    memcpy(gnss_at_cmd,"OK\r\n",4);
+    atsvc_gnss_outcb(gnss_at_cmd,4,0);
+}
+
+
+int lynq_at_cgps(int at_type,char *at_paramter)
+{
+    int ret = 0;
+    char cgps_at_res[512]={};
+
+    if (at_type == LYNQ_ATCMD_TEST)
+    {
+        bzero(cgps_at_res,512);
+        memcpy(cgps_at_res,"+CGPS:(0,1)\r\n",strlen("+CGPS:(0,1)"));
+        atsvc_gnss_outcb(cgps_at_res,strlen("+CGPS:(0,1)\r\n"),0);
+        return 0;
+    }
+    else if(at_type == LYNQ_ATCMD_READ)
+    {
+        bzero(cgps_at_res,512);
+        sprintf(cgps_at_res,"+CGPS:<%d>",at_gps_status);
+        atsvc_gnss_outcb(cgps_at_res,strlen(cgps_at_res),0);
+        return 0;
+    }
+    else if(at_type == LYNQ_ATCMD_WRITE)
+    {
+        if (at_gps_status != atoi(at_paramter))
+        {
+            at_gps_status = atoi(at_paramter);
+        }
+        else
+        {
+            bzero(cgps_at_res,512);
+            memcpy(cgps_at_res,"+CGPS ERROR: same status\r\n",strlen("+CGPS ERROR: same status\r\n"));
+            atsvc_gnss_outcb(cgps_at_res,strlen(cgps_at_res),0);
+            return -1;
+        }
+        if (at_gps_status == 0)
+        {
+            ret = lynq_gnss_stop();
+            if (ret != 0)
+            {
+                RLOGD("lynq gnss stop fail");
+                return -1;
+            }
+            ret = lynq_gnss_deinit();
+            if (ret != 0)
+            {
+                RLOGD("lynq gnss deinit fail");
+                return -1;
+            }
+            bzero(cgps_at_res,512);
+            memcpy(cgps_at_res,"+CGPS OK\r\n",strlen("+CGPS OK\r\n"));
+            atsvc_gnss_outcb(cgps_at_res,strlen(cgps_at_res),0);
+        }
+        else if(at_gps_status == 1)
+        {
+            lynq_at_callbacks = lynq_at_get__gnss_callbacks();
+            ret = lynq_gnss_callback_reg(lynq_at_callbacks);
+            if (ret != 0)
+            {
+                RLOGD("lynq gnss callback reg fail");
+                return -1;
+            }
+            ret = lynq_gnss_init();
+            if (ret != 0)
+            {
+                RLOGD("lynq gnss init fail");
+                return -1;
+            }
+            ret = lynq_gnss_start();
+            if (ret != 0)
+            {
+                RLOGD("lynq gnss init fail");
+                return -1;
+            }
+            bzero(cgps_at_res,512);
+            memcpy(cgps_at_res,"+CGPS OK\r\n",strlen("+CGPS OK\r\n"));
+            atsvc_gnss_outcb(cgps_at_res,strlen(cgps_at_res),0);
+        }
+        else
+        {
+            RLOGD("unknown at paramters");
+            bzero(cgps_at_res,512);
+            memcpy(cgps_at_res,"+CGPS ERROR: 100\r\n",strlen("+CGPS ERROR: 100\r\n"));
+            atsvc_gnss_outcb(cgps_at_res,strlen("+CGPS ERROR: 100\r\n"),0);
+        }
+        return 0;
+    }
+}
+
+
+int lynq_at_cgpsnmea(int at_type,char *at_paramter)
+{
+    int ret = 0;
+    char cgpsnmea_at_res[512]={};
+
+    if (at_type == LYNQ_ATCMD_TEST)
+    {
+        bzero(cgpsnmea_at_res,512);
+        memcpy(cgpsnmea_at_res,"+CGPSNMEA:(0,1)\r\n",strlen("+CGPSNMEA:(0,1)"));
+        atsvc_gnss_outcb(cgpsnmea_at_res,strlen(cgpsnmea_at_res),0);
+        return 0;
+    }
+    else if(at_type == LYNQ_ATCMD_READ)
+    {
+        bzero(cgpsnmea_at_res,512);
+        sprintf(cgpsnmea_at_res,"+CGPSNMEA:<%d>",at_gpsnmea_status);
+        atsvc_gnss_outcb(cgpsnmea_at_res,strlen(cgpsnmea_at_res),0);
+        return 0;
+    }
+    else if(at_type == LYNQ_ATCMD_WRITE)
+    {
+        if (at_gpsnmea_status != atoi(at_paramter))
+        {
+            at_gpsnmea_status = atoi(at_paramter);
+            bzero(cgpsnmea_at_res,512);
+            memcpy(cgpsnmea_at_res,"+CGPSNMEA OK\r\n",strlen("+CGPSNMEA OK\r\n"));
+            atsvc_gnss_outcb(cgpsnmea_at_res,strlen(cgpsnmea_at_res),0);
+        }
+        else
+        {
+            RLOGD("unknown at paramters");
+            bzero(cgpsnmea_at_res,512);
+            memcpy(cgpsnmea_at_res,"+CGPSNMEA ERROR: 100\r\n",strlen("+CGPSNMEA ERROR: 100\r\n"));
+            atsvc_gnss_outcb(cgpsnmea_at_res,strlen(cgpsnmea_at_res),0);
+        }
+        return 0;
+    }
+}
\ No newline at end of file
diff --git a/src/lynq/lib/liblynq-gnss/src/lynq_gnsshal.h b/src/lynq/lib/liblynq-gnss/src/lynq_gnsshal.h
index a7687fe..04938c9 100755
--- a/src/lynq/lib/liblynq-gnss/src/lynq_gnsshal.h
+++ b/src/lynq/lib/liblynq-gnss/src/lynq_gnsshal.h
@@ -6,6 +6,7 @@
 #endif
 
 #include<pthread.h>
+#include "lynq_gnss.h"
 #include "hardware/gps_mtk.h"
 #include "hal2mnl_interface.h"
 #include "gpshal.h"
@@ -37,6 +38,17 @@
 
 GpsMeasurementCallbacks_ext* lynq_gnss_get_raw_callbacks(void);
 
+lynq_gnss_cb* lynq_at_get__gnss_callbacks(void);
+
+extern lynq_atsvc_outcb atsvc_gnss_outcb;
+extern int at_gpsnmea_status;
+
+typedef enum{
+    LYNQ_ATCMD_TEST = 0,
+    LYNQ_ATCMD_READ,
+    LYNQ_ATCMD_WRITE
+}LYNQ_ATCMD_TYPE;
+
 #ifdef __cplusplus
 }
 #endif
diff --git a/src/lynq/lib/liblynq-network/LICENSE b/src/lynq/lib/liblynq-network/LICENSE
index 77f59ed..605b7ea 100755
--- a/src/lynq/lib/liblynq-network/LICENSE
+++ b/src/lynq/lib/liblynq-network/LICENSE
@@ -1,31 +1,31 @@
 Copyright Statement:
 
-This software/firmware and related documentation ("MediaTek Software") are
+This software/firmware and related documentation ("MobileTek Software") are
 protected under relevant copyright laws. The information contained herein is
-confidential and proprietary to MediaTek Inc. and/or its licensors. Without
-the prior written permission of MediaTek inc. and/or its licensors, any
-reproduction, modification, use or disclosure of MediaTek Software, and
+confidential and proprietary to MobileTek Inc. and/or its licensors. Without
+the prior written permission of MobileTek inc. and/or its licensors, any
+reproduction, modification, use or disclosure of MobileTek Software, and
 information contained herein, in whole or in part, shall be strictly
 prohibited.
 
-MediaTek Inc. (C) 2015. All rights reserved.
+MobileTek Inc. (C) 2015. All rights reserved.
 
 BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
-THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
-RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
-ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL
+THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MobileTek SOFTWARE")
+RECEIVED FROM MobileTek AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
+ON AN "AS-IS" BASIS ONLY. MobileTek EXPRESSLY DISCLAIMS ANY AND ALL
 WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
 WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
-NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH
+NONINFRINGEMENT. NEITHER DOES MobileTek PROVIDE ANY WARRANTY WHATSOEVER WITH
 RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
-INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES
+INCORPORATED IN, OR SUPPLIED WITH THE MobileTek SOFTWARE, AND RECEIVER AGREES
 TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
 RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
-OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK
-SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE
+OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MobileTek
+SOFTWARE. MobileTek SHALL ALSO NOT BE RESPONSIBLE FOR ANY MobileTek SOFTWARE
 RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
-STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S
-ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE
-RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE
-MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
-CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MobileTek'S
+ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MobileTek SOFTWARE
+RELEASED HEREUNDER WILL BE, AT MobileTek'S OPTION, TO REVISE OR REPLACE THE
+MobileTek SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
+CHARGE PAID BY RECEIVER TO MobileTek FOR SUCH MobileTek SOFTWARE AT ISSUE.
diff --git a/src/lynq/lib/liblynq-network/lynq_module_common.h b/src/lynq/lib/liblynq-network/lynq_module_common.h
index a582538..57ea5b2 100755
--- a/src/lynq/lib/liblynq-network/lynq_module_common.h
+++ b/src/lynq/lib/liblynq-network/lynq_module_common.h
@@ -28,6 +28,8 @@
 #define LYNQ_REQUEST_RECORD  (LYNQ_REQUEST_VENDOR_BASE +11)
 #define LYNQ_REQUEST_OOS_RECOVER_TIMER_INTERVAL (LYNQ_REQUEST_VENDOR_BASE +12)
 #define LYNQ_REQUEST_OOS_DEEP_SLEEP_RECOVER_TIMER_INTERVAL (LYNQ_REQUEST_VENDOR_BASE +13)
+#define LYNQ_REQUEST_CHANGE_SCREEN_STATE (LYNQ_REQUEST_VENDOR_BASE + 14)/*jb.qi add for two sim suspend 2022/9/19*/
+#define LYNQ_REQUEST_CHANGE_RADIO (LYNQ_REQUEST_VENDOR_BASE + 15)
 /*the same with lynq_interface.h end*/
 
 typedef enum{
@@ -60,4 +62,7 @@
 #define MODULE_CLOSED (0)
 #define MODULE_SWITCHING  (1)
 #define MODULE_RUNNING (2)
+
+extern int g_module_init_flag;
+
 #endif
diff --git a/src/lynq/lib/liblynq-network/lynq_module_socket.cpp b/src/lynq/lib/liblynq-network/lynq_module_socket.cpp
index fa71d82..c3f7334 100755
--- a/src/lynq/lib/liblynq-network/lynq_module_socket.cpp
+++ b/src/lynq/lib/liblynq-network/lynq_module_socket.cpp
@@ -15,6 +15,7 @@
 #include "lynq_module_common.h"
 #include "lynq_module_socket.h"
 #include "liblog/lynq_deflog.h"
+#include "lynq_shm.h"
 
 #define LYNQ_SERVICE_PORT 8088
 #define LYNQ_ADDRESS "127.0.0.1"
@@ -40,6 +41,11 @@
     int error;
 }lynq_resp_t;
 
+typedef struct{
+    int resp_type;
+    int urcid;   
+}lynq_head_t;
+
 lynq_client_t client_t;
 lynq_resp_t response;
 
@@ -67,6 +73,21 @@
 const int waitResponse(int token,int time_out);
 /*hq add for set waiting time 2022/09/13 end*/
 
+/*hq add for urc process asynchronous 2022/12/26 begin*/
+static pthread_mutex_t s_ProcessUrcMsgBlockMutex = PTHREAD_MUTEX_INITIALIZER;
+static pthread_cond_t s_WaitProcessUrcMsgCond = PTHREAD_COND_INITIALIZER;
+
+#define BLOCK_PROCESS_URC_MSG_INIT() pthread_mutex_init(&s_ProcessUrcMsgBlockMutex,NULL)
+#define BLOCK_PROCESS_URC_MSG_LOCK() pthread_mutex_lock(&s_ProcessUrcMsgBlockMutex)
+#define BLOCK_PROCESS_URC_MSG_UNLOCK() pthread_mutex_unlock(&s_ProcessUrcMsgBlockMutex)
+#define BLOCK_WAIT_PROCESS_URC_MSG() pthread_cond_wait(&s_WaitProcessUrcMsgCond, &s_ProcessUrcMsgBlockMutex)
+#define BLOCK_WAKEUP_PROCESS_URC_MSG() pthread_cond_broadcast(&s_WaitProcessUrcMsgCond)
+static std::list<Parcel*> s_recv_urc_parcel_list;
+void *thread_urc_process(void *p);
+pthread_t module_urc_process_tid = -1;
+int module_urc_process_status = 1;
+/*hq add for urc process asynchronous 2022/12/26 end*/
+
 int g_module_Global_uToken = 0;
 int g_wait_time=5;
 
@@ -118,7 +139,7 @@
     std::list<Parcel*>::iterator iter;
     int cnt=0;
     
-	gettimeofday(&now,NULL);
+    gettimeofday(&now,NULL);
     timeout.tv_sec = now.tv_sec+time_out; //timeout is 1min
     timeout.tv_nsec = now.tv_usec*1000;
 
@@ -268,6 +289,295 @@
     return ret;    
 }
 
+/*hq add for urc broadcase optimisson 2023/01/03 begin*/
+#define SHM_BUFFER_INDEX_OFFSET 1
+#define SHM_BUFFER_SIZE_OFFSET 16
+#define SHM_BUFFER_INDEX_MASK 0x0000007F
+#define SHM_BUFFER_SIZE_MASK 0x0000FFFF
+
+bool urc_data_is_in_shm_data(int responseType,int& level, int& index, int& size)
+{
+    int shm_index=((responseType>>SHM_BUFFER_INDEX_OFFSET)&SHM_BUFFER_INDEX_MASK);
+    if (shm_index>0)
+    {
+        index=shm_index-1;    
+        size=((responseType>>SHM_BUFFER_SIZE_OFFSET)&SHM_BUFFER_SIZE_MASK);
+        if(size>=sizeof(int32_t)*3 && get_shem_buffer_level(size,&level))
+        {
+            LYINFLOG("urc_data_is_in_shm_data level is %d, index is %d size is %d",level,index,size);
+               return true;                            
+        }        
+    }
+    LYINFLOG("urc_data_is_in_shm_data return false, responseType is %d",responseType);
+    return false;
+}
+/*hq add for urc broadcase optimisson 2023/01/03 end*/
+
+void *thread_urc_recv(void *p)
+{
+    Parcel *urc_p =NULL;
+    char urc_data[LYNQ_REC_BUF];    
+    int res = 0;
+    lynq_head_t* phead;
+    int level,index,size;
+    uint8_t * shm_buffer;
+   
+    LYINFLOG("urc recv thread is running");
+    while(module_urc_status)
+    {
+        bzero(urc_data,LYNQ_REC_BUF);
+        res = recvfrom(module_urc_sock_fd,urc_data,sizeof(urc_data),0,(struct sockaddr *)&module_urc_addr_serv,(socklen_t*)&module_len_urc_addr_serv);
+        if(res<sizeof(int32_t)*2)
+        {
+            LYERRLOG("thread_urc_recv step2 fail: res is %d",res);
+            continue;
+        }
+
+        phead=(lynq_head_t*) urc_data;
+        if(is_support_urc(phead->urcid)==false)
+        {
+            continue;
+        }
+        urc_p = new Parcel();
+        if(urc_p == NULL)
+        {
+            LYERRLOG("new parcel failure!!!");
+            continue;
+        }        
+        if(urc_data_is_in_shm_data(phead->resp_type,level,index,size))
+        {
+            shm_buffer = (uint8_t *) get_shem_buffer(level,index);
+            LYINFLOG("shm pointer is %p", shm_buffer); 
+            urc_p->setData(shm_buffer,size); // p.setData((uint8_t *) buffer, buflen);                        
+        }
+        else if(res>=sizeof(int32_t)*3)
+        {
+            urc_p->setData((uint8_t *)urc_data,res); // p.setData((uint8_t *) buffer, buflen);            
+        }
+        else 
+        {    
+               LYERRLOG("res %d error!!!", res);
+            delete urc_p;
+            urc_p = NULL;
+            continue;
+        }
+        urc_p->setDataPosition(0);
+        if(urc_p->dataAvail()>0)
+        {
+            BLOCK_PROCESS_URC_MSG_LOCK();
+            s_recv_urc_parcel_list.push_back(urc_p);            
+            BLOCK_WAKEUP_PROCESS_URC_MSG();
+            BLOCK_PROCESS_URC_MSG_UNLOCK();
+        }
+        else 
+        {
+            delete urc_p;
+            urc_p = NULL;
+        }        
+    }
+    LYINFLOG("urc recv thread ended");
+    return NULL;
+}
+
+void cleanup_urc_process_mutex(void *arg)
+{
+    BLOCK_PROCESS_URC_MSG_UNLOCK();
+}
+
+void *thread_urc_process(void *p)
+{
+    Parcel *urc_p =NULL;
+    std::list<Parcel*>::iterator iter;
+   
+    LYINFLOG("urc process thread is running");
+    pthread_cleanup_push(cleanup_urc_process_mutex, NULL); // thread cleanup handler
+    while(module_urc_process_status)
+    {
+        BLOCK_PROCESS_URC_MSG_LOCK();
+        while(s_recv_urc_parcel_list.empty())
+        {
+            BLOCK_WAIT_PROCESS_URC_MSG();
+        }  
+        iter=s_recv_urc_parcel_list.begin();
+        urc_p=(*iter);
+        s_recv_urc_parcel_list.erase(iter);
+        BLOCK_PROCESS_URC_MSG_UNLOCK();             
+        urc_p->setDataPosition(0);
+        if(urc_p->dataAvail()>0)
+        {          
+            pthread_mutex_lock(&s_urc_mutex);
+            urc_msg_process(urc_p);            
+            pthread_mutex_unlock(&s_urc_mutex);
+        }
+        delete urc_p;
+        urc_p = NULL;
+    }
+    pthread_cleanup_pop(0);
+    LYINFLOG("urc process thread ended");
+    return NULL;
+}
+
+void lynq_close_urc_rev_thread()
+{
+    int ret;
+
+    BLOCK_PROCESS_URC_MSG_LOCK();  //just cancel urc process tid when recv from
+    module_urc_status = 0;    
+    if(module_urc_tid!=-1)
+    {
+        ret = pthread_cancel(module_urc_tid);
+        LYINFLOG("pthread cancel urc rev ret = %d",ret);            
+    }
+    BLOCK_PROCESS_URC_MSG_UNLOCK();
+    if(module_urc_tid != -1)
+    {
+        ret = pthread_join(module_urc_tid,NULL);
+        LYINFLOG("pthread join urc tid ret = %d",ret);
+        module_urc_tid =-1;
+    }       
+}
+
+void lynq_close_urc_process_thread()
+{
+    int ret;
+    BLOCK_PROCESS_URC_MSG_LOCK();  //just cancel urc process tid when not process urc msg in list 
+    pthread_mutex_lock(&s_urc_mutex); //just cancel urc process tid when not process urg msg avoid mutual lock for tid may call pthread_cond_wait
+    module_urc_process_status = 0;    
+    if(module_urc_process_tid!=-1)
+    {
+        ret = pthread_cancel(module_urc_process_tid);
+        LYINFLOG("pthread cancel urc process ret = %d",ret);            
+    }
+    pthread_mutex_unlock(&s_urc_mutex);
+    BLOCK_PROCESS_URC_MSG_UNLOCK();
+    if(module_urc_process_tid != -1)
+    {
+        ret = pthread_join(module_urc_process_tid,NULL);
+        LYINFLOG("pthread join urc process tid ret = %d",ret);
+        module_urc_process_tid =-1;
+    }
+}
+
+int lynq_setup_urc_socket()
+{
+    int on = 1;
+    int ret = 0;
+    module_len_urc_addr_serv = sizeof(sockaddr_in);
+    module_urc_sock_fd = socket(AF_INET, SOCK_DGRAM, 0);
+    if (module_urc_sock_fd <0){
+        LYERRLOG("urc socket error");
+        return RESULT_ERROR;  
+    }
+    module_urc_addr_serv.sin_family = AF_INET;
+    module_urc_addr_serv.sin_port = htons(LYNQ_URC_SERVICE_PORT);
+    module_urc_addr_serv.sin_addr.s_addr = inet_addr(LYNQ_URC_ADDRESS);
+    /* Set socket to allow reuse of address and port, SO_REUSEADDR value is 2*/
+    ret = setsockopt(module_urc_sock_fd,SOL_SOCKET,SO_REUSEADDR,&on,sizeof on);
+    if(ret <0)
+    {
+        LYERRLOG("urc socket set error");
+        close(module_urc_sock_fd);
+        module_urc_sock_fd =-1;
+        return RESULT_ERROR;  
+    }
+    ret = bind(module_urc_sock_fd ,(struct sockaddr*)&module_urc_addr_serv, sizeof(module_urc_addr_serv));
+    if(ret <0)
+    {
+        LYERRLOG("urc socket bind error");
+        close(module_urc_sock_fd);
+        module_urc_sock_fd =-1;
+        return RESULT_ERROR;  
+    }
+    return RESULT_OK;
+}
+
+void lynq_close_urc_socket()
+{
+    if (module_urc_sock_fd >= 0)
+    {
+        close(module_urc_sock_fd);
+        module_urc_sock_fd =-1;
+    }  
+}
+
+int lynq_start_all_urc_socket_thread()
+{  
+    
+    if(ril_init_mem()!=0)
+    {
+        LYERRLOG("ril_init_mem fail");        
+        return RESULT_ERROR;
+    }
+
+    int ret= lynq_setup_urc_socket();
+    if(ret!=RESULT_OK)
+    {
+        LYERRLOG("call lynq_setup_urc_socket fail");
+        ril_deinit_mem();
+        return RESULT_ERROR;
+    }
+    
+    BLOCK_PROCESS_URC_MSG_INIT();
+    BLOCK_PROCESS_URC_MSG_LOCK();    
+    std::list<Parcel*>::iterator iter;
+    for(iter=s_recv_urc_parcel_list.begin();iter!=s_recv_urc_parcel_list.end();++iter)
+    {
+        delete (*iter);        
+    }
+    s_recv_urc_parcel_list.clear(); 
+    BLOCK_PROCESS_URC_MSG_UNLOCK(); 
+    
+    pthread_mutex_init(&s_urc_mutex, NULL);    
+    
+    module_urc_status = 1;
+  //  pthread_attr_init(&attr);
+  //  pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
+    ret = pthread_create(&module_urc_tid,/*&attr*/NULL,thread_urc_recv,NULL);
+    if(ret <0)
+    {
+        LYERRLOG("urc recv pthread create error");
+        module_urc_status = 0;
+        lynq_close_urc_socket();
+        ril_deinit_mem();
+        return RESULT_ERROR;  
+    }
+
+    module_urc_process_status = 1;
+    ret = pthread_create(&module_urc_process_tid,/*&attr*/NULL,thread_urc_process,NULL);
+    if(ret <0)
+    {
+        LYERRLOG("urc process pthread create error");
+        module_urc_process_status = 0;
+        lynq_close_urc_socket();
+        lynq_close_urc_rev_thread();
+        ril_deinit_mem();
+        return RESULT_ERROR;  
+    }
+    
+    LYINFLOG("urc start success");
+    
+    return RESULT_OK;  
+}
+
+void lynq_close_all_urc_socket_thread()
+{
+ 
+    lynq_close_urc_rev_thread();
+    lynq_close_urc_socket();
+    lynq_close_urc_process_thread();        
+    
+    BLOCK_PROCESS_URC_MSG_LOCK();    
+    std::list<Parcel*>::iterator iter;
+    for(iter=s_recv_urc_parcel_list.begin();iter!=s_recv_urc_parcel_list.end();++iter)
+    {
+        delete (*iter);        
+    }
+    s_recv_urc_parcel_list.clear(); 
+    BLOCK_PROCESS_URC_MSG_UNLOCK(); 
+    
+    ril_deinit_mem();    
+}
+
 /**@ a thread just for recv\buffer solicited msg's response and notice waiting thread
 * @param p [IN]: no meaning
 * @return
@@ -347,44 +657,7 @@
     return NULL;
 }
 
-void *thread_urc_recv(void *p)
-{
-    Parcel *urc_p =NULL;
-    char urc_data[LYNQ_REC_BUF];    
-    int res = 0;
-   
-    LYINFLOG("urc thread is running");
-    while(module_urc_status)
-    {
-        bzero(urc_data,LYNQ_REC_BUF);
-        res = recvfrom(module_urc_sock_fd,urc_data,sizeof(urc_data),0,(struct sockaddr *)&module_urc_addr_serv,(socklen_t*)&module_len_urc_addr_serv);
-        if(res<=0)
-        {
-            LYERRLOG("thread_urc_recv step2 fail:");
-            break;
-        }
-        urc_p = new Parcel();
-        if(urc_p == NULL)
-        {
-            LYERRLOG("new parcel failure!!!");
-            break;
-        }
-        urc_p->setData((uint8_t *)urc_data,res); // p.setData((uint8_t *) buffer, buflen);
-        urc_p->setDataPosition(0);
-        if(urc_p->dataAvail()>0)
-        {
-            pthread_mutex_lock(&s_urc_mutex);
-            urc_msg_process(urc_p);            
-            pthread_mutex_unlock(&s_urc_mutex);
-        }
-        delete urc_p;
-        urc_p = NULL;
-    }
-    LYINFLOG("urc thread ended");
-    return NULL;
-}
-
-int lynq_server_socket_start()
+int lynq_start_all_rc_socket_thread()
 {
     module_rc_sock_fd = socket(AF_INET, SOCK_DGRAM, 0);
     if(module_rc_sock_fd < 0)
@@ -434,82 +707,7 @@
     return RESULT_OK;  
 }
 
-int lynq_urc_socket_start()
-{
-//    pthread_t tid;
-//    pthread_attr_t attr;
-    int on = 1;
-    int ret = 0;
-    module_len_urc_addr_serv = sizeof(sockaddr_in);
-    module_urc_sock_fd = socket(AF_INET, SOCK_DGRAM, 0);
-    if (module_urc_sock_fd <0){
-        LYERRLOG("urc socket error");
-        return RESULT_ERROR;  
-    }
-    module_urc_addr_serv.sin_family = AF_INET;
-    module_urc_addr_serv.sin_port = htons(LYNQ_URC_SERVICE_PORT);
-    module_urc_addr_serv.sin_addr.s_addr = inet_addr(LYNQ_URC_ADDRESS);
-    /* Set socket to allow reuse of address and port, SO_REUSEADDR value is 2*/
-    ret = setsockopt(module_urc_sock_fd,SOL_SOCKET,SO_REUSEADDR,&on,sizeof on);
-    if(ret <0)
-    {
-        LYERRLOG("urc socket set error");
-        close(module_urc_sock_fd);
-        module_urc_sock_fd =-1;
-        return RESULT_ERROR;  
-    }
-    ret = bind(module_urc_sock_fd ,(struct sockaddr*)&module_urc_addr_serv, sizeof(module_urc_addr_serv));
-    if(ret <0)
-    {
-        LYERRLOG("urc socket bind error");
-        close(module_urc_sock_fd);
-        module_urc_sock_fd =-1;
-        return RESULT_ERROR;  
-    }
-
-    module_urc_status = 1;
-  //  pthread_attr_init(&attr);
-  //  pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
-    ret = pthread_create(&module_urc_tid,/*&attr*/NULL,thread_urc_recv,NULL);
-    if(ret <0)
-    {
-        LYERRLOG("urc pthread create error");
-        module_urc_status = 0;
-        close(module_urc_sock_fd);
-        module_urc_sock_fd =-1;
-        return RESULT_ERROR;  
-    }
-    LYINFLOG("urc start success");
-    
-    return RESULT_OK;  
-}
-
-void lynq_close_urc_thread()
-{
-    int ret;
-
-    pthread_mutex_lock(&s_urc_mutex); //just cancel urc tid when recvfrom avoid mutual lock for tid may call pthread_cond_wait
-    module_urc_status = 0;    
-    if(module_urc_tid!=-1)
-    {
-        ret = pthread_cancel(module_urc_tid);
-        LYINFLOG("pthread cancel urc ret = %d",ret);            
-    }
-    pthread_mutex_unlock(&s_urc_mutex);
-     if(module_urc_tid != -1)
-    {
-        ret = pthread_join(module_urc_tid,NULL);
-        LYINFLOG("pthread join urc tid ret = %d",ret);
-        module_urc_tid =-1;
-    }
-    if (module_urc_sock_fd > 0)
-    {
-        close(module_urc_sock_fd);
-        module_urc_sock_fd =-1;
-    }  
-}
-
-void lynq_close_rc_thread()
+void lynq_close_all_rc_socket_thread()
 {
     int ret;
     BLOCK_RECV_MSG_LOCK(); 
@@ -545,3 +743,273 @@
     BLOCK_RECV_MSG_UNLOCK(); 
 }
 
+const char * requestToString(int request) 
+{
+    /*
+     cat libs/telephony/ril_commands.h \
+     | egrep "^ *{RIL_" \
+     | sed -re 's/\{RIL_([^,]+),[^,]+,([^}]+).+/case RIL_\1: return "\1";/'
+    
+    
+     cat libs/telephony/ril_unsol_commands.h \
+     | egrep "^ *{RIL_" \
+     | sed -re 's/\{RIL_([^,]+),([^}]+).+/case RIL_\1: return "\1";/'
+    
+    */
+    switch(request) {
+        case RIL_REQUEST_GET_SIM_STATUS: return "GET_SIM_STATUS";
+        case RIL_REQUEST_ENTER_SIM_PIN: return "ENTER_SIM_PIN";
+        case RIL_REQUEST_ENTER_SIM_PUK: return "ENTER_SIM_PUK";
+        case RIL_REQUEST_ENTER_SIM_PIN2: return "ENTER_SIM_PIN2";
+        case RIL_REQUEST_ENTER_SIM_PUK2: return "ENTER_SIM_PUK2";
+        case RIL_REQUEST_CHANGE_SIM_PIN: return "CHANGE_SIM_PIN";
+        case RIL_REQUEST_CHANGE_SIM_PIN2: return "CHANGE_SIM_PIN2";
+        case RIL_REQUEST_ENTER_NETWORK_DEPERSONALIZATION: return "ENTER_NETWORK_DEPERSONALIZATION";
+        case RIL_REQUEST_GET_CURRENT_CALLS: return "GET_CURRENT_CALLS";
+        case RIL_REQUEST_DIAL: return "DIAL";
+        case RIL_REQUEST_GET_IMSI: return "GET_IMSI";
+        case RIL_REQUEST_HANGUP: return "HANGUP";
+        case RIL_REQUEST_HANGUP_WAITING_OR_BACKGROUND: return "HANGUP_WAITING_OR_BACKGROUND";
+        case RIL_REQUEST_HANGUP_FOREGROUND_RESUME_BACKGROUND: return "HANGUP_FOREGROUND_RESUME_BACKGROUND";
+        case RIL_REQUEST_SWITCH_WAITING_OR_HOLDING_AND_ACTIVE: return "SWITCH_WAITING_OR_HOLDING_AND_ACTIVE";
+        case RIL_REQUEST_CONFERENCE: return "CONFERENCE";
+        case RIL_REQUEST_UDUB: return "UDUB";
+        case RIL_REQUEST_LAST_CALL_FAIL_CAUSE: return "LAST_CALL_FAIL_CAUSE";
+        case RIL_REQUEST_SIGNAL_STRENGTH: return "SIGNAL_STRENGTH";
+        case RIL_REQUEST_VOICE_REGISTRATION_STATE: return "VOICE_REGISTRATION_STATE";
+        case RIL_REQUEST_DATA_REGISTRATION_STATE: return "DATA_REGISTRATION_STATE";
+        case RIL_REQUEST_OPERATOR: return "OPERATOR";
+        case RIL_REQUEST_RADIO_POWER: return "RADIO_POWER";
+        case RIL_REQUEST_DTMF: return "DTMF";
+        case RIL_REQUEST_SEND_SMS: return "SEND_SMS";
+        case RIL_REQUEST_SEND_SMS_EXPECT_MORE: return "SEND_SMS_EXPECT_MORE";
+        case RIL_REQUEST_SETUP_DATA_CALL: return "SETUP_DATA_CALL";
+        case RIL_REQUEST_SIM_IO: return "SIM_IO";
+        case RIL_REQUEST_SEND_USSD: return "SEND_USSD";
+        case RIL_REQUEST_CANCEL_USSD: return "CANCEL_USSD";
+        case RIL_REQUEST_GET_CLIR: return "GET_CLIR";
+        case RIL_REQUEST_SET_CLIR: return "SET_CLIR";
+        case RIL_REQUEST_QUERY_CALL_FORWARD_STATUS: return "QUERY_CALL_FORWARD_STATUS";
+        case RIL_REQUEST_SET_CALL_FORWARD: return "SET_CALL_FORWARD";
+        case RIL_REQUEST_QUERY_CALL_WAITING: return "QUERY_CALL_WAITING";
+        case RIL_REQUEST_SET_CALL_WAITING: return "SET_CALL_WAITING";
+        case RIL_REQUEST_SMS_ACKNOWLEDGE: return "SMS_ACKNOWLEDGE";
+        case RIL_REQUEST_GET_IMEI: return "GET_IMEI";
+        case RIL_REQUEST_GET_IMEISV: return "GET_IMEISV";
+        case RIL_REQUEST_ANSWER: return "ANSWER";
+        case RIL_REQUEST_DEACTIVATE_DATA_CALL: return "DEACTIVATE_DATA_CALL";
+        case RIL_REQUEST_QUERY_FACILITY_LOCK: return "QUERY_FACILITY_LOCK";
+        case RIL_REQUEST_SET_FACILITY_LOCK: return "SET_FACILITY_LOCK";
+        case RIL_REQUEST_CHANGE_BARRING_PASSWORD: return "CHANGE_BARRING_PASSWORD";
+        case RIL_REQUEST_QUERY_NETWORK_SELECTION_MODE: return "QUERY_NETWORK_SELECTION_MODE";
+        case RIL_REQUEST_SET_NETWORK_SELECTION_AUTOMATIC: return "SET_NETWORK_SELECTION_AUTOMATIC";
+        case RIL_REQUEST_SET_NETWORK_SELECTION_MANUAL: return "SET_NETWORK_SELECTION_MANUAL";
+        case RIL_REQUEST_QUERY_AVAILABLE_NETWORKS : return "QUERY_AVAILABLE_NETWORKS ";
+        case RIL_REQUEST_DTMF_START: return "DTMF_START";
+        case RIL_REQUEST_DTMF_STOP: return "DTMF_STOP";
+        case RIL_REQUEST_BASEBAND_VERSION: return "BASEBAND_VERSION";
+        case RIL_REQUEST_SEPARATE_CONNECTION: return "SEPARATE_CONNECTION";
+        case RIL_REQUEST_SET_PREFERRED_NETWORK_TYPE: return "SET_PREFERRED_NETWORK_TYPE";
+        case RIL_REQUEST_GET_PREFERRED_NETWORK_TYPE: return "GET_PREFERRED_NETWORK_TYPE";
+        case RIL_REQUEST_GET_NEIGHBORING_CELL_IDS: return "GET_NEIGHBORING_CELL_IDS";
+        case RIL_REQUEST_SET_MUTE: return "SET_MUTE";
+        case RIL_REQUEST_GET_MUTE: return "GET_MUTE";
+        case RIL_REQUEST_QUERY_CLIP: return "QUERY_CLIP";
+        case RIL_REQUEST_LAST_DATA_CALL_FAIL_CAUSE: return "LAST_DATA_CALL_FAIL_CAUSE";
+        case RIL_REQUEST_DATA_CALL_LIST: return "DATA_CALL_LIST";
+        case RIL_REQUEST_RESET_RADIO: return "RESET_RADIO";
+        case RIL_REQUEST_OEM_HOOK_RAW: return "OEM_HOOK_RAW";
+        case RIL_REQUEST_OEM_HOOK_STRINGS: return "OEM_HOOK_STRINGS";
+        case RIL_REQUEST_SET_BAND_MODE: return "SET_BAND_MODE";
+        case RIL_REQUEST_QUERY_AVAILABLE_BAND_MODE: return "QUERY_AVAILABLE_BAND_MODE";
+        case RIL_REQUEST_STK_GET_PROFILE: return "STK_GET_PROFILE";
+        case RIL_REQUEST_STK_SET_PROFILE: return "STK_SET_PROFILE";
+        case RIL_REQUEST_STK_SEND_ENVELOPE_COMMAND: return "STK_SEND_ENVELOPE_COMMAND";
+        case RIL_REQUEST_STK_SEND_TERMINAL_RESPONSE: return "STK_SEND_TERMINAL_RESPONSE";
+        case RIL_REQUEST_STK_HANDLE_CALL_SETUP_REQUESTED_FROM_SIM: return "STK_HANDLE_CALL_SETUP_REQUESTED_FROM_SIM";
+        case RIL_REQUEST_SCREEN_STATE: return "SCREEN_STATE";
+        case RIL_REQUEST_EXPLICIT_CALL_TRANSFER: return "EXPLICIT_CALL_TRANSFER";
+        case RIL_REQUEST_SET_LOCATION_UPDATES: return "SET_LOCATION_UPDATES";
+        case RIL_REQUEST_CDMA_SET_SUBSCRIPTION_SOURCE:return"CDMA_SET_SUBSCRIPTION_SOURCE";
+        case RIL_REQUEST_CDMA_SET_ROAMING_PREFERENCE:return"CDMA_SET_ROAMING_PREFERENCE";
+        case RIL_REQUEST_CDMA_QUERY_ROAMING_PREFERENCE:return"CDMA_QUERY_ROAMING_PREFERENCE";
+        case RIL_REQUEST_SET_TTY_MODE:return"SET_TTY_MODE";
+        case RIL_REQUEST_QUERY_TTY_MODE:return"QUERY_TTY_MODE";
+        case RIL_REQUEST_CDMA_SET_PREFERRED_VOICE_PRIVACY_MODE:return"CDMA_SET_PREFERRED_VOICE_PRIVACY_MODE";
+        case RIL_REQUEST_CDMA_QUERY_PREFERRED_VOICE_PRIVACY_MODE:return"CDMA_QUERY_PREFERRED_VOICE_PRIVACY_MODE";
+        case RIL_REQUEST_CDMA_FLASH:return"CDMA_FLASH";
+        case RIL_REQUEST_CDMA_BURST_DTMF:return"CDMA_BURST_DTMF";
+        case RIL_REQUEST_CDMA_SEND_SMS:return"CDMA_SEND_SMS";
+        case RIL_REQUEST_CDMA_SMS_ACKNOWLEDGE:return"CDMA_SMS_ACKNOWLEDGE";
+        case RIL_REQUEST_GSM_GET_BROADCAST_SMS_CONFIG:return"GSM_GET_BROADCAST_SMS_CONFIG";
+        case RIL_REQUEST_GSM_SET_BROADCAST_SMS_CONFIG:return"GSM_SET_BROADCAST_SMS_CONFIG";
+        case RIL_REQUEST_GSM_SMS_BROADCAST_ACTIVATION:return "GSM_SMS_BROADCAST_ACTIVATION";
+        case RIL_REQUEST_CDMA_GET_BROADCAST_SMS_CONFIG:return "CDMA_GET_BROADCAST_SMS_CONFIG";
+        case RIL_REQUEST_CDMA_SET_BROADCAST_SMS_CONFIG:return "CDMA_SET_BROADCAST_SMS_CONFIG";
+        case RIL_REQUEST_CDMA_SMS_BROADCAST_ACTIVATION:return "CDMA_SMS_BROADCAST_ACTIVATION";
+        case RIL_REQUEST_CDMA_VALIDATE_AND_WRITE_AKEY: return"CDMA_VALIDATE_AND_WRITE_AKEY";
+        case RIL_REQUEST_CDMA_SUBSCRIPTION: return"CDMA_SUBSCRIPTION";
+        case RIL_REQUEST_CDMA_WRITE_SMS_TO_RUIM: return "CDMA_WRITE_SMS_TO_RUIM";
+        case RIL_REQUEST_CDMA_DELETE_SMS_ON_RUIM: return "CDMA_DELETE_SMS_ON_RUIM";
+        case RIL_REQUEST_DEVICE_IDENTITY: return "DEVICE_IDENTITY";
+        case RIL_REQUEST_EXIT_EMERGENCY_CALLBACK_MODE: return "EXIT_EMERGENCY_CALLBACK_MODE";
+        case RIL_REQUEST_GET_SMSC_ADDRESS: return "GET_SMSC_ADDRESS";
+        case RIL_REQUEST_SET_SMSC_ADDRESS: return "SET_SMSC_ADDRESS";
+        case RIL_REQUEST_REPORT_SMS_MEMORY_STATUS: return "REPORT_SMS_MEMORY_STATUS";
+        case RIL_REQUEST_REPORT_STK_SERVICE_IS_RUNNING: return "REPORT_STK_SERVICE_IS_RUNNING";
+        case RIL_REQUEST_CDMA_GET_SUBSCRIPTION_SOURCE: return "CDMA_GET_SUBSCRIPTION_SOURCE";
+        case RIL_REQUEST_ISIM_AUTHENTICATION: return "ISIM_AUTHENTICATION";
+        case RIL_REQUEST_ACKNOWLEDGE_INCOMING_GSM_SMS_WITH_PDU: return "RIL_REQUEST_ACKNOWLEDGE_INCOMING_GSM_SMS_WITH_PDU";
+        case RIL_REQUEST_STK_SEND_ENVELOPE_WITH_STATUS: return "RIL_REQUEST_STK_SEND_ENVELOPE_WITH_STATUS";
+        case RIL_REQUEST_VOICE_RADIO_TECH: return "VOICE_RADIO_TECH";
+        case RIL_REQUEST_GET_CELL_INFO_LIST: return"GET_CELL_INFO_LIST";
+        case RIL_REQUEST_SET_UNSOL_CELL_INFO_LIST_RATE: return"SET_UNSOL_CELL_INFO_LIST_RATE";
+        case RIL_REQUEST_SET_INITIAL_ATTACH_APN: return "RIL_REQUEST_SET_INITIAL_ATTACH_APN";
+        case RIL_REQUEST_IMS_REGISTRATION_STATE: return "IMS_REGISTRATION_STATE";
+        case RIL_REQUEST_IMS_SEND_SMS: return "IMS_SEND_SMS";
+        case RIL_REQUEST_SIM_TRANSMIT_APDU_BASIC: return "SIM_TRANSMIT_APDU_BASIC";
+        case RIL_REQUEST_SIM_OPEN_CHANNEL: return "SIM_OPEN_CHANNEL";
+        case RIL_REQUEST_SIM_CLOSE_CHANNEL: return "SIM_CLOSE_CHANNEL";
+        case RIL_REQUEST_SIM_TRANSMIT_APDU_CHANNEL: return "SIM_TRANSMIT_APDU_CHANNEL";
+        case RIL_REQUEST_GET_RADIO_CAPABILITY: return "RIL_REQUEST_GET_RADIO_CAPABILITY";
+        case RIL_REQUEST_SET_RADIO_CAPABILITY: return "RIL_REQUEST_SET_RADIO_CAPABILITY";
+        case RIL_REQUEST_SET_UICC_SUBSCRIPTION: return "SET_UICC_SUBSCRIPTION";
+        case RIL_REQUEST_ALLOW_DATA: return "ALLOW_DATA";
+        case RIL_REQUEST_GET_HARDWARE_CONFIG: return "GET_HARDWARE_CONFIG";
+        case RIL_REQUEST_SIM_AUTHENTICATION: return "SIM_AUTHENTICATION";
+        case RIL_REQUEST_GET_DC_RT_INFO: return "GET_DC_RT_INFO";
+        case RIL_REQUEST_SET_DC_RT_INFO_RATE: return "SET_DC_RT_INFO_RATE";
+        case RIL_REQUEST_SET_DATA_PROFILE: return "SET_DATA_PROFILE";
+        case RIL_UNSOL_RESPONSE_RADIO_STATE_CHANGED: return "UNSOL_RESPONSE_RADIO_STATE_CHANGED";
+        case RIL_UNSOL_RESPONSE_CALL_STATE_CHANGED: return "UNSOL_RESPONSE_CALL_STATE_CHANGED";
+        case RIL_UNSOL_RESPONSE_VOICE_NETWORK_STATE_CHANGED: return "UNSOL_RESPONSE_VOICE_NETWORK_STATE_CHANGED";
+        case RIL_UNSOL_RESPONSE_PS_NETWORK_STATE_CHANGED: return "UNSOL_RESPONSE_VOICE_NETWORK_STATE_CHANGED";
+        case RIL_UNSOL_RESPONSE_NEW_SMS: return "UNSOL_RESPONSE_NEW_SMS";
+        case RIL_UNSOL_RESPONSE_NEW_SMS_STATUS_REPORT: return "UNSOL_RESPONSE_NEW_SMS_STATUS_REPORT";
+        case RIL_UNSOL_RESPONSE_NEW_SMS_ON_SIM: return "UNSOL_RESPONSE_NEW_SMS_ON_SIM";
+        case RIL_UNSOL_ON_USSD: return "UNSOL_ON_USSD";
+        case RIL_UNSOL_ON_USSD_REQUEST: return "UNSOL_ON_USSD_REQUEST(obsolete)";
+        case RIL_UNSOL_NITZ_TIME_RECEIVED: return "UNSOL_NITZ_TIME_RECEIVED";
+        case RIL_UNSOL_SIGNAL_STRENGTH: return "UNSOL_SIGNAL_STRENGTH";
+        case RIL_UNSOL_STK_SESSION_END: return "UNSOL_STK_SESSION_END";
+        case RIL_UNSOL_STK_PROACTIVE_COMMAND: return "UNSOL_STK_PROACTIVE_COMMAND";
+        case RIL_UNSOL_STK_EVENT_NOTIFY: return "UNSOL_STK_EVENT_NOTIFY";
+        case RIL_UNSOL_STK_CALL_SETUP: return "UNSOL_STK_CALL_SETUP";
+        case RIL_UNSOL_SIM_SMS_STORAGE_FULL: return "UNSOL_SIM_SMS_STORAGE_FUL";
+        case RIL_UNSOL_SIM_REFRESH: return "UNSOL_SIM_REFRESH";
+        case RIL_UNSOL_DATA_CALL_LIST_CHANGED: return "UNSOL_DATA_CALL_LIST_CHANGED";
+        case RIL_UNSOL_CALL_RING: return "UNSOL_CALL_RING";
+        case RIL_UNSOL_RESPONSE_SIM_STATUS_CHANGED: return "UNSOL_RESPONSE_SIM_STATUS_CHANGED";
+        case RIL_UNSOL_RESPONSE_CDMA_NEW_SMS: return "UNSOL_NEW_CDMA_SMS";
+        case RIL_UNSOL_RESPONSE_NEW_BROADCAST_SMS: return "UNSOL_NEW_BROADCAST_SMS";
+        case RIL_UNSOL_CDMA_RUIM_SMS_STORAGE_FULL: return "UNSOL_CDMA_RUIM_SMS_STORAGE_FULL";
+        case RIL_UNSOL_RESTRICTED_STATE_CHANGED: return "UNSOL_RESTRICTED_STATE_CHANGED";
+        case RIL_UNSOL_ENTER_EMERGENCY_CALLBACK_MODE: return "UNSOL_ENTER_EMERGENCY_CALLBACK_MODE";
+        case RIL_UNSOL_CDMA_CALL_WAITING: return "UNSOL_CDMA_CALL_WAITING";
+        case RIL_UNSOL_CDMA_OTA_PROVISION_STATUS: return "UNSOL_CDMA_OTA_PROVISION_STATUS";
+        case RIL_UNSOL_CDMA_INFO_REC: return "UNSOL_CDMA_INFO_REC";
+        case RIL_UNSOL_OEM_HOOK_RAW: return "UNSOL_OEM_HOOK_RAW";
+        case RIL_UNSOL_RINGBACK_TONE: return "UNSOL_RINGBACK_TONE";
+        case RIL_UNSOL_RESEND_INCALL_MUTE: return "UNSOL_RESEND_INCALL_MUTE";
+        case RIL_UNSOL_CDMA_SUBSCRIPTION_SOURCE_CHANGED: return "UNSOL_CDMA_SUBSCRIPTION_SOURCE_CHANGED";
+        case RIL_UNSOL_CDMA_PRL_CHANGED: return "UNSOL_CDMA_PRL_CHANGED";
+        case RIL_UNSOL_EXIT_EMERGENCY_CALLBACK_MODE: return "UNSOL_EXIT_EMERGENCY_CALLBACK_MODE";
+        case RIL_UNSOL_RIL_CONNECTED: return "UNSOL_RIL_CONNECTED";
+        case RIL_UNSOL_VOICE_RADIO_TECH_CHANGED: return "UNSOL_VOICE_RADIO_TECH_CHANGED";
+        case RIL_UNSOL_CELL_INFO_LIST: return "UNSOL_CELL_INFO_LIST";
+        case RIL_UNSOL_RESPONSE_IMS_NETWORK_STATE_CHANGED: return "RESPONSE_IMS_NETWORK_STATE_CHANGED";
+        case RIL_UNSOL_UICC_SUBSCRIPTION_STATUS_CHANGED: return "UNSOL_UICC_SUBSCRIPTION_STATUS_CHANGED";
+        case RIL_UNSOL_SRVCC_STATE_NOTIFY: return "UNSOL_SRVCC_STATE_NOTIFY";
+        case RIL_UNSOL_HARDWARE_CONFIG_CHANGED: return "HARDWARE_CONFIG_CHANGED";
+        case RIL_UNSOL_DC_RT_INFO_CHANGED: return "UNSOL_DC_RT_INFO_CHANGED";
+        case RIL_REQUEST_SHUTDOWN: return "SHUTDOWN";
+        case RIL_UNSOL_RADIO_CAPABILITY: return "RIL_UNSOL_RADIO_CAPABILITY";
+        case RIL_REQUEST_SET_TRM: return "RIL_REQUEST_SET_TRM";
+        case RIL_REQUEST_SET_IMS_ENABLE:return "RIL_REQUEST_SET_IMS_ENABLE";
+        case RIL_REQUEST_SET_AUDIO_PATH: return "SET_AUDIO_PATH";
+        case RIL_REQUEST_HANGUP_ALL: return "HANGUP_ALL";
+        case RIL_REQUEST_FORCE_RELEASE_CALL: return "FORCE_RELEASE_CALL";
+        case RIL_REQUEST_EMERGENCY_DIAL: return "RIL_REQUEST_EMERGENCY_DIAL";
+        case RIL_REQUEST_SET_ECC_SERVICE_CATEGORY: return "RIL_REQUEST_SET_ECC_SERVICE_CATEGORY";
+        case RIL_REQUEST_SET_ECC_LIST: return "RIL_REQUEST_SET_ECC_LIST";
+        case RIL_REQUEST_AT_COMMAND_WITH_PROXY: return "AT_COMMAND_WITH_PROXY";
+        case RIL_REQUEST_SET_SUPP_SVC_NOTIFICATION: return "RIL_REQUEST_SET_SUPP_SVC_NOTIFICATION";
+        case RIL_REQUEST_SET_CLIP: return "RIL_REQUEST_SET_CLIP";
+        case RIL_REQUEST_GET_COLP: return "RIL_REQUEST_GET_COLP";
+        case RIL_REQUEST_SET_COLP: return "RIL_REQUEST_SET_COLP";
+        case RIL_REQUEST_GET_COLR: return "RIL_REQUEST_GET_COLR";
+        case RIL_REQUEST_ADD_IMS_CONFERENCE_CALL_MEMBER: return "ADD_IMS_CONFERENCE_CALL_MEMBER";
+        case RIL_REQUEST_REMOVE_IMS_CONFERENCE_CALL_MEMBER: return "REMOVE_IMS_CONFERENCE_CALL_MEMBER";
+        case RIL_REQUEST_CONFERENCE_DIAL: return "CONFERENCE_DIAL";
+        case RIL_REQUEST_DIAL_WITH_SIP_URI: return "DIAL_WITH_SIP_URI";
+        case RIL_REQUEST_HOLD_CALL: return "HOLD_CALL";
+        case RIL_REQUEST_RESUME_CALL: return "RESUME_CALL";
+        case RIL_UNSOL_ECONF_SRVCC_INDICATION : return "ECONF_SRVCC_INDICATION";
+        case RIL_UNSOL_ECONF_RESULT_INDICATION : return "ECONF_RESULT_INDICATION";
+        case RIL_UNSOL_MAL_AT_INFO : return "UNSOL_MAL_AT_INFO";
+        case RIL_REQUEST_MODEM_POWEROFF: return "MODEM_POWEROFF";
+        case RIL_REQUEST_MODEM_POWERON: return "MODEM_POWERON";
+        case RIL_REQUEST_WRITE_SMS_TO_SIM: return "WRITE_SMS_TO_SIM";
+        case RIL_REQUEST_QUERY_ICCID: return "RIL_REQUEST_QUERY_ICCID";
+        case RIL_UNSOL_TX_POWER: return "RIL_UNSOL_TX_POWER";
+        case RIL_UNSOL_NETWORK_INFO: return "RIL_UNSOL_NETWORK_INFO";
+        case RIL_REQUEST_DELETE_SMS_ON_SIM: return "DELETE_SMS_ON_SIM";
+        case RIL_REQUEST_SET_IMSCFG: return "RIL_REQUEST_SET_IMSCFG";
+#ifdef ECALL_SUPPORT
+        case RIL_REQUEST_ECALL_FAST_MAKE_ECALL: return "ECALL_FAST_MAKE_ECALL";
+        case RIL_REQUEST_ECALL_SET_IVS: return "RIL_REQUEST_ECALL_SET_IVS";
+        case RIL_REQUEST_ECALL_SET_PSAP: return "RIL_REQUEST_ECALL_SET_PSAP";
+        case RIL_REQUEST_ECALL_MAKE_ECALL: return "RIL_REQUEST_ECALL_MAKE_ECALL";
+        case RIL_REQUEST_ECALL_IVS_PUSH_MSD: return "RIL_REQUEST_ECALL_IVS_PUSH_MSD";
+        case RIL_REQUEST_ECALL_PSAP_PULL_MSD: return "RIL_REQUEST_ECALL_PSAP_PULL_MSD";
+        case RIL_UNSOL_ECALL_MSDHACK : return "ECALL_MSDHACK";
+        case RIL_REQUEST_ECALL_SET_MSD: return "RIL_REQUEST_ECALL_SET_MSD";
+        case RIL_REQUEST_ECALL_CTRL_SEQUENCE: return "ECALL_SET_CTRL_SEQUENCE";
+        case RIL_UNSOL_ECALL_INDICATIONS : return "ECALL_INDICATIONS";
+        case RIL_REQUEST_ECALL_RESET_IVS: return "RIL_REQUEST_ECALL_RESET_IVS";
+        case RIL_REQUEST_ECALL_SET_PRI: return "RIL_REQUEST_ECALL_SET_PRI";
+        case RIL_REQUEST_ECALL_SET_TEST_NUM: return "RIL_REQUEST_ECALL_SET_TEST_NUM";
+        case RIL_REQUEST_ECALL_SET_RECONF_NUM: return "RIL_REQUEST_ECALL_SET_RECONF_NUM";
+        case RIL_REQUEST_SYNC_DATA_SETTINGS_TO_MD: return "RIL_REQUEST_SYNC_DATA_SETTINGS_TO_MD";
+        case RIL_REQUEST_ECALL_SET_NAD_DEREGISTRATION_TIME: return "RIL_REQUEST_ECALL_SET_NAD_DEREGISTRATION_TIME";
+        case RIL_REQUEST_ECALL_SET_REGISTRATION_STATE: return "RIL_REQUEST_ECALL_SET_REGISTRATION_STATE";
+#endif /*ECALL_SUPPORT*/
+#ifdef KEEP_ALIVE
+        case RIL_REQUEST_START_KEEPALIVE_PRO: return "RIL_REQUEST_START_KEEPALIVE_PRO";
+        case RIL_REQUEST_STOP_KEEPALIVE_PRO: return "RIL_REQUEST_STOP_KEEPALIVE_PRO";
+        case RIL_UNSOL_KEEPALIVE_STATUS_PRO: return "RIL_UNSOL_KEEPALIVE_STATUS_PRO";
+#endif /*KEEP_ALIVE*/
+        case RIL_REQUEST_SEND_USSI: return "SEND_USSI";
+        case RIL_REQUEST_CANCEL_USSI: return "CANCEL_USSI";
+        case RIL_REQUEST_GET_SMS_SIM_MEM_STATUS: return "GET_SMS_SIM_MEM_STATUS";
+        case RIL_UNSOL_SIP_CALL_PROGRESS_INDICATOR: return "RIL_UNSOL_SIP_CALL_PROGRESS_INDICATOR";
+        case RIL_REQUEST_REPORT_AIRPLANE_MODE: return "RIL_REQUEST_REPORT_AIRPLANE_MODE";
+        case RIL_REQUEST_SET_ECC_NUM: return "RIL_REQUEST_SET_ECC_NUM";
+        case RIL_REQUEST_GET_ECC_NUM: return "RIL_REQUEST_GET_ECC_NUM";
+        case RIL_UNSOL_ECC_NUM: return "RIL_UNSOL_ECC_NUM";
+        case RIL_REQUEST_QUERY_AVAILABLE_NETWORKS_WITH_ACT: return "RIL_REQUEST_QUERY_AVAILABLE_NETWORKS_WITH_ACT";
+        case RIL_REQUEST_GSM_GET_BROADCAST_LANGUAGE: return "RIL_REQUEST_GSM_GET_BROADCAST_LANGUAGE";
+        case RIL_REQUEST_GSM_SET_BROADCAST_LANGUAGE: return "RIL_REQUEST_GSM_SET_BROADCAST_LANGUAGE";
+        case RIL_UNSOL_CALL_INFO_INDICATION: return "RIL_UNSOL_CALL_INFO_INDICATION";
+        case RIL_REQUEST_MODIFY_APN: return "RIL_REQUEST_MODIFY_APN";
+        case RIL_REQUEST_RESET_APN: return "RIL_REQUEST_RESET_APN";
+        case RIL_REQUEST_QUERY_SIM_RETRY_COUNT: return "RIL_REQUEST_QUERY_SIM_RETRY_COUNT";
+        case RIL_REQUEST_QUERY_EID: return "RIL_REQUEST_QUERY_EID";
+        case LYNQ_REQUEST_SET_DTMF_VOLUME: return "RIL_REQUEST_SET_DTMF_VOLUME";
+        case LYNQ_REQUEST_SET_SPEECH_VOLUME: return "RIL_REQUEST_SET_SPEECH_VOLUME";
+        case LYNQ_REQUEST_GET_SPEECH_VOLUME: return "RIL_REQUEST_GET_SPEECH_VOLUME";
+        case LYNQ_REQUEST_RECORD: return "RIL_REQUEST_RECORD";
+        /*warren add for t800 ril service 2022/1/22 start*/
+        case LYNQ_REQUEST_WRITE_SMS_TO_MEMORY: return "LYNQ_REQUEST_WRITE_SMS_TO_MEMORY";
+        case LYNQ_REQUEST_READ_SMS_FROM_MEMORY: return "LYNQ_REQUEST_READ_SMS_FROM_MEMORY";
+        case LYNQ_REQUEST_DELETE_SMS_FROM_MEMORY: return "LYNQ_REQUEST_DELETE_SMS_FROM_MEMORY";
+        case LYNQ_REQUEST_LIST_SMS_FROM_MEMORY: return "LYNQ_REQUEST_LIST_SMS_FROM_MEMORY";
+        case LYNQ_REQUEST_SET_DEFAULT_SIM_ALL:return "SET_DEFAULT_SIM_ALL";
+        case LYNQ_REQUEST_CHANGE_SCREEN_STATE:return "LYNQ_REQUEST_CHANGE_SCREEN_STATE";/*jb.qi add for two sim sleep 2022/9/19*/
+        case LYNQ_REQUEST_CHANGE_RADIO:return "LYNQ_REQUEST_CHANGE_RADIO";/*lei add for factory test of sleep 2022/9/19*/
+        /*warren add for t800 ril service 2022/1/22 end*/
+        default: return "<unknown request>";
+    }
+}
+
+
diff --git a/src/lynq/lib/liblynq-network/lynq_module_socket.h b/src/lynq/lib/liblynq-network/lynq_module_socket.h
index fb1785a..98f968e 100755
--- a/src/lynq/lib/liblynq-network/lynq_module_socket.h
+++ b/src/lynq/lib/liblynq-network/lynq_module_socket.h
@@ -4,15 +4,19 @@
 using ::android::Parcel;
 
 int lynq_set_test_network(const int test_mode);
-int lynq_send_common_request(Parcel*& p, int time_out, int request_id,  int argc, const char* format,...);
-int lynq_server_socket_start();
-int lynq_urc_socket_start();
-void lynq_close_urc_thread();
-void lynq_close_rc_thread();
 
 extern int g_module_Global_uToken;
 extern int g_wait_time;
+int lynq_send_common_request(Parcel*& p, int time_out, int request_id,  int argc, const char* format,...);
+
+int lynq_start_all_urc_socket_thread();
+void lynq_close_all_urc_socket_thread();
+int lynq_start_all_rc_socket_thread();
+void lynq_close_all_rc_socket_thread();
+
+const char * requestToString(int request);
 
 void urc_msg_process(Parcel *p);
+bool is_support_urc(int urc_id);
 
 #endif
diff --git a/src/lynq/lib/liblynq-network/lynq_module_state_buffer.cpp b/src/lynq/lib/liblynq-network/lynq_module_state_buffer.cpp
index d7c9111..1d0b5af 100755
--- a/src/lynq/lib/liblynq-network/lynq_module_state_buffer.cpp
+++ b/src/lynq/lib/liblynq-network/lynq_module_state_buffer.cpp
@@ -161,7 +161,7 @@
 void deinit_network_timer_all() 
 {
     for(int i=0;i<NETWORK_STATE_BUFFER_TYPE_MAX;i++){
-        stop_network_timer(&s_state_buffer_timer[i],s_state_buffer_sig_value[i]); 
+        stop_network_timer(s_state_buffer_timer[i],s_state_buffer_sig_value[i]); 
         s_state_buffer_valid[i] = false;
     }
 }
diff --git a/src/lynq/lib/liblynq-network/lynq_network.cpp b/src/lynq/lib/liblynq-network/lynq_network.cpp
index cca772f..98e33f6 100755
--- a/src/lynq/lib/liblynq-network/lynq_network.cpp
+++ b/src/lynq/lib/liblynq-network/lynq_network.cpp
@@ -54,8 +54,8 @@
     int ret;
 
     init_network_timer_all();
-
-    ret = lynq_urc_socket_start();
+	
+    ret = lynq_start_all_urc_socket_thread();
     if(ret != 0)
     {
         LYERRLOG("init socket urc fail!!!");
@@ -63,11 +63,11 @@
         return LYNQ_E_INNER_ERROR;
     }
 
-    ret = lynq_server_socket_start();
+    ret = lynq_start_all_rc_socket_thread();
     if(ret !=0)
     {
         LYERRLOG("init socket client fail!!!");
-        lynq_close_urc_thread();
+        lynq_close_all_urc_socket_thread();
         g_module_init_flag = MODULE_CLOSED;  
         return LYNQ_E_INNER_ERROR;
     }
@@ -85,8 +85,8 @@
     }  
     g_module_init_flag = MODULE_SWITCHING;
 
-    lynq_close_urc_thread();
-    lynq_close_rc_thread();    
+    lynq_close_all_urc_socket_thread();
+    lynq_close_all_rc_socket_thread();    
     deinit_network_timer_all();
 
     g_module_init_flag = MODULE_CLOSED;
@@ -1113,6 +1113,20 @@
     return;
 }
 
+bool is_support_urc(int urc_id)
+{
+    switch(urc_id)
+    {
+        case RIL_UNSOL_RESPONSE_VOICE_NETWORK_STATE_CHANGED:
+        case RIL_UNSOL_RESPONSE_PS_NETWORK_STATE_CHANGED:
+        case RIL_UNSOL_RESPONSE_IMS_NETWORK_STATE_CHANGED:
+        case RIL_UNSOL_SIGNAL_STRENGTH:
+            return true;                
+        default:
+            return false;
+    }    
+}
+
 void urc_msg_process(Parcel *p)
 { 
     int resp_type; 
@@ -1121,10 +1135,11 @@
     int urc_LTE_signalstrength = 0;
     int urc_WCDMA_signalstrength = 0;
 
+    int size=p->dataSize();
     p->readInt32(&resp_type);
     p->readInt32(&s_module_wait_urc_id);
     p->readInt32(&s_module_urc_slot_id);
-    LYINFLOG("urc id = %d, slot_id = %d",s_module_wait_urc_id,s_module_urc_slot_id);
+    LYINFLOG("%s urc id = %d, slot_id = %d, size is %d, msg is %s",__func__, s_module_wait_urc_id,s_module_urc_slot_id,size,requestToString(s_module_wait_urc_id));
     switch(s_module_wait_urc_id)
     {
         case RIL_UNSOL_RESPONSE_VOICE_NETWORK_STATE_CHANGED:
diff --git a/src/lynq/lib/liblynq-network/makefile b/src/lynq/lib/liblynq-network/makefile
index 491d547..0ae6805 100755
--- a/src/lynq/lib/liblynq-network/makefile
+++ b/src/lynq/lib/liblynq-network/makefile
@@ -22,6 +22,7 @@
   -I$(ROOT)$(includedir)/liblog \
   -I$(ROOT)$(includedir)/vendor-ril \
   -I$(ROOT)$(includedir)/include \
+  -I$(ROOT)$(includedir)/lynq_shm \
 
 
 
@@ -35,6 +36,7 @@
     -llynq-log \
 	-lutils \
     -lcutils \
+    -llynq-shm \
 
 SOURCES = $(wildcard *.cpp)
 
diff --git a/src/lynq/lib/liblynq-protcl/ftp/lynq_ftpclient.c b/src/lynq/lib/liblynq-protcl/ftp/lynq_ftpclient.c
index 87220ee..10299d1 100644
--- a/src/lynq/lib/liblynq-protcl/ftp/lynq_ftpclient.c
+++ b/src/lynq/lib/liblynq-protcl/ftp/lynq_ftpclient.c
@@ -250,13 +250,14 @@
 }
 
 
-int lynq_ftp_download(lynq_ftp_socker_info* FTP)
+int lynq_ftp_download(lynq_ftp_socker_info* FTP, char *put_pach)
 {
 	char catbuf[1024];
 	int data_sock;
 	int recvbytes, sendbytes;
 	char sendline[1024] = "", recvline[1024] = "";
-	char getfilepath[FTP_MAX_ASCII_LEN+5] = "/tmp/";
+	char getfilepath[FTP_MAX_ASCII_LEN+5];
+    strcpy(getfilepath, put_pach);    
 
 #if 1
 	//type
diff --git a/src/lynq/lib/liblynq-protcl/include/ftp/lynq_ftp.h b/src/lynq/lib/liblynq-protcl/include/ftp/lynq_ftp.h
index 12e3f09..c0344bf 100644
--- a/src/lynq/lib/liblynq-protcl/include/ftp/lynq_ftp.h
+++ b/src/lynq/lib/liblynq-protcl/include/ftp/lynq_ftp.h
@@ -153,7 +153,7 @@
 extern void lynq_ftp_get(int sck, char *pDownloadFileName, int session);
 extern void lynq_ftp_rest(int control_sockfd);
 extern int cliopen(char *hoster, int port);
-extern int lynq_ftp_download(lynq_ftp_socker_info* FTP);
+extern int lynq_ftp_download(lynq_ftp_socker_info* FTP, char *put_pach);
 extern int lynq_ftp_up(lynq_ftp_socker_info* FTP);
 int lynq_ftp_ls(lynq_ftp_socker_info* FTP);
 void lynq_ftp_cd(lynq_ftp_socker_info* FTP);
diff --git a/src/lynq/lib/liblynq-shm/LICENSE b/src/lynq/lib/liblynq-shm/LICENSE
new file mode 100755
index 0000000..605b7ea
--- /dev/null
+++ b/src/lynq/lib/liblynq-shm/LICENSE
@@ -0,0 +1,31 @@
+Copyright Statement:
+
+This software/firmware and related documentation ("MobileTek Software") are
+protected under relevant copyright laws. The information contained herein is
+confidential and proprietary to MobileTek Inc. and/or its licensors. Without
+the prior written permission of MobileTek inc. and/or its licensors, any
+reproduction, modification, use or disclosure of MobileTek Software, and
+information contained herein, in whole or in part, shall be strictly
+prohibited.
+
+MobileTek Inc. (C) 2015. All rights reserved.
+
+BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MobileTek SOFTWARE")
+RECEIVED FROM MobileTek AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
+ON AN "AS-IS" BASIS ONLY. MobileTek EXPRESSLY DISCLAIMS ANY AND ALL
+WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
+WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+NONINFRINGEMENT. NEITHER DOES MobileTek PROVIDE ANY WARRANTY WHATSOEVER WITH
+RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
+INCORPORATED IN, OR SUPPLIED WITH THE MobileTek SOFTWARE, AND RECEIVER AGREES
+TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
+RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
+OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MobileTek
+SOFTWARE. MobileTek SHALL ALSO NOT BE RESPONSIBLE FOR ANY MobileTek SOFTWARE
+RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MobileTek'S
+ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MobileTek SOFTWARE
+RELEASED HEREUNDER WILL BE, AT MobileTek'S OPTION, TO REVISE OR REPLACE THE
+MobileTek SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
+CHARGE PAID BY RECEIVER TO MobileTek FOR SUCH MobileTek SOFTWARE AT ISSUE.
diff --git a/src/lynq/lib/liblynq-shm/include/lynq_shm.h b/src/lynq/lib/liblynq-shm/include/lynq_shm.h
new file mode 100755
index 0000000..bbac100
--- /dev/null
+++ b/src/lynq/lib/liblynq-shm/include/lynq_shm.h
@@ -0,0 +1,26 @@
+/**
+ * @file shm.h
+ * @author hq
+ * @brief 
+ * @version 1.0
+ * @date 2022-12-16
+ * 
+ * @copyright Copyright (c) 2022
+ * 
+ */
+#ifndef __LYNQ_SHM_H__
+#define __LYNQ_SHM_H__
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+int ril_init_mem();
+void ril_deinit_mem();
+bool get_cur_shem_buffer_index(int size, int* level, int* index);
+bool get_shem_buffer_level(int size, int* level);
+char* get_shem_buffer(int level,int index);
+int get_max_shem_buffer_size();
+#ifdef __cplusplus
+}
+#endif 
+#endif //#ifndef __TEST_SHARED_MEMORY_INCLUDE__
diff --git a/src/lynq/lib/liblynq-shm/lynq_shm.cpp b/src/lynq/lib/liblynq-shm/lynq_shm.cpp
new file mode 100755
index 0000000..e06ca96
--- /dev/null
+++ b/src/lynq/lib/liblynq-shm/lynq_shm.cpp
@@ -0,0 +1,194 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+//#include <binder/Parcel.h>
+//#include <sys/socket.h>
+#include <errno.h>
+#include <stdbool.h>
+#include <sys/types.h>
+#include <unistd.h>
+#include "lynq_shm.h"
+#include <sys/shm.h>
+#include "log/log.h"
+
+#undef LOG_TAG
+#define LOG_TAG "SHM"
+
+#define shm_key "shm_key"    
+
+int shmid=-1; 
+
+static int s_use_count=0;
+
+typedef struct{
+    int num_of_buffer;
+    int size_of_buffer;
+    int cur_index;
+}lynq_shm_type_config;
+
+typedef enum{
+    shm_buf_type_256,
+    shm_buf_type_1k,
+    shm_buf_type_max,
+}lynq_shm_buf_type;
+
+lynq_shm_type_config s_lynq_shm_config[shm_buf_type_max]={
+    {10,256,0},
+    {5,1024,0}
+};
+
+static void * s_ril_shm_buf=(void*) -1L;
+
+static pthread_mutex_t s_shm_mtx = PTHREAD_MUTEX_INITIALIZER;
+
+bool get_cur_shem_buffer_index(int size, int* level, int* index)
+{
+    pthread_mutex_lock(&s_shm_mtx);
+    for(int i=0;i<shm_buf_type_max;i++)
+    {
+        if(size<=s_lynq_shm_config[i].size_of_buffer)
+        {
+            (*level)=i;
+            (*index)=(s_lynq_shm_config[i].cur_index)%s_lynq_shm_config[i].num_of_buffer;
+            s_lynq_shm_config[i].cur_index++;    
+            pthread_mutex_unlock(&s_shm_mtx);
+            return true;
+        }
+    }    
+    pthread_mutex_unlock(&s_shm_mtx);
+    return false;
+}
+
+bool get_shem_buffer_level(int size, int* level)
+{
+    for(int i=0;i<shm_buf_type_max;i++)
+    {
+        if(size<=s_lynq_shm_config[i].size_of_buffer)
+        {
+            (*level)=i;
+            return true;
+        }
+    }    
+    return false;
+}
+
+
+char* get_shem_buffer(int level,int index)
+{    
+    int offset=0;
+    for(int i=0;i<level;i++)
+    {
+        offset+=s_lynq_shm_config[i].num_of_buffer*s_lynq_shm_config[i].size_of_buffer;
+    }
+    offset+=s_lynq_shm_config[level].size_of_buffer*index;
+    return ((char*) s_ril_shm_buf)+offset;
+}
+
+int get_max_shem_buffer_size()
+{
+    return s_lynq_shm_config[shm_buf_type_max-1].size_of_buffer;
+}
+
+int get_total_shem_buffer_size()
+{
+    int total_size=0;
+    for(int i=0;i<shm_buf_type_max;i++)
+    {
+        total_size+=s_lynq_shm_config[i].num_of_buffer*s_lynq_shm_config[i].size_of_buffer;
+    }
+    return total_size;
+}
+
+static int create_shm_common(int size,int flags)
+{
+    RLOGD("create shared memory\n");
+ 
+//  key_t key = ftok(shm_key, 's');
+    key_t key=0x123456;
+    if (key == -1) 
+    {
+        RLOGE("ftok error.\n");
+        return -1;
+    }
+    RLOGD("key is 0x%x\n", key);
+ 
+    int shmid = shmget(key,size , flags);
+    if (shmid == -1) 
+    {
+        RLOGE("shmget error.\n");
+        return -1;
+    }
+    RLOGD("shmid is %d\n", shmid);
+ 
+    return shmid;
+}
+
+int create_shm()
+{
+    shmid = create_shm_common(get_total_shem_buffer_size(),IPC_CREAT|0644);
+
+    if(shmid==-1)
+    {
+        return -1;
+    }
+    s_ril_shm_buf = shmat(shmid, NULL, 0);
+    if (s_ril_shm_buf == (void*) -1L) 
+    {
+        RLOGE("shmat error.\n");
+        return -1;
+    }
+    return 0;    
+}
+ 
+void remove_shm()
+{
+    if(shmid!=-1)
+    {
+        if (shmdt(s_ril_shm_buf) != 0) 
+        {
+            RLOGE("shmdt error.\n");      
+        }        
+        shmid = -1;
+    }
+    s_ril_shm_buf = (void*) -1L;
+    return ;
+}
+
+int ril_init_mem()
+{   
+    pthread_mutex_lock(&s_shm_mtx);
+    RLOGE("init begin, use count is %d.\n",s_use_count);      
+    if(s_use_count==0)
+    {
+        if(create_shm()!=0)
+        {
+            RLOGE("init end, use count is %d.\n",s_use_count);       
+            pthread_mutex_unlock(&s_shm_mtx);
+            return -1;
+        }    
+    }
+    s_use_count++;
+    RLOGE("init end, use count is %d.\n",s_use_count);       
+    pthread_mutex_unlock(&s_shm_mtx);
+    return 0;
+}
+
+void ril_deinit_mem()
+{
+    pthread_mutex_lock(&s_shm_mtx);
+
+    RLOGE("de-init begin, use count is %d.\n",s_use_count);      
+    if(s_use_count==1)
+    {
+        remove_shm();        
+    }
+
+    if(s_use_count>0)
+    {
+        s_use_count--;    
+    }
+    RLOGE("de-init end, use count is %d.\n",s_use_count);      
+    pthread_mutex_unlock(&s_shm_mtx);
+    return ;
+}
+
diff --git a/src/lynq/lib/liblynq-shm/makefile b/src/lynq/lib/liblynq-shm/makefile
new file mode 100755
index 0000000..806cc77
--- /dev/null
+++ b/src/lynq/lib/liblynq-shm/makefile
@@ -0,0 +1,62 @@
+SHELL = /bin/sh
+RM = rm -f
+
+LOCAL_CFLAGS := -Wall \
+                -g -Os \
+                -flto \
+                -fPIC       
+
+PWD := $(shell pwd)
+
+$(warning ################# lynq shm ROOT: $(ROOT),includedir:$(includedir), PWD :$(PWD))
+LOCAL_PATH   = .
+
+LOCAL_C_INCLUDES = \
+  -I. \
+  -I$(LOCAL_PATH)/include \
+  -I$(ROOT)$(includedir) \
+
+LOCAL_LIBS := \
+    -L. \
+    -ldl \
+    -llog \
+#   -lbinder \
+    -lpthread \
+#   -lutils \
+#   -lcutils \
+
+SOURCES = $(wildcard *.cpp)
+
+EXECUTABLE = liblynq-shm.so
+
+OBJECTS=$(SOURCES:.c=.o)
+all: $(EXECUTABLE)
+
+$(EXECUTABLE): $(OBJECTS)
+	$(CXX) -shared -Wl,--no-undefined $(OBJECTS) $(LOCAL_LIBS) $(LOCAL_CFLAGS) $(LOCAL_C_INCLUDES) -o $@
+
+%.o : %.c
+	$(CC) $(LOCAL_C_INCLUDES) $(LOCAL_CFLAGS) $(LOCAL_LIBS) -o $@ -c $<
+
+build:  $(EXECUTABLE)
+	$(warning ########## build $(EXECUTABLE)  ##########)
+
+install:
+	$(warning ################# lynq shm EXECUTABLE: $(EXECUTABLE),base:$(base_libdir))
+	mkdir -p $(ROOT)$(base_libdir)/
+	install $(EXECUTABLE) $(ROOT)$(base_libdir)/
+
+pack_rootfs:
+	$(warning ################# lynq shm PACK: $(PACK_INITRAMFS_TO),base:$(base_libdir))
+	mkdir -p $(PACK_INITRAMFS_TO)$(base_libdir)/
+	cp -af $(EXECUTABLE) $(PACK_INITRAMFS_TO)$(base_libdir)/
+	$(CROSS)strip $(PACK_INITRAMFS_TO)$(base_libdir)/$(EXECUTABLE)
+	mkdir -p $(PACK_TO)$(base_libdir)/
+	cp -af $(EXECUTABLE) $(PACK_TO)$(base_libdir)/
+	$(CROSS)strip $(PACK_TO)$(base_libdir)/$(EXECUTABLE)
+
+.PHONY: clean
+clean:
+	$(RM) $(OBJECTS) $(EXECUTABLE)
+
+
diff --git a/src/lynq/lib/liblynq-sms/LICENSE b/src/lynq/lib/liblynq-sms/LICENSE
index 77f59ed..605b7ea 100755
--- a/src/lynq/lib/liblynq-sms/LICENSE
+++ b/src/lynq/lib/liblynq-sms/LICENSE
@@ -1,31 +1,31 @@
 Copyright Statement:
 
-This software/firmware and related documentation ("MediaTek Software") are
+This software/firmware and related documentation ("MobileTek Software") are
 protected under relevant copyright laws. The information contained herein is
-confidential and proprietary to MediaTek Inc. and/or its licensors. Without
-the prior written permission of MediaTek inc. and/or its licensors, any
-reproduction, modification, use or disclosure of MediaTek Software, and
+confidential and proprietary to MobileTek Inc. and/or its licensors. Without
+the prior written permission of MobileTek inc. and/or its licensors, any
+reproduction, modification, use or disclosure of MobileTek Software, and
 information contained herein, in whole or in part, shall be strictly
 prohibited.
 
-MediaTek Inc. (C) 2015. All rights reserved.
+MobileTek Inc. (C) 2015. All rights reserved.
 
 BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
-THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
-RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
-ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL
+THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MobileTek SOFTWARE")
+RECEIVED FROM MobileTek AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
+ON AN "AS-IS" BASIS ONLY. MobileTek EXPRESSLY DISCLAIMS ANY AND ALL
 WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
 WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
-NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH
+NONINFRINGEMENT. NEITHER DOES MobileTek PROVIDE ANY WARRANTY WHATSOEVER WITH
 RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
-INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES
+INCORPORATED IN, OR SUPPLIED WITH THE MobileTek SOFTWARE, AND RECEIVER AGREES
 TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
 RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
-OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK
-SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE
+OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MobileTek
+SOFTWARE. MobileTek SHALL ALSO NOT BE RESPONSIBLE FOR ANY MobileTek SOFTWARE
 RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
-STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S
-ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE
-RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE
-MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
-CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MobileTek'S
+ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MobileTek SOFTWARE
+RELEASED HEREUNDER WILL BE, AT MobileTek'S OPTION, TO REVISE OR REPLACE THE
+MobileTek SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
+CHARGE PAID BY RECEIVER TO MobileTek FOR SUCH MobileTek SOFTWARE AT ISSUE.
diff --git a/src/lynq/lib/liblynq-sms/include/libsms/lynq_sms.h b/src/lynq/lib/liblynq-sms/include/libsms/lynq_sms.h
index 64547c9..0d346a6 100755
--- a/src/lynq/lib/liblynq-sms/include/libsms/lynq_sms.h
+++ b/src/lynq/lib/liblynq-sms/include/libsms/lynq_sms.h
@@ -1,9 +1,9 @@
-#ifndef YLNQ_SMS_H
-#define YLNQ_SMS_H 1
-#include <sys/types.h>
+#ifndef LYNQ_SMS_H
+#define LYNQ_SMS_H 1
 #ifdef __cplusplus
 extern "C" {
 #endif
+
 #define MIN_MSM_PARAM_NUM 4
 #define MIN_IMS_MSM_PARAM_NUM 6
 #define MIN_WRITE_MSM_PARAM_NUM 5
@@ -12,6 +12,7 @@
 #define STORAGE_SMS_MAX_SIZE 128
 #define SMSC_MAX_LEN 22
 #define SMS_NUM_MAX 255
+
 int lynq_sms_init(int uToken);
 int lynq_sms_deinit(void);
 int lynq_send_sms(char telephony_num[TELEPHONE_NUM_LEN], int charset, char *msg, int msglen);
@@ -21,9 +22,6 @@
 int lynq_list_sms(char index_list[SMS_NUM_MAX]);
 int lynq_delete_sms(int index);
 int lynq_wait_receive_new_sms(int *handle);
-
-
-
 #ifdef __cplusplus
 }
 #endif
diff --git a/src/lynq/lib/liblynq-sms/lynq_module_common.h b/src/lynq/lib/liblynq-sms/lynq_module_common.h
new file mode 100755
index 0000000..590971a
--- /dev/null
+++ b/src/lynq/lib/liblynq-sms/lynq_module_common.h
@@ -0,0 +1,75 @@
+#ifndef LYNQ_MODULE_COMMON_H
+#define LYNQ_MODULE_COMMON_H 
+
+#define RESULT_OK (0)
+#define RESULT_ERROR (-1)
+
+/*the same with lynq_interface.h begin*/
+#define LYNQ_REQUEST_VENDOR_BASE 8000
+#define LYNQ_URC_VENDOR_BASE 9000
+#define LYNQ_AT_SNED (LYNQ_REQUEST_VENDOR_BASE +1)
+#define LYNQ_URC_CALL_STATUS_IND (LYNQ_URC_VENDOR_BASE+1)
+#define LYNQ_URC_DATA_STATUS_IND (LYNQ_URC_VENDOR_BASE+2)
+#define LYNQ_URC_DATA_CALL_STATUS_IND (LYNQ_URC_VENDOR_BASE+3)
+#define LYNQ_AUTO_ANSWER_CALL (LYNQ_REQUEST_VENDOR_BASE +2)
+#define LYNQ_REQUEST_SET_DTMF_VOLUME (LYNQ_REQUEST_VENDOR_BASE +3)
+#define LYNQ_URC_MODIFY_APNDB (LYNQ_URC_VENDOR_BASE+4)
+#define LYNQ_URC_RESET_APNDB (LYNQ_URC_VENDOR_BASE+5)
+
+
+#define LYNQ_REQUEST_WRITE_SMS_TO_MEMORY (LYNQ_REQUEST_VENDOR_BASE +4)
+#define LYNQ_REQUEST_READ_SMS_FROM_MEMORY (LYNQ_REQUEST_VENDOR_BASE + 5)
+#define LYNQ_REQUEST_DELETE_SMS_FROM_MEMORY (LYNQ_REQUEST_VENDOR_BASE + 6)
+#define LYNQ_REQUEST_LIST_SMS_FROM_MEMORY (LYNQ_REQUEST_VENDOR_BASE + 7)
+#define LYNQ_REQUEST_SET_DEFAULT_SIM_ALL (LYNQ_REQUEST_VENDOR_BASE + 8)
+
+#define LYNQ_REQUEST_SET_SPEECH_VOLUME (LYNQ_REQUEST_VENDOR_BASE +9)
+#define LYNQ_REQUEST_GET_SPEECH_VOLUME (LYNQ_REQUEST_VENDOR_BASE +10)
+#define LYNQ_REQUEST_RECORD  (LYNQ_REQUEST_VENDOR_BASE +11)
+#define LYNQ_REQUEST_OOS_RECOVER_TIMER_INTERVAL (LYNQ_REQUEST_VENDOR_BASE +12)
+#define LYNQ_REQUEST_OOS_DEEP_SLEEP_RECOVER_TIMER_INTERVAL (LYNQ_REQUEST_VENDOR_BASE +13)
+#define LYNQ_REQUEST_CHANGE_SCREEN_STATE (LYNQ_REQUEST_VENDOR_BASE + 14)/*jb.qi add for two sim suspend 2022/9/19*/
+#define LYNQ_REQUEST_CHANGE_RADIO (LYNQ_REQUEST_VENDOR_BASE + 15)
+/*the same with lynq_interface.h end*/
+
+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;
+
+#define MODULE_CLOSED (0)
+#define MODULE_SWITCHING  (1)
+#define MODULE_RUNNING (2)
+
+extern int g_module_init_flag;
+
+#endif
diff --git a/src/lynq/lib/liblynq-sms/lynq_module_socket.cpp b/src/lynq/lib/liblynq-sms/lynq_module_socket.cpp
new file mode 100755
index 0000000..4b6f020
--- /dev/null
+++ b/src/lynq/lib/liblynq-sms/lynq_module_socket.cpp
@@ -0,0 +1,1041 @@
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <arpa/inet.h>
+#include <string.h>
+#include <unistd.h>
+#include <binder/Parcel.h>
+#include <log/log.h>
+#include <cutils/jstring.h>
+#include <pthread.h>
+#include <list>
+#include <vendor-ril/telephony/ril.h>
+#include <vendor-ril/telephony/mtk_ril_sp.h>
+#include "lynq_sms.h"
+#include "lynq_module_common.h"
+#include "lynq_module_socket.h"
+#include "liblog/lynq_deflog.h"
+#include "lynq_shm.h"
+
+#define LYNQ_SERVICE_PORT 8088
+#define LYNQ_ADDRESS "127.0.0.1"
+#define LYNQ_URC_SERVICE_PORT 8086
+#define LYNQ_URC_ADDRESS "0.0.0.0"
+#define LYNQ_REQUEST_PARAM_BUF 8192
+#define LYNQ_REC_BUF 8192
+
+#define USER_LOG_TAG "LYNQ_NETWORK"
+
+typedef struct{
+    int uToken;
+    int request;
+    int paramLen;
+    char param[LYNQ_REQUEST_PARAM_BUF];
+}lynq_client_t;
+
+typedef struct{
+    int resp_type;
+    int token;
+    int request;
+    int slot_id;
+    int error;
+}lynq_resp_t;
+
+typedef struct{
+    int resp_type;
+    int urcid;   
+}lynq_head_t;
+
+lynq_client_t client_t;
+lynq_resp_t response;
+
+int module_len_rc_addr_serv;
+int module_len_urc_addr_serv;
+struct sockaddr_in module_rc_addr_serv;
+struct sockaddr_in module_urc_addr_serv;
+static int module_rc_sock_fd = -1;
+static int module_urc_sock_fd = -1;
+int module_urc_status = 1;
+int module_rc_status = 1;
+pthread_t module_urc_tid = -1;
+pthread_t module_rc_tid = -1;
+static pthread_mutex_t s_urc_mutex = PTHREAD_MUTEX_INITIALIZER;
+
+/*hq add for set waiting time 2022/09/13 begin*/
+static pthread_mutex_t s_sendto_mutex = PTHREAD_MUTEX_INITIALIZER;
+static pthread_mutex_t s_RecvMsgBlockMutex = PTHREAD_MUTEX_INITIALIZER;
+static pthread_cond_t s_WaitRecvMsgCond = PTHREAD_COND_INITIALIZER;
+#define BLOCK_RECV_MSG_LOCK() pthread_mutex_lock(&s_RecvMsgBlockMutex)
+#define BLOCK_RECV_MSG_UNLOCK() pthread_mutex_unlock(&s_RecvMsgBlockMutex)
+#define BLOCK_WAIT_RECV_MSG_TIME_OUT(a) pthread_cond_timedwait(&s_WaitRecvMsgCond, &s_RecvMsgBlockMutex,(a))
+#define BLOCK_WAKEUP_RECV_MSG() pthread_cond_broadcast(&s_WaitRecvMsgCond)
+static std::list<Parcel*> s_recv_parcel_list;
+const int waitResponse(int token,int time_out);
+/*hq add for set waiting time 2022/09/13 end*/
+
+/*hq add for urc process asynchronous 2022/12/26 begin*/
+static pthread_mutex_t s_ProcessUrcMsgBlockMutex = PTHREAD_MUTEX_INITIALIZER;
+static pthread_cond_t s_WaitProcessUrcMsgCond = PTHREAD_COND_INITIALIZER;
+
+#define BLOCK_PROCESS_URC_MSG_INIT() pthread_mutex_init(&s_ProcessUrcMsgBlockMutex,NULL)
+#define BLOCK_PROCESS_URC_MSG_LOCK() pthread_mutex_lock(&s_ProcessUrcMsgBlockMutex)
+#define BLOCK_PROCESS_URC_MSG_UNLOCK() pthread_mutex_unlock(&s_ProcessUrcMsgBlockMutex)
+#define BLOCK_WAIT_PROCESS_URC_MSG() pthread_cond_wait(&s_WaitProcessUrcMsgCond, &s_ProcessUrcMsgBlockMutex)
+#define BLOCK_WAKEUP_PROCESS_URC_MSG() pthread_cond_broadcast(&s_WaitProcessUrcMsgCond)
+static std::list<Parcel*> s_recv_urc_parcel_list;
+void *thread_urc_process(void *p);
+pthread_t module_urc_process_tid = -1;
+int module_urc_process_status = 1;
+/*hq add for urc process asynchronous 2022/12/26 end*/
+
+int g_module_Global_uToken = 0;
+int g_wait_time=5;
+
+/*inner test*/
+static int s_inner_test=0;
+
+/**@brief just for inner test
+* @param test_mode [IN]: test mode
+*  0:success
+*  other:failure
+*/
+void lynq_set_test_mode(const int test_mode)
+{
+    if(test_mode<0)
+    {
+        g_wait_time = -test_mode;          
+    }
+    else if(test_mode==9999)
+    {
+        LYERRLOG("%s inner test para %d %d",__FUNCTION__,s_inner_test,g_wait_time);         
+    }    
+    else 
+    {
+        s_inner_test = test_mode;    
+    }
+}
+
+void cleanup_RecvMsgBlock_mutex(void *arg)
+{
+    BLOCK_RECV_MSG_UNLOCK(); 
+}
+
+/**@brief wait response with expected token and write msg to parcel in some time
+* @param p [IN]: pointer the parcel
+* @param token [IN]: the expected token for the response msg
+* @param time_out [IN]: timeout.
+* @return
+*  0:success
+*  other:failure
+*/
+const int waitResponse(Parcel*& p, int token,int time_out)
+{
+    int waitToken = token;
+    int wakeup_token=-1;
+    int resp_type;
+    struct timeval now;
+    struct timespec timeout;
+    int ret;
+    std::list<Parcel*>::iterator iter;
+    int cnt=0;
+
+    gettimeofday(&now,NULL);
+    timeout.tv_sec = now.tv_sec+time_out; //timeout is 1min
+    timeout.tv_nsec = now.tv_usec*1000;
+
+    LYINFLOG("%s wait token is %d, wait time is %d",__FUNCTION__,waitToken,time_out);
+
+    BLOCK_RECV_MSG_LOCK();
+    pthread_cleanup_push(cleanup_RecvMsgBlock_mutex, NULL); // thread cleanup handler
+    while(module_rc_status){
+        cnt++;
+        for(iter=s_recv_parcel_list.begin();iter!=s_recv_parcel_list.end();++iter)
+        {
+            (*iter)->setDataPosition(0);
+            (*iter)->readInt32(&resp_type);
+            (*iter)->readInt32(&wakeup_token);
+            if(wakeup_token==waitToken)
+            {
+                LYINFLOG("%s get waitToken",__FUNCTION__);
+                p=(*iter);
+                p->setDataPosition(0);
+                s_recv_parcel_list.erase(iter);
+                goto waitResponse_end;
+            }
+        }
+        LYINFLOG("%s no wait Token in msg list, list size is %d",__FUNCTION__,s_recv_parcel_list.size());
+        ret=BLOCK_WAIT_RECV_MSG_TIME_OUT(&timeout);
+        if(ret!=0)
+        {
+            LYERRLOG("%s no expected token %d after %d second",__FUNCTION__,waitToken,time_out);
+            break;
+        }
+    }
+waitResponse_end:
+    LYINFLOG("%s wait token is %d wakeup_token is %d, cnt is %d",__FUNCTION__,waitToken,wakeup_token,cnt);
+    pthread_cleanup_pop(0);
+    BLOCK_RECV_MSG_UNLOCK(); 
+    return wakeup_token==waitToken ? 0:LYNQ_E_TIME_OUT;
+}
+
+/**@brief print solicied response msg's head information
+* @param head [IN]: head information
+* @return none
+*/
+void PrintHeader(lynq_resp_t& head)
+{
+    LYINFLOG("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);
+}
+
+/**@brief get solicied response msg's head
+* @param head [OUT]: head information
+* @return
+*  0:success
+*  other:failure
+*/
+int GetHeader(Parcel* &p, lynq_resp_t& head)
+{
+    LYINFLOG("get header");
+    if(p->dataAvail() > 0)
+    {
+        p->readInt32(&(head.resp_type));
+        p->readInt32(&(head.token));
+        p->readInt32(&(head.request));
+        p->readInt32(&(head.slot_id));
+        p->readInt32(&(head.error));
+        PrintHeader(head);
+        return RESULT_OK;  
+    }
+    else
+    {
+        return RESULT_ERROR;  
+    }
+}
+
+/**@brief send msg to service and get response from service
+* @param request_id [IN]: request id
+* @param time_out [IN]: wait time uplimit
+* @param p [IN]: point to response msg's parcel
+* @param argc [IN]: how many parameters in parameter string
+* @param format [IN]: parameter string's format
+* @param ... [IN]: the specific parameter
+* @return
+*  0:success
+*  other:failure
+*/
+int lynq_send_common_request(Parcel*& p, int time_out, int request_id, int argc, const char* format,...)
+{
+    lynq_client_t client;
+    int ret;
+    int send_num;
+    
+    client.uToken = g_module_Global_uToken;
+    g_module_Global_uToken=(g_module_Global_uToken+1)%10000;/*0-10000*/
+    client.request = request_id;
+    client.paramLen = argc;
+    bzero(client.param,LYNQ_REQUEST_PARAM_BUF);
+    if(argc!=0)
+    {
+        va_list args;
+        va_start(args, format);
+        vsnprintf(client.param, LYNQ_REQUEST_PARAM_BUF, format, args);
+        va_end(args);
+    }
+    LYINFLOG("uToken=%d,request=%d,paralen=%d,param=%s",client.uToken,client.request,client.paramLen,client.param);
+    pthread_mutex_lock(&s_sendto_mutex);
+    if(s_inner_test==1)
+    {
+        send_num = 1;
+    }
+    else
+    {
+        send_num = sendto(module_rc_sock_fd,&client,sizeof(client),0,(struct sockaddr *)&module_rc_addr_serv,module_len_rc_addr_serv); 
+    }
+    if(s_inner_test>=1000)
+    {
+        time_out = s_inner_test-1000;
+    }        
+    pthread_mutex_unlock(&s_sendto_mutex);
+
+    if(send_num <= 0)
+    {
+        LYERRLOG("send request fail, send num is %d", send_num);
+        return LYNQ_E_SEND_REQUEST_FAIL;
+    }
+    ret = waitResponse(p, client.uToken,time_out);
+
+    if(ret==0)
+    {
+        lynq_resp_t head; 
+        ret=GetHeader(p,head);
+        if(ret!=0)
+        {
+            LYERRLOG("%s %d get head error %d",__FUNCTION__,client.uToken,ret);
+            delete p;
+            return LYNQ_E_GET_HEAD_ERROR;
+        }
+        if(head.error!=0)
+        {
+            LYERRLOG("%s %d mdm return head error %d",__FUNCTION__,client.uToken,head.error);
+            delete p;
+            return head.error;
+        }
+        LYERRLOG("%s %d suc",__FUNCTION__,client.uToken);
+        return RESULT_OK;
+    }
+
+    LYERRLOG("%s %d fail, ret is %d",__FUNCTION__,client.uToken,ret);
+   
+    return ret;
+}
+
+/*hq add for urc broadcase optimisson 2023/01/03 begin*/
+#define SHM_BUFFER_INDEX_OFFSET 1
+#define SHM_BUFFER_SIZE_OFFSET 16
+#define SHM_BUFFER_INDEX_MASK 0x0000007F
+#define SHM_BUFFER_SIZE_MASK 0x0000FFFF
+
+bool urc_data_is_in_shm_data(int responseType,int& level, int& index, int& size)
+{
+    int shm_index=((responseType>>SHM_BUFFER_INDEX_OFFSET)&SHM_BUFFER_INDEX_MASK);
+    if (shm_index>0)
+    {
+        index=shm_index-1;
+        size=((responseType>>SHM_BUFFER_SIZE_OFFSET)&SHM_BUFFER_SIZE_MASK);
+        if(size>=sizeof(int32_t)*3 && get_shem_buffer_level(size,&level))
+        {
+            LYINFLOG("urc_data_is_in_shm_data level is %d, index is %d size is %d",level,index,size);
+            return true;
+        }
+    }
+    LYINFLOG("urc_data_is_in_shm_data return false, responseType is %d",responseType);
+    return false;
+}
+/*hq add for urc broadcase optimisson 2023/01/03 end*/
+
+void *thread_urc_recv(void *p)
+{
+    Parcel *urc_p =NULL;
+    char urc_data[LYNQ_REC_BUF];
+    int res = 0;
+    lynq_head_t* phead;
+   
+    LYINFLOG("urc recv thread is running");
+    while(module_urc_status)
+    {
+        bzero(urc_data,LYNQ_REC_BUF);
+        res = recvfrom(module_urc_sock_fd,urc_data,sizeof(urc_data),0,(struct sockaddr *)&module_urc_addr_serv,(socklen_t*)&module_len_urc_addr_serv);
+        if(res<sizeof(int32_t)*2)
+        {
+            LYERRLOG("thread_urc_recv step2 fail: res is %d",res);
+            continue;
+        }
+        LYINFLOG("__FUNCTION__ %s __LINE__ %d\n", __FUNCTION__, __LINE__);
+        phead=(lynq_head_t*) urc_data;
+        if(is_support_urc(phead->urcid)==false)
+        {
+            continue;
+        }
+        urc_p = new Parcel();
+        if(urc_p == NULL)
+        {
+            LYERRLOG("new parcel failure!!!");
+            continue;
+        }
+        LYINFLOG("__FUNCTION__ %s __LINE__ %d\n", __FUNCTION__, __LINE__);
+        int level,index,size;
+        if(urc_data_is_in_shm_data(phead->resp_type,level,index,size))
+        {
+            LYINFLOG("__FUNCTION__ %s __LINE__ %d,use share memory\n", __FUNCTION__, __LINE__);
+            urc_p->setData((uint8_t *)get_shem_buffer(level,index),size); // p.setData((uint8_t *) buffer, buflen);                        
+        }
+        else if(res>=sizeof(int32_t)*3)
+        {
+            urc_p->setData((uint8_t *)urc_data,res); // p.setData((uint8_t *) buffer, buflen);            
+        }
+        else 
+        {    
+               LYERRLOG("res %d error!!!", res);
+            delete urc_p;
+            urc_p = NULL;
+            continue;
+        }
+        urc_p->setDataPosition(0);
+        if(urc_p->dataAvail()>0)
+        {
+            BLOCK_PROCESS_URC_MSG_LOCK();
+            s_recv_urc_parcel_list.push_back(urc_p);            
+            BLOCK_WAKEUP_PROCESS_URC_MSG();
+            BLOCK_PROCESS_URC_MSG_UNLOCK();
+            LYINFLOG("__FUNCTION__ %s __LINE__ %d\n", __FUNCTION__, __LINE__);
+        }
+        else 
+        {
+            delete urc_p;
+            urc_p = NULL;
+        }
+        LYINFLOG("__FUNCTION__ %s __LINE__ %d\n", __FUNCTION__, __LINE__);        
+    }
+    LYINFLOG("urc recv thread ended");
+    return NULL;
+}
+
+void cleanup_urc_process_mutex(void *arg)
+{
+    BLOCK_PROCESS_URC_MSG_UNLOCK();
+}
+
+void *thread_urc_process(void *p)
+{
+    Parcel *urc_p =NULL;
+    std::list<Parcel*>::iterator iter;
+   
+    LYINFLOG("urc process thread is running");
+    pthread_cleanup_push(cleanup_urc_process_mutex, NULL); // thread cleanup handler
+    while(module_urc_process_status)
+    {
+        BLOCK_PROCESS_URC_MSG_LOCK();
+        while(s_recv_urc_parcel_list.empty())
+        {
+            LYINFLOG("__FUNCTION__ %s __LINE__ %d\n", __FUNCTION__, __LINE__);
+            BLOCK_WAIT_PROCESS_URC_MSG();
+            LYINFLOG("__FUNCTION__ %s __LINE__ %d\n", __FUNCTION__, __LINE__);
+        }  
+        iter=s_recv_urc_parcel_list.begin();
+        urc_p=(*iter);
+        s_recv_urc_parcel_list.erase(iter);
+        BLOCK_PROCESS_URC_MSG_UNLOCK();             
+        urc_p->setDataPosition(0);
+        if(urc_p->dataAvail()>0)
+        {
+            LYINFLOG("__FUNCTION__ %s __LINE__ %d\n", __FUNCTION__, __LINE__);
+            pthread_mutex_lock(&s_urc_mutex);
+            urc_msg_process(urc_p);            
+            pthread_mutex_unlock(&s_urc_mutex);
+            LYINFLOG("__FUNCTION__ %s __LINE__ %d\n", __FUNCTION__, __LINE__);
+        }
+        delete urc_p;
+        urc_p = NULL;
+    }
+    pthread_cleanup_pop(0);
+    LYINFLOG("urc process thread ended");
+    return NULL;
+}
+
+void lynq_close_urc_rev_thread()
+{
+    int ret;
+
+    BLOCK_PROCESS_URC_MSG_LOCK();  //just cancel urc process tid when recv from
+    module_urc_status = 0;    
+    if(module_urc_tid!=-1)
+    {
+        ret = pthread_cancel(module_urc_tid);
+        LYINFLOG("pthread cancel urc rev ret = %d",ret);            
+    }
+    BLOCK_PROCESS_URC_MSG_UNLOCK();
+    if(module_urc_tid != -1)
+    {
+        ret = pthread_join(module_urc_tid,NULL);
+        LYINFLOG("pthread join urc tid ret = %d",ret);
+        module_urc_tid =-1;
+    }       
+}
+
+void lynq_close_urc_process_thread()
+{
+    int ret;
+    BLOCK_PROCESS_URC_MSG_LOCK();  //just cancel urc process tid when not process urc msg in list 
+    pthread_mutex_lock(&s_urc_mutex); //just cancel urc process tid when not process urg msg avoid mutual lock for tid may call pthread_cond_wait
+    module_urc_process_status = 0;    
+    if(module_urc_process_tid!=-1)
+    {
+        ret = pthread_cancel(module_urc_process_tid);
+        LYINFLOG("pthread cancel urc process ret = %d",ret);            
+    }
+    pthread_mutex_unlock(&s_urc_mutex);
+    BLOCK_PROCESS_URC_MSG_UNLOCK();
+    if(module_urc_process_tid != -1)
+    {
+        ret = pthread_join(module_urc_process_tid,NULL);
+        LYINFLOG("pthread join urc process tid ret = %d",ret);
+        module_urc_process_tid =-1;
+    }
+}
+
+int lynq_setup_urc_socket()
+{
+    int on = 1;
+    int ret = 0;
+    module_len_urc_addr_serv = sizeof(sockaddr_in);
+    module_urc_sock_fd = socket(AF_INET, SOCK_DGRAM, 0);
+    if (module_urc_sock_fd <0){
+        LYERRLOG("urc socket error");
+        return RESULT_ERROR;  
+    }
+    module_urc_addr_serv.sin_family = AF_INET;
+    module_urc_addr_serv.sin_port = htons(LYNQ_URC_SERVICE_PORT);
+    module_urc_addr_serv.sin_addr.s_addr = inet_addr(LYNQ_URC_ADDRESS);
+    /* Set socket to allow reuse of address and port, SO_REUSEADDR value is 2*/
+    ret = setsockopt(module_urc_sock_fd,SOL_SOCKET,SO_REUSEADDR,&on,sizeof on);
+    if(ret <0)
+    {
+        LYERRLOG("urc socket set error");
+        close(module_urc_sock_fd);
+        module_urc_sock_fd =-1;
+        return RESULT_ERROR;
+    }
+    ret = bind(module_urc_sock_fd ,(struct sockaddr*)&module_urc_addr_serv, sizeof(module_urc_addr_serv));
+    if(ret <0)
+    {
+        LYERRLOG("urc socket bind error");
+        close(module_urc_sock_fd);
+        module_urc_sock_fd =-1;
+        return RESULT_ERROR;  
+    }
+    return RESULT_OK;
+}
+
+void lynq_close_urc_socket()
+{
+    if (module_urc_sock_fd >= 0)
+    {
+        close(module_urc_sock_fd);
+        module_urc_sock_fd =-1;
+    }  
+}
+
+int lynq_start_all_urc_socket_thread()
+{  
+    
+    if(ril_init_mem()!=0)
+    {
+        LYERRLOG("ril_init_mem fail");        
+        return RESULT_ERROR;
+    }
+
+    int ret= lynq_setup_urc_socket();
+    if(ret!=RESULT_OK)
+    {
+        LYERRLOG("sms lynq_setup_urc_socket fail");
+        ril_deinit_mem();
+        return RESULT_ERROR;
+    }
+    
+    BLOCK_PROCESS_URC_MSG_INIT();
+    BLOCK_PROCESS_URC_MSG_LOCK();    
+    std::list<Parcel*>::iterator iter;
+    for(iter=s_recv_urc_parcel_list.begin();iter!=s_recv_urc_parcel_list.end();++iter)
+    {
+        delete (*iter);        
+    }
+    s_recv_urc_parcel_list.clear(); 
+    BLOCK_PROCESS_URC_MSG_UNLOCK(); 
+    
+    pthread_mutex_init(&s_urc_mutex, NULL);    
+    
+    module_urc_status = 1;
+  //  pthread_attr_init(&attr);
+  //  pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
+    ret = pthread_create(&module_urc_tid,/*&attr*/NULL,thread_urc_recv,NULL);
+    if(ret <0)
+    {
+        LYERRLOG("urc recv pthread create error");
+        module_urc_status = 0;
+        lynq_close_urc_socket();
+        ril_deinit_mem();
+        return RESULT_ERROR;  
+    }
+
+    module_urc_process_status = 1;
+    ret = pthread_create(&module_urc_process_tid,/*&attr*/NULL,thread_urc_process,NULL);
+    if(ret <0)
+    {
+        LYERRLOG("urc process pthread create error");
+        module_urc_process_status = 0;
+        lynq_close_urc_socket();
+        lynq_close_urc_rev_thread();
+        ril_deinit_mem();
+        return RESULT_ERROR;  
+    }
+    
+    LYINFLOG("urc start success");
+    
+    return RESULT_OK;  
+}
+
+void lynq_close_all_urc_socket_thread()
+{
+ 
+    lynq_close_urc_rev_thread();
+    lynq_close_urc_socket();
+    lynq_close_urc_process_thread();
+
+    BLOCK_PROCESS_URC_MSG_LOCK();
+    std::list<Parcel*>::iterator iter;
+    for(iter=s_recv_urc_parcel_list.begin();iter!=s_recv_urc_parcel_list.end();++iter)
+    {
+        delete (*iter);
+    }
+    s_recv_urc_parcel_list.clear(); 
+    BLOCK_PROCESS_URC_MSG_UNLOCK(); 
+    
+    ril_deinit_mem();    
+}
+
+bool is_support_request(int req_id)
+{
+    switch(req_id)
+    {
+        case RIL_REQUEST_SEND_SMS:
+        case RIL_REQUEST_SET_SMSC_ADDRESS:
+        case RIL_REQUEST_GET_SMSC_ADDRESS:
+        case LYNQ_REQUEST_READ_SMS_FROM_MEMORY:
+        case LYNQ_REQUEST_DELETE_SMS_FROM_MEMORY:
+        case LYNQ_REQUEST_LIST_SMS_FROM_MEMORY:
+            return true;
+        default:
+            return false;
+    }
+}
+
+/**@ a thread just for recv\buffer solicited msg's response and notice waiting thread
+* @param p [IN]: no meaning
+* @return
+* always null
+*/
+void *thread_rc_recv(void *p)
+{
+    Parcel* rc_p;
+    std::list<Parcel*>::iterator iter;
+    int resp_type = -1;
+    char rc_data[LYNQ_REC_BUF];
+    int rc_len;
+    int null_cnt=0;
+    int wakeup_token;
+    int resquest;
+    LYINFLOG("rc thread is running");
+    while(module_rc_status)
+    {
+        bzero(rc_data,LYNQ_REC_BUF);
+        while(true)
+        {
+            rc_len = recvfrom(module_rc_sock_fd,rc_data,sizeof(rc_data),0,(struct sockaddr *)&module_rc_addr_serv,(socklen_t *)&module_len_rc_addr_serv);
+            if(rc_len<sizeof(int32_t)*2)
+            {
+                 LYERRLOG("%s recv len %d less %d",__FUNCTION__, rc_len,sizeof(int)*2);
+                 continue;
+            } 
+            rc_p= new Parcel;
+            if(rc_p==NULL)
+            {
+                null_cnt++;
+                LYERRLOG("%s rc_p is NULL, cnt is %d",__FUNCTION__, null_cnt);
+                if(null_cnt>20)
+                {
+                    goto rc_recv_end;
+                }
+                continue;
+            }
+            else
+            {
+                null_cnt=0;
+            }
+
+            rc_p->setData((uint8_t *)rc_data,rc_len); // p.setData((uint8_t *) buffer, buflen);
+            rc_p->setDataPosition(0);
+            if(rc_p->dataAvail()>0)
+            {
+                rc_p->readInt32(&resp_type);
+                rc_p->readInt32(&wakeup_token);
+                rc_p->readInt32(&resquest);
+                if(!is_support_request(resquest))
+                {
+                    continue;
+                }
+                BLOCK_RECV_MSG_LOCK();
+                s_recv_parcel_list.push_back(rc_p);
+                LYINFLOG("%s wakeup token is %d, list size is %d!",__FUNCTION__,wakeup_token,s_recv_parcel_list.size());
+                if(s_recv_parcel_list.size()>20) //max 20
+                {
+                    iter=s_recv_parcel_list.begin();
+                    (*iter)->setDataPosition(0);
+                    (*iter)->readInt32(&resp_type);
+                    (*iter)->readInt32(&wakeup_token);
+                    delete (*(s_recv_parcel_list.begin()));
+                    LYERRLOG("%s wakeup token %d is deleted!",__FUNCTION__,wakeup_token);
+                    s_recv_parcel_list.erase(iter);
+                }
+                BLOCK_WAKEUP_RECV_MSG();
+                BLOCK_RECV_MSG_UNLOCK();
+                break;
+            }
+            else
+            {
+                LYERRLOG("%s rc_p data Avail %d not greater than 0",__FUNCTION__, rc_p->dataAvail());
+                delete rc_p;
+            }
+        }
+    }
+
+rc_recv_end:
+    LYINFLOG("rc thread ended");
+    return NULL;
+}
+
+int lynq_start_all_rc_socket_thread()
+{
+    module_rc_sock_fd = socket(AF_INET, SOCK_DGRAM, 0);
+    if(module_rc_sock_fd < 0)
+    {
+        LYERRLOG("socket open error");
+        return -1;
+    }
+
+    LYINFLOG("module_rc_sock_fd = %d",module_rc_sock_fd);
+
+    memset(&module_rc_addr_serv, 0, sizeof(module_rc_addr_serv));
+    module_rc_addr_serv.sin_family = AF_INET;
+    module_rc_addr_serv.sin_addr.s_addr = inet_addr(LYNQ_ADDRESS);
+    module_rc_addr_serv.sin_port = htons(LYNQ_SERVICE_PORT);
+    module_len_rc_addr_serv = sizeof(module_rc_addr_serv);
+
+    BLOCK_RECV_MSG_LOCK(); 
+    std::list<Parcel*>::iterator iter;
+    for(iter=s_recv_parcel_list.begin();iter!=s_recv_parcel_list.end();++iter)
+    {
+        delete (*iter);
+    }
+    s_recv_parcel_list.clear();
+    BLOCK_RECV_MSG_UNLOCK();
+
+//    pthread_attr_t attr;
+    int ret;
+
+    pthread_mutex_init(&s_sendto_mutex, NULL);   
+    pthread_mutex_init(&s_RecvMsgBlockMutex, NULL);   
+
+    module_rc_status = 1;
+//    pthread_attr_init(&attr);
+//    pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
+    ret = pthread_create(&module_rc_tid,/*&attr*/NULL,thread_rc_recv,NULL);
+    if(ret <0)
+    {
+        LYERRLOG("rc pthread create error");
+        module_rc_status =0;
+        close(module_rc_sock_fd);
+        module_rc_sock_fd =-1;
+        return ret;
+    }   
+    
+    LYINFLOG("rc start success");
+
+    return RESULT_OK;
+}
+
+void lynq_close_all_rc_socket_thread()
+{
+    int ret;
+    BLOCK_RECV_MSG_LOCK();
+    module_rc_status = 0;
+    BLOCK_WAKEUP_RECV_MSG();
+    if(module_rc_tid != -1)
+    {
+        ret = pthread_cancel(module_rc_tid);
+        LYINFLOG("pthread cancel rc ret = %d",ret);
+    }    
+    BLOCK_RECV_MSG_UNLOCK();
+    if(module_rc_tid != -1)
+    {
+        ret = pthread_join(module_rc_tid,NULL);
+        module_rc_tid =-1;
+        LYINFLOG("pthread join rc tid ret = %d",ret);
+
+    }
+
+    if (module_rc_sock_fd > 0)
+    {
+        close(module_rc_sock_fd);
+        module_rc_sock_fd =-1;
+    }
+    
+    BLOCK_RECV_MSG_LOCK();
+    std::list<Parcel*>::iterator iter;
+    for(iter=s_recv_parcel_list.begin();iter!=s_recv_parcel_list.end();++iter)
+    {
+        delete (*iter);
+    }
+    s_recv_parcel_list.clear();
+    BLOCK_RECV_MSG_UNLOCK();
+}
+
+const char * requestToString(int request) 
+{
+    /*
+     cat libs/telephony/ril_commands.h \
+     | egrep "^ *{RIL_" \
+     | sed -re 's/\{RIL_([^,]+),[^,]+,([^}]+).+/case RIL_\1: return "\1";/'
+    
+    
+     cat libs/telephony/ril_unsol_commands.h \
+     | egrep "^ *{RIL_" \
+     | sed -re 's/\{RIL_([^,]+),([^}]+).+/case RIL_\1: return "\1";/'
+    
+    */
+    switch(request) {
+        case RIL_REQUEST_GET_SIM_STATUS: return "GET_SIM_STATUS";
+        case RIL_REQUEST_ENTER_SIM_PIN: return "ENTER_SIM_PIN";
+        case RIL_REQUEST_ENTER_SIM_PUK: return "ENTER_SIM_PUK";
+        case RIL_REQUEST_ENTER_SIM_PIN2: return "ENTER_SIM_PIN2";
+        case RIL_REQUEST_ENTER_SIM_PUK2: return "ENTER_SIM_PUK2";
+        case RIL_REQUEST_CHANGE_SIM_PIN: return "CHANGE_SIM_PIN";
+        case RIL_REQUEST_CHANGE_SIM_PIN2: return "CHANGE_SIM_PIN2";
+        case RIL_REQUEST_ENTER_NETWORK_DEPERSONALIZATION: return "ENTER_NETWORK_DEPERSONALIZATION";
+        case RIL_REQUEST_GET_CURRENT_CALLS: return "GET_CURRENT_CALLS";
+        case RIL_REQUEST_DIAL: return "DIAL";
+        case RIL_REQUEST_GET_IMSI: return "GET_IMSI";
+        case RIL_REQUEST_HANGUP: return "HANGUP";
+        case RIL_REQUEST_HANGUP_WAITING_OR_BACKGROUND: return "HANGUP_WAITING_OR_BACKGROUND";
+        case RIL_REQUEST_HANGUP_FOREGROUND_RESUME_BACKGROUND: return "HANGUP_FOREGROUND_RESUME_BACKGROUND";
+        case RIL_REQUEST_SWITCH_WAITING_OR_HOLDING_AND_ACTIVE: return "SWITCH_WAITING_OR_HOLDING_AND_ACTIVE";
+        case RIL_REQUEST_CONFERENCE: return "CONFERENCE";
+        case RIL_REQUEST_UDUB: return "UDUB";
+        case RIL_REQUEST_LAST_CALL_FAIL_CAUSE: return "LAST_CALL_FAIL_CAUSE";
+        case RIL_REQUEST_SIGNAL_STRENGTH: return "SIGNAL_STRENGTH";
+        case RIL_REQUEST_VOICE_REGISTRATION_STATE: return "VOICE_REGISTRATION_STATE";
+        case RIL_REQUEST_DATA_REGISTRATION_STATE: return "DATA_REGISTRATION_STATE";
+        case RIL_REQUEST_OPERATOR: return "OPERATOR";
+        case RIL_REQUEST_RADIO_POWER: return "RADIO_POWER";
+        case RIL_REQUEST_DTMF: return "DTMF";
+        case RIL_REQUEST_SEND_SMS: return "SEND_SMS";
+        case RIL_REQUEST_SEND_SMS_EXPECT_MORE: return "SEND_SMS_EXPECT_MORE";
+        case RIL_REQUEST_SETUP_DATA_CALL: return "SETUP_DATA_CALL";
+        case RIL_REQUEST_SIM_IO: return "SIM_IO";
+        case RIL_REQUEST_SEND_USSD: return "SEND_USSD";
+        case RIL_REQUEST_CANCEL_USSD: return "CANCEL_USSD";
+        case RIL_REQUEST_GET_CLIR: return "GET_CLIR";
+        case RIL_REQUEST_SET_CLIR: return "SET_CLIR";
+        case RIL_REQUEST_QUERY_CALL_FORWARD_STATUS: return "QUERY_CALL_FORWARD_STATUS";
+        case RIL_REQUEST_SET_CALL_FORWARD: return "SET_CALL_FORWARD";
+        case RIL_REQUEST_QUERY_CALL_WAITING: return "QUERY_CALL_WAITING";
+        case RIL_REQUEST_SET_CALL_WAITING: return "SET_CALL_WAITING";
+        case RIL_REQUEST_SMS_ACKNOWLEDGE: return "SMS_ACKNOWLEDGE";
+        case RIL_REQUEST_GET_IMEI: return "GET_IMEI";
+        case RIL_REQUEST_GET_IMEISV: return "GET_IMEISV";
+        case RIL_REQUEST_ANSWER: return "ANSWER";
+        case RIL_REQUEST_DEACTIVATE_DATA_CALL: return "DEACTIVATE_DATA_CALL";
+        case RIL_REQUEST_QUERY_FACILITY_LOCK: return "QUERY_FACILITY_LOCK";
+        case RIL_REQUEST_SET_FACILITY_LOCK: return "SET_FACILITY_LOCK";
+        case RIL_REQUEST_CHANGE_BARRING_PASSWORD: return "CHANGE_BARRING_PASSWORD";
+        case RIL_REQUEST_QUERY_NETWORK_SELECTION_MODE: return "QUERY_NETWORK_SELECTION_MODE";
+        case RIL_REQUEST_SET_NETWORK_SELECTION_AUTOMATIC: return "SET_NETWORK_SELECTION_AUTOMATIC";
+        case RIL_REQUEST_SET_NETWORK_SELECTION_MANUAL: return "SET_NETWORK_SELECTION_MANUAL";
+        case RIL_REQUEST_QUERY_AVAILABLE_NETWORKS : return "QUERY_AVAILABLE_NETWORKS ";
+        case RIL_REQUEST_DTMF_START: return "DTMF_START";
+        case RIL_REQUEST_DTMF_STOP: return "DTMF_STOP";
+        case RIL_REQUEST_BASEBAND_VERSION: return "BASEBAND_VERSION";
+        case RIL_REQUEST_SEPARATE_CONNECTION: return "SEPARATE_CONNECTION";
+        case RIL_REQUEST_SET_PREFERRED_NETWORK_TYPE: return "SET_PREFERRED_NETWORK_TYPE";
+        case RIL_REQUEST_GET_PREFERRED_NETWORK_TYPE: return "GET_PREFERRED_NETWORK_TYPE";
+        case RIL_REQUEST_GET_NEIGHBORING_CELL_IDS: return "GET_NEIGHBORING_CELL_IDS";
+        case RIL_REQUEST_SET_MUTE: return "SET_MUTE";
+        case RIL_REQUEST_GET_MUTE: return "GET_MUTE";
+        case RIL_REQUEST_QUERY_CLIP: return "QUERY_CLIP";
+        case RIL_REQUEST_LAST_DATA_CALL_FAIL_CAUSE: return "LAST_DATA_CALL_FAIL_CAUSE";
+        case RIL_REQUEST_DATA_CALL_LIST: return "DATA_CALL_LIST";
+        case RIL_REQUEST_RESET_RADIO: return "RESET_RADIO";
+        case RIL_REQUEST_OEM_HOOK_RAW: return "OEM_HOOK_RAW";
+        case RIL_REQUEST_OEM_HOOK_STRINGS: return "OEM_HOOK_STRINGS";
+        case RIL_REQUEST_SET_BAND_MODE: return "SET_BAND_MODE";
+        case RIL_REQUEST_QUERY_AVAILABLE_BAND_MODE: return "QUERY_AVAILABLE_BAND_MODE";
+        case RIL_REQUEST_STK_GET_PROFILE: return "STK_GET_PROFILE";
+        case RIL_REQUEST_STK_SET_PROFILE: return "STK_SET_PROFILE";
+        case RIL_REQUEST_STK_SEND_ENVELOPE_COMMAND: return "STK_SEND_ENVELOPE_COMMAND";
+        case RIL_REQUEST_STK_SEND_TERMINAL_RESPONSE: return "STK_SEND_TERMINAL_RESPONSE";
+        case RIL_REQUEST_STK_HANDLE_CALL_SETUP_REQUESTED_FROM_SIM: return "STK_HANDLE_CALL_SETUP_REQUESTED_FROM_SIM";
+        case RIL_REQUEST_SCREEN_STATE: return "SCREEN_STATE";
+        case RIL_REQUEST_EXPLICIT_CALL_TRANSFER: return "EXPLICIT_CALL_TRANSFER";
+        case RIL_REQUEST_SET_LOCATION_UPDATES: return "SET_LOCATION_UPDATES";
+        case RIL_REQUEST_CDMA_SET_SUBSCRIPTION_SOURCE:return"CDMA_SET_SUBSCRIPTION_SOURCE";
+        case RIL_REQUEST_CDMA_SET_ROAMING_PREFERENCE:return"CDMA_SET_ROAMING_PREFERENCE";
+        case RIL_REQUEST_CDMA_QUERY_ROAMING_PREFERENCE:return"CDMA_QUERY_ROAMING_PREFERENCE";
+        case RIL_REQUEST_SET_TTY_MODE:return"SET_TTY_MODE";
+        case RIL_REQUEST_QUERY_TTY_MODE:return"QUERY_TTY_MODE";
+        case RIL_REQUEST_CDMA_SET_PREFERRED_VOICE_PRIVACY_MODE:return"CDMA_SET_PREFERRED_VOICE_PRIVACY_MODE";
+        case RIL_REQUEST_CDMA_QUERY_PREFERRED_VOICE_PRIVACY_MODE:return"CDMA_QUERY_PREFERRED_VOICE_PRIVACY_MODE";
+        case RIL_REQUEST_CDMA_FLASH:return"CDMA_FLASH";
+        case RIL_REQUEST_CDMA_BURST_DTMF:return"CDMA_BURST_DTMF";
+        case RIL_REQUEST_CDMA_SEND_SMS:return"CDMA_SEND_SMS";
+        case RIL_REQUEST_CDMA_SMS_ACKNOWLEDGE:return"CDMA_SMS_ACKNOWLEDGE";
+        case RIL_REQUEST_GSM_GET_BROADCAST_SMS_CONFIG:return"GSM_GET_BROADCAST_SMS_CONFIG";
+        case RIL_REQUEST_GSM_SET_BROADCAST_SMS_CONFIG:return"GSM_SET_BROADCAST_SMS_CONFIG";
+        case RIL_REQUEST_GSM_SMS_BROADCAST_ACTIVATION:return "GSM_SMS_BROADCAST_ACTIVATION";
+        case RIL_REQUEST_CDMA_GET_BROADCAST_SMS_CONFIG:return "CDMA_GET_BROADCAST_SMS_CONFIG";
+        case RIL_REQUEST_CDMA_SET_BROADCAST_SMS_CONFIG:return "CDMA_SET_BROADCAST_SMS_CONFIG";
+        case RIL_REQUEST_CDMA_SMS_BROADCAST_ACTIVATION:return "CDMA_SMS_BROADCAST_ACTIVATION";
+        case RIL_REQUEST_CDMA_VALIDATE_AND_WRITE_AKEY: return"CDMA_VALIDATE_AND_WRITE_AKEY";
+        case RIL_REQUEST_CDMA_SUBSCRIPTION: return"CDMA_SUBSCRIPTION";
+        case RIL_REQUEST_CDMA_WRITE_SMS_TO_RUIM: return "CDMA_WRITE_SMS_TO_RUIM";
+        case RIL_REQUEST_CDMA_DELETE_SMS_ON_RUIM: return "CDMA_DELETE_SMS_ON_RUIM";
+        case RIL_REQUEST_DEVICE_IDENTITY: return "DEVICE_IDENTITY";
+        case RIL_REQUEST_EXIT_EMERGENCY_CALLBACK_MODE: return "EXIT_EMERGENCY_CALLBACK_MODE";
+        case RIL_REQUEST_GET_SMSC_ADDRESS: return "GET_SMSC_ADDRESS";
+        case RIL_REQUEST_SET_SMSC_ADDRESS: return "SET_SMSC_ADDRESS";
+        case RIL_REQUEST_REPORT_SMS_MEMORY_STATUS: return "REPORT_SMS_MEMORY_STATUS";
+        case RIL_REQUEST_REPORT_STK_SERVICE_IS_RUNNING: return "REPORT_STK_SERVICE_IS_RUNNING";
+        case RIL_REQUEST_CDMA_GET_SUBSCRIPTION_SOURCE: return "CDMA_GET_SUBSCRIPTION_SOURCE";
+        case RIL_REQUEST_ISIM_AUTHENTICATION: return "ISIM_AUTHENTICATION";
+        case RIL_REQUEST_ACKNOWLEDGE_INCOMING_GSM_SMS_WITH_PDU: return "RIL_REQUEST_ACKNOWLEDGE_INCOMING_GSM_SMS_WITH_PDU";
+        case RIL_REQUEST_STK_SEND_ENVELOPE_WITH_STATUS: return "RIL_REQUEST_STK_SEND_ENVELOPE_WITH_STATUS";
+        case RIL_REQUEST_VOICE_RADIO_TECH: return "VOICE_RADIO_TECH";
+        case RIL_REQUEST_GET_CELL_INFO_LIST: return"GET_CELL_INFO_LIST";
+        case RIL_REQUEST_SET_UNSOL_CELL_INFO_LIST_RATE: return"SET_UNSOL_CELL_INFO_LIST_RATE";
+        case RIL_REQUEST_SET_INITIAL_ATTACH_APN: return "RIL_REQUEST_SET_INITIAL_ATTACH_APN";
+        case RIL_REQUEST_IMS_REGISTRATION_STATE: return "IMS_REGISTRATION_STATE";
+        case RIL_REQUEST_IMS_SEND_SMS: return "IMS_SEND_SMS";
+        case RIL_REQUEST_SIM_TRANSMIT_APDU_BASIC: return "SIM_TRANSMIT_APDU_BASIC";
+        case RIL_REQUEST_SIM_OPEN_CHANNEL: return "SIM_OPEN_CHANNEL";
+        case RIL_REQUEST_SIM_CLOSE_CHANNEL: return "SIM_CLOSE_CHANNEL";
+        case RIL_REQUEST_SIM_TRANSMIT_APDU_CHANNEL: return "SIM_TRANSMIT_APDU_CHANNEL";
+        case RIL_REQUEST_GET_RADIO_CAPABILITY: return "RIL_REQUEST_GET_RADIO_CAPABILITY";
+        case RIL_REQUEST_SET_RADIO_CAPABILITY: return "RIL_REQUEST_SET_RADIO_CAPABILITY";
+        case RIL_REQUEST_SET_UICC_SUBSCRIPTION: return "SET_UICC_SUBSCRIPTION";
+        case RIL_REQUEST_ALLOW_DATA: return "ALLOW_DATA";
+        case RIL_REQUEST_GET_HARDWARE_CONFIG: return "GET_HARDWARE_CONFIG";
+        case RIL_REQUEST_SIM_AUTHENTICATION: return "SIM_AUTHENTICATION";
+        case RIL_REQUEST_GET_DC_RT_INFO: return "GET_DC_RT_INFO";
+        case RIL_REQUEST_SET_DC_RT_INFO_RATE: return "SET_DC_RT_INFO_RATE";
+        case RIL_REQUEST_SET_DATA_PROFILE: return "SET_DATA_PROFILE";
+        case RIL_UNSOL_RESPONSE_RADIO_STATE_CHANGED: return "UNSOL_RESPONSE_RADIO_STATE_CHANGED";
+        case RIL_UNSOL_RESPONSE_CALL_STATE_CHANGED: return "UNSOL_RESPONSE_CALL_STATE_CHANGED";
+        case RIL_UNSOL_RESPONSE_VOICE_NETWORK_STATE_CHANGED: return "UNSOL_RESPONSE_VOICE_NETWORK_STATE_CHANGED";
+        case RIL_UNSOL_RESPONSE_PS_NETWORK_STATE_CHANGED: return "UNSOL_RESPONSE_VOICE_NETWORK_STATE_CHANGED";
+        case RIL_UNSOL_RESPONSE_NEW_SMS: return "UNSOL_RESPONSE_NEW_SMS";
+        case RIL_UNSOL_RESPONSE_NEW_SMS_STATUS_REPORT: return "UNSOL_RESPONSE_NEW_SMS_STATUS_REPORT";
+        case RIL_UNSOL_RESPONSE_NEW_SMS_ON_SIM: return "UNSOL_RESPONSE_NEW_SMS_ON_SIM";
+        case RIL_UNSOL_ON_USSD: return "UNSOL_ON_USSD";
+        case RIL_UNSOL_ON_USSD_REQUEST: return "UNSOL_ON_USSD_REQUEST(obsolete)";
+        case RIL_UNSOL_NITZ_TIME_RECEIVED: return "UNSOL_NITZ_TIME_RECEIVED";
+        case RIL_UNSOL_SIGNAL_STRENGTH: return "UNSOL_SIGNAL_STRENGTH";
+        case RIL_UNSOL_STK_SESSION_END: return "UNSOL_STK_SESSION_END";
+        case RIL_UNSOL_STK_PROACTIVE_COMMAND: return "UNSOL_STK_PROACTIVE_COMMAND";
+        case RIL_UNSOL_STK_EVENT_NOTIFY: return "UNSOL_STK_EVENT_NOTIFY";
+        case RIL_UNSOL_STK_CALL_SETUP: return "UNSOL_STK_CALL_SETUP";
+        case RIL_UNSOL_SIM_SMS_STORAGE_FULL: return "UNSOL_SIM_SMS_STORAGE_FUL";
+        case RIL_UNSOL_SIM_REFRESH: return "UNSOL_SIM_REFRESH";
+        case RIL_UNSOL_DATA_CALL_LIST_CHANGED: return "UNSOL_DATA_CALL_LIST_CHANGED";
+        case RIL_UNSOL_CALL_RING: return "UNSOL_CALL_RING";
+        case RIL_UNSOL_RESPONSE_SIM_STATUS_CHANGED: return "UNSOL_RESPONSE_SIM_STATUS_CHANGED";
+        case RIL_UNSOL_RESPONSE_CDMA_NEW_SMS: return "UNSOL_NEW_CDMA_SMS";
+        case RIL_UNSOL_RESPONSE_NEW_BROADCAST_SMS: return "UNSOL_NEW_BROADCAST_SMS";
+        case RIL_UNSOL_CDMA_RUIM_SMS_STORAGE_FULL: return "UNSOL_CDMA_RUIM_SMS_STORAGE_FULL";
+        case RIL_UNSOL_RESTRICTED_STATE_CHANGED: return "UNSOL_RESTRICTED_STATE_CHANGED";
+        case RIL_UNSOL_ENTER_EMERGENCY_CALLBACK_MODE: return "UNSOL_ENTER_EMERGENCY_CALLBACK_MODE";
+        case RIL_UNSOL_CDMA_CALL_WAITING: return "UNSOL_CDMA_CALL_WAITING";
+        case RIL_UNSOL_CDMA_OTA_PROVISION_STATUS: return "UNSOL_CDMA_OTA_PROVISION_STATUS";
+        case RIL_UNSOL_CDMA_INFO_REC: return "UNSOL_CDMA_INFO_REC";
+        case RIL_UNSOL_OEM_HOOK_RAW: return "UNSOL_OEM_HOOK_RAW";
+        case RIL_UNSOL_RINGBACK_TONE: return "UNSOL_RINGBACK_TONE";
+        case RIL_UNSOL_RESEND_INCALL_MUTE: return "UNSOL_RESEND_INCALL_MUTE";
+        case RIL_UNSOL_CDMA_SUBSCRIPTION_SOURCE_CHANGED: return "UNSOL_CDMA_SUBSCRIPTION_SOURCE_CHANGED";
+        case RIL_UNSOL_CDMA_PRL_CHANGED: return "UNSOL_CDMA_PRL_CHANGED";
+        case RIL_UNSOL_EXIT_EMERGENCY_CALLBACK_MODE: return "UNSOL_EXIT_EMERGENCY_CALLBACK_MODE";
+        case RIL_UNSOL_RIL_CONNECTED: return "UNSOL_RIL_CONNECTED";
+        case RIL_UNSOL_VOICE_RADIO_TECH_CHANGED: return "UNSOL_VOICE_RADIO_TECH_CHANGED";
+        case RIL_UNSOL_CELL_INFO_LIST: return "UNSOL_CELL_INFO_LIST";
+        case RIL_UNSOL_RESPONSE_IMS_NETWORK_STATE_CHANGED: return "RESPONSE_IMS_NETWORK_STATE_CHANGED";
+        case RIL_UNSOL_UICC_SUBSCRIPTION_STATUS_CHANGED: return "UNSOL_UICC_SUBSCRIPTION_STATUS_CHANGED";
+        case RIL_UNSOL_SRVCC_STATE_NOTIFY: return "UNSOL_SRVCC_STATE_NOTIFY";
+        case RIL_UNSOL_HARDWARE_CONFIG_CHANGED: return "HARDWARE_CONFIG_CHANGED";
+        case RIL_UNSOL_DC_RT_INFO_CHANGED: return "UNSOL_DC_RT_INFO_CHANGED";
+        case RIL_REQUEST_SHUTDOWN: return "SHUTDOWN";
+        case RIL_UNSOL_RADIO_CAPABILITY: return "RIL_UNSOL_RADIO_CAPABILITY";
+        case RIL_REQUEST_SET_TRM: return "RIL_REQUEST_SET_TRM";
+        case RIL_REQUEST_SET_IMS_ENABLE:return "RIL_REQUEST_SET_IMS_ENABLE";
+        case RIL_REQUEST_SET_AUDIO_PATH: return "SET_AUDIO_PATH";
+        case RIL_REQUEST_HANGUP_ALL: return "HANGUP_ALL";
+        case RIL_REQUEST_FORCE_RELEASE_CALL: return "FORCE_RELEASE_CALL";
+        case RIL_REQUEST_EMERGENCY_DIAL: return "RIL_REQUEST_EMERGENCY_DIAL";
+        case RIL_REQUEST_SET_ECC_SERVICE_CATEGORY: return "RIL_REQUEST_SET_ECC_SERVICE_CATEGORY";
+        case RIL_REQUEST_SET_ECC_LIST: return "RIL_REQUEST_SET_ECC_LIST";
+        case RIL_REQUEST_AT_COMMAND_WITH_PROXY: return "AT_COMMAND_WITH_PROXY";
+        case RIL_REQUEST_SET_SUPP_SVC_NOTIFICATION: return "RIL_REQUEST_SET_SUPP_SVC_NOTIFICATION";
+        case RIL_REQUEST_SET_CLIP: return "RIL_REQUEST_SET_CLIP";
+        case RIL_REQUEST_GET_COLP: return "RIL_REQUEST_GET_COLP";
+        case RIL_REQUEST_SET_COLP: return "RIL_REQUEST_SET_COLP";
+        case RIL_REQUEST_GET_COLR: return "RIL_REQUEST_GET_COLR";
+        case RIL_REQUEST_ADD_IMS_CONFERENCE_CALL_MEMBER: return "ADD_IMS_CONFERENCE_CALL_MEMBER";
+        case RIL_REQUEST_REMOVE_IMS_CONFERENCE_CALL_MEMBER: return "REMOVE_IMS_CONFERENCE_CALL_MEMBER";
+        case RIL_REQUEST_CONFERENCE_DIAL: return "CONFERENCE_DIAL";
+        case RIL_REQUEST_DIAL_WITH_SIP_URI: return "DIAL_WITH_SIP_URI";
+        case RIL_REQUEST_HOLD_CALL: return "HOLD_CALL";
+        case RIL_REQUEST_RESUME_CALL: return "RESUME_CALL";
+        case RIL_UNSOL_ECONF_SRVCC_INDICATION : return "ECONF_SRVCC_INDICATION";
+        case RIL_UNSOL_ECONF_RESULT_INDICATION : return "ECONF_RESULT_INDICATION";
+        case RIL_UNSOL_MAL_AT_INFO : return "UNSOL_MAL_AT_INFO";
+        case RIL_REQUEST_MODEM_POWEROFF: return "MODEM_POWEROFF";
+        case RIL_REQUEST_MODEM_POWERON: return "MODEM_POWERON";
+        case RIL_REQUEST_WRITE_SMS_TO_SIM: return "WRITE_SMS_TO_SIM";
+        case RIL_REQUEST_QUERY_ICCID: return "RIL_REQUEST_QUERY_ICCID";
+        case RIL_UNSOL_TX_POWER: return "RIL_UNSOL_TX_POWER";
+        case RIL_UNSOL_NETWORK_INFO: return "RIL_UNSOL_NETWORK_INFO";
+        case RIL_REQUEST_DELETE_SMS_ON_SIM: return "DELETE_SMS_ON_SIM";
+        case RIL_REQUEST_SET_IMSCFG: return "RIL_REQUEST_SET_IMSCFG";
+#ifdef ECALL_SUPPORT
+        case RIL_REQUEST_ECALL_FAST_MAKE_ECALL: return "ECALL_FAST_MAKE_ECALL";
+        case RIL_REQUEST_ECALL_SET_IVS: return "RIL_REQUEST_ECALL_SET_IVS";
+        case RIL_REQUEST_ECALL_SET_PSAP: return "RIL_REQUEST_ECALL_SET_PSAP";
+        case RIL_REQUEST_ECALL_MAKE_ECALL: return "RIL_REQUEST_ECALL_MAKE_ECALL";
+        case RIL_REQUEST_ECALL_IVS_PUSH_MSD: return "RIL_REQUEST_ECALL_IVS_PUSH_MSD";
+        case RIL_REQUEST_ECALL_PSAP_PULL_MSD: return "RIL_REQUEST_ECALL_PSAP_PULL_MSD";
+        case RIL_UNSOL_ECALL_MSDHACK : return "ECALL_MSDHACK";
+        case RIL_REQUEST_ECALL_SET_MSD: return "RIL_REQUEST_ECALL_SET_MSD";
+        case RIL_REQUEST_ECALL_CTRL_SEQUENCE: return "ECALL_SET_CTRL_SEQUENCE";
+        case RIL_UNSOL_ECALL_INDICATIONS : return "ECALL_INDICATIONS";
+        case RIL_REQUEST_ECALL_RESET_IVS: return "RIL_REQUEST_ECALL_RESET_IVS";
+        case RIL_REQUEST_ECALL_SET_PRI: return "RIL_REQUEST_ECALL_SET_PRI";
+        case RIL_REQUEST_ECALL_SET_TEST_NUM: return "RIL_REQUEST_ECALL_SET_TEST_NUM";
+        case RIL_REQUEST_ECALL_SET_RECONF_NUM: return "RIL_REQUEST_ECALL_SET_RECONF_NUM";
+        case RIL_REQUEST_SYNC_DATA_SETTINGS_TO_MD: return "RIL_REQUEST_SYNC_DATA_SETTINGS_TO_MD";
+        case RIL_REQUEST_ECALL_SET_NAD_DEREGISTRATION_TIME: return "RIL_REQUEST_ECALL_SET_NAD_DEREGISTRATION_TIME";
+        case RIL_REQUEST_ECALL_SET_REGISTRATION_STATE: return "RIL_REQUEST_ECALL_SET_REGISTRATION_STATE";
+#endif /*ECALL_SUPPORT*/
+#ifdef KEEP_ALIVE
+        case RIL_REQUEST_START_KEEPALIVE_PRO: return "RIL_REQUEST_START_KEEPALIVE_PRO";
+        case RIL_REQUEST_STOP_KEEPALIVE_PRO: return "RIL_REQUEST_STOP_KEEPALIVE_PRO";
+        case RIL_UNSOL_KEEPALIVE_STATUS_PRO: return "RIL_UNSOL_KEEPALIVE_STATUS_PRO";
+#endif /*KEEP_ALIVE*/
+        case RIL_REQUEST_SEND_USSI: return "SEND_USSI";
+        case RIL_REQUEST_CANCEL_USSI: return "CANCEL_USSI";
+        case RIL_REQUEST_GET_SMS_SIM_MEM_STATUS: return "GET_SMS_SIM_MEM_STATUS";
+        case RIL_UNSOL_SIP_CALL_PROGRESS_INDICATOR: return "RIL_UNSOL_SIP_CALL_PROGRESS_INDICATOR";
+        case RIL_REQUEST_REPORT_AIRPLANE_MODE: return "RIL_REQUEST_REPORT_AIRPLANE_MODE";
+        case RIL_REQUEST_SET_ECC_NUM: return "RIL_REQUEST_SET_ECC_NUM";
+        case RIL_REQUEST_GET_ECC_NUM: return "RIL_REQUEST_GET_ECC_NUM";
+        case RIL_UNSOL_ECC_NUM: return "RIL_UNSOL_ECC_NUM";
+        case RIL_REQUEST_QUERY_AVAILABLE_NETWORKS_WITH_ACT: return "RIL_REQUEST_QUERY_AVAILABLE_NETWORKS_WITH_ACT";
+        case RIL_REQUEST_GSM_GET_BROADCAST_LANGUAGE: return "RIL_REQUEST_GSM_GET_BROADCAST_LANGUAGE";
+        case RIL_REQUEST_GSM_SET_BROADCAST_LANGUAGE: return "RIL_REQUEST_GSM_SET_BROADCAST_LANGUAGE";
+        case RIL_UNSOL_CALL_INFO_INDICATION: return "RIL_UNSOL_CALL_INFO_INDICATION";
+        case RIL_REQUEST_MODIFY_APN: return "RIL_REQUEST_MODIFY_APN";
+        case RIL_REQUEST_RESET_APN: return "RIL_REQUEST_RESET_APN";
+        case RIL_REQUEST_QUERY_SIM_RETRY_COUNT: return "RIL_REQUEST_QUERY_SIM_RETRY_COUNT";
+        case RIL_REQUEST_QUERY_EID: return "RIL_REQUEST_QUERY_EID";
+        case LYNQ_REQUEST_SET_DTMF_VOLUME: return "RIL_REQUEST_SET_DTMF_VOLUME";
+        case LYNQ_REQUEST_SET_SPEECH_VOLUME: return "RIL_REQUEST_SET_SPEECH_VOLUME";
+        case LYNQ_REQUEST_GET_SPEECH_VOLUME: return "RIL_REQUEST_GET_SPEECH_VOLUME";
+        case LYNQ_REQUEST_RECORD: return "RIL_REQUEST_RECORD";
+        /*warren add for t800 ril service 2022/1/22 start*/
+        case LYNQ_REQUEST_WRITE_SMS_TO_MEMORY: return "LYNQ_REQUEST_WRITE_SMS_TO_MEMORY";
+        case LYNQ_REQUEST_READ_SMS_FROM_MEMORY: return "LYNQ_REQUEST_READ_SMS_FROM_MEMORY";
+        case LYNQ_REQUEST_DELETE_SMS_FROM_MEMORY: return "LYNQ_REQUEST_DELETE_SMS_FROM_MEMORY";
+        case LYNQ_REQUEST_LIST_SMS_FROM_MEMORY: return "LYNQ_REQUEST_LIST_SMS_FROM_MEMORY";
+        case LYNQ_REQUEST_SET_DEFAULT_SIM_ALL:return "SET_DEFAULT_SIM_ALL";
+        case LYNQ_REQUEST_CHANGE_SCREEN_STATE:return "LYNQ_REQUEST_CHANGE_SCREEN_STATE";/*jb.qi add for two sim sleep 2022/9/19*/
+        case LYNQ_REQUEST_CHANGE_RADIO:return "LYNQ_REQUEST_CHANGE_RADIO";/*lei add for factory test of sleep 2022/9/19*/
+        /*warren add for t800 ril service 2022/1/22 end*/
+        default: return "<unknown request>";
+    }
+}
+
+
diff --git a/src/lynq/lib/liblynq-sms/lynq_module_socket.h b/src/lynq/lib/liblynq-sms/lynq_module_socket.h
new file mode 100755
index 0000000..aabac32
--- /dev/null
+++ b/src/lynq/lib/liblynq-sms/lynq_module_socket.h
@@ -0,0 +1,22 @@
+#ifndef LYNQ_MODULE_SOCKET_H
+#define LYNQ_MODULE_SOCKET_H 
+
+using ::android::Parcel;
+
+int lynq_set_test_network(const int test_mode);
+
+extern int g_module_Global_uToken;
+extern int g_wait_time;
+int lynq_send_common_request(Parcel*& p, int time_out, int request_id,  int argc, const char* format,...);
+int lynq_start_all_urc_socket_thread();
+void lynq_close_all_urc_socket_thread();
+int lynq_start_all_rc_socket_thread();
+void lynq_close_all_rc_socket_thread();
+
+const char * requestToString(int request);
+
+void urc_msg_process(Parcel *p);
+bool is_support_urc(int urc_id);
+bool is_support_request(int req_id);
+
+#endif
diff --git a/src/lynq/lib/liblynq-sms/lynq_sms.cpp b/src/lynq/lib/liblynq-sms/lynq_sms.cpp
new file mode 100755
index 0000000..46f2119
--- /dev/null
+++ b/src/lynq/lib/liblynq-sms/lynq_sms.cpp
@@ -0,0 +1,364 @@
+
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <arpa/inet.h>
+#include <fcntl.h>
+#include <string.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <binder/Parcel.h>
+#include <log/log.h>
+#include <cutils/jstring.h>
+#include <pthread.h>
+#include "liblog/lynq_deflog.h"
+#include <sys/time.h>
+#include <string.h>
+#include <vendor-ril/telephony/ril.h>
+#include <vendor-ril/telephony/mtk_ril_sp.h>
+#include <vendor-ril/telephony/mtk_ril_ivt.h>
+#include "lynq_sms.h"
+#include "lynq_module_common.h"
+#include "lynq_module_socket.h"
+
+#define CALL_OFF (0)
+#define CALL_ON  (1)
+#define USER_LOG_TAG "LYNQ_SMS"
+
+using ::android::Parcel;
+
+#define MAX_SMS_BUF 1024
+
+int sms_storage_index = 0;
+
+/**
+ * @brief mark call initialization state
+ * 0: deinit state
+ * 1: init state
+ */
+int g_module_init_flag = 0;
+
+//static lynq_call_list_e_t s_call_lists[LYNQ_CALL_MAX]={};
+//static bool s_call_list_loop = 0;
+//static pthread_t s_call_list_loop_tid = -1;
+static pthread_mutex_t s_notice_new_sms_mutex  = PTHREAD_MUTEX_INITIALIZER;
+static pthread_cond_t s_notice_new_sms_cond = PTHREAD_COND_INITIALIZER;
+
+//static int s_module_isDial = 0;
+//static pthread_mutex_t call_state_change_mutex = PTHREAD_MUTEX_INITIALIZER;
+//static pthread_cond_t call_state_change_cond = PTHREAD_COND_INITIALIZER;
+//static int s_CallId = 0;
+//static pthread_mutex_t s_call_state_change_mutex = PTHREAD_MUTEX_INITIALIZER;
+//static pthread_cond_t s_call_state_change_cond = PTHREAD_COND_INITIALIZER;
+
+
+static char *strdupReadString(Parcel* &p) {
+    size_t stringlen;
+    const char16_t *s16;
+    s16 = p->readString16Inplace(&stringlen);
+    return strndup16to8(s16, stringlen);
+}
+
+void lynqNoticeGetModuleNewSms()
+{
+    pthread_mutex_lock(&s_notice_new_sms_mutex);
+    pthread_cond_signal(&s_notice_new_sms_cond);
+    pthread_mutex_unlock(&s_notice_new_sms_mutex);
+    
+}
+
+void lynqNoticeWaitModuleNewSms()
+{
+    pthread_mutex_lock(&s_notice_new_sms_mutex);
+    pthread_cond_wait(&s_notice_new_sms_cond, &s_notice_new_sms_mutex);
+    pthread_mutex_unlock(&s_notice_new_sms_mutex);
+}
+
+int lynq_sms_init(int uToken)
+{
+    if(g_module_init_flag != MODULE_CLOSED)
+    {
+        LYERRLOG("module state is %d",g_module_init_flag);
+        return LYNQ_E_CONFLICT;
+    }
+    if(uToken <0){
+        LYERRLOG("uToken  is less than 0",uToken);      
+        return LYNQ_E_PARAMETER_ANONALY;
+    }
+    g_module_init_flag = MODULE_SWITCHING;
+
+    LYLOGSET(LOG_DEBUG);
+    LYLOGEINIT(USER_LOG_TAG);   
+
+    g_module_Global_uToken = uToken;
+
+    int ret = lynq_start_all_urc_socket_thread();
+    if(ret != RESULT_OK)
+    {
+        LYERRLOG("init socket urc fail!!!");
+        g_module_init_flag = MODULE_CLOSED;
+        return LYNQ_E_INNER_ERROR;
+    }
+
+    ret = lynq_start_all_rc_socket_thread();
+    if(ret !=RESULT_OK)
+    {
+        LYERRLOG("init socket client fail!!!");
+        lynq_close_all_urc_socket_thread();
+        g_module_init_flag = MODULE_CLOSED;
+        return LYNQ_E_INNER_ERROR;
+    }
+    g_module_init_flag = MODULE_RUNNING;
+    return RESULT_OK;
+}
+
+/*
+Converts an array to a hexadecimal string
+*/
+void ArrayToStr(unsigned char *Buff, unsigned int BuffLen, char *OutputStr)
+{
+    int i = 0;
+    char TempBuff[MAX_SMS_BUF] = {0};
+    char strBuff[MAX_SMS_BUF] = {0};
+    if(sizeof(Buff) < BuffLen)
+    {
+        LYERRLOG("BuffLen is error\n");
+        return;
+    }
+    for(i = 0; i<BuffLen;i++)
+    {
+        sprintf(TempBuff,"%02x",(unsigned char)Buff[i]);
+        strncat(strBuff,TempBuff,BuffLen*2);
+    }
+    strncpy(OutputStr, strBuff, BuffLen*2);
+    return;
+}
+
+int lynq_send_sms(char telephony_num[TELEPHONE_NUM_LEN], int charset, char *msg, int msglen)
+{
+    if(g_module_init_flag != MODULE_RUNNING)
+    {
+        LYERRLOG("%s module state %d error",__func__,g_module_init_flag);
+        return LYNQ_E_CONFLICT;
+    }
+    Parcel* p=NULL;
+    if(charset == 1)//means 8 bit
+    {
+        char msg_e_b[msglen*2+1] = {0};// +1 for end of string.*2:A char array contains two elements of a string for each value
+        ArrayToStr(msg, msglen, msg_e_b);
+        int ret=lynq_send_common_request(p,g_wait_time,RIL_REQUEST_SEND_SMS,3,"%s %d %s",telephony_num, charset, msg_e_b);
+        if(ret!=RESULT_OK)
+        {
+            LYERRLOG("%s  8bit send error %d",__func__,__LINE__);
+            return ret;
+        }
+        delete p;
+        return RESULT_OK;
+    }
+    else//other bit
+    {
+        int ret=lynq_send_common_request(p,g_wait_time,RIL_REQUEST_SEND_SMS,3,"%s %d %s",telephony_num, charset, msg);
+        if(ret!=RESULT_OK)
+        {
+            LYERRLOG("%s  7bit send error %d",__func__,__LINE__);
+            return ret;
+        }
+        delete p;
+        return RESULT_OK;
+    }
+}
+
+int lynq_read_sms(int index,int *status,int *charset,char smsc[SMSC_MAX_LEN],int *smscLen,int *smslen,char message[MSG_MAX_LEN],char teleNum[TELEPHONE_NUM_LEN],int *numLen,int *current,int *total)
+{
+    if(g_module_init_flag != MODULE_RUNNING)
+    {
+        LYERRLOG("%s module state %d error",__func__,g_module_init_flag);
+        return LYNQ_E_CONFLICT;
+    }
+    Parcel* p=NULL;
+    int ret=lynq_send_common_request(p,g_wait_time,LYNQ_REQUEST_READ_SMS_FROM_MEMORY,1,"%d",index);
+    if(ret!=0)
+    {
+        return ret;
+    }
+    LYDBGLOG("LYNQ_REQUEST_READ_SMS_FROM_MEMORY SUCCESS!");
+    p->readInt32(&index);
+    p->readInt32(status);
+    p->readInt32(charset);
+    /*lei add for gws 2022/5/12*/
+    p->readInt32(current);
+    p->readInt32(total);
+    /*lei add for gws 2022/5/12*/
+    char *phone_num = NULL;
+    phone_num = strdupReadString(p);
+    *numLen = strlen(phone_num);
+    strcpy(teleNum, phone_num);
+    char *smscenter = NULL;
+    smscenter = strdupReadString(p);
+    *smscLen = strlen(smscenter);
+    strcpy(smsc,smscenter);
+    char *msg = NULL;
+    msg = strdupReadString(p);
+    *smslen = strlen(msg);
+    strcpy(message,msg);
+    free(phone_num);
+    free(smscenter);
+    free(msg);
+    delete p;
+    return RESULT_OK;
+}
+
+int lynq_get_smsc_address(char service_num[SMSC_MAX_LEN])
+{
+    if(g_module_init_flag != MODULE_RUNNING)
+    {
+        LYERRLOG("%s module state %d error",__func__,g_module_init_flag);
+        return LYNQ_E_CONFLICT;
+    }
+    Parcel* p=NULL;
+    int ret=lynq_send_common_request(p,g_wait_time,RIL_REQUEST_GET_SMSC_ADDRESS,0,"");
+    if(ret!=0)
+    {
+        return ret;
+    }
+    LYDBGLOG("lynq_get_smsc_address SUCCESS!");
+    char *temp = strdupReadString(p);
+    strcpy(service_num, temp);
+    free(temp);
+    delete p;
+    return RESULT_OK;
+}
+
+int lynq_wait_receive_new_sms(int *handle)
+{
+    if(g_module_init_flag != MODULE_RUNNING)
+    {
+        LYERRLOG("%s module state %d error",__func__,g_module_init_flag);
+        return LYNQ_E_CONFLICT;
+    }
+    if(handle==NULL)
+    {
+        LYERRLOG("handle is null!!!");
+        return LYNQ_E_NULL_ANONALY;
+    }
+    lynqNoticeWaitModuleNewSms();
+    *handle = sms_storage_index;
+    return RESULT_OK;
+}
+
+int lynq_set_smsc_address(const char* service_num)
+{
+    if(g_module_init_flag != MODULE_RUNNING)
+    {
+        LYERRLOG("%s module state %d error",__func__,g_module_init_flag);
+        return LYNQ_E_CONFLICT;
+    }
+    Parcel* p=NULL;
+    int ret=lynq_send_common_request(p,g_wait_time,RIL_REQUEST_SET_SMSC_ADDRESS,1,"%s", service_num);
+
+    if(ret!=RESULT_OK)
+    {
+        LYERRLOG("%s  8bit send error %d",__func__,__LINE__);
+        return ret;
+    }
+    LYDBGLOG("lynq_set_smsc_address SUCCESS!");
+    delete p;
+    return RESULT_OK;
+}
+
+int lynq_list_sms(char index_list[SMS_NUM_MAX])
+{
+    if(g_module_init_flag != MODULE_RUNNING)
+    {
+        LYERRLOG("%s module state %d error",__func__,g_module_init_flag);
+        return LYNQ_E_CONFLICT;
+    }
+    Parcel* p=NULL;
+    int ret=lynq_send_common_request(p,g_wait_time,LYNQ_REQUEST_LIST_SMS_FROM_MEMORY,0,"");
+    if(ret!=0)
+    {
+        return ret;
+    }
+    LYDBGLOG("lynq_list_sms SUCCESS!");
+    char *temp = strdupReadString(p);
+    strcpy(index_list, temp);
+    free(temp);
+    delete p;
+    return RESULT_OK;
+}
+
+int lynq_delete_sms(int index)
+{
+    if(g_module_init_flag != MODULE_RUNNING)
+    {
+        LYERRLOG("%s module state %d error",__func__,g_module_init_flag);
+        return LYNQ_E_CONFLICT;
+    }
+    Parcel* p=NULL;
+    int ret=lynq_send_common_request(p,g_wait_time,LYNQ_REQUEST_DELETE_SMS_FROM_MEMORY,1,"%d", index);
+
+    if(ret!=RESULT_OK)
+    {
+        LYERRLOG("%s  8bit send error %d",__func__,__LINE__);
+        return ret;
+    }
+    LYDBGLOG("lynq_delete_sms SUCCESS!");
+    delete p;
+    return RESULT_OK;
+}
+
+bool is_support_urc(int urc_id)
+{
+    switch(urc_id)
+    {
+        case RIL_UNSOL_RESPONSE_NEW_SMS:
+            return true;
+        default:
+            return false;
+    }
+}
+
+int lynq_sms_deinit(void)
+{
+    if (g_module_init_flag != MODULE_RUNNING)
+    {
+       LYERRLOG("module state is %d",g_module_init_flag);
+       return LYNQ_E_CONFLICT;
+    }
+    g_module_init_flag = MODULE_SWITCHING;
+    lynq_close_all_urc_socket_thread();
+    lynq_close_all_rc_socket_thread(); 
+    g_module_init_flag = MODULE_CLOSED;
+    return RESULT_OK;
+}
+
+void urc_msg_process(Parcel *p)
+{ 
+    int resp_type;
+    int urcid;
+    int slot_id;
+
+    int size=p->dataSize();
+    p->readInt32(&resp_type);
+    p->readInt32(&urcid);
+    p->readInt32(&slot_id);
+    LYINFLOG("%s urc id = %d, slot_id = %d, size is %d, msg is %s",__func__, urcid,slot_id,size,requestToString(urcid));
+    switch (urcid)
+    {
+        case RIL_UNSOL_RESPONSE_NEW_SMS://new sms received
+        {
+            LYINFLOG("**************:resp_type=%d,urcid=%d,slot_id=%d",resp_type,urcid,slot_id);
+            char *msg = NULL;
+            int index = 0;
+            msg = strdupReadString(p);
+            p->readInt32(&index);
+            sms_storage_index = index;
+            lynqNoticeGetModuleNewSms();
+            free(msg);
+            break;
+        }
+        default:
+            break;
+    }
+}
+
diff --git a/src/lynq/lib/liblynq-sms/makefile b/src/lynq/lib/liblynq-sms/makefile
index 9daf449..e5dedab 100755
--- a/src/lynq/lib/liblynq-sms/makefile
+++ b/src/lynq/lib/liblynq-sms/makefile
@@ -5,79 +5,60 @@
                 -std=gnu++14 \
                 -g -Os \
                 -flto \
+                -DRIL_SHLIB \
+                -DATCI_PARSE \
                 -fPIC \
+                -DKEEP_ALIVE \
+                -DECALL_SUPPORT \
                 -fpermissive \
 
-$(warning ################# C2K support: $(RAT_CONFIG_C2K_SUPPORT))
-ifeq ($(strip $(RAT_CONFIG_C2K_SUPPORT)), yes)
-    LOCAL_CFLAGS += -DC2K_SUPPORT
 
-endif
 
-ifeq ($(strip $(MTK_MULTI_SIM_SUPPORT)), dsds)
-    LOCAL_CFLAGS += -DANDROID_SIM_COUNT_2 \
-                     -DANDROID_MULTI_SIM \
-                     -DMODE_DSDS
-endif
-
-ifeq ($(strip $(MTK_MULTI_SIM_SUPPORT)), dsss)
-    LOCAL_CFLAGS += -DMODE_DSSS
-endif
-
-$(warning ################# TARGET_PLATFORM: $(TARGET_PLATFORM))
-ifeq ($(strip $(TARGET_PLATFORM)), mt2731)
-#$(warning #################add for debug $(ROOT), $(includedir))
-$(warning ################# TARGET_PLATFORM_MT2731)
-    LOCAL_CFLAGS += -DTARGET_PLATFORM_MT2731 \
-                    -DMD_93_SUPPORT
-else ifeq ($(strip $(TARGET_PLATFORM)), mt2635)
-$(warning ################# TARGET_PLATFORM_MT2635)
-    LOCAL_CFLAGS += -DTARGET_PLATFORM_MT2635 \
-                    -DMD_90_SUPPORT
-endif
-
-$(warning ################# RITA ROOT: $(ROOT),includedir:$(includedir))
+$(warning ################# lynq data demo ROOT: $(ROOT),includedir:$(includedir))
 LOCAL_PATH   = .
 
 LOCAL_C_INCLUDES = \
   -I. \
   -I$(LOCAL_PATH)/include/libsms \
-  -I$(ROOT)$(includedir)/vendor-ril \
+  -I$(ROOT)$(includedir)/logger \
   -I$(ROOT)$(includedir)/liblog \
+  -I$(ROOT)$(includedir)/vendor-ril \
+  -I$(ROOT)$(includedir)/lynq_shm \
 
 
 LOCAL_LIBS := \
     -L. \
     -ldl \
-    -lpthread \
-    -lbinder \
-    -lutils \
+    -lstdc++ \
+    -llog \
     -lcutils \
+    -lutils \
+    -lbinder \
+    -lpthread \
     -llynq-log \
+    -llynq-shm \
 
-SOURCES = $(wildcard *.c wildcard *.h src/*.cpp)
+SOURCES = $(wildcard *.cpp)
 
 EXECUTABLE = liblynq-sms.so
 
-OBJECTS=$(SOURCES:.c=.o)
+OBJECTS=$(SOURCES:.cpp=.o)
 
 
 .PHONY: build clean install pack_rootfs 
-
 all: build
 $(EXECUTABLE): $(OBJECTS)
 	$(CXX) -shared -Wl,--no-undefined $(OBJECTS) $(LOCAL_LIBS) $(LOCAL_CFLAGS) $(LOCAL_C_INCLUDES) -o $@
 
-%.o : %.c
-	$(CC) $(LOCAL_C_INCLUDES) $(LOCAL_CFLAGS) $(LOCAL_LIBS) -o $@ -c $< 
+%.o : %.cpp
+	$(CXX) $(LOCAL_C_INCLUDES) $(LOCAL_CFLAGS) $(LOCAL_LIBS) -o $@ -c $<
 
 build:  $(EXECUTABLE)
 	$(warning ########## build $(EXECUTABLE)  ##########)
-
 install:
 	mkdir -p $(ROOT)$(base_libdir)/
 	install $(EXECUTABLE) $(ROOT)$(base_libdir)/
-
+	mkdir -p $(ROOT)$(includedir)/$(NAME)/sdk
 pack_rootfs:
 	mkdir -p $(PACK_INITRAMFS_TO)$(base_libdir)/
 	cp -af $(EXECUTABLE) $(PACK_INITRAMFS_TO)$(base_libdir)/
@@ -85,7 +66,7 @@
 	mkdir -p $(PACK_TO)$(base_libdir)/
 	cp -af $(EXECUTABLE) $(PACK_TO)$(base_libdir)/
 	$(CROSS)strip $(PACK_TO)$(base_libdir)/$(EXECUTABLE)
-
 .PHONY: clean
 clean:
 	$(RM) $(OBJECTS) $(EXECUTABLE)
+	-find . -name "*.o" -delete
diff --git a/src/lynq/lib/liblynq-sms/src/lynq_sms.cpp b/src/lynq/lib/liblynq-sms/src/lynq_sms.cpp
deleted file mode 100755
index fbf1b64..0000000
--- a/src/lynq/lib/liblynq-sms/src/lynq_sms.cpp
+++ /dev/null
@@ -1,597 +0,0 @@
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <binder/Parcel.h>
-#include <sys/socket.h>
-#include <netdb.h>
-#include <arpa/inet.h>
-#include <string.h>
-#include <errno.h>
-#include <unistd.h>
-#include <cutils/jstring.h>
-#include "lynq_sms.h"
-#include <vendor-ril/telephony/ril.h>
-#include <liblog/lynq_deflog.h>
-#include <sys/types.h>
-#define LYNQ_REQUEST_VENDOR_BASE 8000
-#define LYNQ_URC_VENDOR_BASE 9000
-#define LYNQ_AT_SNED (LYNQ_REQUEST_VENDOR_BASE +1)
-#define LYNQ_REQUEST_WRITE_SMS_TO_MEMORY (LYNQ_REQUEST_VENDOR_BASE +4)
-#define LYNQ_REQUEST_READ_SMS_FROM_MEMORY (LYNQ_REQUEST_VENDOR_BASE + 5)
-#define LYNQ_REQUEST_DELETE_SMS_FROM_MEMORY (LYNQ_REQUEST_VENDOR_BASE + 6)
-#define LYNQ_REQUEST_LIST_SMS_FROM_MEMORY (LYNQ_REQUEST_VENDOR_BASE + 7)
-using ::android::Parcel;
-
-
-#define MAX_SMS_BUF 5120
-#define SERVER_PORT     8088
-#define SERVER_URC_PORT 8086
-#define SERVER_IP    "127.0.0.1"
-#define USER_LOG_TAG "LYNQ_SMS"
-typedef struct{
-    int uToken;
-    int request;
-    int paramLen;
-    char param[1024*8];
-}lynq_client_t;
-
-typedef struct {
-    int sock_fd;
-    struct sockaddr_in addrto;
-    struct sockaddr_in addrfrom;
-}sms_instance_t;
-
-
-enum{
-    SMS_OK = 0,
-    SMS_FAIL,
-    SMS_PARAM_ERR
-};
-
-typedef struct
-{
-    int index;          /*the index of sms in memory,0-255 */
-    int status;         /* 0:read, 1:unread */
-    int charset;        /* 0:7bit, 1:8bit, 2:16bit(chinese) */
-    char smsc[SMSC_MAX_LEN];    /* smsc address */
-    int smscLen;                /* smsc string  length */
-    int smslen;                 /* the length of sms,the maximum length shall not exceed the length specified in 3GGP protocol(160/70) */
-    char message[MSG_MAX_LEN];  /* sms content */
-    char teleNum[TELEPHONE_NUM_LEN];    /* telephony number */
-    int numLen;                         /* telephony number strings length */
-    /*lei add for gsw 2022/5/12*/
-    int current;    /* Long and short letter after the split letter subscript */
-    int total;      /* The total number of short creeds after the separation of long and short letters */
-    /*lei add for gsw 2022/5/12*/
-}lynq_sms_msg_info_t;
-
-typedef struct{
-    int index;              /*the index of sms in memory,0-255 */
-    int status;             /* 0:read, 1:unread */
-    uint64_t timestamp;     /* reciced message timestamp */
-    char telephone_num[TELEPHONE_NUM_LEN];    /* sender telephone number */
-}lynq_sms_info_t;
-
-typedef struct{
-    int num_msg;        /* numbers of messsage */
-    lynq_sms_info_t lynq_sms_info[STORAGE_SMS_MAX_SIZE];  /* message information */
-}lynq_sms_list_info_t;
-
-static sms_instance_t sms_instance;
-int urc_recive_status = 1;
-static pthread_mutex_t s_receive_sms_mutex = PTHREAD_MUTEX_INITIALIZER;
-static pthread_cond_t s_receive_sms_cond = PTHREAD_COND_INITIALIZER;
-pthread_t sms_recv_pid = 0;
-int GuToken = 0;
-int sms_storage_index = 0;
-int urc_sock_fd = -1;
-/**g_lynq_sms_init_flag
-* @brief mark sms initialization state
-* 0:Uninitialized
-* 1:initialized
-*/
-static int g_lynq_sms_init_flag = 0;
-/**g_lynq_sms_sendto_mutex
-* @brief mark sms send request mutex
-*/
-static pthread_mutex_t g_lynq_sms_sendto_mutex;
-
-static char *strdupReadString(Parcel &p) {
-    size_t stringlen;
-    const char16_t *s16;
-
-    s16 = p.readString16Inplace(&stringlen);
-
-    return strndup16to8(s16, stringlen);
-}
-
-static int sms_server_init(void)
-{
-    int ret = SMS_OK;
-
-    bzero(&sms_instance, sizeof(sms_instance));
-    if ((sms_instance.sock_fd = socket(AF_INET, SOCK_DGRAM, 0)) == -1){
-        LYERRLOG("socket error:%s\n", strerror(errno));
-        ret = SMS_FAIL;
-    }
-    struct timeval timeOut;
-    timeOut.tv_sec = 60;
-    timeOut.tv_usec = 0;
-    if (setsockopt(sms_instance.sock_fd, SOL_SOCKET, SO_RCVTIMEO, &timeOut, sizeof(timeOut)) < 0) 
-    {
-        LYERRLOG("time out setting failed\n");
-        return -1;
-    }
-    sms_instance.addrto.sin_family=AF_INET;
-    sms_instance.addrto.sin_addr.s_addr = inet_addr(SERVER_IP);
-    sms_instance.addrto.sin_port=htons(SERVER_PORT);
-    sms_instance.addrfrom.sin_family=AF_INET;
-    sms_instance.addrfrom.sin_addr.s_addr = inet_addr(SERVER_IP);
-    sms_instance.addrfrom.sin_port=htons(SERVER_PORT);
-    pthread_mutex_init(&g_lynq_sms_sendto_mutex, NULL);
-
-    return ret;
-}
-
-int send_buff_to_service(char *buff, int length)
-{
-    int addr_len = sizeof(sms_instance.addrto);
-    int ret = 0;
-    ret = sendto(sms_instance.sock_fd, buff, length, 0, (struct sockaddr *)&sms_instance.addrto, addr_len);
-
-    return ret;
-}
-int waitReceiveNewSms()
-{
-    int ret = 0;
-    pthread_mutex_lock(&s_receive_sms_mutex);
-    ret = pthread_cond_wait(&s_receive_sms_cond,&s_receive_sms_mutex);
-    pthread_mutex_unlock(&s_receive_sms_mutex);
-    return ret;
-}
-void sendSignalNewSms()
-{
-    pthread_mutex_lock(&s_receive_sms_mutex);
-    pthread_cond_signal(&s_receive_sms_cond);
-    pthread_mutex_unlock(&s_receive_sms_mutex);
-    return;
-}
-int lynq_wait_receive_new_sms(int *handle)
-{
-    if(g_lynq_sms_init_flag == 0)
-    {
-        return -1;
-    }
-    if(handle==NULL)
-    {
-        LYERRLOG("handle is null!!!");
-        return -1;
-    }
-    waitReceiveNewSms();
-    *handle = sms_storage_index;
-    return 0;
-}
-int recvfrom_server(void *resp, int id)
-{
-    char recv_buf[4096] = {0};
-    int recv_len = 0;
-    int len = sizeof(struct sockaddr_in);
-    Parcel resp_parcel; // = new Parcel();
-    int32_t resp_type = 0;
-    int32_t token = 0;
-    int32_t request = 0;
-    int32_t slot_id = 0;
-    int32_t error = -1;
-    while (request != id)
-    {
-        recv_len = recvfrom(sms_instance.sock_fd, recv_buf, sizeof(recv_buf), 0, (struct sockaddr*)&sms_instance.addrfrom, (socklen_t*)&len);
-        LYDBGLOG("##################recv length:%d\n", recv_len);
-        if(recv_len <= 0){
-            LYERRLOG("recvform error: %s\n", strerror(errno));
-            return SMS_FAIL;
-        }
-        resp_parcel.setData((uint8_t *)recv_buf,recv_len);
-        resp_parcel.setDataPosition(0);
-        if(resp_parcel.dataAvail() > 0)
-        {
-            resp_parcel.readInt32(&resp_type);
-            resp_parcel.readInt32(&token);
-            resp_parcel.readInt32(&request);
-            resp_parcel.readInt32(&slot_id);
-            resp_parcel.readInt32(&error);
-        }
-    }
-    LYDBGLOG("resp data: %d,%d, %d,%d\n", resp_type, request, slot_id, error);
-    switch(request)
-    {
-        case RIL_REQUEST_SEND_SMS:
-        case RIL_REQUEST_SET_SMSC_ADDRESS:
-            if(0 != error)
-            {
-                LYDBGLOG("request:%d failure,Error code:%d",request,error);
-            }
-            break;
-
-        case RIL_REQUEST_GET_SMSC_ADDRESS:
-            if(0 != error)
-            {
-                LYDBGLOG("request:%d failure,Error code:%d",request,error);
-            }
-            else
-            {
-                char *temp = strdupReadString(resp_parcel);
-                memcpy(resp, temp, strlen(temp));
-                free(temp);
-            }
-            break;
-        case LYNQ_REQUEST_READ_SMS_FROM_MEMORY:
-            if(0 != error)
-            {
-                LYDBGLOG("request:%d failure,Error code:%d",request,error);
-            }
-            else
-            {
-                LYDBGLOG("LYNQ_REQUEST_READ_SMS_FROM_MEMORY SUCCESS!");
-                int index = 0;
-                int status = 0;
-                char *phone_num = NULL;
-                char *smsc = NULL;
-                char *msg = NULL;
-                int  charset = 0;
-                lynq_sms_msg_info_t * sms_info = (lynq_sms_msg_info_t *)resp;
-                resp_parcel.readInt32(&sms_info->index);
-                resp_parcel.readInt32(&sms_info->status);
-                resp_parcel.readInt32(&sms_info->charset);
-                /*lei add for gws 2022/5/12*/
-                resp_parcel.readInt32(&sms_info->current);
-                resp_parcel.readInt32(&sms_info->total);
-                /*lei add for gws 2022/5/12*/
-                phone_num = strdupReadString(resp_parcel);
-                smsc = strdupReadString(resp_parcel);
-                msg = strdupReadString(resp_parcel);
-                memcpy(sms_info->smsc, smsc, strlen(smsc));
-                memcpy(sms_info->message, msg, strlen(msg));
-                memcpy(sms_info->teleNum, phone_num, strlen(phone_num));
-                sms_info->smscLen = strlen(smsc);
-                sms_info->smslen = strlen(msg);
-                sms_info->numLen = strlen(phone_num);
-                free(phone_num);
-                free(smsc);
-                free(msg);
-            }
-            break;
-
-        case LYNQ_REQUEST_DELETE_SMS_FROM_MEMORY:
-            if(0 != error)
-            {
-                LYDBGLOG("request:%d failure,Error code:%d",request,error);
-            }
-            break;
-
-        case LYNQ_REQUEST_LIST_SMS_FROM_MEMORY:
-            if(0 != error)
-            {
-                LYDBGLOG("request:%d failure,Error code:%d",request,error);
-            }else{
-                int temp = 0;
-                char *chartemp = NULL;
-                chartemp = strdupReadString(resp_parcel);
-                temp = strlen(chartemp);
-                if((temp > 0) && (temp <= SMS_NUM_MAX))
-                {
-                    memcpy((char*)resp,chartemp,temp);
-                }
-                free(chartemp);
-            }
-            break;
-
-        default:
-            LYERRLOG("not support id: %d\n", request);
-            break;
-    }
-
-    return error;
-}
-
-void * handle_urc(void *p)
-{
-    int ret = SMS_OK;
-    char recv_buf[8192] = {0};
-    Parcel resp;
-    int len = sizeof(struct sockaddr_in);
-    if ((urc_sock_fd = socket(AF_INET, SOCK_DGRAM, 0)) == -1){
-        LYERRLOG("socket error:%s\n", strerror(errno));
-        ret = SMS_FAIL;
-    }
-    int opt = 1;
-    ret = setsockopt(urc_sock_fd,SOL_SOCKET,SO_BROADCAST,&opt,sizeof(opt));
-    ret = setsockopt(urc_sock_fd,SOL_SOCKET,SO_REUSEADDR,&opt,sizeof(opt));
-
-    struct sockaddr_in server;
-    server.sin_family=AF_INET;
-    server.sin_addr.s_addr = htonl(INADDR_ANY);
-    server.sin_port=htons(SERVER_URC_PORT);
-    ret = bind(urc_sock_fd ,(struct sockaddr*)&server, sizeof(server));
-    while(urc_recive_status)
-    {
-        int slot_id = 0;
-        char *phone_num = NULL;
-        char *smsc = NULL;
-        char *msg = NULL;
-        int  charset = 0;
-        int resp_type = 0;
-        int unsol = 0;
-        int index = 0;
-        ret = recvfrom(urc_sock_fd, recv_buf, sizeof(recv_buf), 0, (struct sockaddr*)&server, (socklen_t*)&len);
-        LYDBGLOG("urc recv length: %d\n", ret);
-        if(ret <= 0)
-        {
-            LYERRLOG("recvform error: %s\n", strerror(errno));
-            continue;
-        }
-        resp.setData((uint8_t *)recv_buf,ret);
-        resp.setDataPosition(0);
-        if(resp.dataAvail() > 0) {
-            resp.readInt32(&resp_type);
-            resp.readInt32(&unsol);
-            resp.readInt32(&slot_id);
-        }
-        LYERRLOG("resp_type%d,unsol=%d,slot_id=%d",resp_type,unsol,slot_id);
-        if(RIL_UNSOL_RESPONSE_NEW_SMS == unsol)
-        {
-            msg = strdupReadString(resp);
-            resp.readInt32(&index);
-            sms_storage_index = index;
-            //sms_urc_callback(slot_id, phone_num, smsc, msg, charset);
-            sendSignalNewSms();
-            free(msg);
-        }
-    }
-}
-
-int lynq_sms_init(int uToken)
-{
-    //Check whether sms has been initialized,0:Uninitialized,1:initialized
-    if(g_lynq_sms_init_flag == 1)
-    {
-        LYERRLOG("sms has init!!!");
-        //return error code 9000 (LYNQ_E_CONFLICT)
-        return 9000;
-    }
-    g_lynq_sms_init_flag = 1;
-    int ret = sms_server_init();
-    GuToken = uToken;
-    LYLOGSET(LOG_INFO);
-    LYLOGEINIT(USER_LOG_TAG);
-    urc_recive_status = 1;
-    pthread_create(&sms_recv_pid, NULL, handle_urc, NULL);
-    LYERRLOG("lynq_sms_init ret: %d\n", ret);
-    return ret;
-}
-
-int lynq_sms_deinit(void)
-{
-    int ret = 0;
-    //Check whether sms has been Uninitialized,0:Uninitialized,1:initialized
-    if(g_lynq_sms_init_flag == 0)
-    {
-        LYERRLOG("sms has deinit!!!");
-        //return error code 9000 (LYNQ_E_CONFLICT)
-        return 9000;
-    }
-    urc_recive_status = 0;
-    g_lynq_sms_init_flag = 0;
-    if(sms_recv_pid > 0)
-    {
-        ret = pthread_cancel(sms_recv_pid);
-        LYERRLOG("pthread cancel ret = %d",ret);
-        ret = pthread_join(sms_recv_pid,NULL);
-        LYERRLOG("pthread join ret = %d",ret);
-    }
-
-    if(sms_instance.sock_fd > 0)
-    {
-        close(sms_instance.sock_fd);
-        LYERRLOG("sms_instance.sock_fd");
-        close(urc_sock_fd);
-        LYERRLOG("URC sock_fd close");
-    }
-    return 0;
-}
-
-void ArrayToStr(unsigned char *Buff, unsigned int BuffLen, char *OutputStr)
-{
-    int i = 0;
-    char TempBuff[MAX_SMS_BUF] = {0};
-    char strBuff[MAX_SMS_BUF] = {0};
-    if(sizeof(Buff) < BuffLen)
-    {
-        LYERRLOG("BuffLen is error\n");
-        return;
-    }
-    for(i = 0; i<BuffLen;i++)
-    {
-        sprintf(TempBuff,"%02x",(unsigned char)Buff[i]);
-        strncat(strBuff,TempBuff,BuffLen*2);
-    }
-    strncpy(OutputStr, strBuff, BuffLen*2);
-    return;
-}
-
-int lynq_send_sms(char telephony_num[TELEPHONE_NUM_LEN], int charset, char *msg, int msglen)
-{
-    if(g_lynq_sms_init_flag == 0)
-    {
-        return -1;
-    }
-    lynq_client_t client;
-    int ret = SMS_OK;
-    if (NULL == msg)
-    {
-        LYERRLOG("input msg is null!!!");
-        return -1;
-    }
-    if (strlen(msg) == 0)
-    {
-        LYERRLOG("msg is null,plz input msg");
-    }
-    client.request = RIL_REQUEST_SEND_SMS;
-    client.uToken = GuToken;
-    client.paramLen = 3;
-    bzero(client.param, 8*1024);
-    if(charset == 1)//means 8 bit
-    {
-        char msg_e_b[msglen*2+1] = {0};// +1 for end of string.*2:A char array contains two elements of a string for each value
-        ArrayToStr(msg, msglen, msg_e_b);
-        sprintf(client.param, "%s %d %s\n", telephony_num, charset, msg_e_b);
-    }
-    else
-    {
-        sprintf(client.param, "%s %d %s\n", telephony_num, charset, msg);
-    }
-    pthread_mutex_lock(&g_lynq_sms_sendto_mutex);
-    ret = send_buff_to_service((char *)&client, sizeof(client));
-    ret = recvfrom_server(NULL, RIL_REQUEST_SEND_SMS);
-    pthread_mutex_unlock(&g_lynq_sms_sendto_mutex);
-
-    return ret;
-}
-
-int lynq_read_sms(int index,int *status,int *charset,char smsc[SMSC_MAX_LEN],int *smscLen,int *smslen,char message[MSG_MAX_LEN],char teleNum[TELEPHONE_NUM_LEN],int *numLen,int *current,int *total)
-{
-    if(g_lynq_sms_init_flag == 0)
-    {
-        return -1;
-    }
-    lynq_client_t client;
-    lynq_sms_msg_info_t sms_msg_info;
-    int lenTemp = -1;
-    int ret = SMS_OK;
-    client.request = LYNQ_REQUEST_READ_SMS_FROM_MEMORY;
-    client.uToken = GuToken;
-    client.paramLen = 1;
-    bzero(client.param, 8*1024);
-    sprintf(client.param, "%d", index);
-    pthread_mutex_lock(&g_lynq_sms_sendto_mutex);
-    ret = send_buff_to_service((char *)&client, sizeof(client));
-    ret = recvfrom_server((void *)&sms_msg_info, LYNQ_REQUEST_READ_SMS_FROM_MEMORY);
-    pthread_mutex_unlock(&g_lynq_sms_sendto_mutex);
-    if(ret == 0)
-    {
-        *charset = sms_msg_info.charset;
-        *status = sms_msg_info.status;
-        *smslen = sms_msg_info.smslen;
-        *smscLen = sms_msg_info.smscLen;
-        *numLen = sms_msg_info.numLen;
-        *current = sms_msg_info.current;
-        *total = sms_msg_info.total;
-        if((*smscLen > 0) && (*smscLen < SMSC_MAX_LEN))
-        {
-            memcpy(smsc,sms_msg_info.smsc,*smscLen);
-            smsc[*smscLen] = '\0';
-        }
-        if((*smslen > 0) && (*smslen < MSG_MAX_LEN))
-        {
-            memcpy(message,sms_msg_info.message,*smslen);
-            message[*smslen] = '\0';
-        }
-        if((*numLen > 0) && (*numLen < TELEPHONE_NUM_LEN))
-        {
-            memcpy(teleNum,sms_msg_info.teleNum,*numLen);
-            teleNum[*numLen] = '\0';
-        }
-    }
-    return ret;
-}
-
-int lynq_get_smsc_address(char service_num[SMSC_MAX_LEN])
-{
-    if(g_lynq_sms_init_flag == 0)
-    {
-        return -1;
-    }
-    if(NULL == service_num)
-    {
-        return -1;
-    }
-    int ret = SMS_OK;
-    lynq_client_t client;
-
-    client.request = RIL_REQUEST_GET_SMSC_ADDRESS;
-    client.uToken = GuToken;
-    client.paramLen = 0;
-    pthread_mutex_lock(&g_lynq_sms_sendto_mutex);
-    ret = send_buff_to_service((char *)&client, sizeof(client));
-    ret = recvfrom_server(service_num, RIL_REQUEST_GET_SMSC_ADDRESS);
-    pthread_mutex_unlock(&g_lynq_sms_sendto_mutex);
-
-    return ret;
-}
-
-int lynq_set_smsc_address(const char* service_num)
-{
-    if(g_lynq_sms_init_flag == 0)
-    {
-        return -1;
-    }
-    if(NULL == service_num)
-    {
-        return -1;
-    }
-    if(strlen(service_num) == 0)
-    {
-        return -1;
-    }
-    lynq_client_t client;
-    int ret = SMS_OK;
-
-    client.request = RIL_REQUEST_SET_SMSC_ADDRESS;
-    client.uToken = GuToken;
-    client.paramLen = 1;
-    bzero(client.param, 8*1024);
-    sprintf(client.param, "%s", service_num);
-    pthread_mutex_lock(&g_lynq_sms_sendto_mutex);
-    send_buff_to_service((char *)&client, sizeof(client));
-    ret = recvfrom_server(NULL, RIL_REQUEST_SET_SMSC_ADDRESS);
-    pthread_mutex_unlock(&g_lynq_sms_sendto_mutex);
-
-    return ret;
-}
-
-int lynq_list_sms(char index_list[SMS_NUM_MAX])
-{
-    if(g_lynq_sms_init_flag == 0)
-    {
-        return -1;
-    }
-    lynq_client_t client;
-    int ret = SMS_OK;
-    client.request = LYNQ_REQUEST_LIST_SMS_FROM_MEMORY;
-    client.uToken = GuToken;
-    client.paramLen = 0;
-    pthread_mutex_lock(&g_lynq_sms_sendto_mutex);
-    ret = send_buff_to_service((char *)&client, sizeof(client));
-    ret = recvfrom_server((void *)index_list, LYNQ_REQUEST_LIST_SMS_FROM_MEMORY);
-    pthread_mutex_unlock(&g_lynq_sms_sendto_mutex);
-    return ret;
-}
-
-int lynq_delete_sms(int index)
-{
-    if(g_lynq_sms_init_flag == 0)
-    {
-        return -1;
-    }
-    lynq_client_t client;
-    int ret = SMS_OK;
-    client.request = LYNQ_REQUEST_DELETE_SMS_FROM_MEMORY;
-    client.uToken = GuToken;
-    client.paramLen = 1;
-    bzero(client.param, 8*1024);
-    sprintf(client.param, "%d", index);
-    pthread_mutex_lock(&g_lynq_sms_sendto_mutex);
-    ret = send_buff_to_service((char *)&client, sizeof(client));
-    ret = recvfrom_server(NULL, LYNQ_REQUEST_DELETE_SMS_FROM_MEMORY);
-    pthread_mutex_unlock(&g_lynq_sms_sendto_mutex);
-    return ret;
-}
diff --git a/src/lynq/lib/liblynq-systime/src/lynq_systime.c b/src/lynq/lib/liblynq-systime/src/lynq_systime.c
index 29bf676..46ec442 100755
--- a/src/lynq/lib/liblynq-systime/src/lynq_systime.c
+++ b/src/lynq/lib/liblynq-systime/src/lynq_systime.c
@@ -66,7 +66,7 @@
 
     system(date);
     system(time);
-
+    system("hwclock -w -f /dev/rtc0");
     return 0;
 }
 
diff --git a/src/lynq/lib/liblynq-uci/lynq_uci.config b/src/lynq/lib/liblynq-uci/lynq_uci.config
index 86f578c..5b7c208 100755
--- a/src/lynq/lib/liblynq-uci/lynq_uci.config
+++ b/src/lynq/lib/liblynq-uci/lynq_uci.config
@@ -26,3 +26,6 @@
 
 config  lynq_rndis  'lynq_rndis'
         option initiate '0'
+	
+config  rndis_status 'rndis'
+        option status '0'
diff --git a/src/lynq/lib/liblynq-wifi6/libwifi6.c b/src/lynq/lib/liblynq-wifi6/libwifi6.c
index 78c756e..d0c3c32 100755
--- a/src/lynq/lib/liblynq-wifi6/libwifi6.c
+++ b/src/lynq/lib/liblynq-wifi6/libwifi6.c
@@ -60,7 +60,14 @@
 const char * state_scan_result = "CTRL-EVENT-SCAN-RESULTS";
 const char * STATE_COMPLETED = "COMPLETED";
 
-static struct wpa_ctrl * g_lynq_wpa_ctrl[2] = {0};
+struct local_wpa_ctrl{
+    struct wpa_ctrl *ctrl;
+    pthread_mutex_t mutex;
+};
+
+static pthread_mutex_t s_check_wpa_ctrl_mutex = PTHREAD_MUTEX_INITIALIZER;
+
+static struct local_wpa_ctrl * g_lynq_wpa_ctrl[2] = {0};
 
 //you.chen add for tv-box start
 volatile int g_gbw_enabled = 0;
@@ -76,6 +83,50 @@
     int net_no;
 }curr_status_info;
 
+static int local_wpa_ctrl_request(struct local_wpa_ctrl *ctrl, const char *cmd, size_t cmd_len,
+                            char *reply, size_t *reply_len,
+                                  void (*msg_cb)(char *msg, size_t len))
+{
+    int ret;
+    if (ctrl->ctrl == NULL) {
+        printf("local_wpa_ctrl_request ctrl is null\n");
+        return -1;
+    }
+    pthread_mutex_lock(&ctrl->mutex);
+    ret = wpa_ctrl_request(ctrl->ctrl, cmd, cmd_len, reply, reply_len, msg_cb);
+    pthread_mutex_unlock(&ctrl->mutex);
+    return ret;
+}
+
+static struct local_wpa_ctrl * inner_get_wpa_ctrl(int index) {
+    int repeat_cnt;
+    struct local_wpa_ctrl *lynq_wpa_ctrl = NULL;
+    pthread_mutex_lock(&s_check_wpa_ctrl_mutex);
+    printf("inner_get_wpa_ctrl\n");
+    for (repeat_cnt = 0; repeat_cnt < 5 && NULL == g_lynq_wpa_ctrl[index]; repeat_cnt++) {
+        pthread_mutex_unlock(&s_check_wpa_ctrl_mutex);
+//        printf("wait enable finish\n");
+        usleep(500 * 1000);
+        pthread_mutex_lock(&s_check_wpa_ctrl_mutex);
+    }
+    if (NULL == g_lynq_wpa_ctrl[index]) {
+        printf("NULL == g_lynq_wpa_ctrl[index]\n");
+        goto out_addr;
+    }
+    if (NULL == g_lynq_wpa_ctrl[index]->ctrl) {
+        g_lynq_wpa_ctrl[index]->ctrl = wpa_ctrl_open(CTRL_PATH[index]);
+        if (NULL == g_lynq_wpa_ctrl[index]->ctrl) {
+            printf("wpa_ctrl_open fail\n");
+            goto out_addr;
+        }
+        pthread_mutex_init(&g_lynq_wpa_ctrl[index]->mutex, NULL);
+    }
+    lynq_wpa_ctrl = g_lynq_wpa_ctrl[index];
+out_addr:
+    pthread_mutex_unlock(&s_check_wpa_ctrl_mutex);
+    return lynq_wpa_ctrl;
+}
+
 #define PRINT_AND_RETURN_VALUE(str,value) \
 {\
     perror((str));\
@@ -93,23 +144,17 @@
 #define CHECK_WPA_CTRL(index) int ret = 0;\
     size_t reply_len = MAX_RET; \
     char cmd_reply[MAX_RET]={0}; \
-    struct wpa_ctrl *lynq_wpa_ctrl = NULL; \
+    struct local_wpa_ctrl *lynq_wpa_ctrl = NULL; \
     do{ \
-        if (NULL == g_lynq_wpa_ctrl[index]) { \
-            g_lynq_wpa_ctrl[index] = wpa_ctrl_open(CTRL_PATH[index]); \
-            if (NULL == g_lynq_wpa_ctrl[index]) { \
-                printf("wpa_ctrl_open fail\n"); \
-                return -1; \
-            } \
-        } \
-        lynq_wpa_ctrl = g_lynq_wpa_ctrl[index]; \
+        lynq_wpa_ctrl = inner_get_wpa_ctrl(index); \
+        if (NULL == lynq_wpa_ctrl) return -1; \
     }while(0)
 
 #define DO_REQUEST(cmd_str) do { \
         reply_len = MAX_RET;\
         cmd_reply[0] = '\0'; \
         printf("to call [%s]\n", cmd_str);  \
-        ret = wpa_ctrl_request(lynq_wpa_ctrl, cmd_str, strlen(cmd_str), cmd_reply, &reply_len, NULL); \
+        ret = local_wpa_ctrl_request(lynq_wpa_ctrl, cmd_str, strlen(cmd_str), cmd_reply, &reply_len, NULL); \
         if (ret != 0) { \
             printf("call "#cmd_str" fail %d\n", ret); \
             return ret; \
@@ -130,6 +175,7 @@
     }while (0)
 
 
+static int exec_cmd(const char *str_cmd, char * str_cmd_ret, size_t max_len);
 
 static void APWatcherThreadProc() {
     size_t len = MAX_RET;
@@ -264,6 +310,13 @@
 {
     int ret = 0;
     int i;
+    pthread_mutex_lock(&s_check_wpa_ctrl_mutex);
+
+    if (g_lynq_wpa_ctrl[0] != NULL && g_lynq_wpa_ctrl[1] != NULL) {
+        goto out_enable;
+    }
+
+    printf("lynq_wifi_enable1\n");
     const char * cmd_check_service =
             "state=`systemctl is-active wg870_drv_insmod.service`\n"
             "[ \"\"$state == \"active\" ] && exit 0\n"
@@ -275,7 +328,8 @@
     ret = system(cmd_check_service);
     if (ret != 0) {
         printf("service state %d\n", ret);
-        return -1;
+        ret = -1;
+        goto out_enable;
     }
 
     for (i=0; i<10; i++) {
@@ -286,7 +340,8 @@
     }
 
     if (i >= 10) {
-        return -1;
+        ret = -1;
+        goto out_enable;
     }
 
     //@todo delete add temp check for socket avilable start (20220606)
@@ -300,7 +355,8 @@
 
     if (i >= 60)
     {
-        return -1;
+        ret  = -1;
+        goto out_enable;
     }
     //@todo delete add temp check for socket avilable end (20220606)
 
@@ -318,14 +374,16 @@
     if (g_ap_watcher_pid == 0 ) {
         ret=pthread_create(&g_ap_watcher_pid,NULL,APWatcherThreadProc,NULL);
         if(ret<0){
-            return -1;
+            ret = -1;
+            goto out_enable;
         }
     }
 
     if (g_sta_watcher_pid == 0 ) {
         ret=pthread_create(&g_sta_watcher_pid,NULL,STAWatcherThreadProc,NULL);
         if(ret<0){
-            return -1;
+            ret = -1;
+            goto out_enable;
         }
     }
 
@@ -336,11 +394,18 @@
         }
     }
 
+    g_lynq_wpa_ctrl[0] = malloc(sizeof (struct local_wpa_ctrl));
+    g_lynq_wpa_ctrl[1] = malloc(sizeof (struct local_wpa_ctrl));
+    memset(g_lynq_wpa_ctrl[0], 0 , sizeof(struct local_wpa_ctrl));
+    memset(g_lynq_wpa_ctrl[1], 0 , sizeof(struct local_wpa_ctrl));
+out_enable:
+    pthread_mutex_unlock(&s_check_wpa_ctrl_mutex);
     return ret;
 }
 
 int lynq_wifi_disable(void)
 {
+    pthread_mutex_lock(&s_check_wpa_ctrl_mutex);
     g_ap_watcher_stop_flag = 1;
     g_sta_watcher_stop_flag = 1;
     if (g_ap_watcher_pid != 0)
@@ -356,11 +421,95 @@
     g_lynq_wpa_ctrl[0] = NULL;
     g_lynq_wpa_ctrl[1] = NULL;
     system("systemctl stop wg870_drv_insmod.service");
-	return 0;
+    pthread_mutex_unlock(&s_check_wpa_ctrl_mutex);
+    return 0;
+}
+
+static inline char inner_convert_char(char in)
+{
+    if (in >= '0' && in <= '9')
+    {
+        return in - '0';
+    }
+    else if (in >= 'a' && in <= 'f')
+    {
+        return in - 'a' + 10;
+    }
+    else if (in >= 'A' && in <= 'F')
+    {
+        return in - 'A' + 10;
+    }
+    else
+    {
+        return '\xff';
+    }
+}
+
+static inline void inner_copy_ssid(char * out_ssid, const char * ssid,  size_t out_ssid_len)
+{
+    char *p;
+    size_t pos = 0;
+    if (NULL == out_ssid)
+        return;
+    //printf("input ssid=[%s]\n", ssid);
+    memset(out_ssid, 0, out_ssid_len);
+    if (NULL == ssid)
+        return;
+    p = strchr(ssid, '\\');
+    if (NULL == p)
+    {
+        strncpy(out_ssid, ssid, out_ssid_len);
+        //printf(" first %s\n", out_ssid);
+    }
+    else
+    {
+        pos = p - ssid;
+        memcpy(out_ssid, ssid, pos);
+        //printf("pos %lu -- %s\n", pos, out_ssid);
+        for(; pos < out_ssid_len; pos ++)
+        {
+            if (p[0] == '\0')
+            {
+                //printf(" out %s\n", out_ssid);
+                return;
+            }
+            else if (p[0] != '\\')
+            {
+                out_ssid[pos] = p[0];
+                p += 1;
+            }
+            else if (p[1] == 'x' || p[1] == 'X')
+            {
+                out_ssid[pos] = inner_convert_char(p[2]) << 4 | inner_convert_char(p[3]);
+                p += 4;
+            }
+            else if (p[1] == '\\')
+            {
+                out_ssid[pos] = '\\';
+                p += 2;
+            }
+            else if (p[1] == 't')
+            {
+                out_ssid[pos] = '\t';
+                p += 2;
+            }
+            else if (p[1] == 'r')
+            {
+                out_ssid[pos] = '\r';
+                p += 2;
+            }
+            else if (p[1] == 'n')
+            {
+                out_ssid[pos] = '\n';
+                p += 2;
+            }//todo find a better way to convert?
+        }
+    }
+    //printf(" out %s\n", out_ssid);
 }
 
 static int inner_get_param(int interface, int net_no, char* param_name, char * out_put) {
-
+    int i, ssid_len;
     char lynq_cmd_get[128]={0};
 
     if (out_put == NULL) {
@@ -387,7 +536,33 @@
     }
 
 //    printf("reply len %d, %08x\n", reply_len, (int)out_put);
-    memcpy(out_put, cmd_reply, reply_len + 1);
+    if (strcmp(param_name, "ssid") == 0)
+    {
+        if (cmd_reply[0] == '\"') {
+            ssid_len = reply_len - 1;
+            memcpy(out_put, cmd_reply + 1, ssid_len);
+            if (out_put[ssid_len-1] == '\"')
+            {
+                out_put[ssid_len-1] = '\0';
+            }
+            else
+            {
+                out_put[ssid_len] = '\0';
+            }
+        }
+        else{
+            ssid_len = reply_len / 2;
+            for(i=0; i<ssid_len; i++)
+            {
+                out_put[i] = inner_convert_char(cmd_reply[i*2]) << 4 | inner_convert_char(cmd_reply[i*2 + 1]);
+            }
+            out_put[ssid_len] = '\0';
+        }
+    }
+    else
+    {
+        memcpy(out_put, cmd_reply, reply_len + 1);
+    }
     return 0;
 }
 
@@ -410,123 +585,26 @@
     return ret;
 }
 
-static void trim_space(char * p, int count) {
-    char * begin = p;
-    p += count;
-    printf("%C-%C||\n", *begin, *p);
-    while (p >= begin ) {
-        if (*p == ' ') {
-            *p-- = '\0';
-        }
-        else {
-            break;
-        }
-    }
-}
-
-static int get_ip_mac_list(char * mac_list[128], char * ip_list[128]) {
-    FILE * fp;
-    int len, ret;
-    int count, count_words, index;
-    int mac_start, mac_end;
-    int ip_start, ip_end;
-    char *split_lines[128] = {0};
-    char *buff;
-    const char * ip_header = "IP address";
-    const char * mac_header = "HW address";
-    const char * zero_mac = "00:00:00:00:00:00";
-
-    fp = fopen("/proc/net/arp", "rb");
-    if (NULL == fp) {
-        printf("open file fail\n");
-        return  -1;
-    }
-
-    buff = alloca(MAX_RET);
-    fseek(fp, 0, SEEK_SET);
-    len = fread(buff, 1, MAX_RET, fp);
-    fclose(fp);
-    if (len <= 0) {
-        printf("read file fail\n");
+static int inner_get_ip_by_mac(const char * mac, char * ip, int ip_len)
+{
+    char * p;
+    int ret = 0;
+    char cmd[256]={0};
+    if (NULL == mac || NULL == ip)
         return -1;
+    memset(ip, 0, ip_len);
+    sprintf(cmd, "ip neigh | grep \"lladdr\" | grep \"tether\" | grep \"%s\" | head -1 | awk '{print $1}'", mac);
+    ret = exec_cmd(cmd, ip, ip_len);
+    p = strchr(ip, '\n');
+    if (NULL != p)
+    {
+        *p = '\0';
     }
-    printf("file : %s\n", buff);
-
-    count = lynq_split(buff, len, '\n', split_lines);
-    printf("----- %s\n", split_lines[0]);
-
-    mac_end = 0;
-    count_words = strlen(split_lines[0]);
-    if (strstr(split_lines[0], mac_header) != NULL) {
-        mac_start = strstr(split_lines[0], mac_header) - split_lines[0];
-        mac_end = mac_start + strlen(mac_header) + 1;
-        while (mac_end < count_words) {
-            if (split_lines[0][mac_end] != ' ') {
-                break;
-            }
-            mac_end++;
-        }
-    }
-
-    ip_end = 0;
-    if (strstr(split_lines[0], ip_header) != NULL) {
-        ip_start = strstr(split_lines[0], ip_header) - split_lines[0];
-        ip_end = ip_start + strlen(ip_header) + 1;
-        while (ip_end < count_words) {
-            if (split_lines[0][ip_end] != ' ') {
-                break;
-            }
-            ip_end++;
-        }
-    }
-
-    if (mac_end == 0 || ip_end == 0) {
-        return 0;
-    }
-
-    ret = 0;
-    for(index = 1;index < count; index++) {
-        if (memcmp(split_lines[index] + mac_start, zero_mac, strlen(zero_mac)) == 0) {
-            continue;
-        }
-        mac_list[ret] = malloc(mac_end - mac_start + 1);
-        ip_list[ret] = malloc(ip_end - ip_start + 1);
-        memcpy(mac_list[ret], split_lines[index] + mac_start, mac_end - mac_start);
-        memcpy(ip_list[ret], split_lines[index] + ip_start, ip_end - ip_start);
-        trim_space(mac_list[ret],  mac_end - mac_start - 1);
-        trim_space(ip_list[ret],  ip_end - ip_start - 1);
-        ret++;
-    }
-
+    printf("inner_get_ip_by_mac %s\n", ip);
     return ret;
 }
 
-static void free_ip_mac_list_mem(char ** mac_list, int mac_cnt, char ** ip_list, int ip_cnt)
-{
-    int i;
-    if (mac_list != NULL && mac_cnt > 0) {
-        for(i = 0; i< mac_cnt; i++)
-        {
-            if (NULL != mac_list[i])
-            {
-                free(mac_list[i]);
-                mac_list[i] = NULL;
-            }
-        }
-    }
-    if (ip_list != NULL && ip_cnt > 0) {
-        for(i = 0; i< mac_cnt; i++)
-        {
-            if (NULL != ip_list[i])
-            {
-                free(ip_list[i]);
-                ip_list[i] = NULL;
-            }
-        }
-    }
-}
-
-static int get_hostname_by_ip(char *ip, char *hostname) {
+static int inner_get_hostname_by_ip(char *ip, char *hostname) {
     struct in_addr addr ={0};
     struct hostent *ht;
 
@@ -534,6 +612,7 @@
         return -1;
     }
 
+    *hostname = '\0';
     if (inet_aton(ip, &addr) == 0) {
         printf("---inet_aton fail\n");
         return -1;
@@ -557,6 +636,7 @@
     int count, index, words_count;
     char * split_lines[128]= {0};
     char * split_words[128] = {0};
+    char local_ssid[128] = {0};
     const char *lynq_wifi_list_networks = "LIST_NETWORKS";
 
     CHECK_WPA_CTRL(ap_sta);
@@ -571,7 +651,8 @@
     for(index=1; index < count; index++) {
         words_count = lynq_split(split_lines[index], strlen(split_lines[index]), '\t', split_words);
         if (words_count > 2) {
-            if (ssid == NULL || strcmp(split_words[1], ssid) == 0) {
+            inner_copy_ssid(local_ssid, split_words[1], sizeof (local_ssid));
+            if (ssid == NULL || strcmp(local_ssid, ssid) == 0) {
                 net_no_list[ret++] = atoi(split_words[0]);
             }
         }
@@ -677,6 +758,9 @@
         else if (strstr( flag, "NONE") != NULL) {
             return LYNQ_WIFI_AUTH_OPEN;
         }
+        else if (strcmp( flag, "[ESS]") == 0) {
+            return LYNQ_WIFI_AUTH_OPEN;
+        }
     }
 
     return -1;
@@ -713,6 +797,7 @@
     const char * FLAG_FREQ = "freq=";
     const char * FLAG_STATE = "wpa_state=";
     const char * FLAG_ID = "id=";
+    const char * FLAG_IPADDR = "ip_address=";
     char *split_lines[128] = {0};
 
     CHECK_WPA_CTRL(interface);
@@ -731,13 +816,13 @@
         if (curr_state->ap != NULL) {
             p = strstr(split_lines[i], FLAG_SBSID);
             if (p != NULL) {
-                strcpy(curr_state->ap->ap_mac, p + strlen(FLAG_SBSID));
+                strncpy(curr_state->ap->ap_mac, p + strlen(FLAG_SBSID), sizeof(curr_state->ap->ap_mac));
                 ret = 0;
                 continue;
             }
             p = strstr(split_lines[i], FLAG_SSID);
             if (p != NULL) {
-                strcpy(curr_state->ap->ap_ssid, p + strlen(FLAG_SSID));
+                inner_copy_ssid(curr_state->ap->ap_ssid, p + strlen(FLAG_SSID), sizeof (curr_state->ap->ap_ssid));
                 ret = 0;
                 continue;
             }
@@ -754,6 +839,12 @@
                 ret = 0;
                 continue;
             }
+            p = strstr(split_lines[i], FLAG_IPADDR);
+            if (p != NULL) {
+                strncpy(curr_state->ap->ap_ip, p + strlen(FLAG_IPADDR), sizeof(curr_state->ap->ap_ip));
+                ret = 0;
+                continue;
+            }
         } // end  if (ap != NULL)
         if (curr_state->state != NULL) {
             p = strstr(split_lines[i], FLAG_STATE);
@@ -806,19 +897,8 @@
 
 int lynq_wifi_ap_ssid_get(lynq_wifi_index_e idx, char* ap_ssid)
 {
-    int len;
     CHECK_IDX(idx, CTRL_AP);
-    if (0 != inner_get_param(CTRL_AP, AP_NETWORK_0, "ssid", ap_ssid))
-        return -1;
-    len = strlen(ap_ssid);
-    if (ap_ssid[0] == '\"') {
-        memmove(ap_ssid, ap_ssid + 1, len - 1);
-        len -= 1;
-    }
-    if (len > 0 && ap_ssid[len-1] == '\"') {
-        ap_ssid[len-1] = '\0';
-    }
-    return 0;
+    return inner_get_param(CTRL_AP, AP_NETWORK_0, "ssid", ap_ssid);
 }
 
 /*****
@@ -832,34 +912,40 @@
  *
  * */ 
 static int lynq_check_set_frequency(int input_frequency){
-    static int legitimate_frequency[21]={2412,2417,2422,2427,2432,2437,2442,2447,2452,2457,2462,2467,2472,5180,5200,5220,5240,5745,5765,5785,5805,5825};
-    int i = 0;
-    int flag_check = 0;
-    for(i=0 ;i<= 21; i++){
-        if(input_frequency == legitimate_frequency[i]){
-            flag_check = 1;
+    int legitimate_frequency[]={2412,2417,2422,2427,2432,2437,2442,2447,2452,2457,2462,2467,2472,5180,5200,5220,5240,5745,5765,5785,5805,5825};
+    int i;
+    int arr_len = sizeof(legitimate_frequency) / sizeof(int);
+
+    for(i = 0; i < arr_len; i++)
+    {
+        if(input_frequency == legitimate_frequency[i])
             break;
-        }
     }
-    if(flag_check == 1){
-        printf("input frequency in range\n");
-    }else{
-        printf("input frequency is eero--->%d,please check it\n",input_frequency);
+
+    if(i == arr_len)
+    {
+        printf("input frequency is eero--->%d,please check it\n", input_frequency);
         return -1;
     }
+
     return 0;
 }
 int lynq_wifi_ap_frequency_set(lynq_wifi_index_e idx,int lynq_wifi_frequency)
 {
+    int check;
     char lynq_wifi_frequency_cmd[128]={0};
     char lynq_cmd_mode[128]={0};
     char lynq_cmd_slect[128]={0};
 
     //@do check input frequency
-    if((lynq_check_set_frequency(lynq_wifi_frequency)) != 0){
+    check = lynq_check_set_frequency(lynq_wifi_frequency);
+    if(check != 0)
+    {
+        printf("do check frequency error\n");
         return -1;
     }
-    if (lynq_check_network_number(idx, CTRL_AP, AP_NETWORK_0) != 0) {
+    if (lynq_check_network_number(idx, CTRL_AP, AP_NETWORK_0) != 0)
+    {
         return -1;
     }
 
@@ -1425,10 +1511,11 @@
 int lynq_sta_ssid_password_get(lynq_wifi_index_e idx, ap_info_s *ap, char *password) { // @todo
 
     FILE * fp;
-    int len, ret, network_len;
+    int len, ret, network_len, i, ssid_len;
     int count, index;
     char *split_lines[128] = {0};
-    char *buff, *p;
+    char *buff, *p, *ssid, *ssid_end_flag;
+    char tmp_ssid[128]={0};
 
     network_len = 0;
     p = NULL;
@@ -1468,9 +1555,28 @@
              break;
         }
 
-        if (strstr(p, ap->ap_ssid) != NULL) {
-            break;
+        ssid = strstr(p, "ssid=");
+        if (ssid != NULL) {
+            ssid += strlen("ssid=");
+            if (ssid[0] == '\"') {
+                if (memcmp(ssid + 1, ap->ap_ssid, strlen(ap->ap_ssid)) == 0 && ssid[strlen(ap->ap_ssid) + 1] == '\"')
+                    break;
+            }
+            else{
+                ssid_end_flag = strstr(ssid, "\n");
+                if (ssid_end_flag != NULL)
+                {
+                    ssid_len = (ssid_end_flag - ssid) / 2;
+                    for(i=0; i<ssid_len; i++)
+                    {
+                        tmp_ssid[i] = inner_convert_char(ssid[i*2]) << 4 | inner_convert_char(ssid[i*2 + 1]);
+                    }
+                    if (memcmp(tmp_ssid, ap->ap_ssid, ssid_len) == 0)
+                        break;
+                }
+            }
         }
+
     }
 
     if (index >= len || NULL == p || network_len <= 0) {
@@ -1577,7 +1683,7 @@
     curr_state.state = NULL;
 
     if (0 == inner_get_status_info(CTRL_STA, &curr_state)) {
-        strcpy(sta_ssid, ap_info.ap_ssid);
+        strncpy(sta_ssid, ap_info.ap_ssid, sizeof (ap_info.ap_ssid));
         return 0;
     }
 
@@ -1662,6 +1768,7 @@
                     best_scan_index = j;
                     best_rssi = scan_list[j].rssi;
                 }
+                strncpy(save_list[i].base_info.ap_mac, scan_list[j].mac, sizeof (save_list[i].base_info.ap_mac));
                 break;
             }
         }
@@ -1669,6 +1776,7 @@
 
     if (best_index >= 0) {
         memcpy(&info->base_info, &save_list[best_index].base_info, sizeof (ap_info_s));
+        inner_get_ip_by_mac( info->base_info.ap_mac, info->base_info.ap_ip, sizeof (info->base_info.ap_ip));
         info->status = LYNQ_WIFI_AP_STATUS_DISABLE;
         info->rssi = best_rssi;
         ret = 0;
@@ -1839,44 +1947,52 @@
 
 int lynq_wifi_sta_start(lynq_wifi_index_e idx)
 {
-    const char *lynq_reconfigure_cmd = "wpa_cli -iwpa_wlan0_cmd -p/var/run/ IFNAME=wlan0 RECONFIGURE /data/wifi/wg870/wpa_supplicant.conf";
-    const char *lynq_reconnect_cmd = "RECONNECT";
+//    const char *lynq_reconfigure_cmd = "wpa_cli -iwpa_wlan0_cmd -p/var/run/ IFNAME=wlan0 RECONFIGURE /data/wifi/wg870/wpa_supplicant.conf";
+//    const char *lynq_reconnect_cmd = "RECONNECT";
+    const char *lynq_enable_sta_cmd = "wpa_cli -iwpa_wlan0_cmd -p/var/run/ IFNAME=wlan0 enable_net all";
+    const char *lynq_reconnect_cmd = "wpa_cli -iwpa_wlan0_cmd -p/var/run/ IFNAME=wlan0 reconnect";
+//    const char *lynq_first_sta_cmd = "wpa_cli -iwpa_wlan0_cmd -p/var/run/ IFNAME=wlan0 remove_net all";
 
     CHECK_IDX(idx, CTRL_STA);
     CHECK_WPA_CTRL(CTRL_STA);
 
     system("connmanctl enable wifi");
 
-    if (system("ifconfig | grep -q wlan0") != 0) {
+    if (system("ifconfig | grep -q wlan0") != 0)
+    {
         return -1;
     }
 
-    DO_OK_FAIL_REQUEST(cmd_remove_all);
-    system(lynq_reconfigure_cmd);
-    DO_OK_FAIL_REQUEST(lynq_reconnect_cmd);
-
+//    DO_OK_FAIL_REQUEST(cmd_remove_all);
+//    system(lynq_first_sta_cmd);
+//    system(lynq_reconfigure_cmd);
+//    DO_OK_FAIL_REQUEST(lynq_reconnect_cmd);
+    system(lynq_enable_sta_cmd);
+    system(lynq_reconnect_cmd);
+//    DO_OK_FAIL_REQUEST(lynq_reconnect_cmd);
     return 0;
 }
 
 int lynq_wifi_sta_stop(lynq_wifi_index_e idx)
 {
-    char lynq_disable_network_cmd[MAX_CMD];
-    curr_status_info curr_state;
-    ap_info_s ap_info;
+//    char lynq_disable_network_cmd[MAX_CMD];
+//    curr_status_info curr_state;
+//    ap_info_s ap_info;
 
+    const char * lynq_disable_sta_cmd = "wpa_cli -iwpa_wlan0_cmd -p/var/run/ IFNAME=wlan0 disable_net all";
     CHECK_IDX(idx, CTRL_STA);
     CHECK_WPA_CTRL(CTRL_STA);
 
-    curr_state.ap = &ap_info;
-    curr_state.state = NULL;
+//    curr_state.ap = &ap_info;
+//    curr_state.state = NULL;
 
-    if (0 != inner_get_status_info(CTRL_STA, &curr_state) || curr_state.net_no < 0) {
-        return 0;
-    }
+//    if (0 != inner_get_status_info(CTRL_STA, &curr_state) || curr_state.net_no < 0) {
+//        return 0;
+//    }
 
-    sprintf(lynq_disable_network_cmd, "DISABLE_NETWORK %d", curr_state.net_no);
-    DO_OK_FAIL_REQUEST(lynq_disable_network_cmd);
-
+//    sprintf(lynq_disable_network_cmd, "DISABLE_NETWORK %d", curr_state.net_no);
+//    DO_OK_FAIL_REQUEST(lynq_disable_network_cmd);
+    system(lynq_disable_sta_cmd);
     DO_OK_FAIL_REQUEST(cmd_save_config);
 
     return 0;
@@ -1924,12 +2040,11 @@
 
 int lynq_get_ap_device_list(lynq_wifi_index_e idx, ap_info_s **ap, device_info_s ** list,int * len)
 {
-    int ip_count, index, i, line_count;
+    int index, line_count;
+    device_info_s *dev_info;
     const char *lynq_first_sta_cmd = "STA-FIRST";
     char lynq_next_sta_cmd[MAX_CMD];
     char *bssid[1024] = {0};
-    char *mac_list[128] = {0};
-    char *ip_list[128] = {0};
     char *split_lines[128] = {0};
 
     CHECK_IDX(idx, CTRL_AP);
@@ -1954,9 +2069,6 @@
     lynq_get_interface_ip(idx, (*ap)->ap_ip);
     lynq_ap_password_get(idx, (*ap)->psw);
 
-    ip_count = get_ip_mac_list(mac_list, ip_list);
-    printf("get count %d\n", ip_count);
-
     DO_REQUEST(lynq_first_sta_cmd);
 
     index = 0;
@@ -1971,7 +2083,7 @@
         sprintf(lynq_next_sta_cmd, "STA-NEXT %s", split_lines[0]);
         reply_len = MAX_RET;
         cmd_reply[0] = '\0';
-        ret = wpa_ctrl_request(lynq_wpa_ctrl, lynq_next_sta_cmd, strlen(lynq_next_sta_cmd), cmd_reply, &reply_len, NULL);
+        ret = local_wpa_ctrl_request(lynq_wpa_ctrl, lynq_next_sta_cmd, strlen(lynq_next_sta_cmd), cmd_reply, &reply_len, NULL);
         if (ret != 0 || memcmp(cmd_reply, "FAIL", 4) == 0) {
             printf("run %s fail \n", lynq_next_sta_cmd);
             break;
@@ -1982,20 +2094,15 @@
 
     *list = malloc(sizeof(device_info_s) * (*len));
     for (index=0; index < *len; index++) {
-        strcpy((*list)[index].sta_mac, bssid[index]);
-        for(i=0;i < ip_count; i++ ) {
-            if (strcmp(bssid[index], mac_list[i]) == 0) {
-                strcpy((*list)[index].sta_ip, ip_list[i]);
-                break;
-            }
-        }
-        get_hostname_by_ip((*list)[index].sta_ip, list[index]->hostname);
-        (*list)[index].status = LYNQ_WIFI_STATUS_CONNECT;
+        dev_info = &(*list)[index];
+        memset(dev_info, 0, sizeof(device_info_s));
+        strncpy(dev_info->sta_mac, bssid[index], sizeof (dev_info->sta_mac));
+        inner_get_ip_by_mac(dev_info->sta_mac, dev_info->sta_ip, sizeof (dev_info->sta_ip));
+        inner_get_hostname_by_ip(dev_info->sta_ip, dev_info->hostname);
+        dev_info->status = LYNQ_WIFI_STATUS_CONNECT;
         free(bssid[index]);
     }
 
-    free_ip_mac_list_mem(mac_list, 128, ip_list, 128);
-
     return 0;
 }
 
@@ -2043,7 +2150,7 @@
         p->band = convert_band_from_freq(atoi(split_words[1]));
         p->rssi = -1 * atoi( split_words[2]);
         p->auth = convert_max_auth_from_flag(split_words[3]);
-        strcpy(p->ssid, split_words[4]);
+        inner_copy_ssid(p->ssid, split_words[4], sizeof (p->ssid));
     }
 
     return 0;
@@ -2090,10 +2197,9 @@
 
 int lynq_get_sta_saved_ap(lynq_wifi_index_e idx, saved_ap_info_s ** list, int * len)
 {    
-    int count, index, ssid_len;
+    int count, index;
     int net_no_list[128];
     char freq[16];
-    char *ssid_ptr;
 
     if (list == NULL || len == NULL) {
         printf("bad param\n");
@@ -2114,17 +2220,6 @@
     for (index=0; index < count; index++) {
         printf("to get ssid %d\n", index);
         inner_get_param(CTRL_STA, net_no_list[index], "ssid", (*list)[index].base_info.ap_ssid);
-
-        ssid_ptr = (*list)[index].base_info.ap_ssid;
-        ssid_len = strlen(ssid_ptr);
-        if (ssid_ptr[0] == '\"') {
-            memmove(ssid_ptr, ssid_ptr + 1, ssid_len - 1);
-            ssid_len -= 1;
-        }
-        if (ssid_len > 0 && ssid_ptr[ssid_len - 1] == '\"') {
-            ssid_ptr[ssid_len - 1] = '\0';
-        }
-
         inner_get_param(CTRL_STA, net_no_list[index], "bssid", (*list)[index].base_info.ap_mac);
         inner_get_network_auth(CTRL_STA, net_no_list[index], &(*list)[index].base_info.auth);
         if (inner_get_param(CTRL_STA, net_no_list[index], "frequency", freq) == 0) {
@@ -2262,7 +2357,7 @@
 //        reply_len = MAX_RET;
 //        cmd_reply[0] = '\0';
 //        printf("to call [%s]\n", cmd_str);
-//        ret = wpa_ctrl_request(s_lynq_wpa_ctrl, cmd_str, strlen(cmd_str), cmd_reply, &reply_len, NULL);
+//        ret = local_wpa_ctrl_request(s_lynq_wpa_ctrl, cmd_str, strlen(cmd_str), cmd_reply, &reply_len, NULL);
 //        if (ret != 0) {
 //            printf("call ##cmd_str fail %d\n", ret);
 //            return ret;
@@ -2390,6 +2485,7 @@
             }
         }
     }
+    freeifaddrs(ifaddr_header);
     return -1;
 }
 
@@ -2503,11 +2599,7 @@
 
 int lynq_get_connect_ap_ip(lynq_wifi_index_e idx, char *ip)
 {
-    int index;
-    int ip_count = 0;
     char bssid[1024] = {0};
-    char *mac_list[128] = {0};
-    char *ip_list[128] = {0};
 
     if (ip == NULL)
     {
@@ -2522,24 +2614,7 @@
         return -1;
     }
 
-    ip_count = get_ip_mac_list(mac_list, ip_list);
-
-    for (index=0; index < ip_count; index++)
-    {
-        if (strcmp(bssid, mac_list[index]) == 0)
-        {
-            strcpy(ip, ip_list[index]);
-
-            free_ip_mac_list_mem(mac_list, 128, ip_list, 128);
-
-            return 0;
-        }
-    }
-
-    printf("not found\n");
-    free_ip_mac_list_mem(mac_list, 128, ip_list, 128);
-
-    return -1;
+    return inner_get_ip_by_mac(bssid, ip, 32); //better input by user
 }
 
 int lynq_ap_connect_num(int sta_number)
diff --git a/src/lynq/packages/apps/lynq-default/lynq_default.c b/src/lynq/packages/apps/lynq-default/lynq_default.c
index d32a4b2..ba3a4b4 100755
--- a/src/lynq/packages/apps/lynq-default/lynq_default.c
+++ b/src/lynq/packages/apps/lynq-default/lynq_default.c
@@ -9,8 +9,8 @@
 
 
 //#define USER_LOG_TAG "lynq_default"
-#define  LYNQ_SW_VERSION "T800v02.MP1_MR1.01b04.01"//needs to be modified if upgrade version
-#define  LYNQ_SW_INSIDE_VERSION "T800v02.MP1_MR1.01b04.04"//only for insde check
+//#define  LYNQ_SW_VERSION "T800v02.MP1_MR1.01b04.01"//needs to be modified if upgrade version
+//#define  LYNQ_SW_INSIDE_VERSION "T800v02.MP1_MR1.01b04.04"//only for insde check
 
 //#define GET_DATA_LEN 64
 #define BUF_LEN 258
diff --git a/src/lynq/packages/apps/lynq-default/makefile b/src/lynq/packages/apps/lynq-default/makefile
index fbb54dd..e5e41eb 100644
--- a/src/lynq/packages/apps/lynq-default/makefile
+++ b/src/lynq/packages/apps/lynq-default/makefile
@@ -9,6 +9,8 @@
 
 
 
+LOCAL_CFLAGS += -DLYNQ_SW_INSIDE_VERSION=\"$(LYNQ_CONFIG_VERSION)\"
+LOCAL_CFLAGS += -DLYNQ_SW_VERSION=\"$(LYNQ_CONFIG_SW_VERSION)\"
 
 LOCAL_PATH   = .
 
diff --git a/src/lynq/packages/apps/lynq-gnss-test/lynq-gnss-test-cb.c b/src/lynq/packages/apps/lynq-gnss-test/lynq-gnss-test-cb.c
index 81720c7..9e409b0 100755
--- a/src/lynq/packages/apps/lynq-gnss-test/lynq-gnss-test-cb.c
+++ b/src/lynq/packages/apps/lynq-gnss-test/lynq-gnss-test-cb.c
@@ -110,8 +110,8 @@
         strncmp(nmea+3,NMEA_GSV,strlen(NMEA_GSV)) == 0)
         {
             printf("%s\r\n",nmea);
-            sprintf(gnss_ttyCmd,"echo -e \"\\%s\\r\\n\" > /dev/ttyGS0",nmea);
-            system(gnss_ttyCmd);
+            //sprintf(gnss_ttyCmd,"echo -e \"\\%s\\r\\n\" > /dev/ttyGS0",nmea);
+            //system(gnss_ttyCmd);
         }
 }
 
diff --git a/src/telephonyware/3.0/atcid/atci/src/Makefile b/src/telephonyware/3.0/atcid/atci/src/Makefile
index 42c2169..77f997a 100755
--- a/src/telephonyware/3.0/atcid/atci/src/Makefile
+++ b/src/telephonyware/3.0/atcid/atci/src/Makefile
@@ -2,9 +2,15 @@
 
 FLAGS += -DMTK_GPS_FEATURE
 
+$(warning ################# warren LYNQ_ATSVC_SUPPORT: $(LYNQ_ATSVC_SUPPORT))
+ifeq ($(strip $(LYNQ_ATSVC_SUPPORT)), yes)
+    FLAGS += -DLYNQ_ATSVC 
+endif
+
 INCLUDES := -I. \
          -I./platform \
-
+         -I./lynq-private \
+         -I./lynq-private/pseudo_terminal \
 
 SRCS := \
            ./at_tok.c \
@@ -18,6 +24,8 @@
            ./platform/atcid_common.c \
            ./atcid_sim_cmd.c\
            ./atcid_universal_ant_cmd.c\
+           ./lynq-private/lynq_atsvc_controller.c \
+           ./lynq-private/pseudo_terminal/transfer_controller.c \
 
 
 CXXSRCS := \
@@ -30,7 +38,7 @@
 
 CXXOBJS := ${CXXSRCS:%.cpp=%.o}
 
-#LDFLAGS = -L. -lz -ldl -lpthread -lstdc++
+LDFLAGS += -L. -lpthread -lxml2 -ldl
 
 .PHONY: all
 all : $(TARGET)
diff --git a/src/telephonyware/3.0/atcid/atci/src/atcid.c b/src/telephonyware/3.0/atcid/atci/src/atcid.c
index 0bb0641..0eaff4f 100755
--- a/src/telephonyware/3.0/atcid/atci/src/atcid.c
+++ b/src/telephonyware/3.0/atcid/atci/src/atcid.c
@@ -44,6 +44,7 @@
 
 #include <netinet/in.h>
 #include <sys/socket.h>
+#include "lynq_atsvc_controller.h" /*warren add for lynq atsvc on 2022/12/06*/
 
 /*misc global vars */
 Serial serial;
@@ -69,11 +70,19 @@
 */
 int main() {
     int i = 0;
+    int res = 0;
     LOGATCI(LOG_INFO, "atcid-daemon start!!!");
 
     //Initial the parameter for serial dervice
     initSerialDevice(&serial);
-
+#ifdef LYNQ_ATSVC
+    res = lynq_atsvc_init(0,PLUGIN_CONF_PATH);
+    if(res!=0)
+    {
+        ALOGD("lynq_atsvc_init fail,result = %d",res);
+        ALOGD("lynq all at cmd can`t use");
+    }
+#endif
 #ifdef MTK_DATACARD_ATCI
     //AP AT port is GS3 in factory mode
     snprintf(serial.devicename[0], strlen(TTY_GS3) + 1, "%s", TTY_GS3);
diff --git a/src/telephonyware/3.0/atcid/atci/src/atcid_cmd_dispatch.c b/src/telephonyware/3.0/atcid/atci/src/atcid_cmd_dispatch.c
index 08810de..6d9dc8a 100755
--- a/src/telephonyware/3.0/atcid/atci/src/atcid_cmd_dispatch.c
+++ b/src/telephonyware/3.0/atcid/atci/src/atcid_cmd_dispatch.c
@@ -292,6 +292,32 @@
     free(line_cut);
     return 0;
 }
+/*warren add for lynq atsvc on 2022/12/06 start*/
+#ifdef LYNQ_ATSVC
+int lynq_command_hdlr(char *line)
+{
+    int i = 0;
+    int table_size = 0;
+    char* line_cut = cut_cmd_line(line);
+    if (line_cut == NULL)
+    {
+        return 0;
+    }
+    table_size = (sizeof(lynq_cmd_table)/sizeof(generic_cmd_type));
+
+    for (i = 0; i < table_size; i++)
+    {
+        if (strcmp(line_cut, lynq_cmd_table[i].cmdName) == 0)
+        {
+            free(line_cut);
+            return 1; //The command is handled here
+        }
+    }
+    free(line_cut);
+    return 0;
+}
+#endif
+/*warren add for lynq atsvc on 2022/12/06 end*/
 
 int process_cmd_line(char* line) {
     LOGATCI(LOG_DEBUG,"Enter");
@@ -311,6 +337,14 @@
     if (generic_command_hdlr(line)) {
         return GENERIC_TYPE;
     }
+/*warren add for lynq atsvc on 2022/12/06 start*/
+#ifdef LYNQ_ATSVC
+    LOGATCI(LOG_DEBUG, "handle in lynq_command_hdlr");
+    if (lynq_command_hdlr(line)) {
+        return LYNQ_CMD_TYPE;
+    }
+#endif
+/*warren add for lynq atsvc on 2022/12/06 end*/
 
     LOGATCI(LOG_DEBUG, "handle in audio_command_hdlr");
     int audio_result = audio_command_hdlr(line);
diff --git a/src/telephonyware/3.0/atcid/atci/src/atcid_cmd_dispatch.h b/src/telephonyware/3.0/atcid/atci/src/atcid_cmd_dispatch.h
old mode 100644
new mode 100755
index 8f31e46..602c6ce
--- a/src/telephonyware/3.0/atcid/atci/src/atcid_cmd_dispatch.h
+++ b/src/telephonyware/3.0/atcid/atci/src/atcid_cmd_dispatch.h
@@ -178,6 +178,19 @@
     {"AT+CMGC"},    // AT command to send command
     {"AT+CNMA"},
 };
+/*warren add for lynq atsvc on 2022/12/06 start*/
+#ifdef LYNQ_ATSVC
+static generic_cmd_type lynq_cmd_table[] = {
+    {"AT+LAPNACT"},     //AT command to enable defult PDP
+    {"AT+ELAPNACT"},    //AT command to enable PDP with APN
+    {"AT+LEAPNMOD"},    //AT command to modify apn info 
+    {"AT+LCSUS"},       //AT command to dsds
+    {"AT+SCREEN"},      //AT command to off/on modem screen
+    {"ATD"},
+};
+char* cut_cmd_line(char* line);
+#endif
+/*warren add for lynq atsvc on 2022/12/06 end*/
 
 int process_cmd_line(char* line);
 char* cut_cmd_line(char* line);
diff --git a/src/telephonyware/3.0/atcid/atci/src/atcid_serial.c b/src/telephonyware/3.0/atcid/atci/src/atcid_serial.c
index 54be009..577b3c1 100755
--- a/src/telephonyware/3.0/atcid/atci/src/atcid_serial.c
+++ b/src/telephonyware/3.0/atcid/atci/src/atcid_serial.c
@@ -56,7 +56,9 @@
 #else
 #include <sys/un.h>
 #endif
-
+#ifdef LYNQ_ATSVC
+#include "lynq_atsvc_controller.h"
+#endif
 #define MAX_FAILURE_RETRY 3
 #define BUILD_TYPE_PROP "ro.build.type"
 #define BUILD_TYPE_PROP_ENG "eng"
@@ -66,7 +68,9 @@
 
 
 /*misc global vars */
+#ifndef LYNQ_ATSVC
 extern Serial serial;
+#endif
 extern At_Ril_Mmi_t atRilMmi_info;
 
 #define CONN_VCOM 1
@@ -542,7 +546,15 @@
         }
 
 #endif
-    } else if (GENERIC_TYPE == dataType) {
+    } 
+    /*warren add for lynq atsvc on 2022/12/06 start*/
+#ifdef LYNQ_ATSVC
+    else if ((GENERIC_TYPE == dataType)||(LYNQ_CMD_TYPE == dataType))
+#else
+    else if (GENERIC_TYPE == dataType)
+#endif
+    /*warren add for lynq atsvc on 2022/12/06 end*/
+    {
 #ifdef ANDROID
         if (s_fdService_command == INVALIDE_SOCKET_FD) {
             s_fdService_command = connectToSystemAtciService();
@@ -1203,7 +1215,7 @@
     Serial *p_serial = (Serial *)arg;
     ATCI_DataType dataType = UNKNOWN_TYPE;
     char operator[MTK_PROPERTY_VALUE_MAX] = {0};
-
+    int plugin_count = -1; /*warren add for lynq at svc on 2022/12/12*/
     signal(SIGPIPE, sigpipe_handler);
 
     LOGATCI(LOG_DEBUG,"Enter");
@@ -1257,7 +1269,29 @@
         convertToUpperCase(line,'=');
         trim_string(&line);
         LOGATCI(LOG_INFO, "Command:%s",line);
-
+        /*warren add for lynq at svc on 2022/12/12 start*/
+        #ifdef LYNQ_ATSVC
+        if(has_registe_cmd == true)
+        {
+            if(lynq_check_extension_atcmd(line) == 0)
+            {
+                if(send_msg_to_at_extension(line,strlen(line))!=0)
+                {
+                    ALOGD("send at fail,please try agin");
+                }
+                continue;
+            }
+        }
+        plugin_count = -1;
+        plugin_count = lynq_dispatch_atcmd(line);
+        ALOGD("plugin count:%d",plugin_count);
+        if(0 <= plugin_count)
+        {
+            plugin_msg_array[plugin_count].atsvc_incb(line,strlen(line));
+            continue;
+        }
+        #endif
+        /*warren add for lynq at svc on 2022/12/12 end*/
         dataType = process_cmd_line(line);
 
         LOGATCI(LOG_INFO, "The command type is belonged to :%d",dataType);
@@ -1358,7 +1392,21 @@
             } else {
                 LOGATCI(LOG_INFO, "Generic AT COMMAND");
             }
-        } else if (dataType == AUDIO_TYPE) {
+        }
+        /*warren add for lynq atsvc on 2022/12/06 start*/
+        #ifdef LYNQ_ATSVC
+        else if(dataType == LYNQ_CMD_TYPE)
+        {
+            if (s_fdService_command < 0 || s_fdService_command_vendor < 0) 
+            {
+                connectTarget(LYNQ_CMD_TYPE);
+            }
+            sendDataToGenericService(line);
+            LOGATCI(LOG_INFO, "LYNQ AT COMMAND");
+        }
+        #endif
+        /*warren add for lynq atsvc on 2022/12/06 end*/
+        else if (dataType == AUDIO_TYPE) {
             LOGATCI(LOG_INFO, "AUDIO COMMAND");
             if (dataType == AUDIO_TYPE && s_fdAudio_command < 0) {
                 connectTarget(dataType);
diff --git a/src/telephonyware/3.0/atcid/atci/src/atcid_serial.h b/src/telephonyware/3.0/atcid/atci/src/atcid_serial.h
index 1e0a923..3c0ed52 100755
--- a/src/telephonyware/3.0/atcid/atci/src/atcid_serial.h
+++ b/src/telephonyware/3.0/atcid/atci/src/atcid_serial.h
@@ -91,6 +91,9 @@
     BATTERY_TYPE = 6,
     AUDIO_EXTERNAL_TYPE =7,
     META_TYPE = 8,
+#ifdef LYNQ_ATSVC
+    LYNQ_CMD_TYPE = 9, //warren add for lynq atsvc on 2022/12/06 start
+#endif
 } ATCI_DataType;
 
 typedef enum{
@@ -120,6 +123,9 @@
     int currDevice;
 } Serial;
 
+#ifdef LYNQ_ATSVC
+extern Serial serial;//warren add for atsvc on 20221214
+#endif
 
 static const char *s_MsgResponses[] = {
    "OK",
diff --git a/src/telephonyware/3.0/atcid/atci/src/lynq-private/lynq_atsvc_controller.c b/src/telephonyware/3.0/atcid/atci/src/lynq-private/lynq_atsvc_controller.c
new file mode 100755
index 0000000..3cd6be5
--- /dev/null
+++ b/src/telephonyware/3.0/atcid/atci/src/lynq-private/lynq_atsvc_controller.c
@@ -0,0 +1,507 @@
+#include <stdio.h>
+#include <sys/socket.h>
+#include <sys/un.h>
+#include <sys/types.h>
+#include <errno.h>
+#include <libxml/tree.h>
+#include <libxml/parser.h>
+#include <dlfcn.h>
+#include <pthread.h>
+#include "lynq_atsvc_controller.h"
+#include "atcid.h"
+#include "atcid_serial.h"
+#include "atcid_cmd_dispatch.h"
+#include "transfer_controller.h"
+#define FUNC __FUNCTION__
+#define LINE __LINE__
+
+#define SOCKET_ZERO   0
+#define SOCKET_SUCC   1
+#define SOCKET_FAIL  -1
+#define SOCKET_BUF_SIZE 512
+char register_atcmd_buff[SOCKET_BUF_SIZE] = {0};
+char *white_list[] = {"AT","ATD","ATV","ATA","ATE","ATH","ATL","ATI","ATP","ATO","ATQ",NULL};
+int g_atsvc_socket_fd = 0;
+int g_atsvc_client_connect = 0;
+//struct sockaddr_in server_addr;
+//struct sockaddr_in lynqClient_addr;
+static pthread_mutex_t s_startupMutex = PTHREAD_MUTEX_INITIALIZER;
+int has_registe_cmd = 0;
+struct sockaddr_un g_remote_addr = {0};
+struct sockaddr_un g_local_addr = {0};
+
+typedef enum
+{
+    INIT_SUCCESS=0,
+    INIT_PULGIN_FAIL,
+    INIT_SOCKET_FAIL,
+    INIT_THREAD_FAIL
+}init_reuslt_t;
+
+typedef struct
+{
+    xmlChar* name;
+    xmlChar* reg;
+    xmlChar* cmd;
+}plugin_conf_t;
+
+plugin_msg_t plugin_msg_array[PLUGINE_MAX_COUNT] = {0};
+void upper_string(char *org_string)
+{
+    int len = strlen(org_string);
+    for(int i=0;i<len;i++)
+    {
+        if(org_string[i]>=97 && org_string[i]<=122)
+        {
+            org_string[i]=org_string[i]-32;
+        }
+    }
+    return;
+}
+
+void lynq_atsvc_outcb_entity(char *output,int out_size,int type)
+{
+    if(NULL == output)
+    {
+        ALOGE("output is null");
+    }
+    int length = 0;
+    length = strlen(output);
+    if(length != out_size)
+    {
+        ALOGD("strlen length != output");
+    }
+    ALOGD("ouput:%s,len:%d",output,out_size);
+    lynq_write_data_to_serail(output,out_size,type);
+}
+
+
+int create_socket(const int domain, const int type, const int protocol,const int port,const char *IP,const char *socket_name,void * addr,int backlog)
+{
+    ALOGD("[%d][%s]start create socket",LINE,FUNC);
+    ALOGD("domain:%d,type:%d,protocol:%d,port:%d,IP:%s,socket_name:%s,backlog:%d",domain,type,protocol,port,IP,socket_name,backlog);
+    int socket_fd = -1;
+    char acBuf[1024] = {0};
+    struct sockaddr_un *local_addr = NULL;
+    local_addr = (struct sockaddr_un *)addr;
+    socket_fd = socket(domain, type,protocol);
+    if(0 > socket_fd)
+    {
+        ALOGD("create socket fail:fd = %d",socket_fd);
+        return socket_fd;
+    }
+    switch (domain)
+    {
+        case AF_UNIX:
+        {
+            if (strlen(socket_name) > sizeof(local_addr->sun_path) - 1)
+            {
+                ALOGD("Server socket path too long: %s", socket_name);
+                return (-strlen(socket_name));
+            }
+            if (remove(socket_name) == -1 && errno != ENOENT)
+            { 
+                ALOGD("remove-%s fail and errno:%d", socket_name,errno); 
+            }
+            ALOGD("remove %s", socket_name);
+            local_addr->sun_family = AF_UNIX;
+            sprintf(local_addr->sun_path, socket_name);
+            if(bind(socket_fd, (struct sockaddr *)local_addr, sizeof(struct sockaddr_un)) == -1)
+            {
+                ALOGD("[%d][%s]bind fail and errno: %d",LINE,FUNC,errno);
+                return -1;
+            }
+            if(type == SOCK_STREAM)
+            {
+                if(listen(socket_fd,backlog) == -1)
+                {
+                    ALOGD("[%d]listen fd: %dfail",LINE);
+                    return -1;
+                }
+            }
+            break;
+        }
+        case AF_INET:
+        {
+            break;
+        }
+        default:
+            break;
+    }
+    return socket_fd;
+}
+
+int send_msg(int socket_fd,const struct sockaddr *dest_addr,const char *msg)
+{
+    ALOGD("[%d][%s] msg is:%s",LINE,FUNC,msg);
+    int ret = 0;
+    ret = sendto(socket_fd,msg, sizeof(msg), 0, dest_addr, sizeof(dest_addr));
+    if(0 > ret)
+    {
+        ALOGD("sendto fail,ret:%d,errno:%d",ret,errno);
+        return ret;
+    }
+    else
+    {
+        ALOGD("sendto msg len:%d",ret);
+        ALOGD("return %d",0);
+        return 0;
+    }
+}
+int lynq_dispatch_atcmd(char* atcmd)
+{
+    ALOGD("[%d][%s] enter",LINE,FUNC);
+    char *needleP = NULL;
+    if(NULL == atcmd)
+    {
+        ALOGD("[%d][%s] atcmd is null",LINE,FUNC);
+        return -1;
+    }
+    ALOGD("[%d][%s]atcmd:%s",LINE,FUNC,atcmd);
+    char* line_cut = cut_cmd_line(atcmd);
+    if (line_cut == NULL)
+    {
+        ALOGD("[%d][%s]line_cut is null",LINE,FUNC);
+        return -1;
+    }
+    for(int i = 0;white_list[i];i++)
+    {
+        if(strcmp(line_cut,white_list[i]) == 0)
+        {
+            ALOGD("[%d][%s]count %d,pass atcmd:%s",LINE,FUNC,i,line_cut);
+            return -1;
+        }
+    }
+    for(int i = 0;i < PLUGINE_MAX_COUNT;i++)
+    {
+        ALOGD("i:%d,state:%d,atcmd:%s",i,plugin_msg_array[i].state,plugin_msg_array[i].atcmd);
+        if((plugin_msg_array[i].state == 1) && (NULL != plugin_msg_array[i].atcmd))
+        {
+            needleP =strstr(plugin_msg_array[i].atcmd,line_cut);
+            if(NULL != needleP)
+            {
+                ALOGD("[%d][%s] find atcmd:%s",LINE,FUNC,line_cut);
+                free(line_cut);
+                return i;
+            }
+        }
+    }
+    free(line_cut);
+    return -1;
+}
+
+
+int load_pulgin(const char * plugin_conf_path)
+{
+    ALOGD("[%d][%s]load pulgin",LINE,FUNC);
+    int count = 0;
+    char *atcmd = NULL;
+    int atcmd_len = 0;
+    xmlDocPtr pdoc = NULL;
+    xmlNodePtr root = NULL;
+    plugin_conf_t plugin_conf;
+    memset(plugin_msg_array,0,sizeof(plugin_msg_array));
+    pdoc = xmlReadFile(plugin_conf_path ,"UTF-8",XML_PARSE_RECOVER);
+    if(NULL == pdoc)
+    {
+        ALOGD("[%d][%s]open file %s" ,LINE,FUNC, plugin_conf_path);
+        return -1;
+    }
+    root = xmlDocGetRootElement(pdoc);
+    if(NULL == root)
+    {
+        ALOGD("get xmlDocGetRootElement() empty document fail");
+        return -1;
+    }
+    ALOGD("root->name :%s",root->name);
+    root = root->xmlChildrenNode;
+    while (root != NULL)
+    {
+        ALOGD("count is:%d",count);
+        if(PLUGINE_MAX_COUNT <= count)
+        {
+            ALOGD("plugin too many!!!");
+            break;
+        }
+        if ((!xmlStrcmp(root->name, (const xmlChar *)"module")))
+        {
+            ALOGD("find module");
+            plugin_conf.name = xmlGetProp(root, "name");
+            plugin_conf.reg = xmlGetProp(root, "register");
+            plugin_conf.cmd = xmlGetProp(root, "cmd");
+            if((NULL == plugin_conf.name)||(NULL == plugin_conf.reg)||(NULL == plugin_conf.cmd))
+            {
+                ALOGE("get prop fail,name:%s,reg:%s,cmd=%s",plugin_conf.name,plugin_conf.reg,plugin_conf.cmd);
+                root = root->next;
+                continue;
+            }
+            ALOGE("[%d][%s]plugin_conf name:%s,reg:%s,cmd=%s",LINE,FUNC,plugin_conf.name,plugin_conf.reg,plugin_conf.cmd);
+            plugin_msg_array[count].dlHandle_plugin = dlopen(plugin_conf.name, RTLD_NOW);
+            if(NULL == plugin_msg_array[count].dlHandle_plugin)
+            {
+                ALOGE("open lib %s fail",plugin_conf.name);
+                root = root->next;
+                continue;
+            }
+            ALOGD("plugin_msg_array[%d].dlHandle_plugin :%p",count,plugin_msg_array[count].dlHandle_plugin);
+            plugin_msg_array[count].register_module = (lynq_atsvc_incb(*)(lynq_atsvc_outcb out_cb))dlsym(plugin_msg_array[count].dlHandle_plugin, plugin_conf.reg);
+            if(NULL == plugin_msg_array[count].register_module)
+            {
+                ALOGD("open plugin_msg_array[%d].%p fail",count,plugin_msg_array[count].register_module);
+                ALOGD("dlsym failed: %s", dlerror());
+                root = root->next;
+                continue;
+            }
+            plugin_msg_array[count].atsvc_incb = plugin_msg_array[count].register_module(lynq_atsvc_outcb_entity);
+            if(NULL == plugin_msg_array[count].atsvc_incb)
+            {
+                ALOGE("call %s fail",plugin_conf.reg);
+                root = root->next;
+                continue;
+            }
+            atcmd_len = strlen(plugin_conf.cmd);
+            atcmd = (char *)malloc(atcmd_len*(sizeof(char)+1));
+            if(NULL == atcmd)
+            {
+                ALOGE("count %d atcmd malloc fail",count);
+                root = root->next;
+                continue;
+            }
+            plugin_msg_array[count].state = 1;
+            memcpy(atcmd,plugin_conf.cmd,atcmd_len);
+            atcmd[atcmd_len] = '\0';
+            //plugin_msg_array[count].atcmd = atcmd;
+            upper_string(atcmd);
+            plugin_msg_array[count].atcmd = atcmd;
+            count++;
+        }
+        root = root->next;
+    }
+    ALOGD("pcurnode->name return");
+    xmlFreeDoc(pdoc);
+    xmlCleanupParser();
+    return 0;
+}
+
+
+int lynq_check_extension_atcmd(char * atcmd)
+{
+    ALOGD("[%d][%s] enter",LINE,FUNC);
+    char *needleP = NULL;
+    if(NULL == atcmd)
+    {
+        ALOGD("[%d][%s] atcmd is null",LINE,FUNC);
+        return -1;
+    }
+    ALOGD("[%d][%s]atcmd:%s",LINE,FUNC,atcmd);
+    char* line_cut = cut_cmd_line(atcmd);
+    if (line_cut == NULL)
+    {
+        ALOGD("[%d][%s]line_cut is null",LINE,FUNC);
+        return -1;
+    }
+    for(int i = 0;white_list[i];i++)
+    {
+        if(strcmp(line_cut,white_list[i]) == 0)
+        {
+            ALOGD("[%d][%s]count %d,pass atcmd:%s",LINE,FUNC,i,line_cut);
+            return -1;
+        }
+    }
+    needleP =strstr(register_atcmd_buff,line_cut);
+    if(NULL != needleP)
+    {
+        ALOGD("[%d][%s] find atcmd:%s",LINE,FUNC,line_cut);
+        free(line_cut);
+        return 0;
+    }
+    free(line_cut);
+    return -1;
+}
+int send_msg_to_at_extension(char *atcmd,int size)
+{
+    LOGATCI(LOG_ERR,"[%d][%s] enter",LINE,FUNC);
+    if (g_atsvc_client_connect < 0)
+    {
+        LOGATCI(LOG_ERR, "fd invalid when send to atci service. errno = %d", errno);
+        return -1;
+    }
+    if(NULL == atcmd)
+    {
+        LOGATCI(LOG_ERR, "atcmd is null.");
+        return -1;
+    }
+    int sendLen = send(g_atsvc_client_connect, atcmd, size, 0);
+    if (sendLen != size)
+    {
+        LOGATCI(LOG_ERR, "lose data when send to atci service. errno = %d", errno);
+        return -1;
+    }
+    LOGATCI(LOG_DEBUG, "send to app demo: %s", atcmd);
+    return 0;
+}
+int actsvc_cmd_recv(int fd, char *buf, int len)
+{
+    int ret = 0;
+    fd_set rfds;
+    //FD_CLR(fd, &rfds);
+    FD_SET(fd, &rfds);
+    ret = select(fd + 1, &rfds, NULL, NULL, NULL);
+    if (ret <= 0)
+    {
+        ALOGE("acti_cmd_recv select error, ret=%d, error=%s(%d),fd=%d", ret,strerror(errno), errno, fd);
+        return SOCKET_FAIL;
+    }
+    if (FD_ISSET(fd, &rfds))
+    {
+        ret = recv(fd, buf, len, 0);
+        if (ret < 0)
+        {
+            ALOGE("acti_cmd_recv select error, ret=%d, error=%s(%d),fd=%d", ret,strerror(errno), errno, fd);
+            return SOCKET_FAIL;
+        }
+        else if(ret == 0)
+        {
+            ALOGE("acti_cmd_recv recv error, ret=%d, error=%s(%d),fd=%d", ret,strerror(errno), errno, fd);
+            return SOCKET_ZERO;
+        }
+        else
+        {
+            ALOGD("[%d][%s] buf is:%s",LINE,FUNC,buf);
+        }
+    }
+    return SOCKET_SUCC;
+}
+
+void *start_at_extension_Socket(void * param)
+{
+    ALOGD("[%d][%s]enter",LINE,FUNC);
+    socklen_t client_len;
+    int ret;
+    char parser_buf[SOCKET_BUF_SIZE];
+    g_atsvc_socket_fd = create_socket(AF_UNIX, SOCK_STREAM,0, 0, NULL,RIL_SOCKET_NAME, (void *)&g_local_addr, 2);
+    if(0 > g_atsvc_socket_fd)
+    {
+        ALOGD("init socket fail and fd:%d",g_atsvc_socket_fd);
+        return NULL;
+    }
+    TryNewLink:
+    client_len = sizeof(g_local_addr);
+    int conn = accept(g_atsvc_socket_fd,(struct sockaddr *) &g_local_addr, &client_len);
+    if (conn <= 0)
+    {
+        ALOGE("[%d][%s] accept error!",LINE,FUNC);
+        close(conn);
+        return NULL;
+    }
+    ALOGD("Accept a client , fd is %d", conn);
+    if(g_atsvc_client_connect >= 0)
+    {
+        ALOGE("g_atsvc_client_connect need close!");
+        close(g_atsvc_client_connect);
+        g_atsvc_client_connect = -1;
+    }
+    g_atsvc_client_connect = conn;
+    /* tranlate data */
+    while (true)
+    {
+        memset(parser_buf, 0, sizeof(parser_buf));
+        if(has_registe_cmd == 0)
+        {
+            memset(register_atcmd_buff, 0, sizeof(register_atcmd_buff));
+            ret = actsvc_cmd_recv(conn, register_atcmd_buff, SOCKET_BUF_SIZE);
+            upper_string(register_atcmd_buff);
+            if (ret < 0)
+            {
+                ALOGE("[%d][%s]receive CMD error",LINE,FUNC);
+                continue;
+            }
+            else if(ret == SOCKET_ZERO)
+            {
+                ALOGE("maybe client socket closed 1. retry new link!");
+              goto TryNewLink;
+            }
+            has_registe_cmd = 1;
+        }
+        else
+        {
+            ret = actsvc_cmd_recv(conn, parser_buf, SOCKET_BUF_SIZE);
+            if (ret < 0)
+            {
+                ALOGE("[%d][%s]receive CMD error",LINE,FUNC);
+                continue;
+            }
+            else if(ret == SOCKET_ZERO)
+            {
+                ALOGE("maybe client socket closed 1. retry new link!");
+              goto TryNewLink;
+            }
+            lynq_write_data_to_serail(parser_buf,strlen(parser_buf),0);
+        }
+    }
+    return NULL;
+}
+
+void start_at_extension_loop(void)
+{
+    pthread_t at_extension_socket_thread;
+    ALOGD("[%d][%s]enter",LINE,FUNC);
+    pthread_mutex_lock(&s_startupMutex);
+
+    pthread_attr_t attr;
+    pthread_attr_init(&attr);
+    pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
+
+    int result = pthread_create(&at_extension_socket_thread, &attr, start_at_extension_Socket, NULL);
+    if (result != 0)
+    {
+        ALOGE("Failed to create ATCI thread: %s", strerror(result));
+        goto done;
+    }
+done:
+    pthread_mutex_unlock(&s_startupMutex);
+}
+
+int lynq_atsvc_init(int count,const char * plugin_conf_path)
+{
+    ALOGD("start [%d][%s]",LINE,FUNC);
+    int res = 0;
+    /*
+    g_atsvc_socket_fd = create_socket(AF_UNIX, SOCK_STREAM,0, 0, NULL,RIL_SOCKET_NAME, (void *)&g_local_addr, 2);
+    if(0 > g_atsvc_socket_fd)
+    {
+        ALOGD("init socket fail and fd:%d",g_atsvc_socket_fd);
+        //return INIT_SOCKET_FAIL;
+    }
+    */
+    res = init_pseudo_terminal();
+    if(res != 0)
+    {
+        ALOGD("init pseudo terminal fail");
+    }
+    start_at_extension_loop();
+    res = load_pulgin(PLUGIN_CONF_PATH);
+    if(0 > res)
+    {
+        for(int i = 0;i < PLUGINE_MAX_COUNT; i++)
+        {
+            if(NULL != plugin_msg_array[i].atcmd)
+            {
+                free(plugin_msg_array[i].atcmd);
+            }
+        }
+        ALOGD("load_pulgin fail,code is %d",res);
+        return INIT_PULGIN_FAIL;
+    }
+    for(int i = 0;i < PLUGINE_MAX_COUNT; i++)
+    {
+        if(NULL != plugin_msg_array[i].atcmd)
+        {
+            ALOGD("atcmd:%s",plugin_msg_array[i].atcmd);
+        }
+    }
+    //todo at liblynq-at-extension
+    /*create thread for reacive ril msg*/
+    /*load pulgin from plugin config*/
+    return 0;
+}
diff --git a/src/telephonyware/3.0/atcid/atci/src/lynq-private/lynq_atsvc_controller.h b/src/telephonyware/3.0/atcid/atci/src/lynq-private/lynq_atsvc_controller.h
new file mode 100755
index 0000000..549f6a7
--- /dev/null
+++ b/src/telephonyware/3.0/atcid/atci/src/lynq-private/lynq_atsvc_controller.h
@@ -0,0 +1,85 @@
+/**********************************************************************************************
+* @file lynq_atsvc_controller.h
+* @brief Control the initialization of lynq at, and dispacthing, etc.
+* @details None
+* @author   Hong Liu。
+* @date     2022-11-24
+* @version  V1.0
+* @copyright   Copyright (c) MobileTek 
+***********************************************************************************************/
+
+
+#ifndef LYNQ_ATSVC_COBTROLLER_H
+#define LYNQ_ATSVC_COBTROLLER_H 1
+
+#include <sys/types.h>
+#include <sys/socket.h>
+
+#include <pthread.h>
+#define PLUGIN_CONF_PATH "/data/atsvc/lynq_atsvc_plugin.xml"
+#define RIL_SOCKET_NAME "/dev/socket/lynq_atsvc_socket_1"
+#define PLUGINE_MAX_COUNT 16
+
+
+
+/**********************************************************************************************
+* @brief this is a callback function,atsvc will call this function if the at command is this \
+**module command
+* @param input [IN] at command
+* @param length [IN] at command length
+* @return NULL
+************************************************************************************************/
+typedef void ( *lynq_atsvc_incb )(const char *input,const int length);
+
+/**********************************************************************************************
+* @brief this is a callback function,plugin will call this function when the plugin needs to \
+**return the response or urc
+* @param input [IN] response or urc
+* @param length [IN] response or urc length
+* @param type 
+** 0:response 
+** 1:unsolictedresponse
+* @return NULL
+************************************************************************************************/
+typedef void ( *lynq_atsvc_outcb )(char *output,int out_size,int type);
+
+/**********************************************************************************************
+* @brief this is a register function, atsvc will call this function when a plugin register in atsvc.
+* @param lynq_atsvc_outcb [IN]
+* @return lynq_atsvc_incb
+************************************************************************************************/
+typedef lynq_atsvc_incb (*lynq_register_module)(lynq_atsvc_outcb out_cb);
+
+
+typedef struct
+{
+    lynq_atsvc_incb atsvc_incb;
+    lynq_register_module register_module;
+    void *dlHandle_plugin;
+    char * atcmd;
+    int state;
+}plugin_msg_t;
+
+extern plugin_msg_t plugin_msg_array[PLUGINE_MAX_COUNT];
+extern int has_registe_cmd;
+/**********************************************************************************************
+* @brief initalize lynq atsvc,it will load plugin and create socket process
+* @param plugin_conf_path [IN] plugin config file path
+* @return 
+*     0:success
+*     1:load pugin config file fail
+*     2:create socket fail
+*     3:create thread fail
+************************************************************************************************/
+int lynq_atsvc_init(int count,const char * plugin_conf_path);
+int lynq_check_extension_atcmd(char * atcmd);
+int send_msg_to_at_extension(char *atcmd,int size);
+int create_socket(const int domain, const int type, const int protocol,const int port,const char *IP,const char *socket_name,void * addr,int backlog);
+int send_msg(int socket_fd,const struct sockaddr *dest_addr,const char *msg);
+int lynq_dispatch_atcmd(char* atcmd);
+
+
+
+#endif
+
+
diff --git a/src/telephonyware/3.0/atcid/atci/src/lynq-private/lynq_atsvc_plugin.xml b/src/telephonyware/3.0/atcid/atci/src/lynq-private/lynq_atsvc_plugin.xml
new file mode 100755
index 0000000..f4a3de8
--- /dev/null
+++ b/src/telephonyware/3.0/atcid/atci/src/lynq-private/lynq_atsvc_plugin.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<lynq_atsvc_plugin >
+  <module name="/lib64/liblynq-test-data.so"
+                 register="lynq_register_test_data"
+                 cmd="AT+LETEST;AT+LEABC;AT+LEDEF"
+  />
+  <module name="/lib64/liblynq-gnss.so"
+                 register="lynq_register_gnss"
+                 cmd="AT+CGPS;AT+CGPSNMEA"
+  />
+  <module name="/lib64/liblynq-at-common.so"
+                 register="lynq_register_at_common"
+                 cmd="AT+MNETCALL;AT+GTARNDIS;AT+CGIR;AT+LGMDS;AT+LRNDISHANDLE"
+  />
+  <module name="/lib64/liblynq-at-factory.so"
+                 register="lynq_register_at_factory"
+                 cmd="AT+LYNQFACTORY"
+  />
+  <module name="/lib64/liblynq-at-fota.so"
+                 register="lynq_register_fota"
+                 cmd="AT+FOTA;AT+LYNQFOTA"
+  />
+</lynq_atsvc_plugin>
diff --git a/src/telephonyware/3.0/atcid/atci/src/lynq-private/pseudo_terminal/terminal_controller.conf b/src/telephonyware/3.0/atcid/atci/src/lynq-private/pseudo_terminal/terminal_controller.conf
new file mode 100755
index 0000000..c495c76
--- /dev/null
+++ b/src/telephonyware/3.0/atcid/atci/src/lynq-private/pseudo_terminal/terminal_controller.conf
@@ -0,0 +1,6 @@
+#ttyGS0:0
+#ttyGS1:1
+#ttyGS3:2
+#ttyGS4:3
+CONF_PORT_ATIO:0
+CONF_PORT_ATURC:0
diff --git a/src/telephonyware/3.0/atcid/atci/src/lynq-private/pseudo_terminal/transfer_controller.c b/src/telephonyware/3.0/atcid/atci/src/lynq-private/pseudo_terminal/transfer_controller.c
new file mode 100755
index 0000000..4d5bd8f
--- /dev/null
+++ b/src/telephonyware/3.0/atcid/atci/src/lynq-private/pseudo_terminal/transfer_controller.c
@@ -0,0 +1,330 @@
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <termios.h>
+#include <sys/select.h>
+/* According to earlier standards */
+#include <sys/time.h>
+#include <sys/types.h>
+#include <unistd.h>
+#include <sys/stat.h>
+
+
+#include "transfer_controller.h"
+#include "atcid_serial.h"
+typedef struct
+{
+    int serial_io_port;
+    int serial_urc_port;
+    int io_fd;
+    int urc_fd;
+}port_conf_t;
+
+port_conf_t port_config;
+
+static int conf_to_colon(char *p_cur)
+{
+    if (p_cur == NULL)
+    {
+        return -1;
+    }
+    p_cur = strchr(p_cur, ':');
+    if (p_cur == NULL)
+    {
+        return -1;
+    }
+    ALOGD("line:%s",p_cur+1);
+    return atoi(p_cur+1);
+}
+
+char* map_device(int device_id)
+{
+    switch (device_id)
+    {
+        case L_TTY_GS0:
+            return "/dev/ttyGS0";
+        case L_TTY_GS1:
+            return "/dev/ttyGS1";
+        case L_TTY_GS3:
+            return "/dev/ttyGS3";
+        case L_TTY_GS4:
+            return "/dev/ttyGS4";
+        default:
+            return "unkonw";
+    }
+    return NULL;
+}
+int parse_terminal_config(char *path, port_conf_t * port_conf)
+{
+    ALOGD("[%d][%s] enter",__LINE__,__FUNCTION__);
+    FILE *fp;
+    const char *at_io = "CONF_PORT_ATIO";
+    const char *at_urc = "CONF_PORT_ATURC";
+    char *needle = NULL;
+    int conut = 0;
+    int ret = 0;
+    char line[100] = {0};
+    fp=fopen(path,"r");
+    if(fp==NULL)
+    {
+        ALOGD("can not load file!");
+        return -1;
+    }
+    while(!feof(fp))
+    {
+        memset(line,0,100);
+        fgets(line,100,fp);
+        ALOGD("%d:%s",conut,line);
+        needle = NULL;
+        needle = strstr(line,at_io);
+        if(NULL != needle)
+        {
+            ret = conf_to_colon(line);
+            if(ret >= 0 && ret <= 3)
+            {
+                port_conf->serial_io_port = ret;
+            }
+            ALOGD("line:%s:ret:%d",line,ret);
+        }
+        needle = NULL;
+        needle = strstr(line,at_urc);
+        if(NULL != needle)
+        {
+            ret = conf_to_colon(line);
+            if(ret >= 0 && ret <= 3)
+            {
+                port_conf->serial_urc_port = ret;
+            }
+            ALOGD("urc line:%s:ret:%d",line,ret);
+        }
+        conut++;
+    }
+    fclose(fp);
+    return 0;
+}
+
+
+/*
+* Purpose:  Open and initialize the serial device used.
+* Input:    device_id - the serial port
+* Return:    0 if port successfully opened, else -1.
+*/
+int open_serial_device_with_id(int device_id,int type)
+{
+    LOGATCI(LOG_DEBUG, "Enter,device_id:%d,type=%d",device_id,type);
+    int fdflags;
+    struct termios deviceOptions;
+    int fd = INVALIDE_SOCKET_FD;
+    int ret = 0;
+    char *devicename = NULL;
+    devicename  = map_device(device_id);
+    LOGATCI(LOG_INFO, "Opened serial port:%s", devicename);
+
+    do {
+        fd = open(devicename, O_RDWR | O_NOCTTY | O_NONBLOCK);
+    } while (fd < 0 && errno == EINTR);
+
+    if(fd < 0) {
+        LOGATCI(LOG_ERR, "Fail to open serial device(%s) with error code:%d", devicename, errno);
+        return INVALIDE_SOCKET_FD;
+    }
+
+    LOGATCI(LOG_DEBUG, "serial->fd is %d ", fd);
+
+    // Set FD to Sync IO
+    fdflags = fcntl(fd, F_GETFL);
+    ret = fcntl(fd, F_SETFL, fdflags & ~O_NONBLOCK);
+    if (ret < 0) {
+        LOGATCI(LOG_ERR, "Error clearing O_NONBLOCK errno: %d", errno);
+    }
+
+    // get the parameters
+    tcgetattr(fd,&deviceOptions);
+
+    // set raw input
+    //deviceOptions.c_lflag = ICANON | ECHO;
+    // set raw output
+    deviceOptions.c_oflag &= ~OPOST;
+    deviceOptions.c_oflag &= ~OLCUC;
+    deviceOptions.c_oflag &= ~ONLRET;
+    deviceOptions.c_oflag &= ~ONOCR;
+    deviceOptions.c_oflag &= ~OCRNL;
+
+    deviceOptions.c_cc[VEOL] = 0x1a; /*Ctrl+Z*/
+    deviceOptions.c_lflag = deviceOptions.c_lflag | IEXTEN;
+    deviceOptions.c_cc[VEOL2] = 0x1b; /*ESC*/
+
+    tcflush(fd, TCIFLUSH);
+    tcsetattr(fd,TCSANOW,&deviceOptions);
+    if(type == L_URC_TYPE)
+    {
+        port_config.urc_fd = fd;
+    }
+    else if(type == L_RESP_TYPE)
+    {
+        port_config.io_fd = fd;
+    }
+    else
+    {
+        LOGATCI(LOG_ERR, "type is invalid:%d",type);
+    }
+    return fd;
+}
+
+
+
+
+int init_pseudo_terminal()
+{
+    ALOGD("[%d][%s] enter",__LINE__,__FUNCTION__);
+    int ret = 0;
+    bool init_default = true;
+    port_config.io_fd = -1;
+    port_config.urc_fd = -1;
+    port_config.serial_io_port = -1;
+    port_config.serial_urc_port = -1;
+    ret = parse_terminal_config(TERMINAL_CONF_PATH, &port_config);
+    if(ret < 0)
+    {
+        ALOGD("parse terminal fail,init defualt prot");
+        init_default = false;
+        port_config.serial_io_port = L_TTY_GS0;
+        port_config.serial_urc_port = L_TTY_GS0;
+    }
+    //todo init device
+    //just init urc port,why not init io port?Because this function is executed earlier than [atcid.c line 112]open_serial_device(), 
+    //it will cause logic confusion.
+    if(port_config.serial_urc_port != L_TTY_GS0)
+    {
+        ALOGD("[%d][%s] init urc port %d",__LINE__,__FUNCTION__,port_config.serial_urc_port);
+        if(open_serial_device_with_id(port_config.serial_urc_port,L_URC_TYPE)!=0)
+        {
+            ALOGD("[%d][%s] init urc port fail,serial_urc_port:%d,urc_fd:%d",__LINE__,__FUNCTION__,port_config.serial_urc_port,port_config.urc_fd);
+        }
+    }
+    return 0;
+}
+
+void write_data_to_serial_with_port(int serial_port,int type,char *output,int out_size)
+{
+    ALOGD("serial_io_port:%d,type%d,output:%s,out_size:%d",serial_port,type,output,out_size);
+    int write_len = 0;
+    char buffer[out_size+1];
+    int output_len = 0;
+    int count=0;
+    memset(buffer,0,out_size+1);
+    if(NULL == output)
+    {
+        ALOGE("output is null");
+        return;
+    }
+    output_len = strlen(output);
+    if(out_size != output_len)
+    {
+        ALOGD("output len not equal to out_size,and send output,output_len = %d",output_len);
+        if(out_size > output_len)
+        {
+            memcpy(buffer,output,output_len);
+        }
+        else
+        {
+            memcpy(buffer,output,out_size);
+            buffer[out_size] = '\0';
+            output_len = out_size+1;
+        }
+    }
+    else
+    {
+        memcpy(buffer,output,output_len);
+    }
+    ALOGD("output_len = %d",output_len);
+    if(strcmp(serial.devicename[0],map_device(serial_port)) == 0)
+    {
+        ALOGD("[%s] use writeDataToSerial",__FUNCTION__);
+        writeDataToSerial(buffer,output_len);
+        return;
+    }
+    if(type == L_RESP_TYPE)
+    {
+        if(port_config.io_fd < 0)
+        {
+            ALOGE("io fd don`t opened");
+            return;
+        }
+        resp_try_write:
+        write_len = write(port_config.io_fd, buffer,output_len);
+        if(write_len != output_len)
+        {
+            LOGATCI(LOG_DEBUG, "resp wirte_line=%d,output_len=%d,errno:%d!",write_len,output_len,errno);
+            if(write_len == -1)
+            {//meybe usb has change,eg.switch adb to rndis mode,or rndis to adb mode,so we need reopen,the reopen time is 5.
+                if(count < 5)
+                {
+                    close(port_config.io_fd);
+                    init_pseudo_terminal();
+                    usleep(500*1000);
+                    count++;
+                    LOGATCI(LOG_DEBUG, "retry times = %d",count);
+                    goto resp_try_write;
+                }
+            }
+        }
+        LOGATCI(LOG_DEBUG, "resp wirte_line=%d,output_len=%d!",write_len,output_len);
+    }
+    else if(type == L_URC_TYPE)
+    {
+        if(port_config.urc_fd < 0)
+        {
+            ALOGE("urc fd don`t opened");
+            return;
+        }
+        urc_try_write:
+        write_len = write(port_config.urc_fd, buffer,output_len);
+        if(write_len != output_len)
+        {
+            LOGATCI(LOG_DEBUG, "urc wirte_line=%d,output_len=%d,errno:%d!",write_len,output_len,errno);
+            if(write_len == -1)//meybe usb has change,eg.switch adb to rndis mode,or rndis to adb mode,so we need reopen,the reopen time is 5.
+            {
+                if(count < 5)
+                {
+                    close(port_config.urc_fd);
+                    init_pseudo_terminal();
+                    usleep(100*1000);
+                    count++;
+                    LOGATCI(LOG_DEBUG, "retry times = %d",count);
+                    goto urc_try_write;
+                }
+            }
+        }
+        LOGATCI(LOG_DEBUG, "urc wirte_line=%d,output_len=%d!",write_len,output_len);
+    }
+    else
+    {
+        ALOGE("the type is invalid");
+    }
+    LOGATCI(LOG_DEBUG, "end retry times = %d",count);
+    return;
+}
+
+
+void lynq_write_data_to_serail(char *output,int out_size,int type)
+{
+    if(type == L_RESP_TYPE)
+    {
+        ALOGD("device：%s,total:%d,current:%d",serial.devicename[0],serial.totalSize,serial.currDevice);
+        if(strcmp(serial.devicename[0],map_device(port_config.serial_io_port)) == 0)
+        {
+            ALOGD("use writeDataToSerial");
+            writeDataToSerial(output,out_size);
+        }
+        else
+        {
+            write_data_to_serial_with_port(port_config.serial_io_port,L_RESP_TYPE,output,out_size);
+        }
+    }
+    else if(type == L_URC_TYPE)
+    {
+        write_data_to_serial_with_port(port_config.serial_urc_port,L_URC_TYPE,output,out_size);
+    }
+    return;
+}
diff --git a/src/telephonyware/3.0/atcid/atci/src/lynq-private/pseudo_terminal/transfer_controller.h b/src/telephonyware/3.0/atcid/atci/src/lynq-private/pseudo_terminal/transfer_controller.h
new file mode 100755
index 0000000..52c82cc
--- /dev/null
+++ b/src/telephonyware/3.0/atcid/atci/src/lynq-private/pseudo_terminal/transfer_controller.h
@@ -0,0 +1,18 @@
+/**********************************************************************************************
+* @file transfer_controller.h
+* @brief Control the data transfer to whicth serial,etc.
+* @details None
+* @author   Hong Liu。
+* @date     2022-12-13
+* @version  V1.0
+* @copyright   Copyright (c) MobileTek 
+***********************************************************************************************/
+#define L_TTY_GS0 0
+#define L_TTY_GS1 1
+#define L_TTY_GS3 2
+#define L_TTY_GS4 3
+#define L_RESP_TYPE 0
+#define L_URC_TYPE 1
+#define TERMINAL_CONF_PATH "/data/atsvc/terminal_controller.conf"
+void lynq_write_data_to_serail(char *output,int out_size,int type);
+
diff --git a/src/telephonyware/3.0/atcid/atci/src/lynq-private/pseudo_terminal/transfer_queue.c b/src/telephonyware/3.0/atcid/atci/src/lynq-private/pseudo_terminal/transfer_queue.c
new file mode 100644
index 0000000..792d600
--- /dev/null
+++ b/src/telephonyware/3.0/atcid/atci/src/lynq-private/pseudo_terminal/transfer_queue.c
@@ -0,0 +1 @@
+#
diff --git a/src/telephonyware/3.0/atcid/atci/src/lynq-private/pseudo_terminal/transfer_queue.h b/src/telephonyware/3.0/atcid/atci/src/lynq-private/pseudo_terminal/transfer_queue.h
new file mode 100644
index 0000000..792d600
--- /dev/null
+++ b/src/telephonyware/3.0/atcid/atci/src/lynq-private/pseudo_terminal/transfer_queue.h
@@ -0,0 +1 @@
+#
diff --git a/src/telephonyware/3.0/atcid/atci/src/platform/atcid_adaptation.cpp b/src/telephonyware/3.0/atcid/atci/src/platform/atcid_adaptation.cpp
index 29d17da..8038fb8 100755
--- a/src/telephonyware/3.0/atcid/atci/src/platform/atcid_adaptation.cpp
+++ b/src/telephonyware/3.0/atcid/atci/src/platform/atcid_adaptation.cpp
@@ -259,7 +259,7 @@
 #include <unistd.h>
 #include <sys/un.h>
 
-#define ATCI_SERVICE_SOCKET "atci_server_socket"
+#define ATCI_SERVICE_SOCKET "/dev/socket/atci_server_socket"
 
 int socket_local_client (char* name) {
     struct sockaddr_un server;
diff --git a/src/telephonyware/3.0/atcid/atci_service/src/atci_service.h b/src/telephonyware/3.0/atcid/atci_service/src/atci_service.h
index b4b1029..788905f 100755
--- a/src/telephonyware/3.0/atcid/atci_service/src/atci_service.h
+++ b/src/telephonyware/3.0/atcid/atci_service/src/atci_service.h
@@ -47,13 +47,42 @@
 #ifdef ANDROID
 #include <utils/Log.h>
 #endif
+//just dummy defines since were not including syslog.h.
+#define LOG_EMERG   0
+#define LOG_ALERT   1
+#define LOG_CRIT    2
+#define LOG_ERR     3
+#define LOG_WARNING 4
+#define LOG_NOTICE  5
+#define LOG_INFO    6
+#define LOG_DEBUG   7
 
-#define UNUSED(x) do { (void)(x); } while (0)
+#define syslog_level LOG_DEBUG
 
+#ifdef TELEMATICS
+#define ALOGD(...)   {\
+        syslog(LOG_DEBUG, ## __VA_ARGS__);}
+#define ALOGE(...)   {\
+        syslog(LOG_ERR, ## __VA_ARGS__);}
+#define ALOGW(...)   {\
+        syslog(LOG_WARNING, ## __VA_ARGS__);}
+#define ALOGI(...)   {\
+        syslog(LOG_INFO, ## __VA_ARGS__);}
+#else
 #define ALOGD printf
 #define ALOGE printf
 #define ALOGW printf
 #define ALOGI printf
+#endif
+
+#define LOGATCI(lvl, f, ...) do { \
+        if (lvl <= LOG_ERR) {ALOGE("[ATCI] %d:%s(): " f "\n", __LINE__, __FUNCTION__, ##__VA_ARGS__);} \
+        else if (lvl == LOG_WARNING) {ALOGW("[ATCI] %d:%s(): " f "\n", __LINE__, __FUNCTION__, ##__VA_ARGS__);} \
+        else if (lvl <= LOG_INFO) {ALOGI("[ATCI] %d:%s(): " f "\n", __LINE__, __FUNCTION__, ##__VA_ARGS__);} \
+        else if (lvl == LOG_DEBUG) {ALOGD("[ATCI] %d:%s(): " f "\n", __LINE__, __FUNCTION__, ##__VA_ARGS__);} \
+    } while (0)
+
+#define UNUSED(x) do { (void)(x); } while (0)
 
 extern void process_mmi_response(char* data, int dataLen);
 
diff --git a/src/telephonyware/3.0/hardware/ril/fusion/libril/rilmipc/telephony/ims/RpImsController.h b/src/telephonyware/3.0/hardware/ril/fusion/libril/rilmipc/telephony/ims/RpImsController.h
index 97efabc..5b081b9 100644
--- a/src/telephonyware/3.0/hardware/ril/fusion/libril/rilmipc/telephony/ims/RpImsController.h
+++ b/src/telephonyware/3.0/hardware/ril/fusion/libril/rilmipc/telephony/ims/RpImsController.h
@@ -43,7 +43,11 @@
 #include "RfxTimer.h"
 
 #include <utils/Vector.h>
-
+/*jb.qi change for channel 228 resume on 2022.11.18 start*/
+#include "mipc_msg_host.h"
+#include "mipc_msg_tlv_const.h"
+#include "mipc_msg_tlv_api.h"
+/*jb.qi change for channel 228 resume on 2022.11.18 end */
 /*****************************************************************************
  * Class RpDataController
  *****************************************************************************/
@@ -67,5 +71,6 @@
     virtual void handleImsRegistrationState(const sp<RfxMessage>& request);
 };
 
+void mipc_ims_state_ind_cb(mipc_msg_t *msg_ptr, void *priv_ptr); //jb.qi change for channel 228 resume on 2022.11.18
 #endif /* __RP_SYS_CONTROLLER_H__ */
 
diff --git a/src/telephonyware/3.0/hardware/ril/fusion/libril/rilmipc/telephony/network/RpNwController.cpp b/src/telephonyware/3.0/hardware/ril/fusion/libril/rilmipc/telephony/network/RpNwController.cpp
index 0d02dd2..2f39946 100755
--- a/src/telephonyware/3.0/hardware/ril/fusion/libril/rilmipc/telephony/network/RpNwController.cpp
+++ b/src/telephonyware/3.0/hardware/ril/fusion/libril/rilmipc/telephony/network/RpNwController.cpp
@@ -39,7 +39,7 @@
  *****************************************************************************/
 
 #include "RpNwController.h"
-
+#include "../ims/RpImsController.h"
 #include <sys/un.h>
 #include <errno.h>
 #include <unistd.h>
@@ -663,6 +663,11 @@
     uint32_t count = 0;
     uint32_t gsm_cell_count, utms_cell_count,lte_cell_count,nr_cell_count;
 
+/*Typethree merge MTK patch to fixed signal define difference 2023/01/18 start*/
+    int INVALID = INT_MAX; // 0x7FFFFFFF;
+    int INVALID_IE = 0XFF;
+/*Typethree merge MTK patch to fixed signal define difference 2023/01/18 end*/
+
     gsm_cell_count = mipc_nw_ecell_ind_get_gsm_cell_count(msg_ptr,0);
     utms_cell_count = mipc_nw_ecell_ind_get_umts_cell_count(msg_ptr,0);
     lte_cell_count = mipc_nw_ecell_ind_get_lte_cell_count(msg_ptr,0);
@@ -734,6 +739,41 @@
             mipc_nw_lte_cell_struct4* lte_cell = mipc_nw_ecell_ind_get_lte_cell_list(msg_ptr,NULL);
             if(lte_cell != NULL) {
                 for(uint32_t i = 0; i < lte_cell_count; i++) {
+/*Typethree merge MTK patch to fixed signal define difference 2023/01/18 start*/
+#if 0
+                    int aosp_rsrp =
+                        lte_cell->rsrp_in_qdbm != INVALID ? -lte_cell->rsrp_in_qdbm / 4 : INVALID;
+                    if (aosp_rsrp > 140 && aosp_rsrp != INVALID) aosp_rsrp = 140;
+                    else if (aosp_rsrp < 44 && aosp_rsrp != INVALID) aosp_rsrp = 44;
+
+                    int aosp_rsrq =
+                        lte_cell->rsrq_in_qdbm != INVALID ? -lte_cell->rsrq_in_qdbm / 4 : INVALID;
+                    if (aosp_rsrq > 20 && aosp_rsrq != INVALID) aosp_rsrq = 20;
+                    else if (aosp_rsrq < 3 && aosp_rsrq != INVALID) aosp_rsrq = 3;
+#else
+                    int aosp_rsrp =
+                        lte_cell->rsrp != INVALID ? (141 - lte_cell->rsrp) : INVALID;
+                    if (aosp_rsrp > 140 && aosp_rsrp != INVALID) aosp_rsrp = 140;
+                    else if (aosp_rsrp < 44 && aosp_rsrp != INVALID) aosp_rsrp = 44;
+
+                    int aosp_rsrq =
+                        lte_cell->rsrq != INVALID ? ((40 - lte_cell->rsrq) >> 1) : INVALID;
+                    if (aosp_rsrq > 20 && aosp_rsrq != INVALID) aosp_rsrq = 20;
+                    else if (aosp_rsrq < 3 && aosp_rsrq != INVALID) aosp_rsrq = 3;
+#endif
+                    int aosp_cqi = lte_cell->cqi;
+                    if (aosp_cqi < 0 && aosp_cqi != INVALID) aosp_cqi = 0;
+                    else if (aosp_cqi > 15 && aosp_cqi != INVALID) aosp_cqi = 15;
+
+                    int aosp_ta = lte_cell->ta != INVALID ? (int)(lte_cell->ta) : INVALID;
+                    if (aosp_ta < 0 && aosp_ta != INVALID) aosp_ta = 0;
+                    else if (aosp_ta > 0x7FFFFFFE && aosp_ta != INVALID) aosp_ta = 0x7FFFFFFE;
+
+                    RFX_LOG_D(RFX_LOG_TAG,"lte_cell_count: aosp_rsrp:%d, aosp_rsrq:%d, aosp_cqi:%d, aosp_ta:%d",
+                            aosp_rsrp, aosp_rsrq, aosp_cqi, aosp_ta);
+                    RFX_LOG_D(RFX_LOG_TAG,"lte_cell_count: rsrp:%d, rsrq:%d, rsrp_in_qdbm:%d, rsrq_in_qdbm:%d, rssnr:%d, cqi:%d, ta:%d",
+                            lte_cell->rsrp, lte_cell->rsrq, lte_cell->rsrp_in_qdbm, lte_cell->rsrq_in_qdbm, lte_cell->rssnr, lte_cell->cqi, lte_cell->ta);
+/*Typethree merge MTK patch to fixed signal define difference 2023/01/18 end*/
                     p->writeInt32(RIL_CELL_INFO_TYPE_LTE);
                     p->writeInt32(lte_cell->state);
                     p->writeInt32(0);
@@ -746,12 +786,16 @@
                     p->writeInt32(lte_cell->physical_cell_id);
                     p->writeInt32(lte_cell->tac);
                     p->writeInt32(lte_cell->earfcn);
-                    p->writeInt32(lte_cell->rsrp);//signalStrength not in mipc // parameter
-                    p->writeInt32(lte_cell->rsrp);
-                    p->writeInt32(lte_cell->rsrq);
-                    p->writeInt32(lte_cell->rssnr);//rssnr not in mipc // parameter
-                    p->writeInt32(lte_cell->cqi);//cqi not in mipc // parameter
-                    p->writeInt32(lte_cell->ta);
+/*Typethree merge MTK patch to fixed signal define difference 2023/01/18 start*/
+                    /* For LTE, the ext1((rssnr)) in +ECELL is rssi, and format follows 27.007 +CSQ. alps05878992  */
+                    p->writeInt32(lte_cell->rssnr); //signalStrength
+                    p->writeInt32(aosp_rsrp);
+                    p->writeInt32(aosp_rsrq);
+                    /*For LTE, rssnr is not reported. alps05878992 */
+                    p->writeInt32(0); //rssnr
+                    p->writeInt32(aosp_cqi); //cqi
+                    p->writeInt32(aosp_ta);
+/*Typethree merge MTK patch to fixed signal define difference 2023/01/18 end*/
                 }
             }
         }
@@ -760,6 +804,44 @@
             mipc_nw_nr_cell_struct4* nr_cell = mipc_nw_ecell_ind_get_nr_cell_list(msg_ptr,NULL);
             if(nr_cell != NULL) {
                 for(uint32_t i = 0; i < nr_cell_count; i++) {
+/*Typethree merge MTK patch to fixed signal define difference 2023/01/18 start*/
+                    int aosp_nr_ssrsrp =
+                        nr_cell->rsrp != INVALID_IE ? (157 - nr_cell->rsrp) : INVALID;
+                    if (aosp_nr_ssrsrp > 140 && aosp_nr_ssrsrp != INVALID) aosp_nr_ssrsrp = 140;
+                    else if (aosp_nr_ssrsrp < 44 && aosp_nr_ssrsrp != INVALID) aosp_nr_ssrsrp = 44;
+
+                    int aosp_nr_ssrsrq =
+                        nr_cell->rsrq != INVALID_IE ? ((87 - nr_cell->rsrq) >> 1) : INVALID;
+                    if (aosp_nr_ssrsrq > 20 && aosp_nr_ssrsrq != INVALID) aosp_nr_ssrsrq = 20;
+                    else if (aosp_nr_ssrsrq < 3 && aosp_nr_ssrsrq != INVALID) aosp_nr_ssrsrq = 3;
+
+                    int aosp_nr_sssinr =
+                        nr_cell->sinr != INVALID_IE ? ((nr_cell->sinr - 47) >> 1) : INVALID;
+                    if (aosp_nr_sssinr > 40 && aosp_nr_sssinr != INVALID) aosp_nr_sssinr = 40;
+                    else if (aosp_nr_sssinr < -23 && aosp_nr_sssinr != INVALID) aosp_nr_sssinr = -23;
+
+                    int aosp_nr_csirsrp =
+                        nr_cell->csirsrp != INVALID_IE ? (157 - nr_cell->csirsrp) : INVALID;
+                    if (aosp_nr_csirsrp > 140 && aosp_nr_csirsrp != INVALID) aosp_nr_csirsrp = 140;
+                    else if (aosp_nr_csirsrp < 44 && aosp_nr_csirsrp != INVALID) aosp_nr_csirsrp = 44;
+
+                    int aosp_nr_csirsrq =
+                        nr_cell->csirsrq != INVALID_IE ? ((87 - nr_cell->csirsrq) >> 1) : INVALID;
+                    if (aosp_nr_csirsrq > 20 && aosp_nr_csirsrq != INVALID) aosp_nr_csirsrq = 20;
+                    else if (aosp_nr_csirsrq < 3 && aosp_nr_csirsrq != INVALID) aosp_nr_csirsrq = 3;
+
+                    int aosp_nr_csisinr =
+                        nr_cell->csisinr != INVALID_IE ? ((nr_cell->csisinr - 47) >> 1) : INVALID;
+                    if (aosp_nr_csisinr > 40 && aosp_nr_csisinr != INVALID) aosp_nr_csisinr = 40;
+                    else if (aosp_nr_csisinr < -23 && aosp_nr_csisinr != INVALID) aosp_nr_csisinr = -23;
+
+                    RFX_LOG_D(RFX_LOG_TAG,"nr_cell_count: aosp_nr_ssrsrp:%d, aosp_nr_ssrsrq:%d, aosp_nr_sssinr:%d, \
+                                    aosp_nr_csirsrp:%d, aosp_nr_csirsrq:%d, aosp_nr_csisinr:%d",
+                                    aosp_nr_ssrsrp, aosp_nr_ssrsrq, aosp_nr_sssinr, aosp_nr_csirsrp, aosp_nr_csirsrq, aosp_nr_csisinr);
+
+                    RFX_LOG_D(RFX_LOG_TAG,"nr_cell_count: nr_cell->rsrp:%d, nr_cell->rsrq:%d, nr_cell->sinr:%d, nr_cell->csirsrp:%d, nr_cell->csirsrq:%d, nr_cell->csisinr:%d",
+                        nr_cell->rsrp, nr_cell->rsrq, nr_cell->sinr, nr_cell->csirsrp, nr_cell->csirsrq, nr_cell->csisinr);
+/*Typethree merge MTK patch to fixed signal define difference 2023/01/18 end*/
                     p->writeInt32(RIL_CELL_INFO_TYPE_NR);
                     p->writeInt32(nr_cell->state);
                     p->writeInt32(0);
@@ -773,12 +855,14 @@
                     p->writeInt32(nr_cell->physical_cell_id);
                     p->writeInt32(nr_cell->tac);
                     p->writeInt32(nr_cell->nr_arfcn);
-                    p->writeInt32(nr_cell->rsrp);
-                    p->writeInt32(nr_cell->rsrq);
-                    p->writeInt32(nr_cell->sinr);
-                    p->writeInt32(nr_cell->csirsrp); //csirsrp
-                    p->writeInt32(nr_cell->csirsrq); //csirsrq
-                    p->writeInt32(nr_cell->csisinr); //csisinr
+/*Typethree merge MTK patch to fixed signal define difference 2023/01/18 start*/
+                    p->writeInt32(aosp_nr_ssrsrp);
+                    p->writeInt32(aosp_nr_ssrsrq);
+                    p->writeInt32(aosp_nr_sssinr);
+                    p->writeInt32(aosp_nr_csirsrp); //csirsrp
+                    p->writeInt32(aosp_nr_csirsrq); //csirsrq
+                    p->writeInt32(aosp_nr_csisinr); //csisinr
+/*Typethree merge MTK patch to fixed signal define difference 2023/01/18 end*/
                 }
             }
         }
@@ -1249,7 +1333,10 @@
 {
     RFX_LOG_D(RFX_LOG_TAG,"mipc_get_cell_info_cb result_code %d\n",result_ptr->result_code);
     RFX_LOG_D(RFX_LOG_TAG,"result_code:%d,cell_list_count:%d\n", result_ptr->result_code, result_ptr->cell_list_count);
-
+/*Typethree merge MTK patch to fixed signal define difference 2023/01/18 start*/
+    int INVALID = INT_MAX; // 0x7FFFFFFF;
+    int INVALID_IE = 0XFF;
+/*Typethree merge MTK patch to fixed signal define difference 2023/01/18 end*/
     if(result_ptr->result_code != MIPC_RESULT_SUCCESS) {
         //result code to ril error transfer
         rfx_enqueue_response_message(NULL,cb_priv_ptr,mipc_sim_id_to_slot_id(sim_ps_id),result_ptr->result_code);
@@ -1299,6 +1386,47 @@
                     break;
                 }
                 case RIL_CELL_INFO_TYPE_LTE: {
+/*Typethree merge MTK patch to fixed signal define difference 2023/01/18 start*/
+#if 0
+                    int aosp_rsrp =
+                        result_ptr->cell_list[i].u.lte_cell.rsrp_in_qdbm != INVALID ? -result_ptr->cell_list[i].u.lte_cell.rsrp_in_qdbm / 4 : INVALID;
+                    if (aosp_rsrp > 140 && aosp_rsrp != INVALID) aosp_rsrp = 140;
+                    else if (aosp_rsrp < 44 && aosp_rsrp != INVALID) aosp_rsrp = 44;
+
+                    int aosp_rsrq =
+                        result_ptr->cell_list[i].u.lte_cell.rsrq_in_qdbm != INVALID_IE ? -result_ptr->cell_list[i].u.lte_cell.rsrq_in_qdbm / 4 : INVALID;
+                    if (aosp_rsrq > 20 && aosp_rsrq != INVALID) aosp_rsrq = 20;
+                    else if (aosp_rsrq < 3 && aosp_rsrq != INVALID) aosp_rsrq = 3;
+#else
+                    int aosp_rsrp =
+                        result_ptr->cell_list[i].u.lte_cell.rsrp != INVALID ? (141 - result_ptr->cell_list[i].u.lte_cell.rsrp) : INVALID;
+                    if (aosp_rsrp > 140 && aosp_rsrp != INVALID) aosp_rsrp = 140;
+                    else if (aosp_rsrp < 44 && aosp_rsrp != INVALID) aosp_rsrp = 44;
+
+                    int aosp_rsrq =
+                        result_ptr->cell_list[i].u.lte_cell.rsrq != INVALID_IE ? ((40 - result_ptr->cell_list[i].u.lte_cell.rsrq) >> 1) : INVALID;
+                    if (aosp_rsrq > 20 && aosp_rsrq != INVALID) aosp_rsrq = 20;
+                    else if (aosp_rsrq < 3 && aosp_rsrq != INVALID) aosp_rsrq = 3;
+#endif
+                    int aosp_cqi = result_ptr->cell_list[i].u.lte_cell.cqi;
+                    if (aosp_cqi < 0 && aosp_cqi != INVALID) aosp_cqi = 0;
+                    else if (aosp_cqi > 15 && aosp_cqi != INVALID) aosp_cqi = 15;
+
+                    int aosp_ta = result_ptr->cell_list[i].u.lte_cell.ta != INVALID ? (int)(result_ptr->cell_list[i].u.lte_cell.ta) : INVALID;
+                    if (aosp_ta < 0 && aosp_ta != INVALID) aosp_ta = 0;
+                    else if (aosp_ta > 0x7FFFFFFE && aosp_ta != INVALID) aosp_ta = 0x7FFFFFFE;
+
+                    RFX_LOG_D(RFX_LOG_TAG,"RIL_CELL_INFO_TYPE_LTE: aosp_rsrp:%d, aosp_rsrq:%d, aosp_cqi:%d, aosp_ta:%d",
+                            aosp_rsrp, aosp_rsrq, aosp_cqi, aosp_ta);
+                    RFX_LOG_D(RFX_LOG_TAG,"RIL_CELL_INFO_TYPE_LTE: rsrp:%d, rsrq:%d, rsrp_in_qdbm:%d, rsrq_in_qdbm:%d, rssnr:%d, cqi:%d, ta:%d",
+                            result_ptr->cell_list[i].u.lte_cell.rsrp,
+                            result_ptr->cell_list[i].u.lte_cell.rsrq,
+                            result_ptr->cell_list[i].u.lte_cell.rsrp_in_qdbm,
+                            result_ptr->cell_list[i].u.lte_cell.rsrq_in_qdbm,
+                            result_ptr->cell_list[i].u.lte_cell.rssnr,
+                            result_ptr->cell_list[i].u.lte_cell.cqi,
+                            result_ptr->cell_list[i].u.lte_cell.ta);
+/*Typethree merge MTK patch to fixed signal define difference 2023/01/18 end*/
                     p->writeInt32(result_ptr->cell_list[i].u.lte_cell.state);
                     p->writeInt32(0);
                     p->writeInt64(0);
@@ -1311,15 +1439,59 @@
                     p->writeInt32(result_ptr->cell_list[i].u.lte_cell.physical_cell_id);
                     p->writeInt32(result_ptr->cell_list[i].u.lte_cell.tac);
                     p->writeInt32(result_ptr->cell_list[i].u.lte_cell.earfcn);
-                    p->writeInt32(result_ptr->cell_list[i].u.lte_cell.rsrp);//signalStrength not in mipc // parameter
-                    p->writeInt32(result_ptr->cell_list[i].u.lte_cell.rsrp);
-                    p->writeInt32(result_ptr->cell_list[i].u.lte_cell.rsrq);
-                    p->writeInt32(result_ptr->cell_list[i].u.lte_cell.rssnr);//rssnr not in mipc // parameter
-                    p->writeInt32(result_ptr->cell_list[i].u.lte_cell.cqi);//cqi not in mipc // parameter
-                    p->writeInt32(result_ptr->cell_list[i].u.lte_cell.ta);
+/*Typethree merge MTK patch to fixed signal define difference 2023/01/18 start*/
+                    /* For LTE, the ext1((rssnr)) in +ECELL is rssi, and format follows 27.007 +CSQ. alps05878992  */
+                    p->writeInt32(result_ptr->cell_list[i].u.lte_cell.rssnr); //signalStrength
+                    p->writeInt32(aosp_rsrp);
+                    p->writeInt32(aosp_rsrq);
+                    /*For LTE, rssnr is not reported. alps05878992 */
+                    p->writeInt32(0); //rssnr
+                    p->writeInt32(aosp_cqi); //cqi
+                    p->writeInt32(aosp_ta);
+/*Typethree merge MTK patch to fixed signal define difference 2023/01/18 end*/
                     break;
                 }
                 case RIL_CELL_INFO_TYPE_NR: {
+/*Typethree merge MTK patch to fixed signal define difference 2023/01/18 start*/
+                    int aosp_nr_ssrsrp =
+                        result_ptr->cell_list[i].u.nr_cell.rsrp != INVALID_IE ? (157 - result_ptr->cell_list[i].u.nr_cell.rsrp) : INVALID;
+                    if (aosp_nr_ssrsrp > 140 && aosp_nr_ssrsrp != INVALID) aosp_nr_ssrsrp = 140;
+                    else if (aosp_nr_ssrsrp < 44 && aosp_nr_ssrsrp != INVALID) aosp_nr_ssrsrp = 44;
+
+                    int aosp_nr_ssrsrq =
+                        result_ptr->cell_list[i].u.nr_cell.rsrq != INVALID_IE ? ((87 - result_ptr->cell_list[i].u.nr_cell.rsrq) >> 1) : INVALID;
+                    if (aosp_nr_ssrsrq > 20 && aosp_nr_ssrsrq != INVALID) aosp_nr_ssrsrq = 20;
+                    else if (aosp_nr_ssrsrq < 3 && aosp_nr_ssrsrq != INVALID) aosp_nr_ssrsrq = 3;
+
+                    int aosp_nr_sssinr =
+                        result_ptr->cell_list[i].u.nr_cell.sinr != INVALID_IE ? ((result_ptr->cell_list[i].u.nr_cell.sinr - 47) >> 1) : INVALID;
+                    if (aosp_nr_sssinr > 40 && aosp_nr_sssinr != INVALID) aosp_nr_sssinr = 40;
+                    else if (aosp_nr_sssinr < -23 && aosp_nr_sssinr != INVALID) aosp_nr_sssinr = -23;
+
+                    int aosp_nr_csirsrp =
+                        result_ptr->cell_list[i].u.nr_cell.csirsrp != INVALID_IE ? (157 - result_ptr->cell_list[i].u.nr_cell.csirsrp) : INVALID;
+                    if (aosp_nr_csirsrp > 140 && aosp_nr_csirsrp != INVALID) aosp_nr_csirsrp = 140;
+                    else if (aosp_nr_csirsrp < 44 && aosp_nr_csirsrp != INVALID) aosp_nr_csirsrp = 44;
+
+                    int aosp_nr_csirsrq =
+                        result_ptr->cell_list[i].u.nr_cell.csirsrq != INVALID_IE ? ((87 - result_ptr->cell_list[i].u.nr_cell.csirsrq) >> 1) : INVALID;
+                    if (aosp_nr_csirsrq > 20 && aosp_nr_csirsrq != INVALID) aosp_nr_csirsrq = 20;
+                    else if (aosp_nr_csirsrq < 3 && aosp_nr_csirsrq != INVALID) aosp_nr_csirsrq = 3;
+
+                    int aosp_nr_csisinr =
+                        result_ptr->cell_list[i].u.nr_cell.csisinr != INVALID_IE ? ((result_ptr->cell_list[i].u.nr_cell.csisinr - 47) >> 1) : INVALID;
+                    if (aosp_nr_csisinr > 40 && aosp_nr_csisinr != INVALID) aosp_nr_csisinr = 40;
+                    else if (aosp_nr_csisinr < -23 && aosp_nr_csisinr != INVALID) aosp_nr_csisinr = -23;
+
+                    RFX_LOG_D(RFX_LOG_TAG,"RIL_CELL_INFO_TYPE_NR: aosp_nr_ssrsrp:%d, aosp_nr_ssrsrq:%d, aosp_nr_sssinr:%d, \
+                                    aosp_nr_csirsrp:%d, aosp_nr_csirsrq:%d, aosp_nr_csisinr:%d",
+                                    aosp_nr_ssrsrp, aosp_nr_ssrsrq, aosp_nr_sssinr, aosp_nr_csirsrp, aosp_nr_csirsrq, aosp_nr_csisinr);
+
+                    RFX_LOG_D(RFX_LOG_TAG,"RIL_CELL_INFO_TYPE_NR: rsrp:%d, rsrq:%d, sinr:%d, csirsrp:%d, csirsrq:%d, csisinr:%d",
+                        result_ptr->cell_list[i].u.nr_cell.rsrp, result_ptr->cell_list[i].u.nr_cell.rsrq, result_ptr->cell_list[i].u.nr_cell.sinr,
+                        result_ptr->cell_list[i].u.nr_cell.csirsrp, result_ptr->cell_list[i].u.nr_cell.csirsrq, result_ptr->cell_list[i].u.nr_cell.csisinr);
+/*Typethree merge MTK patch to fixed signal define difference 2023/01/18 end*/
+
                     p->writeInt32(result_ptr->cell_list[i].u.nr_cell.state);
                     p->writeInt32(0);
                     p->writeInt64(0);
@@ -1332,12 +1504,14 @@
                     p->writeUint32(result_ptr->cell_list[i].u.nr_cell.physical_cell_id);
                     p->writeInt32(result_ptr->cell_list[i].u.nr_cell.tac);
                     p->writeInt32(result_ptr->cell_list[i].u.nr_cell.nr_arfcn);
-                    p->writeInt32(result_ptr->cell_list[i].u.nr_cell.rsrp);
-                    p->writeInt32(result_ptr->cell_list[i].u.nr_cell.rsrq);
-                    p->writeInt32(result_ptr->cell_list[i].u.nr_cell.sinr);
-                    p->writeInt32(result_ptr->cell_list[i].u.nr_cell.csirsrp); //csirsrp
-                    p->writeInt32(result_ptr->cell_list[i].u.nr_cell.csirsrq); //csirsrq
-                    p->writeInt32(result_ptr->cell_list[i].u.nr_cell.csisinr); //csisinr
+/*Typethree merge MTK patch to fixed signal define difference 2023/01/18 start*/
+                    p->writeInt32(aosp_nr_ssrsrp);
+                    p->writeInt32(aosp_nr_ssrsrq);
+                    p->writeInt32(aosp_nr_sssinr);
+                    p->writeInt32(aosp_nr_csirsrp); //csirsrp
+                    p->writeInt32(aosp_nr_csirsrq); //csirsrq
+                    p->writeInt32(aosp_nr_csisinr); //csisinr
+/*Typethree merge MTK patch to fixed signal define difference 2023/01/18 end*/
                     break;
                 }
                 default: {
@@ -2111,7 +2285,7 @@
 void RpNwController::handleScreenStateRequest(const sp<RfxMessage>& request)
 {
     Parcel* p = request->getParcel();
-
+    int ret; //jb.qi change for channel 228 resume on 2022.11.18
     int32_t count = 0;
     android::status_t status = android::NO_ERROR;
     int32_t screen_state = -1;
@@ -2135,12 +2309,18 @@
         mipc_nw_ps_register(slot_id_to_mipc_sim_id(getSlotId()),mipc_unsol_nw_ps_ind_cb,NULL);
         mipc_nw_cs_register(slot_id_to_mipc_sim_id(getSlotId()),mipc_unsol_nw_cs_ind_cb,NULL);
         mipc_nw_psbearer_ind_register(slot_id_to_mipc_sim_id(getSlotId()),mipc_unsol_nw_psbearer_ind_cb,NULL);
+        /*jb.qi change for channel 228 resume on 2022.11.18 start*/
+        ret = mipc_msg_register_ind_api((mipc_msg_sim_ps_id_enum)slot_id_to_mipc_sim_id(getSlotId()), MIPC_IMS_STATE_IND, (void*)mipc_ims_state_ind_cb, NULL, NULL);
+        /*jb.qi change for channel 228 resume on 2022.11.18 end*/
     }else {
         mipc_nw_nitz_register(slot_id_to_mipc_sim_id(getSlotId()),NULL,NULL);
         mipc_nw_signal_state_register(slot_id_to_mipc_sim_id(getSlotId()),NULL,NULL);
         mipc_nw_ps_register(slot_id_to_mipc_sim_id(getSlotId()),NULL,NULL);
         mipc_nw_cs_register(slot_id_to_mipc_sim_id(getSlotId()),NULL,NULL);
         mipc_nw_psbearer_ind_register(slot_id_to_mipc_sim_id(getSlotId()),NULL,NULL);
+        /*jb.qi change for channel 228 resume on 2022.11.18 start*/
+        ret = mipc_msg_register_ind_api((mipc_msg_sim_ps_id_enum)slot_id_to_mipc_sim_id(getSlotId()), MIPC_IMS_STATE_IND, NULL, NULL, NULL);
+        /*jb.qi change for channel 228 resume on 2022.11.18 end*/
     }
     rfx_enqueue_response_message(NULL,request->getRilToken(),(RIL_SOCKET_ID)request->getSlotId(),RIL_E_SUCCESS);
     return;
diff --git a/src/telephonyware/3.0/libvendor-ril/mtk-rilproxy/telephony/apn/RpApnController.cpp b/src/telephonyware/3.0/libvendor-ril/mtk-rilproxy/telephony/apn/RpApnController.cpp
old mode 100644
new mode 100755
index d5475d4..f7e89b1
--- a/src/telephonyware/3.0/libvendor-ril/mtk-rilproxy/telephony/apn/RpApnController.cpp
+++ b/src/telephonyware/3.0/libvendor-ril/mtk-rilproxy/telephony/apn/RpApnController.cpp
@@ -735,21 +735,23 @@
 
     if(strncmp(apn_db_ready, "true", 4) == 0)
     {
-        if(APNDB_READY == gApnDoneCond_flag){
-            apn_destroy();
-        }
+        /*lei modify because recover /etc/config/radio_property*/
+        // if(APNDB_READY == gApnDoneCond_flag){
+        //     apn_destroy();
+        // }
 
-        if(access(DB_FILE_NAME, R_OK)==0)
-        {
-            logD(RFX_LOG_TAG," generateApnDB delete file=%s, start", DB_FILE_NAME);
-            unlink(DB_FILE_NAME); //how to detele the file.
-            while(access(DB_FILE_NAME, R_OK)==0)
-            {
-                logD(RFX_LOG_TAG," generateApnDB file=%s still exist", DB_FILE_NAME);
-                usleep(10);
-            }
-            logD(RFX_LOG_TAG," generateApnDB delete file=%s, done", DB_FILE_NAME);
-        }
+        // if(access(DB_FILE_NAME, R_OK)==0)
+        // {
+        //     logD(RFX_LOG_TAG," generateApnDB delete file=%s, start", DB_FILE_NAME);
+        //     unlink(DB_FILE_NAME); //how to detele the file.
+        //     while(access(DB_FILE_NAME, R_OK)==0)
+        //     {
+        //         logD(RFX_LOG_TAG," generateApnDB file=%s still exist", DB_FILE_NAME);
+        //         usleep(10);
+        //     }
+        //     logD(RFX_LOG_TAG," generateApnDB delete file=%s, done", DB_FILE_NAME);
+        // }
+        /*lei modify because recover /etc/config/radio_property*/
     }
 
     if(APNDB_NOTREADY == gApnDoneCond_flag)
