[Feature]rgmii/lynq-low-power

Change-Id: Ifeee65004ab690ef1f9cbfa815610b4efcf02c37
diff --git a/meta/meta-mediatek-mt2731/recipes-lynq/lynq-low-power/lynq-low-power.bb b/meta/meta-mediatek-mt2731/recipes-lynq/lynq-low-power/lynq-low-power.bb
new file mode 100755
index 0000000..53af55c
--- /dev/null
+++ b/meta/meta-mediatek-mt2731/recipes-lynq/lynq-low-power/lynq-low-power.bb
@@ -0,0 +1,30 @@
+inherit externalsrc package
+
+DESCRIPTION = "function test"
+LICENSE = "CLOSED"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=e1696b147d49d491bcb4da1a57173fff"
+DEPENDS += "platform-libs liblynq-sim"
+inherit workonsrc
+WORKONSRC = "${TOPDIR}/../src/lynq/packages/apps/lynq-low-power/src"
+
+TARGET_CC_ARCH += "${LDFLAGS}"
+
+#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}'"
+
+#INHIBIT_PACKAGE_STRIP = "1"
+do_compile () {
+	if test "${PACKAGE_ARCH}" = "cortexa7hf-vfp-vfpv4-neon" || test "${PACKAGE_ARCH}" = "cortexa7hf-neon-vfpv4"; then
+		oe_runmake all ROOT=${STAGING_DIR_HOST} OFLAGS="--sysroot=${STAGING_DIR_HOST} -mhard-float"
+	else
+		oe_runmake all ROOT=${STAGING_DIR_HOST} OFLAGS="--sysroot=${STAGING_DIR_HOST}"
+	fi
+}
+
+do_install() {
+	install -d ${D}${bindir}/
+	install -m 0755 ${S}/lynq-low-power ${D}${bindir}/
+	install -d ${D}${includedir}
+}
diff --git a/meta/meta-mediatek-mt2731/recipes-lynq/packagegroups/packagegroup-lync-mt2731.bb b/meta/meta-mediatek-mt2731/recipes-lynq/packagegroups/packagegroup-lync-mt2731.bb
index 6fa3a85..f20ac38 100755
--- a/meta/meta-mediatek-mt2731/recipes-lynq/packagegroups/packagegroup-lync-mt2731.bb
+++ b/meta/meta-mediatek-mt2731/recipes-lynq/packagegroups/packagegroup-lync-mt2731.bb
@@ -22,5 +22,6 @@
 	lynq-logrotate-service \
 	lynq-konoda-rock \
     lynq-atsvc \
+    lynq-low-power \
     liblynq-logdata-handle \
 "
diff --git a/src/lynq/framework/lynq-atsvc/src/factory/lynq_factory.cpp b/src/lynq/framework/lynq-atsvc/src/factory/lynq_factory.cpp
index a8ef998..c88ae9f 100755
--- a/src/lynq/framework/lynq-atsvc/src/factory/lynq_factory.cpp
+++ b/src/lynq/framework/lynq-atsvc/src/factory/lynq_factory.cpp
@@ -88,30 +88,64 @@
     return 0;
 }
 
