Merge "[Feature][ZXW-180]Add API to open sample rate channel and other parameters"
diff --git a/allbins/zx297520v3/prj_vehicle/nv_dc_ref/phyGgeAmtUser_nvrwo_0x00038400.bin b/allbins/zx297520v3/prj_vehicle/nv_dc_ref/phyGgeAmtUser_nvrwo_0x00038400.bin
index 22d545d..48a44e2 100755
--- a/allbins/zx297520v3/prj_vehicle/nv_dc_ref/phyGgeAmtUser_nvrwo_0x00038400.bin
+++ b/allbins/zx297520v3/prj_vehicle/nv_dc_ref/phyGgeAmtUser_nvrwo_0x00038400.bin
Binary files differ
diff --git a/allbins/zx297520v3/prj_vehicle/nv_dc_ref/phyLteaAmtUser_nvrwo_0x0003C800.bin b/allbins/zx297520v3/prj_vehicle/nv_dc_ref/phyLteaAmtUser_nvrwo_0x0003C800.bin
index 7c010ff..1d21a9a 100755
--- a/allbins/zx297520v3/prj_vehicle/nv_dc_ref/phyLteaAmtUser_nvrwo_0x0003C800.bin
+++ b/allbins/zx297520v3/prj_vehicle/nv_dc_ref/phyLteaAmtUser_nvrwo_0x0003C800.bin
Binary files differ
diff --git a/allbins/zx297520v3/prj_vehicle/nv_dc_ref/phyWcdmaAmtUser_nvrwo_0x0003A000.bin b/allbins/zx297520v3/prj_vehicle/nv_dc_ref/phyWcdmaAmtUser_nvrwo_0x0003A000.bin
index 8ce0321..1c458bf 100755
--- a/allbins/zx297520v3/prj_vehicle/nv_dc_ref/phyWcdmaAmtUser_nvrwo_0x0003A000.bin
+++ b/allbins/zx297520v3/prj_vehicle/nv_dc_ref/phyWcdmaAmtUser_nvrwo_0x0003A000.bin
Binary files differ
diff --git a/cap/zx297520v3/sources/meta-zxic-custom/conf/distro/vehicle_dc_ref.conf b/cap/zx297520v3/sources/meta-zxic-custom/conf/distro/vehicle_dc_ref.conf
index b186409..2b189ba 100755
--- a/cap/zx297520v3/sources/meta-zxic-custom/conf/distro/vehicle_dc_ref.conf
+++ b/cap/zx297520v3/sources/meta-zxic-custom/conf/distro/vehicle_dc_ref.conf
@@ -60,7 +60,7 @@
 
 #rootfs文件系统squashfs参数配置,压缩方式和块大小可以更改
 #squashfs_xz squashfs_zstd
-DISTRO_FEATURES_append = " squashfs_xz "
+DISTRO_FEATURES_append = " squashfs_zstd "
 ROOTFS_SQUASHFS_ARGS = "-nopad -noappend -root-owned -b 256k -p '/dev d 755 0 0' -p '/dev/console c 600 0 0 5 1' -processors 1"
 ROOTFS_SQUASHFS_ARGS += " ${@bb.utils.contains("DISTRO_FEATURES", "selinux", "-xattrs", "", d)} "
 ROOTFS_SQUASHFS_ARGS += "${@bb.utils.contains("DISTRO_FEATURES", "squashfs_zstd", " -comp zstd ","", d)}"
@@ -263,6 +263,7 @@
 	msm-svr \
 	player-demo \
 	lynq-ril-service \
+	lynq-sdk-ready \
         lynq-led-demo \
         lynq-led-sev \
         uci \
@@ -295,6 +296,7 @@
 #开源应用及库	
 meta_app_open += "\
 	dropbear \
+	dbus \
 	e2fsprogs \
 	iptables \
 	curl \
diff --git a/cap/zx297520v3/sources/meta-zxic-custom/recipes-core/images/files/zx297520v3/vehicle_dc_ref/fs/normal/rootfs/etc/init.d/zcatlog_config.sh b/cap/zx297520v3/sources/meta-zxic-custom/recipes-core/images/files/zx297520v3/vehicle_dc_ref/fs/normal/rootfs/etc/init.d/zcatlog_config.sh
index b6946d5..cebf7b0 100755
--- a/cap/zx297520v3/sources/meta-zxic-custom/recipes-core/images/files/zx297520v3/vehicle_dc_ref/fs/normal/rootfs/etc/init.d/zcatlog_config.sh
+++ b/cap/zx297520v3/sources/meta-zxic-custom/recipes-core/images/files/zx297520v3/vehicle_dc_ref/fs/normal/rootfs/etc/init.d/zcatlog_config.sh
@@ -1,7 +1,9 @@
 #!/bin/sh
 
 if [ ! -d "/mnt/userdata/config/" ];then
-	cp -R /etc/config /mnt/userdata/
+	mkdir config
+	cp -R /etc/config/lynq_uci /mnt/userdata/config/
+	ln -s /etc/config/lynq_uci_ro /mnt/userdata/config/
 else
 	echo "uci config has exist"
 fi
diff --git a/cap/zx297520v3/sources/meta-zxic-custom/recipes-lynq/lynq-qser-network-demo/files/lynq-qser-network-demo.cpp b/cap/zx297520v3/sources/meta-zxic-custom/recipes-lynq/lynq-qser-network-demo/files/lynq-qser-network-demo.cpp
index 0b1dd7d..3982cbc 100755
--- a/cap/zx297520v3/sources/meta-zxic-custom/recipes-lynq/lynq-qser-network-demo/files/lynq-qser-network-demo.cpp
+++ b/cap/zx297520v3/sources/meta-zxic-custom/recipes-lynq/lynq-qser-network-demo/files/lynq-qser-network-demo.cpp
@@ -23,8 +23,8 @@
 int (*qser_nw_get_signal_strength_p)(nw_client_handle_type h_nw,QSER_NW_SIGNAL_STRENGTH_INFO_T *pt_info);

 int (*qser_nw_set_oos_config_p)(nw_client_handle_type   h_nw, QSER_NW_OOS_CONFIG_INFO_T *pt_info);

 int (*qser_nw_get_oos_config_p)(nw_client_handle_type   h_nw, QSER_NW_OOS_CONFIG_INFO_T *pt_info);

-

-

+int (*qser_nw_set_rf_mode_p) (nw_client_handle_type   h_nw,E_QSER_NW_RF_MODE_TYPE_T rf_mode);

+int (*qser_nw_get_rf_mode_p) (nw_client_handle_type   h_nw,E_QSER_NW_RF_MODE_TYPE_T* rf_mode);

 

 int getFunc()

 {

@@ -46,10 +46,12 @@
     qser_nw_add_rx_msg_handler_p = (int (*)(nw_client_handle_type  h_nw, QSER_NW_RxMsgHandlerFunc_t handlerPtr,void* contextPtr))dlsym(handle_network,"qser_nw_add_rx_msg_handler");

     qser_nw_get_oos_config_p = (int (*)(nw_client_handle_type   h_nw, QSER_NW_OOS_CONFIG_INFO_T *pt_info))dlsym(handle_network,"qser_nw_get_oos_config");

     qser_nw_set_oos_config_p = (int (*)(nw_client_handle_type   h_nw, QSER_NW_OOS_CONFIG_INFO_T *pt_info))dlsym(handle_network,"qser_nw_set_oos_config");

-

+    qser_nw_set_rf_mode_p = (int (*)(nw_client_handle_type   h_nw, E_QSER_NW_RF_MODE_TYPE_T rf_mode))dlsym(handle_network,"qser_nw_set_rf_mode");

+    qser_nw_get_rf_mode_p = (int (*)(nw_client_handle_type   h_nw, E_QSER_NW_RF_MODE_TYPE_T* rf_mode))dlsym(handle_network,"qser_nw_get_rf_mode");

         

     if(qser_nw_client_deinit_p==NULL || qser_nw_client_init_p==NULL || qser_nw_set_config_p ==NULL ||

-       qser_nw_get_operator_name_p == NULL || qser_nw_get_reg_status_p ==NULL || qser_nw_add_rx_msg_handler_p==NULL)

+       qser_nw_get_operator_name_p == NULL || qser_nw_get_reg_status_p ==NULL || qser_nw_add_rx_msg_handler_p==NULL ||

+       qser_nw_set_rf_mode_p == NULL || qser_nw_get_rf_mode_p == NULL || qser_nw_get_oos_config_p == NULL || qser_nw_set_oos_config_p == NULL)

     {

         printf("get func pointer null");

         exit(EXIT_FAILURE);

@@ -87,7 +89,9 @@
     {5,     "qser_nw_get_signal_strength"},

     {6,     "qser_nw_set_oos_config"},

     {7,     "qser_nw_get_oos_config"},

-    {8,     "qser_nw_client_deinit"},  

+    {8,     "qser_nw_set_rf_mode"},

+    {9,     "qser_nw_get_rf_mode"},

+    {10,     "qser_nw_client_deinit"},  

  

     

     {-1,    "quit"}

@@ -435,7 +439,7 @@
                              

                  break;

              }                 

