[Feature][ZXW-171][SDK-READY]add lynq-sdk-ready service

Only Configure: No
Affected branch: master
Affected module: sdk-ready
Is it affected on both ZXIC and MTK: only ZXIC
Self-test: Yes
Doc Update: Yes

Change-Id: Id186550e40df3d8305e82f49266b8975cd965b16
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..cf42b4f 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
@@ -263,6 +263,7 @@
 	msm-svr \
 	player-demo \
 	lynq-ril-service \
+	lynq-sdk-ready \
         lynq-led-demo \
         lynq-led-sev \
         uci \
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-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-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-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/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