+/**
+ * @brief parse ipv4 eg:192.168.131.222 ->192.168.131.1
+ * @param  buf              My Param doc
+ */
+static void parse_ipv4(char *buf)
+{
+    char *p = buf;
+    int cnt = 0;
+    while(*p != '\0')
+    {
+        if(*p == '.')
+        {
+            cnt++;
+            if(cnt == 3)
+            {
+                *p++;
+                *p = '1';
+                *p++;
+                *p = '\0';
+            }
+        }
+        *p++;
+    }
+
+}
+
 void *thread_test_RGMII(void *arg){
     FILE *fp;
-    fp=popen("ping -c 4 baidu.com 2>&1", "r");
+    char ipv4[128] = {0};
+    fp= popen("ifconfig 'eth0' | grep \"inet addr\" | cut -f 2 -d \":\" | cut -f 1 -d \" \" 2>&1", "r");
     if(NULL == fp){
-        printf("popen errorn");
+        lynq_factory_response_ttyGS3("popen errorn\n");
         return 0;
     }
-    char lynq_factory_buf[1024] = {0};
-    if(NULL == fgets(lynq_factory_buf,sizeof(lynq_factory_buf),fp)){
-        lynq_factory_response_ttyGS3("UNKONE ERROR\n");
+    fgets(ipv4,sizeof(ipv4),fp);
+    if(strstr(ipv4, "error"))
+    {
+        lynq_factory_response_ttyGS3("RGMII don't insert\n");
+        return 0;
+    }
+    else
+    {   
+        parse_ipv4(ipv4);
+        char cmd[128] = {0};
+        sprintf(cmd, "%s %s %s", "ping -c 4", ipv4, "2>&1");
+        fp=popen(cmd, "r");
+        if(NULL == fp){
+            lynq_factory_response_ttyGS3("popen errorn\n");
+            return 0;
+        }
+        char lynq_factory_buf[1024] = {0};
+        while (NULL != fgets(lynq_factory_buf,sizeof(lynq_factory_buf),fp))
+        {   
+            lynq_factory_response_ttyGS3(lynq_factory_buf);
+        }
         pclose(fp);
         return 0;
     }
-    else{
-        lynq_factory_response_ttyGS3(lynq_factory_buf);
-        if(strstr(lynq_factory_buf, "bad"))
-            return 0;
-    }
-    while (NULL != fgets(lynq_factory_buf,sizeof(lynq_factory_buf),fp))
-    {
-        lynq_factory_response_ttyGS3(lynq_factory_buf);
-    }
-    pclose(fp);
-    return 0;
 }
 
 static void lynq_test_RGMII(void){
diff --git a/src/lynq/framework/lynq-atsvc/src/network.cpp b/src/lynq/framework/lynq-atsvc/src/network.cpp
old mode 100644
new mode 100755
index 639f4c6..9e0dc57
--- a/src/lynq/framework/lynq-atsvc/src/network.cpp
+++ b/src/lynq/framework/lynq-atsvc/src/network.cpp
@@ -345,6 +345,8 @@
     signal_strength_printf=atoi(argv[1]);
     printf("\nthe signal strength printf log will %s\n", signal_strength_printf == 0 ? "close" : "open");
     free(pRI);
+    /*lei add for bugfix of mtk*/
+    return 0;
 }
 //RIL_REQUEST_MODEM_POWEROFF
 int setModemPowerOFF (int argc, char **argv, RIL_SOCKET_ID socket_id, RequestInfo *pRI) {
diff --git a/src/lynq/framework/lynq-atsvc/src/powerManager.cpp b/src/lynq/framework/lynq-atsvc/src/powerManager.cpp
old mode 100644
new mode 100755
index efa8f6d..41effe2
--- a/src/lynq/framework/lynq-atsvc/src/powerManager.cpp
+++ b/src/lynq/framework/lynq-atsvc/src/powerManager.cpp
@@ -104,6 +104,8 @@
     }
     RLOGD("read_wakeup_reason is %s", buf);
     reason = buf;
+    /*lei add for bugfix of mtk*/
+    buf[49]='\0';
 fail:
     close(fd);
     return reason;
diff --git a/src/lynq/lib/liblynq-sim/Makefile b/src/lynq/lib/liblynq-sim/Makefile
index d01b9ca..f34e6b0 100755
--- a/src/lynq/lib/liblynq-sim/Makefile
+++ b/src/lynq/lib/liblynq-sim/Makefile
@@ -2,62 +2,85 @@
 RM = rm -f
 
 LOCAL_CFLAGS := -Wall \
+                -std=gnu++14 \
                 -g -Os \
                 -flto \
                 -fPIC \
-                -DRIL_SHLIB \
-                -DATCI_PARSE \
-                -DKEEP_ALIVE \
-                -DECALL_SUPPORT
+                -fpermissive \
 
+$(warning ################# C2K support: $(RAT_CONFIG_C2K_SUPPORT))
+ifeq ($(strip $(RAT_CONFIG_C2K_SUPPORT)), yes)
+    LOCAL_CFLAGS += -DC2K_SUPPORT
 
+endif
 
-$(warning ################# lynq network demo ROOT: $(ROOT),includedir:$(includedir))
+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))
 LOCAL_PATH   = .
 
 LOCAL_C_INCLUDES = \
   -I. \
-  -I$(LOCAL_PATH)/include/ \
+  -I$(LOCAL_PATH)/include \
+  -I$(ROOT)$(includedir)/vendor-ril \
   -I$(ROOT)$(includedir)/logger \
   -I$(ROOT)$(includedir)/liblog \
-  -I$(ROOT)$(includedir)/vendor-ril \
-  -I$(ROOT)$(includedir)/include \
-
 
 
 LOCAL_LIBS := \
     -L. \
     -ldl \
+	-lpthread \
+	-lbinder \
+	-lutils \
+	-lcutils \
     -llog \
-    -lbinder \
-    -lpthread \
     -llynq-log \
-    -lutils \
-    -lcutils \
 
-SOURCES = $(wildcard *.cpp  wildcard *.h src/*.cpp)
+SOURCES = $(wildcard *.c wildcard *.h src/*.cpp)
 
 EXECUTABLE = liblynq-sim.so
 
 OBJECTS=$(SOURCES:.c=.o)
-all: $(EXECUTABLE)
 
+
+.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 $<
+	$(CC) $(LOCAL_C_INCLUDES) $(LOCAL_CFLAGS) $(LOCAL_LIBS) -o $@ -c $< 
 
 build:  $(EXECUTABLE)
 	$(warning ########## build $(EXECUTABLE)  ##########)
 
 install:
-	$(warning ################# lynq network demo EXECUTABLE: $(EXECUTABLE),base:$(base_libdir))
 	mkdir -p $(ROOT)$(base_libdir)/
 	install $(EXECUTABLE) $(ROOT)$(base_libdir)/
 
 pack_rootfs:
-	$(warning ################# lynq network demo 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)
@@ -68,5 +91,3 @@
 .PHONY: clean
 clean:
 	$(RM) $(OBJECTS) $(EXECUTABLE)
-
-
diff --git a/src/lynq/lib/liblynq-sim/include/lynq_sim.h b/src/lynq/lib/liblynq-sim/include/lynq_sim.h
index 9b9593f..846a1ec 100755
--- a/src/lynq/lib/liblynq-sim/include/lynq_sim.h
+++ b/src/lynq/lib/liblynq-sim/include/lynq_sim.h
@@ -5,80 +5,51 @@
 #     Version: V1.0
 #     LastChange: 2020-07-29 
 #     History: 
-# If you need to use any API under lynq_sim, you must first call the init_sim() function to initialize these functions.
+# If you need to use any API under lynq_sim, you must first call the lynq_sim_init() function to initialize these functions.
 =============================================================================*/
 #ifndef __LYNQ_SIM__
 #define __LYNQ_SIM__
-#include <sys/types.h>
-#include <sys/socket.h>   
-#include <netinet/in.h>   
-#include <arpa/inet.h>
-#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>
-#define MAX_BUF 20
-#define MAX_NUM 80
 #ifdef __cplusplus
-
-#define RIL_REQUEST_GET_SIM_STATUS 1
-#define RIL_REQUEST_GET_IMSI 11
-#define RIL_REQUEST_QUERY_ICCID 2026
-#define RIL_REQUEST_SET_FACILITY_LOCK 43
-#define RIL_REQUEST_QUERY_FACILITY_LOCK 42
-#define RIL_REQUEST_ENTER_SIM_PIN 2
-#define RIL_REQUEST_ENTER_SIM_PUK 3
-#define RIL_REQUEST_CHANGE_SIM_PIN 6
-#define RIL_REQUEST_OEM_HOOK_RAW 59
-
-
 extern "C" {
 #endif
 
-
-#define MAX_LEN 1024*8
-
-typedef struct{
-    int uToken;
-    int request;
-    int paramLen;
-    char param[MAX_LEN];
-}lynq_client_t;
-
-typedef struct 
-{
-    char *MCCMCN;
-    char *buf;
-    char *MCN;
-}FindOperator;
-
-
-
-
-
-
 int lynq_get_sim_status(int *card_status);
 int lynq_get_imsi(char buf[]);
-
-/*add by lei*/
 int lynq_sim_init(int utoken);
 int lynq_sim_deinit(void);
-int lynq_enable_pin(char *pin);
-int lynq_disable_pin(char *pin);
-int lynq_query_operator(char buf[]);
+int lynq_enable_pin(char pin[]);
+int lynq_disable_pin(char pin[]);
 int lynq_get_iccid(char buf[]);
 int lynq_query_pin_lock(char *pin,int buf[]);
 int lynq_verify_pin(char *pin);
 int lynq_change_pin(char *old_pin, char *new_pin);
 int lynq_unlock_pin(char *puk, char *pin);
 int lynq_query_phone_number(char buf[]);
-/*add by lei*/
+int lynq_switch_card(int slot);
+int lynq_screen(int num);
+int lynq_get_imei(char buf[]);
+
+/**
+ * @brief                   Request SIM I/O operation.
+ *                          This is similar to the TS 27.007 "restricted SIM" operation
+ *                          where it assumes all of the EF selection will be done by the callee.
+ * @param  list             type: [IN] list[0]:one of the commands listed for TS 27.007 +CRSM.(command)
+ *                          type: [IN] list[1]:EF id(fileid)
+ *                          type: [IN] list[2]:offset(p1)
+ *                          type: [IN] list[3]:offset(p2)
+ *                          type: [IN] list[4]:response len,sometimes needn't care(p3)
+ * @param  path             type: [IN] "pathid" from TS 27.007 +CRSM command.
+                            type: [IN] Path is in hex asciii format eg "7f205f70"
+                            type: [IN] Path must always be provided.
+ * @param  data             type: [IN] May be NULL
+ * @param  pin2             type: [IN] May be NULL
+ * @param  aidPtr           type: [IN] AID value, See ETSI 102.221 8.1 and 101.220 4, NULL if no value.
+ * @param  sw               type: [OUT] 
+ * @param  simResponse      type: [OUT] response
+ * @return int
+ */
+int lynq_req_sim_io(int list[5], char *path, char *data, char *pin2, char *aidPtr, int sw[2], char *simResponse);
+
 
 
 #ifdef __cplusplus
diff --git a/src/lynq/lib/liblynq-sim/include/operator.h b/src/lynq/lib/liblynq-sim/include/operator.h
deleted file mode 100755
index 8001868..0000000
--- a/src/lynq/lib/liblynq-sim/include/operator.h
+++ /dev/null
@@ -1,32 +0,0 @@
-

-/*============================================================================= 

-**     FileName: command.h

-**     Desc: about operator

-**     Author: lei

-**     Version: V1.0

-**     LastChange: 2021-02-26 

-**     History: 

-=============================================================================*/

-

-{"45400",    "CSL",              "HK"  },

-{"45401",    "NEW WORLD",        "HK" },

-{"45402",    "CSL",              "HK"  },

-{"45404",    "Orange",           "HK" },

-{"45406",    "SMC",              "HK"  },

-{"45410",    "NEW WORLD",        "HK"  },

-{"45412",    "PEOPLES",          "HK"  },

-{"45416",    "SUNDAY",           "HK" },

-{"45418",    "HK TELECOM",       "HK"  },

-{"46000",    "CHINA MOBILE",     "CN"  },

-{"46001",    "CHN-CUGSM",        "CN"  },

-{"46002",    "CHINA MOBILE",     "CN"  },

-{"46003",    "CHINA TELECOM",    "CN"  },

-{"46601",    "Far EasTone",      "TW"  },

-{"46606",    "TUNTEX",           "TW" },

-{"46668",    "ACeS",             "TW" },

-{"46688",    "KGT",              "TW" }, 

-{"46692",    "Chunghwa",         "TW" }, 

-{"46693",    "MobiTai",          "TW" }, 

-{"46697",    "TWN GSM",          "TW" }, 

-{"46699",    "TransAsia",        "TW" }, 

-{(char *)NULL, (char *)NULL, (char *)NULL},
\ No newline at end of file
diff --git a/src/lynq/lib/liblynq-sim/src/lynq_sim.cpp b/src/lynq/lib/liblynq-sim/src/lynq_sim.cpp
index 1a1f38e..1c9e500 100755
--- a/src/lynq/lib/liblynq-sim/src/lynq_sim.cpp
+++ b/src/lynq/lib/liblynq-sim/src/lynq_sim.cpp
@@ -6,22 +6,49 @@
 #     LastChange: 2021-12-29 
 #     History: 
 =============================================================================*/
-#include <dlfcn.h>
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <arpa/inet.h>
 #include <string.h>
-#include <stdint.h>
 #include <unistd.h>
-#include <fcntl.h>
+#include <binder/Parcel.h>
+#include <log/log.h>
+#include <cutils/jstring.h>
+#include <pthread.h>
 #include "lynq_sim.h"
-
-#include <errno.h>
-
-
+#include <sys/socket.h>   
+#include <netinet/in.h>   
+#include <arpa/inet.h>
+#define MAX_BUF 20
+#define MAX_NUM 80
+#define RIL_REQUEST_GET_SIM_STATUS 1
+#define RIL_REQUEST_GET_IMSI 11
+#define RIL_REQUEST_QUERY_ICCID 2026
+#define RIL_REQUEST_SET_FACILITY_LOCK 43
+#define RIL_REQUEST_QUERY_FACILITY_LOCK 42
+#define RIL_REQUEST_ENTER_SIM_PIN 2
+#define RIL_REQUEST_ENTER_SIM_PUK 3
+#define RIL_REQUEST_CHANGE_SIM_PIN 6
+#define RIL_REQUEST_OEM_HOOK_RAW 59
+#define RIL_REQUEST_SCREEN_STATE 61
+#define RIL_REQUEST_SIM_IO 28
+#define LYNQ_REQUEST_SET_DEFAULT_SIM_ALL 8008
+#define MAX_LEN 1024*8
 #define MAX_NUM 10
-#define USER_LOG_TAG "LYNQ_SIM"
-
+#define LOG_TAG "LYNQ_SIM"
+#define FLAG_TESS 0
 using ::android::Parcel;
 #define DEST_PORT 8088
 #define DSET_IP_ADDRESS  "127.0.0.1"
+
+typedef struct{
+    int uToken;
+    int request;
+    int paramLen;
+    char param[MAX_LEN];
+}lynq_client_t;
+
 lynq_client_t client_t;
 /* socket文件描述符 */ 
 int len_addr_serv;
@@ -32,35 +59,35 @@
 int request = -1;
 int slot_id = -1;
 int error1 = -1;
+/**
+ * @brief mark call initialization state
+ * 0: deinit state
+ * 1: init state
+ */
+int g_lynq_sim_init_flag = 0;
 
-FindOperator findOperator[] = {
-#include "include/operator.h"
-};
-
-static FindOperator*find_ope_command (char *name,FindOperator *Class){
-    if(name == NULL || Class == NULL){
-        return ((FindOperator *)NULL);
-    }
-    register int i;
-    for (i = 0; Class[i].MCCMCN; i++)
-        if (strncmp (name, Class[i].MCCMCN, 5) == 0)
-            return (&Class[i]);
-    return ((FindOperator *)NULL);
-}
+/**
+ * @brief lynq_req_sim_io need to send request
+ */
+char data_buf[32] = {0};
+char pin2_buf[32] = {0};
+char aidPtr_buf[32] = {0};
 
 int lynq_sim_init(int utoken){
-    if(utoken < 0){
-        printf("init  err.");
+    if(g_lynq_sim_init_flag == 1)
+    {
+        RLOGD("lynq_sim_init  failed");
         return -1;
     }
-    // LYLOGSET(LOG_INFO);
-    // LYLOGEINIT(USER_LOG_TAG);
+    g_lynq_sim_init_flag = 1;
+    if(utoken < 0){
+        return -1;
+    }
     Global_uToken = utoken;
     sock_fd = socket(AF_INET, SOCK_DGRAM, 0);
 	if (-1 == sock_fd)
 	{
-		printf("socket open err.");
-		return -1;
+		return sock_fd;
 	}
     /* 设置address */  
     memset(&addr_serv, 0, sizeof(addr_serv));  
@@ -73,6 +100,12 @@
 }
 
 int lynq_sim_deinit(void){
+    if(g_lynq_sim_init_flag == 0)
+    {
+        RLOGD("lynq_sim_deinit  failed");
+        return -1;
+    }
+    g_lynq_sim_init_flag = 0;
     close(sock_fd);
     return 0;
 }
@@ -80,21 +113,12 @@
 static char * lynqStrdupReadString(Parcel &p) {
     size_t stringlen;
     const char16_t *s16;
+
     s16 = p.readString16Inplace(&stringlen);
     return strndup16to8(s16, stringlen);
 }
 
-static void delete_char(char str[],char target){
-	int i,j;
-	for(i=j=0;str[i]!='\0';i++){
-		if(str[i]!=target){
-			str[j++]=str[i];
-		}
-	}
-	str[j]='\0';
-}  
-
-/*If you need to use any API under lynq_sim, you mustfirst call the init_sim() function to initialize these functions.*/
+/*If you need to use any API under lynq_sim, you mustfirst call the lynq_sim_init() function to initialize these functions.*/
 int lynq_get_sim_status(int *card_status)
 {   
     int ret = -1;
@@ -111,21 +135,19 @@
     char res_data[MAX_LEN] = {0};
     int len1 = sizeof(client_t1.param);
     memset(client_t1.param, 0, sizeof(char)*MAX_LEN);
-    printf("client_t1 %d\n", sizeof(client_t1));
     send_num = sendto(sock_fd, &client_t1, sizeof(client_t1), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
     if(send_num < 0)  
     {  
-        perror("sendto error:");  
-        return ret;
+        RLOGD("sendto error:");  
+        return send_num;
     }
     //get data msg
     recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN, 0, (struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
     if(recv_num < 0 || recv_num == 0)
     {
-        perror("recvfrom step2 fail:");
-        return ret;
+        RLOGD("recvfrom step2 fail:");
+        return recv_num;
     }
-    printf("=====>resp data len<=====:%d,,,%d\n",recv_num,MAX_LEN);
     Parcel p;;
     p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
     p.setDataPosition(0);
@@ -139,7 +161,7 @@
     }
     return error1;
 }
-/*AT> AT+CIMI     AT< IMSI*/
+
 int lynq_get_imsi(char buf[])
 {   
     int ret = -1;
@@ -158,17 +180,16 @@
     send_num = sendto(sock_fd, &client_t1, sizeof(client_t1), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
     if(send_num < 0)  
     {  
-        perror("sendto error:");  
-        return ret;
+        RLOGD("sendto error:");  
+        return send_num;
     }
     //get data msg
     recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN,0,(struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
     if(recv_num < 0 || recv_num == 0)
     {
-        perror("recvfrom step2 fail:");
-        return -1;
+        RLOGD("recvfrom step2 fail:");
+        return recv_num;
     }
-    printf("=====>resp data len<=====:%d,,,%d\n",recv_num,MAX_LEN);
     Parcel p;
     p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
     p.setDataPosition(0);
@@ -182,7 +203,6 @@
             char * test = lynqStrdupReadString(p);
             memcpy(buf, test, strlen(test));
         }
-        printf("---->test<----resp_type=%d,request=%d,slot_id=%d,error=%d\n",resp_type,request,slot_id,error1);
     }
     return error1;
 }
@@ -205,17 +225,16 @@
     send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
     if(send_num < 0)  
     {  
-        perror("sendto error:");  
-        return ret;
+        RLOGD("sendto error:");  
+        return send_num;
     }
     //get data msg
     recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN,0,(struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
     if(recv_num < 0 || recv_num == 0)
     {
-        perror("recvfrom step2 fail:");
-        return -1;
+        RLOGD("recvfrom step2 fail:");
+        return recv_num;
     }
-    printf("=====>resp data len<=====:%d,,,%d\n",recv_num,MAX_LEN);
     Parcel p;
     p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
     p.setDataPosition(0);
@@ -229,7 +248,6 @@
             char * test = lynqStrdupReadString(p);
             memcpy(buf, test, strlen(test));
         }
-        printf("---->test<----resp_type=%d,request=%d,slot_id=%d,error=%d\n",resp_type,request,slot_id,error1);
     }
     return error1;
 }
@@ -238,6 +256,8 @@
     int ret = -1;
     if(pin == NULL)
         return ret;
+    if(!strlen(pin))
+        return ret;
     int send_num = 0;
     int recv_num = 0;  
     char res_data[MAX_LEN] = {0};
@@ -248,18 +268,17 @@
     send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
     if(send_num < 0)  
     {  
-        perror("sendto error:");  
-        return ret;
+        RLOGD("sendto error:");  
+        return send_num;
     }
 
     //get data msg
     recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN,0,(struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
     if(recv_num < 0 || recv_num == 0)
     {
-        perror("recvfrom step2 fail:");
-        return -1;
+        RLOGD("recvfrom step2 fail:");
+        return recv_num;
     }
-    printf("=====>resp data len<=====:%d,,,%d\n",recv_num,MAX_LEN);
     Parcel p;
     p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
     p.setDataPosition(0);
@@ -271,7 +290,6 @@
         p.readInt32(&error1);
     }
     return error1;
-  
 }
 
 int lynq_disable_pin(char *pin){
@@ -288,17 +306,16 @@
     send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
     if(send_num < 0)  
     {  
-        perror("sendto error:");  
-        return ret;
+        RLOGD("sendto error:");  
+        return send_num;
     }
     //get data msg
     recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN,0,(struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
     if(recv_num < 0 || recv_num == 0)
     {
-        perror("recvfrom step2 fail:");
-        return -1;
+        RLOGD("recvfrom step2 fail:");
+        return recv_num;
     }
-    printf("=====>resp data len<=====:%d,,,%d\n",recv_num,MAX_LEN);
     Parcel p;
     p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
     p.setDataPosition(0);
@@ -327,17 +344,16 @@
     send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
     if(send_num < 0)  
     {  
-        perror("sendto error:");  
-        return ret;
+        RLOGD("sendto error:");  
+        return send_num;
     }
     //get data msg
     recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN,0,(struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
     if(recv_num < 0 || recv_num == 0)
     {
-        perror("recvfrom step2 fail:");
-        return -1;
+        RLOGD("recvfrom step2 fail:");
+        return recv_num;
     }
-    printf("=====>resp data len<=====:%d,,,%d\n",recv_num,MAX_LEN);
     Parcel p;
     p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
     p.setDataPosition(0);
@@ -349,12 +365,14 @@
         p.readInt32(&slot_id);
         p.readInt32(&error1);
         p.readInt32(&num);
-        int *test = (int *)calloc(1, sizeof(int)*num);
-        for(int i =0; i <num; i++){
-            p.readInt32(&test[i]);
-            buf[i] = test[i];
+        if(num > 0){
+            int *test = (int *)calloc(1, sizeof(int)*num);
+            for(int i =0; i <num; i++){
+                p.readInt32(&test[i]);
+                buf[i] = test[i];
+            }
+            free(test);
         }
-        free(test);
     }
     return error1;
 }
@@ -374,17 +392,16 @@
     send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
     if(send_num < 0)  
     {  
-        perror("sendto error:");  
-        return ret;
+        RLOGD("sendto error:");  
+        return send_num;
     }
    //get data msg
     recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN,0,(struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
     if(recv_num < 0 || recv_num == 0)
     {
-        perror("recvfrom step2 fail:");
-        return -1;
+        RLOGD("recvfrom step2 fail:");
+        return recv_num;
     }
-    printf("=====>resp data len<=====:%d,,,%d\n",recv_num,MAX_LEN);
     Parcel p;
     p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
     p.setDataPosition(0);
@@ -402,6 +419,10 @@
     int ret = -1;
     if(old_pin == NULL || new_pin == NULL)
         return ret;
+    if(!strlen(new_pin))
+        return ret;
+    if(!strlen(old_pin))
+        return ret;
     int send_num = 0;
     int recv_num = 0;
     char res_data[MAX_LEN] = {0};
@@ -413,17 +434,16 @@
     send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
     if(send_num < 0)  
     {  
-        perror("sendto error:");  
-        return ret;
+        RLOGD("sendto error:");  
+        return send_num;
     }
     //get data msg
     recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN,0,(struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
     if(recv_num < 0 || recv_num == 0)
     {
-        perror("recvfrom step2 fail:");
-        return -1;
+        RLOGD("recvfrom step2 fail:");
+        return recv_num;
     }
-    printf("=====>resp data len<=====:%d,,,%d\n",recv_num,MAX_LEN);
     Parcel p;
     p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
     p.setDataPosition(0);
@@ -452,17 +472,16 @@
     send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
     if(send_num < 0)  
     {  
-        perror("sendto error:");  
-        return ret;
+        RLOGD("sendto error:");  
+        return send_num;
     }
     //get data msg
     recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN,0,(struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
     if(recv_num < 0 || recv_num == 0)
     {
-        perror("recvfrom step2 fail:");
-        return -1;
+        RLOGD("recvfrom step2 fail:");
+        return recv_num;
     }
-    printf("=====>resp data len<=====:%d,,,%d\n",recv_num,MAX_LEN);
     Parcel p;
     p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
     p.setDataPosition(0);
@@ -476,9 +495,21 @@
     return error1;
 }
 
+static void delete_char(char str[],char target){
+    if(str == NULL){
+        return;
+    }
+    int i,j;
+    for(i=j=0;str[i]!='\0';i++){
+        if(str[i]!=target){
+            str[j++]=str[i];
+        }
+    }
+    str[j]='\0';
+} 
+
 static int parse_param(char *cmd, char **argv, char buf[]){
     if(cmd == NULL || argv == NULL || buf == NULL){
-        printf("input error");
         return 0;
     }
     if(strstr(cmd,"ERROR")){
@@ -505,13 +536,6 @@
             buf[lengh] = '\0';
             delete_char(buf, '"');
         }
-        else{
-            const char *warning = "9001";
-            int len = strlen(warning);
-            memcpy(buf, warning, len);
-            buf[len] = '\0';
-        }
-        
     }
     return 0;
 }
@@ -531,17 +555,16 @@
     send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
     if(send_num < 0)  
     {  
-        perror("sendto error:");  
+        RLOGD("sendto error:");  
         return ret;
     }
      //get data msg
     recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN,0,(struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
     if(recv_num < 0 || recv_num == 0)
     {
-        perror("recvfrom step2 fail:");
-        return -1;
+        RLOGD("recvfrom step2 fail:");
+        return recv_num;
     }
-    printf("=====>resp data len<=====:%d,,,%d\n",recv_num,MAX_LEN);
     Parcel p;
     p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
     p.setDataPosition(0);
@@ -556,7 +579,6 @@
         p.readInt32(&error1);
         p.readInt32(&num);
         if(num == -1){
-            memcpy(buf, "-1", 2);
         }else{
             p.read(test, num);
             parse_param(test, argv, buf);
@@ -565,6 +587,216 @@
     return error1;
 }
 
+int lynq_get_imei(char buf[]){
+    int ret = -1;
+    if(buf == NULL)
+        return ret;
+    int send_num = 0;
+    int recv_num = 0;
+    int len = 0;
+    char res_data[MAX_LEN] = {0};
+    client_t.request = RIL_REQUEST_OEM_HOOK_RAW;
+    client_t.paramLen = 1;
+    client_t.uToken = Global_uToken;
+    sprintf(client_t.param, "%s\n", "AT+CGSN");
+    send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
+    if(send_num < 0)  
+    {  
+        RLOGD("sendto error:");  
+        return ret;
+    }
+     //get data msg
+    recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN,0,(struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
+    if(recv_num < 0 || recv_num == 0)
+    {
+        RLOGD("recvfrom step2 fail:");
+        return recv_num;
+    }
+    Parcel p;
+    p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
+    p.setDataPosition(0);
+    int num = -1;
+    if(p.dataAvail() > 0)
+    {   
+        char test[30] = {0};
+        char *argv[5] = {0};
+        p.readInt32(&resp_type);
+        p.readInt32(&request);
+        p.readInt32(&slot_id);
+        p.readInt32(&error1);
+        p.readInt32(&num);
+        if(num == -1){
+        }else{
+            p.read(buf, num);
+        }
+    }
+    return error1;
+}
+
+static int judge(int slot){
+    switch(slot){
+        case 0:
+            return -1;
+        case 1:
+            return -1;
+    }
+    return 0;
+}
+
+int lynq_switch_card(int slot){
+    int ret = -1;
+    if(!judge(slot))
+        return ret;
+    int send_num = 0;
+    char res_data[MAX_LEN] = {0};
+    int len = 0; 
+    client_t.request = LYNQ_REQUEST_SET_DEFAULT_SIM_ALL;
+    client_t.paramLen = 1;
+    client_t.uToken = Global_uToken;
+    sprintf(client_t.param, "%d\n", slot);
+    send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
+    if(send_num < 0)  
+    {  
+        RLOGD("sendto error:");  
+        return send_num;
+    }
+    return 0;
+}
+
+int lynq_screen(int num){
+    int ret = -1;
+    if(!judge(num))
+        return ret;
+    int send_num = 0;
+    char res_data[MAX_LEN] = {0};
+    int len = 0;
+    client_t.request = RIL_REQUEST_SCREEN_STATE;
+    client_t.paramLen = 1;
+    client_t.uToken = Global_uToken;
+    sprintf(client_t.param, "%d\n", num);
+    send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
+    if(send_num < 0)
+    {
+        RLOGD("sendto error:");
+        return send_num;
+    }
+    return 0;
+}
+
+/**
+ * @brief                   Check whether the input is valid  for lynq_req_sim_io api
+ * @param  list             type: [IN] list[0]:one of the commands listed for TS 27.007 +CRSM.(command)
+ *                          type: [IN] list[1]:EF id(fileid)
+ *                          type: [IN] list[2]:offset(p1)
+ *                          type: [IN] list[3]:offset(p2)
+ *                          type: [IN] list[4]:response len,sometimes needn't care(p3)
+ * @param  path             type: [IN] "pathid" from TS 27.007 +CRSM command.
+                            type: [IN] Path is in hex asciii format eg "7f205f70"
+                            type: [IN] Path must always be provided.
+ * @param  data             type: [IN] May be NULL
+ * @param  pin2             type: [IN] May be NULL
+ * @param  aidPtr           type: [IN] AID value, See ETSI 102.221 8.1 and 101.220 4, NULL if no value.
+ * @param  sw               type: [OUT] 
+ * @param  simResponse      type: [OUT] response
+ * @return int
+ */
+static int judge_illegal(int list[5], char *path, char *data, char *pin2, char *aidPtr, int sw[2], char *simResponse)
+{
+    if(list == NULL)
+    {
+        return -1;
+    }
+    if(path == NULL)
+    {
+        return -1;
+    }
+    if(sw == NULL){
+        return -1;
+    }
+    if(simResponse == NULL){
+        return -1;
+    }
+    if(data == NULL)
+    {
+        memcpy(data_buf, "null", 4);
+    }
+    else
+    {
+        bzero(data_buf,32);
+        memcpy(data_buf, data, strlen(data));
+    }
+    if(pin2 == NULL)
+    {
+        memcpy(pin2_buf, "null", 4);
+    }
+    else
+    {
+        bzero(pin2_buf,32);
+        memcpy(pin2_buf, data, strlen(data));
+    }
+    if(aidPtr == NULL)
+    {
+        memcpy(aidPtr_buf, "null", 4);
+    }
+    else
+    {
+        bzero(aidPtr_buf,32);
+        memcpy(aidPtr_buf, data, strlen(data));
+    }
+    return 0;
+}
+
+int lynq_req_sim_io(int list[5], char *path, char *data, char *pin2, char *aidPtr, int sw[2], char *simResponse)
+{   
+    int ret = -1;
+    if(judge_illegal(list, path, data, pin2, aidPtr, sw, simResponse))
+    {
+        return ret;
+    }
+    int send_num = 0;
+    int recv_num = 0;
+    char res_data[MAX_LEN] = {0};
+    int len = 0;
+    client_t.request = RIL_REQUEST_SIM_IO;
+    client_t.paramLen = 9;
+    client_t.uToken = Global_uToken;
+    sprintf(client_t.param, "%d %d %s %d %d %d %s %s %s\n", list[0], list[1], path, list[2], list[3], list[4], data_buf, pin2_buf, aidPtr_buf);
+    send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
+    if(send_num < 0)
+    {
+        RLOGD("sendto error:");
+        return send_num;
+    }
+    recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN,0,(struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
+    if(recv_num < 0 || recv_num == 0)
+    {
+        RLOGD("recvfrom step2 fail:");
+        return recv_num;
+    }
+    Parcel p;
+    p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
+    p.setDataPosition(0);
+    int num = -1;
+    if(p.dataAvail() > 0)
+    {   
+        char test[30] = {0};
+        char *argv[5] = {0};
+        p.readInt32(&resp_type);
+        p.readInt32(&request);
+        p.readInt32(&slot_id);
+        p.readInt32(&error1);
+        if(!error1)
+        {
+            p.readInt32(&sw[0]);
+            p.readInt32(&sw[1]);
+            char * test = lynqStrdupReadString(p);
+            memcpy(simResponse, test, strlen(test));
+        }
+
+    }
+    return error1;
+}
+#if FLAG_TESS
 int lynq_query_operator(char buf[]){
     int32_t token = -1;
     if(buf == NULL)
@@ -595,8 +827,19 @@
         return token;
     }
 }
+FindOperator findOperator[] = {
+#include "operator.h"
+};
 
+static FindOperator*find_ope_command (char *name,FindOperator *Class){
+    if(name == NULL || Class == NULL){
+        return ((FindOperator *)NULL);
+    }
+    register int i;
+    for (i = 0; Class[i].MCCMCN; i++)
+        if (strncmp (name, Class[i].MCCMCN, 5) == 0)
+            return (&Class[i]);
+    return ((FindOperator *)NULL);
+}
 
-
-
-
+#endif
diff --git a/src/lynq/packages/apps/lynq-low-power/src/main.cpp b/src/lynq/packages/apps/lynq-low-power/src/main.cpp
new file mode 100755
index 0000000..c2822aa
--- /dev/null
+++ b/src/lynq/packages/apps/lynq-low-power/src/main.cpp
@@ -0,0 +1,55 @@
+#include <stdio.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <pthread.h>
+#include <include/lynq_sim.h>
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*Quick accept array*/
+void * thread_test(void * arg)
+{
+    FILE *fp;
+    char buf[1024*3] = {0};
+    sprintf(buf, "echo 11 | emdlogger_ctrl 2>&1");
+    fp=popen(buf, "r");
+    if(!fp){
+        perror("popen:");
+    }
+    while(fgets(buf, 4072, fp) != NULL){}
+    pclose(fp);
+    return 0;
+}
+
+int main(void){
+    lynq_sim_init(2022);
+    pthread_t thid = -1;
+    int ret = pthread_create(&thid, NULL, thread_test, NULL);
+    if(ret != 0){
+        printf("pthread_create error!!!");
+        return ret;
+    }
+    system("mdlogctl stop");
+    system("echo mem > /sys/power/autosleep");
+    system("echo 0 > /dev/wmtWifi");
+    system("echo 7 9 0 > /proc/driver/wmt_dbg");
+    /*Notify the modem to disable some URC reporting */
+    ret = lynq_screen(0);
+    printf("ret %d\n", ret);
+    /*Notify the modem to disable some URC reporting */
+    system("disown -a");
+    if(thid == -1)
+    {
+        return -1;
+    }
+    ret = pthread_join(thid,NULL);
+    if(ret != 0){
+        printf("pthread_join error!!!");
+        return ret;
+    }
+    return 0;
+}
+#ifdef __cplusplus
+}
+#endif 
\ No newline at end of file
diff --git a/src/lynq/packages/apps/lynq-low-power/src/makefile b/src/lynq/packages/apps/lynq-low-power/src/makefile
new file mode 100755
index 0000000..44a4021
--- /dev/null
+++ b/src/lynq/packages/apps/lynq-low-power/src/makefile
@@ -0,0 +1,85 @@
+SHELL = /bin/sh
+RM = rm -f
+
+LOCAL_CFLAGS := -Wall \
+                -g -Os \
+                -flto \
+                -DRIL_SHLIB \
+                -DATCI_PARSE \
+                -DKEEP_ALIVE \
+                -D__LINUX_OS__ \
+                -DECALL_SUPPORT
+
+$(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
+
+
+LOCAL_PATH   = .
+#CFLAGS = $(LOCAL_CFLAGS) -std=c99 
+#CXXFLAGS = $(LOCAL_CFLAGS) -std=gnu++14
+$(warning ################# ZHOUQUNCHAO ROOT: $(ROOT),includedir:$(includedir),LOCAL_PATH:$(LOCAL_PATH))
+LOCAL_C_INCLUDES = \
+  -I. \
+  -I$(LOCAL_PATH) \
+  -I$(ROOT)$(includedir)/ \
+  -I$(ROOT)$(includedir)/include  \
+  -DLIB_GNSS_HAL_DIR='"$(libdir)"'
+
+LOCAL_C_INCLUDES+=$(DNS_FLAGS)
+
+LOCAL_LIBS := \
+    -L. \
+    -ldl \
+    -lstdc++ \
+    -llog \
+    -lcutils \
+    -lutils \
+    -lbinder \
+    -llynq-log \
+    -lpthread \
+    -llynq-sim \
+
+LOCAL_SRC_FILES_CPP = $(wildcard *.cpp gpio/*.cpp ril/*.cpp)
+LOCAL_SRC_FILES_C = $(wildcard *.c gps/*.c)
+EXECUTABLE = lynq-low-power
+
+OBJECTS=$(LOCAL_SRC_FILES_CPP:.cpp=.o) $(LOCAL_SRC_FILES_C:.c=.o)
+all: $(EXECUTABLE)
+
+$(EXECUTABLE): $(OBJECTS)
+	$(CXX) $(OBJECTS) $(LOCAL_LIBS) $(LOCAL_CFLAGS) $(LOCAL_C_INCLUDES) -o $@
+
+%.o: %.c
+	$(warning ----->build $<)
+	$(CC) $(LOCAL_C_INCLUDES) $(LOCAL_CFLAGS) $(LOCAL_LIBS) -o $@ -c $<
+%.o : %.cpp
+	$(CXX) $(LOCAL_C_INCLUDES) $(LOCAL_CFLAGS) $(LOCAL_LIBS) -o $@ -c $<
+
+.PHONY: clean
+clean:
+	$(RM) $(OBJECTS) $(EXECUTABLE)