-             case 8://"qser_nw_client_deinit"

+             case 10://"qser_nw_client_deinit"

              {

                  ret = qser_nw_client_deinit_p(h_nw);

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

@@ -556,6 +560,22 @@
                 }                

                 break;

              }         

+             case 9://"qser_nw_get_rf_mode"

+             {

+                 E_QSER_NW_RF_MODE_TYPE_T  rf_mode;

+                 ret = qser_nw_get_rf_mode_p(h_nw, &rf_mode);

+                 printf("qser_nw_get_rf_mode ret = %d, rf mode=%d\n", ret, rf_mode);

+                 break;

+             }       

+             case 8://"qser_nw_set_rf_mode"

+             {

+                 E_QSER_NW_RF_MODE_TYPE_T  rf_mode;

+                 printf("please input you want set rf mode (0: cfun 0;  1: cfun 1; 4: flight mode \n");

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

+                 ret = qser_nw_set_rf_mode_p(h_nw, rf_mode);

+                 printf("qser_nw_set_rf_mode %d ret = %dn",rf_mode, ret);

+                 break;

+             }       

              default:

              {

                  show_group_help(&t_nw_test);

diff --git a/cap/zx297520v3/sources/meta-zxic-custom/recipes-lynq/lynq-qser-network-demo/files/lynq_qser_network.h b/cap/zx297520v3/sources/meta-zxic-custom/recipes-lynq/lynq-qser-network-demo/files/lynq_qser_network.h
index 4083e13..bf7781a 100755
--- a/cap/zx297520v3/sources/meta-zxic-custom/recipes-lynq/lynq-qser-network-demo/files/lynq_qser_network.h
+++ b/cap/zx297520v3/sources/meta-zxic-custom/recipes-lynq/lynq-qser-network-demo/files/lynq_qser_network.h
@@ -366,6 +366,12 @@
     QSER_NW_NR_SIGNAL_INFO_T      nr_sig_info;
 }QSER_NW_SINGNAL_EVENT_IND_T;
 
+typedef enum 
+{
+    E_QSER_NW_RF_MODE_CFUN_0 = 0,    /**<  CFUN 0. */
+    E_QSER_NW_RF_MODE_CFUN_1 = 1,    /**<  CFUN 1. */
+    E_QSER_NW_RF_MODE_FLIGHT = 4,    /**<  Flight Mode, CFUN 4. */
+}E_QSER_NW_RF_MODE_TYPE_T;
 
 int qser_nw_client_init(nw_client_handle_type  *ph_nw);
 
@@ -420,6 +426,19 @@
     void* contextPtr
 );
 
+int qser_nw_set_rf_mode
+(
+    nw_client_handle_type       h_nw,
+    E_QSER_NW_RF_MODE_TYPE_T    rf_mode
+);
+
+int qser_nw_get_rf_mode
+(
+    nw_client_handle_type       h_nw,
+    E_QSER_NW_RF_MODE_TYPE_T    *rf_mode
+);
+
+
 #ifdef __cplusplus
 }
 #endif
diff --git a/cap/zx297520v3/sources/meta-zxic-custom/recipes-lynq/lynq-ril-service/lynq-ril-service.bb b/cap/zx297520v3/sources/meta-zxic-custom/recipes-lynq/lynq-ril-service/lynq-ril-service.bb
index 641ebb7..1425ad8 100755
--- a/cap/zx297520v3/sources/meta-zxic-custom/recipes-lynq/lynq-ril-service/lynq-ril-service.bb
+++ b/cap/zx297520v3/sources/meta-zxic-custom/recipes-lynq/lynq-ril-service/lynq-ril-service.bb
@@ -3,7 +3,8 @@
 DESCRIPTION = "lynq ril service"
 LICENSE = "CLOSED"
 LIC_FILES_CHKSUM = "file://LICENSE;md5=b1e07e8d88e26263e71d3a9e2aa9a2ff"
-DEPENDS += "${@bb.utils.contains('TARGET_PLATFORM', 'mt2735', 'audio-mixer-ctrl streamer1.0', '', d)} libapn libpal libvendor-ril libbinder glib-2.0 dbus liblynq-log liblynq-uci liblynq-shm libmedia"
+DEPENDS += "${@bb.utils.contains('TARGET_PLATFORM', 'mt2735', 'audio-mixer-ctrl streamer1.0', '', d)} libapn libpal libril libvendor-ril libbinder glib-2.0 dbus liblynq-log liblynq-uci liblynq-shm libmedia libsd-daemon"
+RDEPENDS_${PN} = "libbinder libril libsd-daemon"
 #inherit workonsrc
 WORKONSRC = "${TOPDIR}/../src/lynq/framework/lynq-ril-service/src"
 FILESEXTRAPATHS_prepend :="${TOPDIR}/../src/lynq/framework/:"
@@ -52,7 +53,7 @@
 		install -d ${D}${sysconfdir}/init.d
 		install -m 0755  ${SRC-DIR}/lynq-ril-service.sh ${D}${sysconfdir}/init.d/lynq-ril-service.sh
 		install -d ${D}${sysconfdir}/rcS.d
-		ln -s ../init.d/lynq-ril-service.sh ${D}${sysconfdir}/rcS.d/S82lynq-ril-service
+		ln -s ../init.d/lynq-ril-service.sh ${D}${sysconfdir}/rcS.d/S21lynq-ril-service
 	fi
 #	install -d ${D}${includedir}
 #	install ${S}/atci/ATCI.h ${D}${includedir}
diff --git a/cap/zx297520v3/sources/meta-zxic-custom/recipes-lynq/lynq-sdk-ready/lynq-sdk-ready.bb b/cap/zx297520v3/sources/meta-zxic-custom/recipes-lynq/lynq-sdk-ready/lynq-sdk-ready.bb
new file mode 100755
index 0000000..ca0aaf7
--- /dev/null
+++ b/cap/zx297520v3/sources/meta-zxic-custom/recipes-lynq/lynq-sdk-ready/lynq-sdk-ready.bb
@@ -0,0 +1,49 @@
+#inherit externalsrc package
+
+DESCRIPTION = "lynq sdk-ready sev"
+LICENSE = "CLOSED"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=b1e07e8d88e26263e71d3a9e2aa9a2ff"
+DEPENDS += "liblynq-uci liblynq-log "
+#inherit workonsrc
+WORKONSRC = "${TOPDIR}/../src/lynq/framework/lynq-sdk-ready"
+FILESEXTRAPATHS_prepend :="${TOPDIR}/../src/lynq/framework/:"
+SRC_URI = " \
+          file://lynq-sdk-ready \
+          "
+
+SRC-DIR = "${S}/../lynq-sdk-ready"
+TARGET_CC_ARCH += "${LDFLAGS}"
+SYSTEMD_PACKAGES = "${PN}"
+SYSTEMD_SERVICE_${PN} = "lynq_sdk_ready.service"
+FILES_${PN} += "${systemd_unitdir}/system/lynq_sdk_ready.service"
+FILES_${PN} += "/system/etc/tele/ring ${bindir}"
+#Parameters passed to do_compile()
+EXTRA_OEMAKE = "'RAT_CONFIG_C2K_SUPPORT = ${RAT_CONFIG_C2K_SUPPORT}'\
+                'MTK_MULTI_SIM_SUPPORT = ${MTK_MULTI_SIM_SUPPORT}'\
+                'TARGET_PLATFORM = ${TARGET_PLATFORM}'\
+                'MTK_LED_SUPPORT = ${MTK_LED_SUPPORT}'\
+                'TARGET_PLATFORM = ${TARGET_PLATFORM}'"
+
+
+#INHIBIT_PACKAGE_STRIP = "1"
+do_compile () {
+	if test "${PACKAGE_ARCH}" = "cortexa7hf-vfp-vfpv4-neon" || test "${PACKAGE_ARCH}" = "cortexa7hf-neon-vfpv4"; then
+		oe_runmake all -C ${SRC-DIR} ROOT=${STAGING_DIR_HOST} OFLAGS="--sysroot=${STAGING_DIR_HOST} -mhard-float"
+	else
+		oe_runmake all -C ${SRC-DIR} ROOT=${STAGING_DIR_HOST} OFLAGS="--sysroot=${STAGING_DIR_HOST}"
+	fi
+}
+
+do_install() {
+	install -d ${D}${bindir}/
+	install -m 0755 ${SRC-DIR}/lynq-sdk-ready ${D}${bindir}/
+	if ${@bb.utils.contains('DISTRO_FEATURES','systemd','true','false',d)}; then
+		install -d ${D}${systemd_unitdir}/system/
+		install -m 0644 ${B}/lynq_sdk_ready.service ${D}${systemd_unitdir}/system
+	else
+		install -d ${D}${sysconfdir}/init.d
+		install -m 0755  ${SRC-DIR}/lynq-sdk-ready.sh ${D}${sysconfdir}/init.d/lynq-sdk-ready.sh
+		install -d ${D}${sysconfdir}/rcS.d
+		ln -s ../init.d/lynq-sdk-ready.sh ${D}${sysconfdir}/rcS.d/S23lynq-sdk-ready
+	fi
+}
diff --git a/cap/zx297520v3/src/lynq/framework/lynq-ril-service/src/lynq-ril-service.sh b/cap/zx297520v3/src/lynq/framework/lynq-ril-service/src/lynq-ril-service.sh
index 267f42b..4514ab0 100644
--- a/cap/zx297520v3/src/lynq/framework/lynq-ril-service/src/lynq-ril-service.sh
+++ b/cap/zx297520v3/src/lynq/framework/lynq-ril-service/src/lynq-ril-service.sh
@@ -11,7 +11,7 @@
 
 start() {
         echo -n "Starting $DAEMON... "
-        start-stop-daemon --no-close -S -b -m -p $PIDFILE -x $EXEC -- $EXEC_ARGS
+        start-stop-daemon --notify-await --no-close -S -b -m -p $PIDFILE -x $EXEC -- $EXEC_ARGS
         [ $? -eq 0 ] && echo "OK" || echo "ERROR"
 }
 
diff --git a/cap/zx297520v3/src/lynq/framework/lynq-ril-service/src/main.cpp b/cap/zx297520v3/src/lynq/framework/lynq-ril-service/src/main.cpp
index b946904..d5aa454 100755
--- a/cap/zx297520v3/src/lynq/framework/lynq-ril-service/src/main.cpp
+++ b/cap/zx297520v3/src/lynq/framework/lynq-ril-service/src/main.cpp
@@ -39,6 +39,14 @@
 #include <signal.h>
 #include "common.h"
 #include "lynq_shm.h"
+#include "sd-daemon.h"
+/*
+#ifdef RIL_TIME_CB
+extern "C" {
+        #include "telephony/ril.h"
+}
+#endif
+*/
 
 extern "C" void RIL_register (const RIL_RadioFunctions *callbacks);
 
@@ -54,6 +62,15 @@
                                 size_t datalen);
 #endif
 
+/*
+#if 1
+ #ifdef RIL_TIME_CB
+extern "C" void RIL_requestTimedCallback (RIL_TimedCallback callback,
+        void *param, const struct timeval *relativeTime);
+#endif
+#endif
+*/
+
 #ifdef RIL_TIME_CB
 void RIL_requestTimedCallback (RIL_TimedCallback callback,void *param, const struct timeval *relativeTime)
 {
@@ -201,6 +218,7 @@
     RLOGD("start rilInit");
     funcs = rilInit(&s_rilEnv, 0, NULL);;
     RLOGD("start RIL_register");
+    sd_notify(0, "READY=1");
     RIL_register(funcs);
 
     android::startGdbusLoop();
diff --git a/cap/zx297520v3/src/lynq/framework/lynq-ril-service/src/makefile b/cap/zx297520v3/src/lynq/framework/lynq-ril-service/src/makefile
index 746c615..11e2e1e 100755
--- a/cap/zx297520v3/src/lynq/framework/lynq-ril-service/src/makefile
+++ b/cap/zx297520v3/src/lynq/framework/lynq-ril-service/src/makefile
@@ -144,6 +144,8 @@
     -llynq-uci \
     -llynq-shm  \
     -lmedia \
+    -lril \
+    -lsd-daemon \
 
 ifeq ($(strip $(TARGET_PLATFORM)), mt2735)
 LOCAL_LIBS += -luciwrapper -luciwrapper -lgstbase-1.0 -llynq-protcl -llynq-thermal -llynq-systime  -lnandapi -ldtmf -lasound -lgstreamer-1.0 -lmtk_audio_mixer_ctrl -lpower
diff --git a/cap/zx297520v3/src/lynq/framework/lynq-sdk-ready/lynq-sdk-ready.sh b/cap/zx297520v3/src/lynq/framework/lynq-sdk-ready/lynq-sdk-ready.sh
new file mode 100755
index 0000000..382e072
--- /dev/null
+++ b/cap/zx297520v3/src/lynq/framework/lynq-sdk-ready/lynq-sdk-ready.sh
@@ -0,0 +1,39 @@
+#!/bin/sh
+#
+# Run the daemon
+#
+
+DAEMON="lynq-sdk-ready-service"
+PIDFILE="/var/run/$DAEMON.pid"
+EXEC="/usr/bin/lynq-sdk-ready"
+EXEC_ARGS=""
+
+
+start() {
+        echo -n "Starting $DAEMON... "
+        start-stop-daemon --no-close -S -b -m -p $PIDFILE -x $EXEC -- $EXEC_ARGS
+        [ $? -eq 0 ] && echo "OK" || echo "ERROR"
+}
+
+stop() {
+        echo -n "Stopping $DAEMON... "
+        start-stop-daemon -K -p $PIDFILE
+        [ $? -eq 0 ] && echo "OK" || echo "ERROR"
+}
+
+restart() {
+        stop
+        start
+}
+
+case "$1" in
+  start|stop|restart)
+        "$1"
+        ;;
+  *)
+        echo "Usage: $0 {start|stop|restart}"
+        exit 1
+esac
+
+exit $?
+
diff --git a/cap/zx297520v3/src/lynq/framework/lynq-sdk-ready/lynq_sdk_ready.service b/cap/zx297520v3/src/lynq/framework/lynq-sdk-ready/lynq_sdk_ready.service
new file mode 100755
index 0000000..5132c86
--- /dev/null
+++ b/cap/zx297520v3/src/lynq/framework/lynq-sdk-ready/lynq_sdk_ready.service
@@ -0,0 +1,16 @@
+[Unit]

+Description=lynq sdk ready

+After=lynq_ril_service.service

+

+[Service]

+StandardOutput=kmsg+console

+Type=simple

+RemainAfterExit=no

+ExecStart=/usr/bin/lynq-sdk-ready

+Restart=always

+User=root

+Group=root

+

+[Install]

+Alias=rilsvc

+WantedBy=multi-user.target
\ No newline at end of file
diff --git a/cap/zx297520v3/src/lynq/framework/lynq-sdk-ready/lynq_timer.cpp b/cap/zx297520v3/src/lynq/framework/lynq-sdk-ready/lynq_timer.cpp
new file mode 100755
index 0000000..b9fba74
--- /dev/null
+++ b/cap/zx297520v3/src/lynq/framework/lynq-sdk-ready/lynq_timer.cpp
@@ -0,0 +1,668 @@
+#include <stdio.h>

+#include <sys/types.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 <netinet/in.h>

+#include <arpa/inet.h>

+#include <sys/socket.h>

+

+#include <errno.h>

+#include "lynq_timer.h"

+#include <include/lynq_uci.h>

+

+#define LOG_TAG "LYNQ_SDK"

+#define DEST_PORT 8088

+#define DSET_IP_ADDRESS  "127.0.0.1"

+#define RIL_REQUEST_DEVICE_IDENTITY 98

+#define MAX_LEN 1024

+#define TIMER 30

+

+

+#define LOG_UCI_FILE "lynq_uci"

+#define LOG_UCI_MODULE "debug_mode"

+

+using ::android::Parcel;

+

+static pthread_mutex_t g_lynq_sim_sendto_mutex;

+

+typedef struct{

+    int uToken;

+    int request;

+    int paramLen;

+    char param[MAX_LEN];

+}lynq_client_t;

+

+int num = 0;

+

+int max_num;

+static int get_md_sta(void)

+{

+    FILE *fp;

+    char buffer[64]={};

+    fp = popen("cat /sys/kernel/ccci/boot","r");

+    if(fp == NULL)

+    {

+        RLOGD("function %s fp is null\n", __FUNCTION__);

+        return 0;

+    }

+    fgets(buffer,sizeof(buffer),fp);

+    if(!strlen(buffer))

+    {

+        RLOGD("function %s line %d\n", __FUNCTION__, __LINE__);

+        pclose(fp);

+        return 0;

+    }

+    if(buffer[4] == '4')

+    {

+        pclose(fp);

+        return 1;

+    }

+    RLOGD("function %s line %d\n", __FUNCTION__, __LINE__);

+    pclose(fp);

+    return 0;

+}

+

+static int t800_check_service(const char *service)

+{

+    FILE *fp;

+    char buffer[1024]={};

+    if(!strcmp(service, "/usr/sbin/mtkfusionrild"))

+    {

+        fp = popen("ps -ef|grep rild","r");

+    }

+    else if(!strcmp(service, "lynq-ril-service"))

+    {

+        fp = popen("ps -ef|grep ril-service","r");

+    }

+    if(fp == NULL)

+    {

+        RLOGD("function %s fp is null\n", __FUNCTION__);

+        return 0;

+    }

+    while(NULL != fgets(buffer,sizeof(buffer),fp))

+    {

+        if(strstr(buffer,service))

+        {

+            pclose(fp);

+            RLOGD("check_service 1\n");

+            return 1;

+        }

+    }

+    RLOGD("check_service 0\n");

+    pclose(fp);

+    return 0;

+}

+

+

+static int t106_check_service(const char *service)

+{

+    FILE *fp;

+    char buffer[1024]={};

+

+    fp = popen("ps -ef|grep ril-service","r");

+    if(fp == NULL)

+    {

+        ALOGD("ril-service fp is null\n");

+        return -1;

+    }

+    while(NULL != fgets(buffer,sizeof(buffer),fp))

+    {

+        if(strstr(buffer,service))

+        {

+            pclose(fp);

+            ALOGD("check_service right\n");

+            return 1;

+        }

+    }

+    ALOGD("check_service -1\n");

+    pclose(fp);

+    return 0;

+}

+

+/**

+ * @brief 30s request imei

+ * 

+ * @param arg 

+ * @return void* 

+ */

+void * timer_request_imei(void * arg)

+{

+    int sock_fd = socket(AF_INET, SOCK_DGRAM, 0);

+    if (-1 == sock_fd)

+    {

+        RLOGD("__FUNCTION__ %s create  sock_fd failed %s\n", __FUNCTION__, strerror(errno));

+        /*set uci*/

+        /*socket abnormal*/

+        system("uci set lynq_uci.sdk_ready='3'");

+        /*set uci*/

+        return NULL;

+    }

+    struct sockaddr_in liblynq_data_socket;

+    bzero(&liblynq_data_socket, sizeof(liblynq_data_socket));

+    //set this lib socket config 

+    liblynq_data_socket.sin_family = AF_INET;

+    liblynq_data_socket.sin_addr.s_addr = inet_addr(DSET_IP_ADDRESS);

+    int ret = bind(sock_fd, (struct sockaddr *)&liblynq_data_socket, sizeof(liblynq_data_socket));

+    if (-1 == ret)

+    {

+        RLOGE("liblynq_data_socket bind fail,errno:%d",errno);

+        return NULL;

+    }

+    

+    struct timeval timeOut;

+    timeOut.tv_sec = 3;//timeout time 3s

+    timeOut.tv_usec = 0;

+    if (setsockopt(sock_fd, SOL_SOCKET, SO_RCVTIMEO, &timeOut, sizeof(timeOut)) < 0) 

+    {

+        RLOGD("__FUNCTION__ %s time out setting failed %s\n", __FUNCTION__, strerror(errno));

+        /*set uci*/

+        /*socket abnormal*/

+        system("uci set lynq_uci.sdk_ready='3'");

+        /*set uci*/

+        return NULL;

+    }

+    struct sockaddr_in addr_serv;

+    memset(&addr_serv, 0, sizeof(addr_serv));  

+    addr_serv.sin_family = AF_INET;  

+    addr_serv.sin_addr.s_addr = inet_addr(DSET_IP_ADDRESS);  

+    addr_serv.sin_port = htons(DEST_PORT);  

+    int len_addr_serv = sizeof(addr_serv);

+    int send_num = -1;

+    int recv_num = -1;

+    int resp_type = -1;

+    int request = -1;

+    int slot_id = -1;

+    int token = -1;

+    int res_error = -1;

+    lynq_client_t client_t;

+    char res_data[MAX_LEN] = {0};

+    client_t.request = RIL_REQUEST_DEVICE_IDENTITY;

+    client_t.paramLen = 0;

+    client_t.uToken = 999;

+    memset(client_t.param, 0, sizeof(client_t.param));

+    while (1)

+    {

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

+        RLOGD("send_num %d\n", send_num);

+        if(send_num == 0)  

+        {

+            RLOGD("__FUNCTION__ %s Close to end %s\n", __FUNCTION__, strerror(errno));

+            //unknow

+            system("uci set lynq_uci.sdk_ready='4'");

+            pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);

+            continue;

+        }

+        if(send_num < 0)  

+        {  

+            RLOGD("__FUNCTION__ %s sendto error %s\n", __FUNCTION__, strerror(errno));

+            //unknow

+            system("uci set lynq_uci.sdk_ready='4'");

+            pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);

+            continue;

+        }

+        //get data msg

+        recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN,0,(struct sockaddr *)&addr_serv,(socklen_t*)&

+len_addr_serv);

+        RLOGD("recv_num %d\n", recv_num);

+        if(recv_num == 0)

+        {

+            RLOGD("__FUNCTION__ %s Close to end\n", __FUNCTION__);

+            //unknow

+            system("uci set lynq_uci.sdk_ready='4'");

+            pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);

+            continue;;

+        }

+        if(recv_num == -1 && errno == EAGAIN)

+        {

+            RLOGD("__FUNCTION__ %srecvfrom fail because timeout\n", __FUNCTION__);

+            /*set uci*/

+#ifdef MOBILETEK_TARGET_PLATFORM_T800

+            if(!get_md_sta())

+            {

+                system("uci set lynq_uci.sdk_ready='1'");

+            }

+            else

+            {

+                if(t800_check_service("/usr/sbin/mtkfusionrild"))//rild work

+                {

+                    if(!t800_check_service("lynq-ril-service"))//not find,must be socket error

+                    {

+                        system("uci set lynq_uci.sdk_ready='3'");

+                    }

+                    else

+                    {

+                        //unknow error

+                        system("uci set lynq_uci.sdk_ready='4'");

+                    }

+                    

+                }

+                else//rild no work

+                {

+                    //unknow

+                    system("uci set lynq_uci.sdk_ready='4'");

+                }

+            }

+#endif

+

+#ifdef MOBILETEK_TARGET_PLATFORM_T106

+            if(!t106_check_service("lynq-ril-service"))//not find,must be socket error

+            {

+                //unknow error

+                system("uci set lynq_uci.sdk_ready='4'");

+            }

+#endif

+            pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);

+            continue;;

+        }

+        if(recv_num < 0)

+        {

+            RLOGD("__FUNCTION__ %srecvfrom fail %s\n", __FUNCTION__, strerror(errno));

+            //unknow

+            system("uci set lynq_uci.sdk_ready='4'");

+            pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);

+            continue;;

+        }

+        Parcel p;

+        p.setData((uint8_t *)res_data,sizeof(char)*recv_num);

+        p.setDataPosition(0);

+        if(p.dataAvail() > 0)

+        {

+            p.readInt32(&resp_type);

+            p.readInt32(&token);

+            p.readInt32(&request);

+            p.readInt32(&slot_id);

+            p.readInt32(&res_error);

+        }

+        /*judge the res_error*/

+        if(!res_error)

+        {

+            system("uci set lynq_uci.sdk_ready='0'");

+        }

+        else

+        {

+            system("uci set lynq_uci.sdk_ready='2'"); //Md configurations are inconsistent with AP configurations

+        }

+        RLOGD("__FUNCTION__ %s res_error %d\n", __FUNCTION__, res_error);

+        /*judge the res_error*/

+        pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);

+        sleep(TIMER);

+    }

+    return NULL;

+}

+

+

+

+void delete_enter(char data[])

+{

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

+    if(find)

+        *find = '\0';

+    return ;

+}

+

+

+void *check(void * arg)

+{

+

+    char pid[200][8];

+    char ffd[200][4];

+    char buf[128];

+    char check_time[4];

+    char timebuf[32];

+    int num = 1;

+    int i=0;

+    int j;

+    FILE *fp,*fp_1;

+    int ret;

+

+    ALOGD("check cpu/pid/interrupts/fd!!!\n");

+    system("mkdir /var/log/check_file");

+    system("touch /var/log/check_time");

+    fp_1 = popen("cat /var/log/check_time","r");

+    if(fgets(check_time, 4, fp_1) != NULL)

+    {

+        num = atoi(check_time);

+    }

+    pclose(fp_1);

+    while(1)

+    {

+        i = 0;

+        system("date >>/var/log/check_file/cpu_moniter.txt");

+        ret = system("top -b |head -n 25 >>/var/log/check_file/cpu_moniter.txt");

+        ALOGD("cpu ret %d", ret);

+        system("date >>/var/log/check_file/inter_moniter.txt");

+        ret = system("cat /proc/interrupts |grep -v \":          0          0\" >>/var/log/check_file/inter_moniter.txt");

+        ALOGD("interrupts ret %d", ret);

+

+        system("date >>/var/log/check_file/pid_moniter.txt");

+        ret = system("ps -e \"%p %a\" | grep -v \"\\[\" >>/var/log/check_file/pid_moniter.txt");

+        ALOGD("pid ret %d", ret);

+

+        system("date >>/var/log/check_file/meminfo_moniter.txt");

+        ret = system("cat /proc/meminfo >>/var/log/check_file/meminfo_moniter.txt");

+        ALOGD("meminfo ret %d", ret);

+

+        system("date >>/var/log/check_file/buddyinfo_moniter.txt");

+        ret = system("cat /proc/buddyinfo >>/var/log/check_file/buddyinfo_moniter.txt");

+        ALOGD("buddyinfo ret %d", ret);

+#ifdef MOBILETEK_TARGET_PLATFORM_T800

+        system("date >>/var/log/check_file/ps_auxw_moniter.txt");

+        ret = system("ps -auxw|grep -v \"0.0  0.0\"|grep -v \"0.1  0.0\"|grep -v \"0.0  0.1\" >>/var/log/check_file/ps_auxw_moniter.txt");

+        ALOGD("ps_auxw ret %d", ret);

+#endif

+        system("date >>/var/log/check_file/cur_freq_moniter.txt");

+        ret = system("cat /sys/devices/system/cpu/cpufreq/policy0/scaling_cur_freq >>/var/log/check_file/cur_freq_moniter.txt");

+        ALOGD("cur_freq ret %d", ret);

+

+        system("date >>/var/log/check_file/available_frequencies_moniter.txt");

+        ret = system("cat /sys/devices/system/cpu/cpufreq/policy0/scaling_available_frequencies >>/var/log/check_file/available_frequencies_moniter.txt");

+        ALOGD("available_frequencies ret %d", ret);

+

+        system("date >>/var/log/check_file/fd_moniter.txt");

+        fp = popen("ps -e \"%p %a\" | grep -v \"\\[\"|awk '{print $1}'","r");

+        while(fgets(pid[i], 8, fp) != NULL)

+        {

+            ALOGD("pid[%d]:%s", i, pid[i]);

+             delete_enter(pid[i]);

+             i++;

+        }

+        pclose(fp);

+

+        for(j=1;j<i;j++)

+        {

+            sprintf(buf, "ls /proc/%s/fd | wc -l", pid[j]);

+            fp = popen(buf, "r");

+            fgets(ffd[j], 4, fp);

+            sprintf(buf,"echo \"pid: %s, fd_num: %s\" >>/var/log/check_file/fd_moniter.txt",pid[j], ffd[j]);

+            ALOGD("%s",buf);

+            system(buf);

+            pclose(fp);

+        }

+

+        if(num > max_num)

+        {

+            system("cp /var/log/check_file/cpu_moniter.txt /var/log/check_file/cpu_moniter_1.txt");

+            system("cp /var/log/check_file/inter_moniter.txt /var/log/check_file/inter_moniter_1.txt");

+            system("cp /var/log/check_file/pid_moniter.txt /var/log/check_file/pid_moniter_1.txt");

+            system("cp /var/log/check_file/fd_moniter.txt /var/log/check_file/fd_moniter_1.txt");

+            system("cp /var/log/check_file/meminfo_moniter.txt /var/log/check_file/meminfo_moniter_1.txt");

+            system("cp /var/log/check_file/buddyinfo_moniter.txt /var/log/check_file/buddyinfo_moniter_1.txt");

+#ifdef MOBILETEK_TARGET_PLATFORM_T800

+            system("cp /var/log/check_file/ps_auxw_moniter.txt /var/log/check_file/ps_auxw_moniter_1.txt");

+#endif

+            system("cp /var/log/check_file/cur_freq_moniter.txt /var/log/check_file/cur_freq_moniter_1.txt");

+            system("cp /var/log/check_file/available_frequencies_moniter.txt /var/log/check_file/available_frequencies_moniter_1.txt");

+

+

+            system("rm -rf /var/log/check_file/cpu_moniter.txt");

+            system("rm -rf /var/log/check_file/inter_moniter.txt");

+            system("rm -rf /var/log/check_file/pid_moniter.txt");

+            system("rm -rf /var/log/check_file/fd_moniter.txt");

+            system("rm -rf /var/log/check_file/meminfo_moniter.txt");

+            system("rm -rf /var/log/check_file/buddyinfo_moniter.txt");

+#ifdef MOBILETEK_TARGET_PLATFORM_T800

+            system("rm -rf /var/log/check_file/ps_auxw_moniter.txt");

+#endif

+            system("rm -rf /var/log/check_file/cur_freq_moniter.txt");

+            system("rm -rf /var/log/check_file/available_frequencies_moniter.txt");

+

+            num = 0;

+        }

+        num++;

+        sprintf(timebuf, "echo \"%d\" >/var/log/check_time", num);

+        ret = system(timebuf);

+        sleep(300);

+    }

+    return NULL;

+

+}

+

+

+void *t800_check_uci(void * arg)

+{

+    int ret[6];

+    int result = 0;

+    int flag = 0;

+

+    char uci_0[]="/etc/config/lynq_uci";

+    char uci_1[]="/etc/config/lynq_uci_ro";

+    char uci_2[]="/etc/config/mdlog";

+    char uci_3[]="/etc/config/radio_property";

+    char uci_4[]="/etc/config/service";

+    char uci_5[]="/etc/config/usb";

+    RLOGD("start check uci\n");

+    while(num++ < 4)

+    {

+        RLOGD("@@@@@@@num=%d\n", num);

+        flag = 0;

+        ret[0] = system("uci show | grep \"lynq_uci.lynq_ril\" > /dev/null");

+        if(ret[0] != 0)

+        {

+            RLOGD("lynq_uci unload\n");

+            flag = 1;

+        }

+

+        ret[1] = system("uci show | grep \"^lynq_uci_ro\.\" > /dev/null");

+        if(ret[1] != 0)

+        {

+            RLOGD("lynq_uci_ro unload\n");

+            flag = 1;

+        }

+

+        ret[2] = system("uci show | grep \"^mdlog\.\"");

+        if(ret[2] != 0)

+        {

+            RLOGD("mdlog unload\n");

+            flag = 1;

+        }

+

+        ret[3] = system("uci show | grep \"^radio_property\.\" > /dev/null");

+        if(ret[3] != 0)

+        {

+            RLOGD("radio_property unload\n");

+            flag = 1;

+        }

+

+        ret[4] = system("uci show | grep \"^service\.\" > /dev/null");

+        if(ret[4] != 0)

+        {

+            RLOGD("service unload\n");

+            flag = 1;

+        }

+

+        ret[5] = system("uci show | grep \"^usb\.\" > /dev/null");

+        if(ret[5] != 0)

+        {

+            RLOGD("usb unload\n");

+            flag = 1;

+        }

+

+        RLOGD("flag=%d\n",flag);

+        if(flag != 0)

+        {

+            RLOGD("config reload\n");

+            result = chdir("/data_backup/");

+            result =system("tar -zxvf userdata.tar.gz -C /STATE/ >/dev/null");

+            if(result!= 0)

+            {

+                RLOGD("cp config fail\n");

+            }

+            if(ret[0] != 0)

+            {

+                lynq_load_config(uci_0);

+                RLOGD("reload lynq_uci\n");

+                system("systemctl start autosuspend");

+            }

+            if(ret[1] != 0)

+            {

+                lynq_load_config(uci_1);

+                RLOGD("reload lynq_uci_ro\n");

+            }

+            if(ret[2] != 0)

+            {

+                lynq_load_config(uci_2);

+                RLOGD("reload mdlog\n");

+            }

+            if(ret[3] != 0)

+            {

+                lynq_load_config(uci_3);

+                RLOGD("reload radio_property\n");

+                system("systemctl restart mtkfusionrild");

+            }

+            if(ret[4] != 0)

+            {

+                lynq_load_config(uci_4);

+                RLOGD("reload service\n");

+            }

+            if(ret[5] != 0)

+            {

+                lynq_load_config(uci_5);

+                RLOGD("reload usb\n");

+            }

+        }

+        else

+        {

+            RLOGD("uci check success, exit check!\n");

+            break;

+        }

+        sleep(2);

+    }

+    return NULL;

+}

+

+

+void *t106_check_uci(void * arg)

+{

+    int ret[6];

+    int result = 0;

+    int flag = 0;

+

+    char uci_0[]="/etc/config/lynq_uci";

+    char uci_1[]="/etc/config/lynq_uci_ro";

+

+    ALOGD("start check uci\n");

+    while(num++ < 4)

+    {

+        ALOGD("@@@@@@@num=%d\n", num);

+        flag = 0;

+        ret[0] = system("uci show | grep \"lynq_uci.lynq_ril\"");

+        if(ret[0] != 0)

+        {

+            ALOGD("lynq_uci unload\n");

+            flag = 1;

+        }

+

+        ret[1] = system("uci show | grep \"^lynq_uci_ro\.\"");

+        if(ret[1] != 0)

+        {

+            ALOGD("lynq_uci_ro unload\n");

+            flag = 1;

+        }

+

+        ALOGD("flag=%d\n",flag);

+        if(flag != 0)

+        {

+            ALOGD("config reload\n");

+            result =system("cp -R /etc/config/ /mnt/userdata/");

+            if(result!= 0)

+            {

+                ALOGD("cp config fail\n");

+            }

+            if(ret[0] != 0)

+            {

+                ALOGD("config reload\n");

+                result =system("cp -R /etc/config/lynq_uci /mnt/userdata/config/");

+                if(result!= 0)

+                {

+                    ALOGD("cp config fail\n");

+                }

+                lynq_load_config(uci_0);

+                ALOGD("reload lynq_uci\n");

+                system("./etc/init.d/lynq-autosuspend.sh restart");

+            }

+            if(ret[1] != 0)

+            {

+                ALOGD("config reload\n");

+		result =system("ln -s /etc/config/lynq_uci_ro /mnt/userdata/config/");

+                if(result!= 0)

+                {

+                    ALOGD("cp config fail\n");

+                }

+                lynq_load_config(uci_1);

+                ALOGD("reload lynq_uci_ro\n");

+            }

+        }

+        else

+        {

+            ALOGD("uci check success, exit check!\n");

+            break;

+        }

+        sleep(2);

+    }

+    return NULL;

+}

+

+

+

+void start_timer_request(void)

+{

+    pthread_t thid,thid_1,thid_2;

+    pthread_attr_t a;

+    pthread_attr_init(&a);

+    pthread_attr_setdetachstate(&a, PTHREAD_CREATE_DETACHED);

+

+    char tmp[20];

+    int debug_mode;

+    int ret;

+

+    ALOGD("start lynq-sdk-ready\n");

+#ifdef MOBILETEK_TARGET_PLATFORM_T106

+    ret = pthread_create(&thid_2,NULL,t106_check_uci,NULL);

+#endif

+

+#ifdef MOBILETEK_TARGET_PLATFORM_T800

+    ret = pthread_create(&thid_2,NULL,t800_check_uci,NULL);

+#endif

+    if(ret != 0){

+        ALOGD("pthread_create error!!!");

+        return;

+    }

+    pthread_detach(thid_2);

+

+    ret = pthread_create(&thid, &a, timer_request_imei, NULL);

+    if(ret != 0){

+        ALOGD("pthread_create error!!!");

+        return;

+    }

+

+    ret = lynq_get_value(LOG_UCI_FILE, LOG_UCI_MODULE, "check_file_size", tmp);

+    ALOGD("ret =%d, tmp is %s\n", ret, tmp);

+    max_num=atoi(tmp);

+    ALOGD("max_num is %d!!!\n", max_num);

+

+    ret = lynq_get_value(LOG_UCI_FILE, LOG_UCI_MODULE, "sysinfo_debug_status", tmp);

+    ALOGD("ret =%d, tmp is %s\n", ret, tmp);

+    debug_mode=atoi(tmp);

+    ALOGD("debug_mode is %d!!!\n", debug_mode);

+    if((debug_mode == 1) &&(max_num > 0))

+    {

+        ALOGD("debug_mode is 1, pthread_create start!!!\n");

+        ret = pthread_create(&thid_1, NULL, check, NULL);

+        if(ret != 0)

+        {

+            ALOGD("pthread_create error!!!");

+            return;

+        }

+

+    }

+

+    return;

+}

+

diff --git a/cap/zx297520v3/src/lynq/framework/lynq-sdk-ready/lynq_timer.h b/cap/zx297520v3/src/lynq/framework/lynq-sdk-ready/lynq_timer.h
new file mode 100755
index 0000000..fac1352
--- /dev/null
+++ b/cap/zx297520v3/src/lynq/framework/lynq-sdk-ready/lynq_timer.h
@@ -0,0 +1,16 @@
+#ifndef __LYNQ_FACTORY_H__
+#define __LYNQ_FACTORY_H__
+#ifdef __cplusplus
+
+extern "C" {
+#endif
+
+
+
+void start_timer_request(void);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/cap/zx297520v3/src/lynq/framework/lynq-sdk-ready/main.cpp b/cap/zx297520v3/src/lynq/framework/lynq-sdk-ready/main.cpp
new file mode 100755
index 0000000..5eead08
--- /dev/null
+++ b/cap/zx297520v3/src/lynq/framework/lynq-sdk-ready/main.cpp
@@ -0,0 +1,24 @@
+
+#include <stdio.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <stdint.h>
+#include "lynq_timer.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+int main(void){
+    start_timer_request();
+    while (1)
+    {
+        sleep(UINT32_MAX);
+    }
+    
+    return 0;
+}
+#ifdef __cplusplus
+}
+#endif 
diff --git a/cap/zx297520v3/src/lynq/framework/lynq-sdk-ready/makefile b/cap/zx297520v3/src/lynq/framework/lynq-sdk-ready/makefile
new file mode 100755
index 0000000..56280dd
--- /dev/null
+++ b/cap/zx297520v3/src/lynq/framework/lynq-sdk-ready/makefile
@@ -0,0 +1,62 @@
+SHELL = /bin/sh
+RM = rm -f
+
+LOCAL_CFLAGS := -Wall \
+				 -std=c++11 \
+                 -g -Os \
+                 -flto \
+                 -DRIL_SHLIB \
+                 -DATCI_PARSE \
+                 -DKEEP_ALIVE \
+                 -DECALL_SUPPORT \
+                 -fpermissive \
+
+
+ifeq ($(strip $(TARGET_PLATFORM)), T106)
+LOCAL_CFLAGS += -DBINDER_IPC_32BIT=1 -DHAVE_ENDIAN_H -DHAVE_PTHREADS -DHAVE_SYS_UIO_H -DHAVE_POSIX_FILEMAP -DHAVE_STRLCPY -DHAVE_PRCTL -DHAVE_MEMSET16 -DHAVE_MEMSET32 -DANDROID_SMP=0 -DMOBILETEK_TARGET_PLATFORM_T106 
+endif
+
+ifeq ($(strip $(TARGET_PLATFORM)), T106)
+    LOCAL_CFLAGS += -DMOBILETEK_TARGET_PLATFORM_T106
+endif
+
+ifeq ($(strip $(TARGET_PLATFORM)), T800)
+    LOCAL_CFLAGS += -DMOBILETEK_TARGET_PLATFORM_T800
+endif
+
+$(warning ################# lynq sdk ROOT: $(ROOT),includedir:$(includedir))
+LOCAL_PATH   = .
+
+LOCAL_C_INCLUDES = \
+  -I. \
+  -I$(LOCAL_PATH) \
+  -I$(ROOT)$(includedir)/logger \
+  -I$(ROOT)$(includedir)/liblog \
+
+
+LOCAL_LIBS := \
+    -L. \
+    -ldl \
+    -lstdc++ \
+    -llog \
+    -lcutils \
+    -lutils \
+    -lbinder \
+    -lpthread \
+    -llynq-uci \
+
+LOCAL_SRC_FILES_CPP = $(wildcard *.cpp)
+EXECUTABLE = lynq-sdk-ready
+
+OBJECTS=$(LOCAL_SRC_FILES_CPP:.cpp=.o)
+all: $(EXECUTABLE)
+
+$(EXECUTABLE): $(OBJECTS)
+	$(CXX) $(OBJECTS) $(LOCAL_LIBS) $(LOCAL_CFLAGS) $(LOCAL_C_INCLUDES) -o $@
+
+%.o : %.cpp
+	$(CXX) $(LOCAL_C_INCLUDES) $(LOCAL_CFLAGS) $(LOCAL_LIBS) -o $@ -c $<
+
+.PHONY: clean
+clean:
+	$(RM) $(OBJECTS) $(EXECUTABLE)
diff --git a/cap/zx297520v3/src/lynq/lib/liblynq-qser-data/lynq-qser-data.cpp b/cap/zx297520v3/src/lynq/lib/liblynq-qser-data/lynq-qser-data.cpp
index 2928d8d..1be825b 100755
--- a/cap/zx297520v3/src/lynq/lib/liblynq-qser-data/lynq-qser-data.cpp
+++ b/cap/zx297520v3/src/lynq/lib/liblynq-qser-data/lynq-qser-data.cpp
@@ -352,7 +352,7 @@
 
 void datacall_ipv4_status_judge(int state,qser_data_call_info_s *data_res)
 {
-    if (state != 0)
+    if(state != 0)
     {
         data_res->v4.state = QSER_DATA_CALL_CONNECTED;
         data_res->v4.reconnect = 1;
@@ -367,7 +367,7 @@
 
 void datacall_ipv6_status_judge(int state,qser_data_call_info_s *data_res)
 {
-    if (state != 0)
+    if(state != 0)
     {
         data_res->v6.state = QSER_DATA_CALL_CONNECTED;
         data_res->v6.reconnect = 1;
@@ -722,7 +722,11 @@
     switch (pdp_type)
     {
     case QSER_APN_PDP_TYPE_IPV4:
+#ifdef MOBILETEK_TARGET_PLATFORM_T106
+        strcpy(out_pdp_type,"IP");
+#else
         strcpy(out_pdp_type,"IPV4");
+#endif
         break;
     case QSER_APN_PDP_TYPE_PPP:
         strcpy(out_pdp_type,"PPP");
@@ -847,7 +851,7 @@
         data_cb_state.profile_idx = (char)handle;
 
         memcpy(data_cb_state.name,data_urc_info.ifname,strlen(data_urc_info.ifname)+1);
-        if (!strcmp(data_urc_info.type,"IPV4"))
+        if ((strcmp(data_urc_info.type,"IPV4") == 0) || (strcmp(data_urc_info.type,"IP") == 0))
         {
             data_cb_state.ip_family = QSER_DATA_CALL_TYPE_IPV4;
         }
@@ -1060,28 +1064,27 @@
         if ((strncmp(data_call_info.type,"IPV4", strlen("IPV4") + 1) == 0) || (strncmp(data_call_info.type,"IP", strlen("IP") + 1) == 0))
         {
             strcpy(info->v4.name,data_call_info.ifname);
-            datacall_ipv4_status_judge(data_call_info.status,info);
+            datacall_ipv4_status_judge(data_call_info.active,info);
             LYINFLOG("[IPV4]addresses:%s,gateways:%s,dnses:%s",data_call_info.addresses,data_call_info.gateways,data_call_info.dnses);
             lynq_ipv4_aton_getinfo(&data_call_info,info);
         }
         else if (strncmp(data_call_info.type,"IPV6", strlen("IPV6") + 1) == 0)
         {
             strcpy(info->v6.name,data_call_info.ifname);
-
-            datacall_ipv6_status_judge(data_call_info.status,info);
+            datacall_ipv6_status_judge(data_call_info.active,info);
             LYINFLOG("[IPV6]addresses:%s,gateways:%s,dnses:%s",data_call_info.addresses,data_call_info.gateways,data_call_info.dnses);
             lynq_ipv6_inet_pton_getinfo(&data_call_info,info);
         }
         else if (strncmp(data_call_info.type,"IPV4V6", strlen("IPV4V6") + 1) == 0)
         {
             strcpy(info->v4.name,data_call_info.ifname);
-            datacall_ipv4_status_judge(data_call_info.status,info);
+            datacall_ipv4_status_judge(data_call_info.active,info);
             LYINFLOG("[IPV4V6]addresses:%s,gateways:%s,dnses:%s",data_call_info.addresses,data_call_info.gateways,data_call_info.dnses);
 #ifndef MOBILETEK_TARGET_PLATFORM_T106
             lynq_ipv4_aton_getinfo(&data_call_info,info);
 #endif
             strcpy(info->v6.name,data_call_info.ifname);
-            datacall_ipv6_status_judge(data_call_info.status,info);
+            datacall_ipv6_status_judge(data_call_info.active,info);
             LYINFLOG("[IPV4V6]addresses:%s,gateways:%s,dnses:%s",data_call_info.addresses,data_call_info.gateways,data_call_info.dnses);
 #ifndef MOBILETEK_TARGET_PLATFORM_T106
             lynq_ipv6_inet_pton_getinfo(&data_call_info,info);
diff --git a/cap/zx297520v3/src/lynq/lib/liblynq-qser-network/include/lynq_qser_network.h b/cap/zx297520v3/src/lynq/lib/liblynq-qser-network/include/lynq_qser_network.h
index 0e571fa..81aa0c2 100755
--- a/cap/zx297520v3/src/lynq/lib/liblynq-qser-network/include/lynq_qser_network.h
+++ b/cap/zx297520v3/src/lynq/lib/liblynq-qser-network/include/lynq_qser_network.h
@@ -364,6 +364,13 @@
     QSER_NW_NR_SIGNAL_INFO_T      nr_sig_info;
 }QSER_NW_SINGNAL_EVENT_IND_T;
 
+typedef enum 
+{
+    E_QSER_NW_RF_MODE_CFUN_0 = 0,    /**<  CFUN 0. */
+    E_QSER_NW_RF_MODE_CFUN_1 = 1,    /**<  CFUN 1. */
+    E_QSER_NW_RF_MODE_FLIGHT = 4,    /**<  Flight Mode, CFUN 4. */
+}E_QSER_NW_RF_MODE_TYPE_T;
+
 
 int qser_nw_client_init(nw_client_handle_type  *ph_nw);
 
@@ -418,6 +425,18 @@
     void* contextPtr
 );
 
+int qser_nw_set_rf_mode
+(
+    nw_client_handle_type       h_nw,
+    E_QSER_NW_RF_MODE_TYPE_T    rf_mode
+);
+
+int qser_nw_get_rf_mode
+(
+    nw_client_handle_type       h_nw,
+    E_QSER_NW_RF_MODE_TYPE_T    *rf_mode
+);
+
 #ifdef __cplusplus
 }
 #endif
diff --git a/cap/zx297520v3/src/lynq/lib/liblynq-qser-network/lynq_qser_network.cpp b/cap/zx297520v3/src/lynq/lib/liblynq-qser-network/lynq_qser_network.cpp
index b1539a7..2628d27 100755
--- a/cap/zx297520v3/src/lynq/lib/liblynq-qser-network/lynq_qser_network.cpp
+++ b/cap/zx297520v3/src/lynq/lib/liblynq-qser-network/lynq_qser_network.cpp
@@ -157,9 +157,7 @@
 
 void *new_network_thread_recv(void *context)
 {
-    int handle = -1;
-    int ret = 0;
-    int slot_id = 0;
+    int handle = -1;  
     uint32_t ind_flag = 0;
 
     while (1)
@@ -646,5 +644,40 @@
     return RESULT_OK;
 }
 
+int qser_nw_set_rf_mode (nw_client_handle_type h_nw,E_QSER_NW_RF_MODE_TYPE_T rf_mode)
+{
+     if(h_nw != g_ph_hw || h_nw == INVALID_CLIENT_HANDLE)
+     {
+         LYERRLOG("h_nw not right %d %d",h_nw,g_ph_hw);
+         return RESULT_ERROR;
+     }    
+     return lynq_radio_on((lynq_network_radio_on_type )rf_mode);     
+}
+
+int qser_nw_get_rf_mode (nw_client_handle_type h_nw,E_QSER_NW_RF_MODE_TYPE_T *rf_mode)
+{
+    if(NULL == rf_mode)
+    {
+        LYERRLOG("invalid client parameters incoming");
+        return RESULT_ERROR;
+    }
+
+    if(h_nw != g_ph_hw || h_nw == INVALID_CLIENT_HANDLE)
+    {
+        LYERRLOG("h_nw not right %d %d",h_nw,g_ph_hw);
+        return RESULT_ERROR;
+    }    
+    
+    int inner_rf_mode;
+    int ret = lynq_query_radio_state(&inner_rf_mode);
+    if(ret != 0)
+    {
+        LYERRLOG("get rf mode fail");
+        return RESULT_ERROR;
+    }
+    (*rf_mode)=(E_QSER_NW_RF_MODE_TYPE_T) inner_rf_mode;
+    return RESULT_OK;
+}
+
 DEFINE_LYNQ_LIB_LOG(LYNQ_QSER_NETWORK)
 
diff --git a/cap/zx297520v3/src/lynq/lib/liblynq-uci/include/lynq_uci.h b/cap/zx297520v3/src/lynq/lib/liblynq-uci/include/lynq_uci.h
index 0e9ec37..0a08c31 100755
--- a/cap/zx297520v3/src/lynq/lib/liblynq-uci/include/lynq_uci.h
+++ b/cap/zx297520v3/src/lynq/lib/liblynq-uci/include/lynq_uci.h
@@ -29,6 +29,9 @@
 

 int lynq_get_value(char *file, char *section, char *key, char *tmp);

 

+

+int lynq_load_config(char *filename);

+

 #ifdef __cplusplus

 }

 #endif

diff --git a/cap/zx297520v3/src/lynq/lib/liblynq-uci/lynq_uci.config b/cap/zx297520v3/src/lynq/lib/liblynq-uci/lynq_uci.config
index b3eb4bc..f88ea81 100755
--- a/cap/zx297520v3/src/lynq/lib/liblynq-uci/lynq_uci.config
+++ b/cap/zx297520v3/src/lynq/lib/liblynq-uci/lynq_uci.config
@@ -15,6 +15,9 @@
         option auto_enable '0'

         option debug '1'

 

+config debug_mode 'debug_mode'

+       option sysinfo_debug_status '1'

+       option check_file_size '228'

 config  lynq_fota_rw  'lynq_fota'

 

 config  service 'adb'

@@ -29,4 +32,4 @@
         option status '0'

         

 config  lynq_led_rw  'lynq_led'

-        option lynq_statusled_on '0'
\ No newline at end of file
+        option lynq_statusled_on '0'

diff --git a/cap/zx297520v3/src/lynq/lib/liblynq-uci/lynq_uci_ro.config b/cap/zx297520v3/src/lynq/lib/liblynq-uci/lynq_uci_ro.config
index 4aa92ac..284caad 100755
--- a/cap/zx297520v3/src/lynq/lib/liblynq-uci/lynq_uci_ro.config
+++ b/cap/zx297520v3/src/lynq/lib/liblynq-uci/lynq_uci_ro.config
@@ -1,4 +1,5 @@
 config lynq_version_ro 'lynq_version'

 

-config  lynq_wifi_ro  'lynq_wifi'

-        option serverport '8000'
\ No newline at end of file
+config  lynq_version 'lynq_version_ro'

+        option LYNQ_SW_VERSION 'T106CN-ZS03.V2.01.01.02P52U02.AP.09.04_CAP.09.04'

+        option LYNQ_SW_INSIDE_VERSION 'T106CN-ZS03.V2.01.01.02P52U02.AP.09.04_CAP.09.04'

diff --git a/cap/zx297520v3/src/lynq/lib/liblynq-uci/src/lynq_uci.c b/cap/zx297520v3/src/lynq/lib/liblynq-uci/src/lynq_uci.c
index a50eed1..b8a658d 100755
--- a/cap/zx297520v3/src/lynq/lib/liblynq-uci/src/lynq_uci.c
+++ b/cap/zx297520v3/src/lynq/lib/liblynq-uci/src/lynq_uci.c
@@ -214,3 +214,22 @@
     #endif //#if UCI_SUPPORT

     return 0;//#if UCI_SUPPORT add

 }

+

+int lynq_load_config(char *filename)

+{

+    struct uci_context * ctx = NULL;

+    struct uci_element *e;

+    struct uci_package * pkg = NULL;

+    ctx = uci_alloc_context();

+    if (UCI_OK != uci_load(ctx, filename, &pkg))

+    {

+        uci_free_context(ctx);

+        ctx = NULL;

+        return -1;

+    }

+    uci_unload(ctx, pkg);

+    uci_free_context(ctx);

+    ctx = NULL;

+    return 0;

+}

+

diff --git a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/sdk/ril/reference-ril/misc.c b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/sdk/ril/reference-ril/misc.c
index d1d0a21..da0ce95 100755
--- a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/sdk/ril/reference-ril/misc.c
+++ b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/sdk/ril/reference-ril/misc.c
@@ -19,7 +19,7 @@
 int strStartsWith(const char *line, const char *prefix)
 {
     for ( ; *line != '\0' && *prefix != '\0' ; line++, prefix++) {
-        if (toupper(*line) != toupper(*prefix)) {
+        if (tolower(*line) != tolower(*prefix)) {
             return 0;
         }
     }
diff --git a/update_version.sh b/update_version.sh
old mode 100644
new mode 100755
index 1c2a397..a1270f5
--- a/update_version.sh
+++ b/update_version.sh
@@ -10,6 +10,9 @@
 LYNQ_AP_SW_VERSION="export LYNQ_VERSION=\"${LYNQ_AP_VERSION}\""
 LYNQ_COMMITID="LYNQ_CONFIG_COMMITID = \"${COMMIT_ID}\""
 LYNQ_BOOT_COMMIT_ID="LYNQ_COMMIT_ID = \"${COMMIT_ID}\""
+LYNQ_VERSION_UCI="        option LYNQ_SW_VERSION '${LYNQ_AP_VERSION}_${LYNQ_CAP_VERSION}'"
+LYNQ_INSIDE_VERSION_UCI="        option LYNQ_SW_INSIDE_VERSION '${LYNQ_AP_VERSION}_${LYNQ_CAP_INSIDE_VERSION}'"
+
 eval sed -i 's/^.*LYNQ_CONFIG_VERSION.*$/"${LYNQ_SW_INSIDE_VERSION}"/' $(pwd)/cap/zx297520v3/sources/meta-zxic-custom/conf/distro/vehicle_dc_ref.conf
 eval sed -i 's/^.*LYNQ_CONFIG_SW_VERSION.*$/"${LYNQ_SW_VERSION}"/' $(pwd)/cap/zx297520v3/sources/meta-zxic-custom/conf/distro/vehicle_dc_ref.conf
 eval sed -i 's/^.*LYNQ_CONFIG_VERSION.*$/"${LYNQ_SW_INSIDE_VERSION}"/' $(pwd)/cap/zx297520v3/sources/meta-zxic-custom/conf/lynq_base.conf
@@ -18,4 +21,6 @@
 eval sed -i 's/^.*LYNQ_VERSION.*$/"${LYNQ_AP_SW_VERSION}"/' $(pwd)/ap/build/build.sh
 eval sed -i 's/^.*LYNQ_CONFIG_VERSION[[:space:]]=.*$/"${LYNQ_SW_INSIDE_VERSION}"/' $(pwd)/boot/common/src/uboot/arch/arm/lib/Makefile
 eval sed -i 's/^.*LYNQ_CONFIG_COMMITID[[:space:]]=.*$/"${LYNQ_COMMITID}"/' $(pwd)/boot/common/src/uboot/arch/arm/lib/Makefile
+eval sed -i 's/^.*LYNQ_SW_VERSION.*$/"${LYNQ_VERSION_UCI}"/' $(pwd)/cap/zx297520v3/src/lynq/lib/liblynq-uci/lynq_uci_ro.config
+eval sed -i 's/^.*LYNQ_SW_INSIDE_VERSION.*$/"${LYNQ_INSIDE_VERSION_UCI}"/' $(pwd)/cap/zx297520v3/src/lynq/lib/liblynq-uci/lynq_uci_ro.config