Merge "[feature]lynq-low-power" into SZZT
diff --git a/meta/meta-mediatek-mt2731/conf/machine/auto2731evb-ivt-main.conf b/meta/meta-mediatek-mt2731/conf/machine/auto2731evb-ivt-main.conf
index a07985b..6f43cbc 100755
--- a/meta/meta-mediatek-mt2731/conf/machine/auto2731evb-ivt-main.conf
+++ b/meta/meta-mediatek-mt2731/conf/machine/auto2731evb-ivt-main.conf
@@ -15,7 +15,7 @@
 DEFAULTTUNE_virtclass-multilib-lib64 = "aarch64"
 
 #LYNQ
-LYNQ_SW_VERSION = "T103R4_SZZT_v02.MP2_MR2.b02"
+LYNQ_SW_VERSION = "T103R4_SZZT_v02.MP2_MR2.b02.01"
 SMS_INDEX = "0"
 SMS_FLAG = "0"
 # lynq
diff --git a/meta/meta-mediatek-mt2731/conf/machine/auto2731evb-ivt-main.conf.bak b/meta/meta-mediatek-mt2731/conf/machine/auto2731evb-ivt-main.conf.bak
new file mode 100755
index 0000000..8aee8e1
--- /dev/null
+++ b/meta/meta-mediatek-mt2731/conf/machine/auto2731evb-ivt-main.conf.bak
@@ -0,0 +1,202 @@
+#@TYPE: Machine
+#@NAME:MT2731
+#@DESCRIPTION: Machine configuration for mt2731 32bit
+
+DEFAULTTUNE ?= "cortexa7hf-neon-vfpv4"
+include ${TOPDIR}/../meta/meta-mediatek/conf/machine/arch-arm64-tune-cortexa7-multilib.inc
+
+#Customer Feature Options
+include ${TOPDIR}/../meta/meta-mediatek-ivt/recipes-yummy/features/customer_feature_option.inc
+#Internal Feature Options
+include ${TOPDIR}/../meta/meta-mediatek-ivt/recipes-yummy/features/internal_feature_option.inc
+
+require conf/multilib.conf
+MULTILIBS = "multilib:lib64"
+DEFAULTTUNE_virtclass-multilib-lib64 = "aarch64"
+
+#LYNQ
+LYNQ_SW_VERSION = "T103R4_Hv02.MP2_MR2.V04"
+SMS_INDEX = "0"
+SMS_FLAG = "0"
+# lynq
+YK_SRC = "${TOPDIR}/../src/lynq"
+# Project
+MTK_PROJECT = "mt2731evb-ivt-main"
+TARGET_PLATFORM = "mt2731"
+PROJ = "mt6735_mifi"
+PRJ_FILENAME = "MT2731_IVT_DSDS"
+#LINUX_KERNEL = "linux-4.9.77"
+#KERNELDIR = "../kernel/linux/v4.9"
+LINUX_KERNEL = "linux-3.18.19"
+KERNELDIR = "../kernel/linux/v3.18"
+COMPLIST = "${LINUX_KERNEL}"
+EXTERNALSRC_SYMLINKS = ""
+INHERIT += "packagebbclassappend"
+
+# BACH
+BACH_SRC = "${TOPDIR}/../src/bach/build.bach/work"
+BACH_PREBUILT = "${TOPDIR}/../prebuilt/bach/build.bach/work"
+BACH_PREFIX = "${STAGING_INCDIR}/install"
+
+# Telephony
+TELEPHONY_SRC = "${TOPDIR}/../src/telephony"
+TELEPHONY_PREBUILT = "${TOPDIR}/../prebuilt/telephony"
+
+# Modem
+MODEM_SRC = "${TOPDIR}/../src/modem"
+MODEM_PREBUILT = "${TOPDIR}/../prebuilt/modem"
+
+# Telephony/Modem Feature Options
+# [S] ss / dsss / dsds; [N] dsda / tsts / qsqs
+MTK_MULTI_SIM_SUPPORT = "dsds"
+# [S] C/Lf/Lt/W/T/G, Lf/Lt/W/T/G, Lf/Lt/W/G; [N] Lf/Lt/T/G, W/T/G, W/G, T/G, G
+MTK_PROTOCOL1_RAT_CONFIG = "C/Lf/Lt/W/T/G"
+MTK_PROTOCOL2_RAT_CONFIG = "L/W/G"
+#MTK_PROTOCOL3_RAT_CONFIG = "G"
+# yes / no
+RAT_CONFIG_C2K_SUPPORT = "yes"
+SINGLE_BIN_MODEM_SUPPORT = "yes"
+
+# secure boot
+SECURE_BOOT_ENABLE ?= "yes"  
+SECURE_BOOT_TYPE = "avb"
+MTK_KEY_DIR = "${TOPDIR}/../meta/meta-mediatek/conf/machine/keys"
+SBC_RSA_ALGO = "rsa2048"
+SBC_HASH_ALGO = "sha256"
+IMAGE_HASH_ALGO = "sha256"
+SBC_KEY = "sbc_key"
+SBC_KEY_RSA3072 = "sbc_key_3072"
+SBC_KEY_RSA4096 = "sbc_key_4096"
+#VERIFIED_KEY = "verified_key"
+VB_HASH_ALGO = "sha256"
+VB_RSA_ALGO = "rsa2048"
+VERIFIED_KEY = "verified_${VB_RSA_ALGO}_key"
+MTEE_KEY = "mtee_key"
+
+MD_VERIFY = "no"
+
+# Preloader
+PRELOADER_PROJECT = "${MTK_PROJECT}"
+
+# AB update
+AB_OTA_UPDATER = "yes"
+AB_OTA_PARTITIONS = "boot system bl2 bl33 md1img tee vbmeta"
+# LK
+LK_PROJECT = "auto2731evb-ivt-mcp_nand"
+BOOTDEV_TYPE = "nand"
+TARGET_CFLAGS += "-DMTK_BOOTDEV_TYPE=1 -Os"
+NAND_TYPE = "mcp_nand"
+#nand name should be the same with the one in nand-utils/nand_device_list.txt
+#tianyan@2021.09.17 modify for nand+dram start
+NAND_CHIP_NAME = "MT29F4G08ABBFAH"
+#tianyan@2021.09.17 modify for nand+dram end
+#nand brom header version:
+#        1.0 or null: header sytle from Tablet SOC, which is independent of PMBR
+#        2.0: header sytle from mt2712, which is designed for GPT, and is part of PMBR
+NAND_HEADER_VERSION = "3.0"
+FIT_LK_IMAGE = "yes"
+LK_LOAD_OFFSET = "0x1000"
+LK_LOADADDRESS = "0x201000"
+LK_ENTRYPOINT = "0x201000"
+LK_MAX_SIZE = "0x3c000"
+
+# BL33
+BL33_PROJECT = "auto2731evb-ivt-mcp_nand-bl33"
+BL33_LOAD_OFFSET = "0x0"
+BL33_LOADADDRESS = "0x42110000"
+BL33_ENTRYPOINT = "0x42110000"
+BL33_COMPRESS = "none"
+BL33_MAX_SIZE = "0xfd000"
+
+# SPMFW
+SPMFW_IMAGETYPE = "fitImage"
+SPMFW_LOADADDRESS = "0x42100000"
+SPMFW_ENTRYPOINT = "0x42100000"
+SPMFW_COMPRESS = "lz4"
+
+# Trustzone
+TZ_PROJECT = "${MTK_PROJECT}"
+TZ_PLATFORM = "${TARGET_PLATFORM}"
+ATF_SUPPORT = "yes"
+PREFERRED_VERSION_atf = "1.6"
+ATF_INSTALL_MODE = "debug"
+MTK_MACH_TYPE = "mt2731"
+TRUSTZONE_HEADER = "fit"
+TRUSTZONE_ENTRYPOINT = "0x43001000"
+TRUSTZONE_LOADADDRESS = "0x43001000"
+TRUSTZONE_COMPRESS = "none"
+TEE_SUPPORT = "none"
+
+# Kernel
+KERNEL_ARCH = "arm"
+PREFERRED_PROVIDER_virtual/kernel = "linux-mtk-extension"
+PREFERRED_VERSION_linux-mtk-extension ?= "4.14%"
+KERNEL_IMAGETYPE = "fitImage"
+KERNEL_CONFIG = "auto2731evb_ivt_mcp_lp2_nand"
+KBUILD_DEFCONFIG = "${KERNEL_CONFIG}_defconfig"
+DTB_LOADADDRESS = "0x43e30000"
+KERNEL_OUT_DIR = "${BASE_WORKDIR}/${MACHINE_ARCH}-poky-linux-gnueabi/${PREFERRED_PROVIDER_virtual/kernel}/4.14-r0/${PREFERRED_PROVIDER_virtual/kernel}-4.14"
+KERNEL_SRC_DIR = "${KERNEL_OUT_DIR}/source"
+KERNEL_COMPRESS = "lz4"
+KERNEL_DEVICETREE = "auto2731evb-ivt-mcp_lp2_nand.dtb"
+RECOVERY_KERNEL_DEVICETREE = "auto2731evb-ivt-mcp_lp2_nand.dtb"
+# GLIBC version control
+OLDEST_KERNEL_EXTRA ?= "3.18"
+OLDEST_KERNEL = "${OLDEST_KERNEL_EXTRA}"
+MACHINE_ESSENTIAL_EXTRA_RRECOMMENDS += "kernel-modules"
+
+# LOADER ENTRYPOINT, LOADADDRESS
+UBOOT_ENTRYPOINT = "0x40008000"
+UBOOT_LOADADDRESS = "0x40008000"
+
+#tianyan@2021.09.17 modify for nand+dram start
+# Scatter File
+SCATTER_PROJECT = "auto2731-ivt-mcp_nand_lp4"
+#tianyan@2021.09.17 modify for nand+dram end
+
+# Image FS
+IMAGE_FSTYPES ?= "squashfs"
+IMAGE_ROOTFS_ALIGNMENT = "4"
+EXTRA_IMAGEDEPENDS += "lib64-bl33 lk lib64-trustzone scatter spmfw flashtool mdcert"
+SERIAL_CONSOLES = "921600;ttyGS1"
+
+#tianyan@2021.09.17 modify for nand+dram start
+#UBI/UBIFS ARGS
+MKUBIFS_ARGS = "-m 4096 -e 253952 -c 1400 -F"
+UBINIZE_ARGS = "-m 4096 -p 256KiB -O 4096"
+
+MKUBIFS_CONFIG_ARGS = "-m 4096 -e 253952 -c 22 -F"
+#tianyan@2021.09.17 modify for nand+dram end
+
+# Build Load Type
+BUILD_LOAD_TYPE ?= "eng"
+
+# DRAM TYPE
+MTK_DRAM_TYPE = "LP2"
+
+#anw soft
+ANW_SUPPORT = "NO"
+
+# PMIC chip type
+MTK_PMIC_CHIP_TYPE = "MT6389"
+
+# USB 3.1/PCIe
+#MTK_USB_OR_PCIE = "PCIe"
+MTK_USB_OR_PCIE = "USB"
+
+DEBUG_SUPPORT = "yes"
+
+# GNSS
+MTK_GNSS_CHIP_TYPE = "MT6630"
+
+# For AEE Kernel Config
+KERNEL_AEE_CFG = "${@bb.utils.contains('DEBUG_SUPPORT', 'yes', 'yes', 'no', d)}"
+# For AEE LK Config
+MTK_KEDUMP_MINI_SUPPORT = "${@bb.utils.contains('DEBUG_SUPPORT', 'yes', 'yes', 'no', d)}"
+MTK_MRDUMP_SUPPORT = "${@bb.utils.contains('DEBUG_SUPPORT', 'yes', 'no', 'no', d)}"
+MTK_BOOT_REASON_SUPPORT = "${@bb.utils.contains('DEBUG_SUPPORT', 'yes', 'yes', 'no', d)}"
+# For AEE Native Service Config
+MTK_AEE_SUPPORT = "${@bb.utils.contains('DEBUG_SUPPORT', 'yes', 'yes', 'no', d)}"
+
+#COMBO CHIP
+COMBO_CHIP_ID="mt6630"
\ No newline at end of file
diff --git a/meta/meta-mediatek-mt2731/recipes-lynq/liblynq-gnss/liblynq-gnss.bb b/meta/meta-mediatek-mt2731/recipes-lynq/liblynq-gnss/liblynq-gnss.bb
new file mode 100755
index 0000000..e0b5b37
--- /dev/null
+++ b/meta/meta-mediatek-mt2731/recipes-lynq/liblynq-gnss/liblynq-gnss.bb
@@ -0,0 +1,65 @@
+inherit externalsrc package

+

+DESCRIPTION = "liblynq conti plugin so"

+SECTION = "base"

+LICENSE = "MediaTekProprietary"

+#LIC_FILES_CHKSUM = "file://LICENSE;md5=e1696b147d49d491bcb4da1a57173fff"

+inherit workonsrc

+DEPENDS += "platform-libs gpshal openssl curl liblynq-log"

+WORKONSRC = "${TOPDIR}/../src/lynq/lib/liblynq-gnss/"

+

+TARGET_CC_ARCH += "${LDFLAGS}"

+BB_INCLUDE_ADD = "--sysroot=${STAGING_DIR_HOST}"

+BB_LDFLAGS_ADD = "--sysroot=${STAGING_DIR_HOST} -Wl,--hash-style=gnu"

+#Parameters passed to do_compile()

+EXTRA_OEMAKE = "'RAT_CONFIG_C2K_SUPPORT = ${RAT_CONFIG_C2K_SUPPORT}'\

+                'MTK_MULTI_SIM_SUPPORT = ${MTK_MULTI_SIM_SUPPORT}'\

+                'TARGET_PLATFORM = ${TARGET_PLATFORM}'"

+

+

+FILES_${PN} = "${base_libdir}/*.so \

+               ${base_bindir}\

+               ${base_sbindir} \

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

+

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

+                   ${includedir}"

+

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

+

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

+                  ${base_libdir}/.debug \

+                  ${base_sbindir}/.debug"

+

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

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

+

+

+#INHIBIT_PACKAGE_STRIP = "1"

+do_compile () {

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

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

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

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

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

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

+	else

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

+	fi

+}

+

+do_install () {

+    oe_runmake install ROOT=${D}

+

+    

+

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

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

+        cp -arf ${S}/include/ ${D}${includedir}/

+    fi

+}

+

+addtask bachclean

+do_bachclean () {

+    oe_runmake clean

+}
\ No newline at end of file
diff --git a/meta/meta-mediatek-mt2731/recipes-lynq/lynq-gnss-test/lynq-gnss-test.bb b/meta/meta-mediatek-mt2731/recipes-lynq/lynq-gnss-test/lynq-gnss-test.bb
new file mode 100755
index 0000000..8513677
--- /dev/null
+++ b/meta/meta-mediatek-mt2731/recipes-lynq/lynq-gnss-test/lynq-gnss-test.bb
@@ -0,0 +1,30 @@
+inherit externalsrc package

+

+DESCRIPTION = "gnss test"

+LICENSE = "MediaTekProprietary"

+#LIC_FILES_CHKSUM = "file://LICENSE;md5=e1696b147d49d491bcb4da1a57173fff"

+DEPENDS += "platform-libs gpshal liblynq-log openssl curl liblynq-gnss"

+inherit workonsrc

+WORKONSRC = "${TOPDIR}/../src/lynq/packages/apps/lynq-gnss-test"

+

+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 0777 ${S}/lynq-gnss-test ${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 f20ac38..2d0cdbc 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
@@ -18,10 +18,12 @@
 	liblynq-sim \
 	liblynq-data \
 	liblynq-call \
+    liblynq-gnss \
 	logrotate \
 	lynq-logrotate-service \
 	lynq-konoda-rock \
     lynq-atsvc \
     lynq-low-power \
     liblynq-logdata-handle \
+    lynq-gnss-test \
 "
diff --git a/meta/meta-mediatek/recipes-connectivity/mnld/gpshal.bb b/meta/meta-mediatek/recipes-connectivity/mnld/gpshal.bb
old mode 100644
new mode 100755
index be0e9c4..ad18054
--- a/meta/meta-mediatek/recipes-connectivity/mnld/gpshal.bb
+++ b/meta/meta-mediatek/recipes-connectivity/mnld/gpshal.bb
@@ -19,6 +19,7 @@
 
 do_install_append() {
     install -d ${D}${libdir}
+	cp -arf ${S}/inc/ ${D}${includedir}/
 }
 
 INSANE_SKIP_${PN} += "already-stripped"
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 56b4128..9d033cd 100755
--- a/src/lynq/framework/lynq-atsvc/src/factory/lynq_factory.cpp
+++ b/src/lynq/framework/lynq-atsvc/src/factory/lynq_factory.cpp
@@ -56,11 +56,12 @@
     getIccCardStatus(RIL_REQUEST_GET_SIM_STATUS,argv,(RIL_SOCKET_ID)id,pRI);
 }
 void *thread_test(void *arg){
-    lynq_factory_response_ttyGS3("GPS OPNE\n");
-    #if 0
+    lynq_factory_response_ttyGS3("+GPS OPEN:OK\n");
+
+    #if 1
     FILE *fp;
     char test[100] = {0};
-    sprintf(test, "mnld_test start & %s", "2>&1");
+    sprintf(test, "lynq-gnss-test & %s", "2>&1");
     char lynq_factory_buf[1024] = {0};
     fp=popen(test, "r");
     if(NULL == fp){
@@ -83,8 +84,10 @@
     }
     pclose(fp);
     #endif
+    #if 0
     system("echo \"debug.dbg2file=1\">>/usr/share/gps/mnl.prop");
     system("mnld_test start &");
+    #endif
     return 0;
 }
 
@@ -183,26 +186,13 @@
     return;
 }
 
-static void lynq_gps_close(void){
-    #if 0
-    enable_nema = 0;
-    sustain = 1;
-    int res = -1;
-    res = pthread_cancel(lynq_gps_tid);
-    if(res){
-        lynq_factory_response_ttyGS3("pthread cancel fail\n");
-        return;
-    }
-    pthread_join(lynq_gps_tid,NULL);
-    int ret = system("killall mnld_test");
+static void lynq_gps_enable(void){
+    #if 1
+    enable_nema = 1;
     already_gps = 0;
-    if(!ret){
-        lynq_factory_response_ttyGS3("GPS CLOSE SUCCESS\n");
-    }
-    else{
-        lynq_factory_response_ttyGS3("GPS CLOSE Failed\n");
-    }
+    lynq_factory_response_ttyGS3("+GPS ENABLE:OK\n");
     #endif
+    #if 0
     system("killall mnld_test");
     FILE *fp;
     char test[100] = {0};
@@ -223,6 +213,7 @@
         }
     }
     pclose(fp);
+    #endif
     return;
 }
 
@@ -288,6 +279,7 @@
     {
         lynq_factory_response_ttyGS3(lynq_factory_buf);
     }
+    lynq_factory_response_ttyGS3("+WIFI ENABLE:OK");
     pclose(fp);
     return;
 }
@@ -588,8 +580,8 @@
     else if(!strcmp(argv[3], "gps")){
         lynq_gps_open();
     }
-    else if(!strcmp(argv[3], "gps_close")){
-        lynq_gps_close();
+    else if(!strcmp(argv[3], "gps_enable")){
+        lynq_gps_enable();
     }
     #if 0
     else if(!strcmp(argv[3], "gpsinfo")){
diff --git a/src/lynq/lib/liblynq-gnss/include/lynq_gnss.h b/src/lynq/lib/liblynq-gnss/include/lynq_gnss.h
new file mode 100755
index 0000000..4e7e8f0
--- /dev/null
+++ b/src/lynq/lib/liblynq-gnss/include/lynq_gnss.h
@@ -0,0 +1,125 @@
+#ifndef LYNQ_GNSS_H

+#define LYNQ_GNSS_H

+

+

+#define LYNQ_GNSS_MODE "GNSS_MODE"

+#define LYNQ_DEBUG_STATUS "debug.dbg2file"

+#define LYNQ_EPO_STATUS  "EPO_enabled"

+#define LYNQ_OUTPUT_FREQUENCY  "fix_interval"

+

+#define LYNQ_CONF_GPS_GLONASS "0"

+#define LYNQ_CONF_GPS_BEIDOU "1"

+#define LYNQ_CONF_GPS_GLONASS_BEIDOU "2"

+#define LYNQ_CONF_GPS "3"

+#define LYNQ_CONF_BEIDOU "4"

+#define LYNQ_CONF_GLONASS "5"

+#define LYNQ_CONF_GPS_GLONASS_BEIDOU_GALILEO "6"

+#define LYNQ_CONF_GPS_GALILEO "7"

+#define LYNQ_CONF_GPS_GLONASS_GALILEO "8"

+#define LYNQ_CONF_GPS_GALILEO_ONLY "9"

+#define LYNQ_CONF_GPS_GLONASS_BEIDOU_GALILEO_NAVIC "10"

+

+#define LYNQ_CONFIG_DISABLE "0"

+#define LYNQ_CONFIG_ENABLE "1"

+

+#define LYNQ_MAX_FRREQUENCY 16

+

+#include<pthread.h>

+#include "gpshal.h"

+#include "hal2mnl_interface.h"

+

+typedef enum{

+    LYNQ_MODE_GPS_GLONASS = 0,

+    LYNQ_MODE_GPS_BEIDOU,

+    LYNQ_MODE_GPS_GLONASS_BEIDOU,

+    LYNQ_MODE_GPS,

+    LYNQ_MODE_BEIDOU,

+    LYNQ_MODE_GLONASS,

+    LYNQ_MODE_GPS_GLONASS_BEIDOU_GALILEO,

+    LYNQ_MODE_GPS_GALILEO,

+    LYNQ_MODE_GPS_GLONASS_GALILEO,

+    LYNQ_MODE_GPS_GALILEO_ONLY,

+    LYNQ_MODE_GPS_GLONASS_BEIDOU_GALILEO_NAVIC,

+    LYNQ_MODE_GNSS_END

+}LYNQ_GNSS_MODE_CONFIGURATION;

+

+typedef enum{

+    LYNQ_SWITCH_DISABLE = 0,

+    LYNQ_SWITCH_ENABLE

+}LYNQ_CONF_SWITCH;

+

+typedef struct {

+    GpsLocation legacyLocation;

+    float           horizontalAccuracyMeters;

+

+    /**

+    * Represents expected vertical position accuracy in meters

+    * (68% confidence).

+    */

+    float           verticalAccuracyMeters;

+

+    /**

+    * Represents expected speed accuracy in meter per seconds

+    * (68% confidence).

+    */

+    float           speedAccuracyMetersPerSecond;

+

+    /**

+    * Represents expected bearing accuracy in degrees

+    * (68% confidence).

+    */

+    float           bearingAccuracyDegrees;

+} lynq_GpsLocation_ext;

+

+typedef void (*gps_location_callback_ext)(lynq_GpsLocation_ext* location);

+

+// typedef void (* gps_status_callback)(GpsStatus* status);

+

+// typedef void (* gps_nmea_callback)(GpsUtcTime timestamp, const char* nmea, int length);

+

+// typedef pthread_t (* gps_create_thread)(const char* name, void (*start)(void *), void* arg);

+

+typedef struct

+{

+    size_t size;

+    gps_location_callback_ext lynq_location_cb;

+    gps_status_callback lynq_status_cb;

+    gps_nmea_callback lynq_nmea_cb;

+    gps_create_thread lynq_create_thread_cb;

+}lynq_gnss_cb;

+

+

+int lynq_gnss_init(void);

+

+int lynq_gnss_callback_reg(lynq_gnss_cb* callbacks);

+

+int lynq_gnss_start(void);

+

+int lynq_gnss_stop(void);

+

+int lynq_gnss_deinit(void);

+

+int lynq_gnss_inject_time(GpsUtcTime time, int64_t timeReference, int uncertainty);

+

+int lynq_gnss_inject_location(double latitude,double longitude,float  accuracy);

+

+int lynq_gnss_delete_aiding_data(GpsAidingData flags);

+

+int lynq_gnss_inject_fused_location(double latitude,double longitude,float accuracy);

+

+void* lynq_gnss_get_extension(const char* name);

+

+int lynq_gnss_set_start_mode(LYNQ_GNSS_MODE_CONFIGURATION start_mode);

+

+int lynq_gnss_debug_switch(LYNQ_CONF_SWITCH switch_op);

+

+int lynq_gnss_epo_switch(LYNQ_CONF_SWITCH switch_op);

+

+int lynq_gnss_output_frequency_set(int frequency);

+

+GpsCallbacks_ext* lynq__get_gps_callbacks(void);

+

+

+

+

+#endif
\ No newline at end of file
diff --git a/src/lynq/lib/liblynq-gnss/makefile b/src/lynq/lib/liblynq-gnss/makefile
new file mode 100755
index 0000000..2d74e59
--- /dev/null
+++ b/src/lynq/lib/liblynq-gnss/makefile
@@ -0,0 +1,66 @@
+SHELL = /bin/sh

+RM = rm -f

+

+

+LOCAL_CFLAGS := \

+	-Wall \

+    -g \

+    -Wall \

+    -fPIC \

+    -shared \

+    -D__COMPILE_OPTION__ \

+    -D__LINUX_OS__ \

+

+CPPFLAGS=\

+  -std=c++11 \

+

+LOCAL_PATH = .

+$(warning ################# ZHOUQUNCHAO LOCAL_PATH:$(LOCAL_PATH),ROOT: $(ROOT),includedir:$(includedir),libdir:$(libdir))

+

+LOCAL_C_INCLUDES = \

+    -I$(LOCAL_PATH)/include \

+	-I$(LOCAL_PATH)/ \

+	-I$(ROOT)$(includedir)/gps_hal \

+	-I$(ROOT)$(includedir)/inc \

+	-I$(ROOT)$(includedir)/inc/hardware \

+	-I$(ROOT)$(includedir)/hardware \

+	-I$(ROOT)$(includedir)/liblog \

+	-I$(ROOT)$(includedir)/ \

+	

+LOCAL_LIBS := \

+    -L. \

+	-ldl \

+    -lrt \

+	-llog \

+	-lutils \

+	-lcutils \

+	-lgpshal \

+	-lpthread \

+#    -llynq-log \

+

+$(warning libs=$(LOCAL_LIBS))

+

+CXXSRC=\

+

+SOURCES = $(wildcard *.c wildcard src/*.c)

+

+EXECUTABLE = liblynq-gnss.so

+

+COBJS=$(SOURCES:.c=.o)

+$(warning test)

+all: $(EXECUTABLE)

+$(EXECUTABLE): $(COBJS)

+	$(CXX) -shared -Wl,--no-undefined $(COBJS) $(LOCAL_LIBS) $(LOCAL_CFLAGS) $(LOCAL_C_INCLUDES) -o $@

+

+%.o: %.c

+	$(warning ----->build $<)

+	$(CC) $(LOCAL_C_INCLUDES) $(LOCAL_CFLAGS) $(LOCAL_LIBS) -o $@ -c $<

+

+.PHONY: install clean

+install:

+	mkdir -p $(ROOT)$(base_libdir)/

+	install $(EXECUTABLE) $(ROOT)$(base_libdir)/

+

+clean:

+	rm -f $(EXECUTABLE) rm -rf *.o

+	find ./ -name *.o | xargs rm -rf

diff --git a/src/lynq/lib/liblynq-gnss/src/lynq_callback.c b/src/lynq/lib/liblynq-gnss/src/lynq_callback.c
new file mode 100755
index 0000000..ee21b22
--- /dev/null
+++ b/src/lynq/lib/liblynq-gnss/src/lynq_callback.c
@@ -0,0 +1,114 @@
+#include<pthread.h>

+#include<stdio.h>

+#include<unistd.h>

+#include<errno.h>

+#include<string.h>

+

+#include"lynq_gnsshal.h"

+#include"mtk_lbs_utility.h"

+#include"lynq_gnss.h"

+

+extern lynq_gnss_cb* lynq_callbacks;

+

+void lynq_gps_location_callback(GpsLocation_ext* location)

+{   

+    GpsLocation_ext* loc = (GpsLocation_ext *)location;

+    lynq_GpsLocation_ext lynq_loc;

+   //lynq_loc.legacyLocation.size = loc->legacyLocation.size;

+    lynq_loc.legacyLocation.size = sizeof(lynq_GpsLocation_ext);

+    lynq_loc.legacyLocation.flags = loc->legacyLocation.flags;

+    lynq_loc.legacyLocation.latitude = loc->legacyLocation.latitude;

+    lynq_loc.legacyLocation.longitude = loc->legacyLocation.longitude;

+    lynq_loc.legacyLocation.altitude = loc->legacyLocation.altitude;

+    lynq_loc.legacyLocation.speed = loc->legacyLocation.speed;

+    lynq_loc.legacyLocation.bearing = loc->legacyLocation.bearing;

+    lynq_loc.legacyLocation.accuracy = loc->legacyLocation.accuracy;

+    lynq_loc.legacyLocation.timestamp = loc->legacyLocation.timestamp;

+    lynq_loc.horizontalAccuracyMeters = loc->horizontalAccuracyMeters;

+    lynq_loc.verticalAccuracyMeters = loc->speedAccuracyMetersPerSecond;

+    lynq_loc.bearingAccuracyDegrees = loc->bearingAccuracyDegrees;

+    lynq_callbacks->lynq_location_cb(&lynq_loc);

+}

+

+void lynq_gps_status_callback(GpsStatus* status)

+{

+    lynq_callbacks->lynq_status_cb(status);

+}

+

+void lynq_gps_sv_status_callback(GpsSvStatus* sv_info)

+{

+

+}

+

+void lynq_gps_nmea_callback(GpsUtcTime timestamp, const char* nmea, int length)

+{

+    lynq_callbacks->lynq_nmea_cb(timestamp,nmea,length);

+

+}

+

+void lynq_gps_set_capabilities(uint32_t capabilities)

+{

+

+}

+

+void lynq_gps_acquire_wakelock(void)

+{

+

+}

+

+void lynq_gps_release_wakelock(void)

+{

+

+}

+

+void lynq_gps_request_utc_time(void)

+{

+

+}

+

+void lynq_set_system_info_cb(const GnssSystemInfo* info)

+{

+

+}

+

+void lynq_gnss_sv_status_cb(GnssSvStatus_ext* sv_info)

+{

+

+}

+

+pthread_t lynq_gps_create_thread(const char* name, void (*start)(void *), void* arg)

+{

+    lynq_callbacks->lynq_create_thread_cb(name,(void *(*)(void *))start,arg);

+}

+

+void lynq_gnss_set_name_cb(const char* name, int length)

+{

+

+}

+

+void lynq_gnss_request_location_cb(bool independentFromGnss, bool isUserEmergency)

+{

+

+}

+

+GpsCallbacks_ext lynq_gps_callbacks_gnss = {

+    .size = sizeof(GpsCallbacks_ext),

+    .location_cb = lynq_gps_location_callback,

+    .status_cb = lynq_gps_status_callback,

+    .sv_status_cb = lynq_gps_sv_status_callback,

+    .nmea_cb = lynq_gps_nmea_callback,

+    .set_capabilities_cb = lynq_gps_set_capabilities,

+    .acquire_wakelock_cb = lynq_gps_acquire_wakelock,

+    .release_wakelock_cb = lynq_gps_release_wakelock,

+    .create_thread_cb = lynq_gps_create_thread,

+    .request_utc_time_cb = lynq_gps_request_utc_time,

+    .set_system_info_cb = lynq_set_system_info_cb,

+    .gnss_sv_status_cb = lynq_gnss_sv_status_cb,

+    .set_name_cb = lynq_gnss_set_name_cb,

+    .request_location_cb = lynq_gnss_request_location_cb,

+};

+

+GpsCallbacks_ext* lynq__get_gps_callbacks(void)

+{

+    return &lynq_gps_callbacks_gnss;

+}

diff --git a/src/lynq/lib/liblynq-gnss/src/lynq_gnss.c b/src/lynq/lib/liblynq-gnss/src/lynq_gnss.c
new file mode 100755
index 0000000..eda43ce
--- /dev/null
+++ b/src/lynq/lib/liblynq-gnss/src/lynq_gnss.c
@@ -0,0 +1,249 @@
+#include <stdarg.h>

+#include <stdio.h>

+#include <stdarg.h>

+#include <unistd.h>

+#include <sys/time.h>

+#include <time.h>

+#include <signal.h>

+#include <string.h>

+#include <errno.h>

+#include <sys/socket.h>

+#include <sys/un.h>

+#include <arpa/inet.h>

+#include <dlfcn.h>

+#include <stdlib.h>

+#include <semaphore.h>

+#include <pthread.h>

+#include <log/log.h>

+

+#include "lynq_gnss.h"

+#include "gpshal.h"

+#include "hal2mnl_interface.h"

+#include "lynq_gnsshal.h"

+#include "mtk_lbs_utility.h"

+#include "lynq_prop.h"

+#include "mtk_auto_log.h"

+

+// #define LOG_TAG "LYNQ_GNSS"

+

+lynq_gnss_cb* lynq_callbacks =NULL;

+GpsCallbacks_ext* turn_cbs = NULL;

+

+/**

+ * @brief mark gnss initialization state

+ * 0: deinit state

+ * 1: init state

+ */

+static int g_lynq_gnss_init_flag = 0;

+

+int lynq_gnss_init(void)

+{

+    if (g_lynq_gnss_init_flag == 1)

+    {

+        printf("init twice is not allowed\n");

+        return -1;

+    }

+    gpshal_set_gps_state_intent(GPSHAL_STATE_INIT);

+    gpshal2mnl_gps_init();

+    return 0;

+}

+

+int lynq_gnss_callback_reg(lynq_gnss_cb* callbacks)

+{   

+    if (NULL == callbacks)

+    {

+        printf("illegal callbacks!!!\n");

+        return -1;

+    }

+    lynq_callbacks = callbacks;

+    turn_cbs = lynq__get_gps_callbacks();

+    if(turn_cbs == NULL)

+    {

+        printf("callbacks error\n");

+        return -1;

+    }

+    if(gpshal_gpscbs_save(turn_cbs) != 0)

+    {

+        printf("For cbs save error\r\n");

+        return -1;

+    }

+    return 0;

+}

+

+int lynq_gnss_deinit(void)

+{

+    gpshal_set_gps_state_intent(GPSHAL_STATE_CLEANUP);

+    gpshal2mnl_gps_cleanup();

+    printf("timer de init end\n");

+    return 0;

+}

+

+int lynq_gnss_start(void)

+{

+    //memset(&lynq_debug_data, 0, sizeof(DebugData));

+    gpshal_set_gps_state_intent(GPSHAL_STATE_START);

+    gpshal2mnl_gps_start();

+    return 0;

+}

+

+int lynq_gnss_stop(void)

+{

+    gpshal_set_gps_state_intent(GPSHAL_STATE_STOP);

+    gpshal2mnl_gps_stop();

+    return 0;

+}

+

+int lynq_gnss_inject_time(GpsUtcTime time, int64_t timeReference, int uncertainty)

+{

+    if (hal2mnl_gps_inject_time(time, timeReference, uncertainty) == -1) {

+        printf("hal2mnl_gps_inject_time failed because of safe_sendto fail ,strerror:%s \n", strerror(errno));

+        return -1;

+    }

+    return 0;

+}

+

+int lynq_gnss_inject_location(

+        double latitude,

+        double longitude,

+        float  accuracy) {

+    if (hal2mnl_gps_inject_location(latitude, longitude, accuracy) == -1) {

+        printf("hal2mnl_gps_inject_location failed because of safe_sendto fail ,strerror:%s \n", strerror(errno));

+        return -1;

+    }

+    return 0;

+}

+

+int lynq_gnss_delete_aiding_data(GpsAidingData flags) {

+    if (hal2mnl_gps_delete_aiding_data(flags) == -1) {

+        printf("hal2mnl_gps_delete_aiding_data failed because of safe_sendto fail ,strerror:%s \n", strerror(errno));

+        return -1;

+    }

+    return 0;

+}

+

+int lynq_gnss_inject_fused_location(

+        double latitude,

+        double longitude,

+        float  accuracy) {

+    // TODO:  hal2mnl_gps_inject_fused_location(latitude, longitude, accuracy);

+    UNUSED(latitude);

+    UNUSED(longitude);

+    UNUSED(accuracy);

+    return 0;  // 0:ok,   non-zero: error; but GPS JNI will ignore it

+}

+/*get extension*/

+void* lynq_gnss_get_extension(const char* name)

+{

+    

+}

+

+int lynq_gnss_set_start_mode(LYNQ_GNSS_MODE_CONFIGURATION start_mode)

+{

+    int ret = 0;

+    switch (start_mode)

+    {

+        case LYNQ_MODE_GPS_GLONASS:

+            mnld_write_cfg(LYNQ_GNSS_MODE , LYNQ_CONF_GPS_GLONASS);

+            break;

+

+        case LYNQ_MODE_GPS_BEIDOU:

+            mnld_write_cfg(LYNQ_GNSS_MODE , LYNQ_CONF_GPS_BEIDOU);

+            break;

+

+        case LYNQ_MODE_GPS_GLONASS_BEIDOU:

+            mnld_write_cfg(LYNQ_GNSS_MODE , LYNQ_CONF_GPS_GLONASS_BEIDOU);

+            break;

+

+        case LYNQ_MODE_GPS:

+            mnld_write_cfg(LYNQ_GNSS_MODE , LYNQ_CONF_GPS);

+            break;

+

+        case LYNQ_MODE_BEIDOU:

+            mnld_write_cfg(LYNQ_GNSS_MODE , LYNQ_CONF_BEIDOU);

+            break;

+

+        case LYNQ_MODE_GLONASS:

+            mnld_write_cfg(LYNQ_GNSS_MODE , LYNQ_CONF_GLONASS);

+            break;

+

+        case LYNQ_MODE_GPS_GLONASS_BEIDOU_GALILEO:

+            mnld_write_cfg(LYNQ_GNSS_MODE , LYNQ_CONF_GPS_GLONASS_BEIDOU_GALILEO);

+

+            break;

+

+        case LYNQ_MODE_GPS_GALILEO:

+            mnld_write_cfg(LYNQ_GNSS_MODE , LYNQ_CONF_GPS_GALILEO);

+

+            break;  

+

+        case LYNQ_MODE_GPS_GLONASS_GALILEO:

+            mnld_write_cfg(LYNQ_GNSS_MODE , LYNQ_CONF_GPS_GLONASS_GALILEO);

+

+            break;

+

+        case LYNQ_MODE_GPS_GALILEO_ONLY:

+            mnld_write_cfg(LYNQ_GNSS_MODE , LYNQ_CONF_GPS_GALILEO_ONLY);

+

+            break;

+

+        case LYNQ_MODE_GPS_GLONASS_BEIDOU_GALILEO_NAVIC:

+            mnld_write_cfg(LYNQ_GNSS_MODE , LYNQ_CONF_GPS_GLONASS_BEIDOU_GALILEO_NAVIC);

+

+            break; 

+        default:

+            printf("unknown type of GNSS MODE\n");

+            ret = -1;

+            break;

+    }

+    

+    return ret;

+}

+

+int lynq_gnss_debug_switch(LYNQ_CONF_SWITCH switch_op)

+{

+    int ret = 0;

+    switch (switch_op)

+    {

+        case LYNQ_SWITCH_DISABLE:

+            mnld_write_cfg(LYNQ_DEBUG_STATUS,LYNQ_CONFIG_DISABLE);

+            break;

+        case LYNQ_SWITCH_ENABLE:

+            mnld_write_cfg(LYNQ_DEBUG_STATUS,LYNQ_CONFIG_ENABLE);

+            break;

+        default:

+            printf("unknown op\n");

+            ret = -1;

+            break;

+    }

+    return ret;

+}

+

+int lynq_gnss_epo_switch(LYNQ_CONF_SWITCH switch_op)

+{

+    int ret = 0;

+    switch (switch_op)

+    {

+        case LYNQ_SWITCH_DISABLE:

+            mnld_write_cfg(LYNQ_EPO_STATUS,LYNQ_CONFIG_DISABLE);

+            break;

+        case LYNQ_SWITCH_ENABLE:

+            mnld_write_cfg(LYNQ_EPO_STATUS,LYNQ_CONFIG_ENABLE);

+            break;

+        default:

+            printf("unknown op\n");

+            ret = -1;

+            break;

+    }

+    return ret;

+}

+

+int lynq_gnss_output_frequency_set(int frequency)

+{

+    int frequency_turn = frequency;

+

+    int freq_num = 1000/frequency_turn;

+    char freq[LYNQ_MAX_FRREQUENCY];

+    sprintf(freq, "%d", freq_num);

+    mnld_write_cfg(LYNQ_OUTPUT_FREQUENCY,freq);

+    return 0;

+}

diff --git a/src/lynq/lib/liblynq-gnss/src/lynq_gnsshal.h b/src/lynq/lib/liblynq-gnss/src/lynq_gnsshal.h
new file mode 100755
index 0000000..f01aec5
--- /dev/null
+++ b/src/lynq/lib/liblynq-gnss/src/lynq_gnsshal.h
@@ -0,0 +1,41 @@
+#ifndef LYNQ_GNSSHAL_H

+#define LYNQ_GNSSHAL_H

+

+#ifdef __cplusplus

+extern "C" {

+#endif

+

+#include<pthread.h>

+#include "gps_mtk.h"

+#include "hal2mnl_interface.h"

+#include "gpshal.h"

+

+#define LYNQ_GNSS_MODE "GNSS_MODE"

+#define LYNQ_DEBUG_STATUS "debug.dbg2file"

+#define LYNQ_EPO_STATUS  "EPO_enabled"

+#define LYNQ_OUTPUT_FREQUENCY  "fix_interval"

+

+#define LYNQ_CONF_GPS_GLONASS "0"

+#define LYNQ_CONF_GPS_BEIDOU "1"

+#define LYNQ_CONF_GPS_GLONASS_BEIDOU "2"

+#define LYNQ_CONF_GPS "3"

+#define LYNQ_CONF_BEIDOU "4"

+#define LYNQ_CONF_GLONASS "5"

+#define LYNQ_CONF_GPS_GLONASS_BEIDOU_GALILEO "6"

+#define LYNQ_CONF_GPS_GALILEO "7"

+#define LYNQ_CONF_GPS_GLONASS_GALILEO "8"

+#define LYNQ_CONF_GPS_GALILEO_ONLY "9"

+#define LYNQ_CONF_GPS_GLONASS_BEIDOU_GALILEO_NAVIC "10"

+

+#define LYNQ_CONFIG_DISABLE "0"

+#define LYNQ_CONFIG_ENABLE "1"

+

+#define LYNQ_MAX_FRREQUENCY 16

+

+GpsCallbacks_ext* lynq__get_gps_callbacks(void);

+

+#ifdef __cplusplus

+}

+#endif

+

+#endif
\ No newline at end of file
diff --git a/src/lynq/lib/liblynq-gnss/src/lynq_prop.c b/src/lynq/lib/liblynq-gnss/src/lynq_prop.c
new file mode 100755
index 0000000..0fcac31
--- /dev/null
+++ b/src/lynq/lib/liblynq-gnss/src/lynq_prop.c
@@ -0,0 +1,105 @@
+#include <stdio.h>   

+#include <string.h>  

+#include <stdlib.h>

+#include <sys/time.h>

+#include <errno.h>

+#include <unistd.h>

+#include <log/log.h>

+ 

+#include "lynq_prop.h"

+

+#define PROPBUF_SIZE 512

+

+

+const char *mnl_prop_path[] = {

+    "/usr/share/gps/mnl.prop",   /*mainly for target*/

+    "/sbin/mnl.prop",   /*mainly for emulator*/

+};

+ 

+int write_prop(const char *file_name, char* key, char* val) {

+    if(NULL == file_name||NULL == key|| NULL == val)

+    {

+        printf("incoming char error\r\n");

+        return -1;

+    }

+    char linebuffer[PROPBUF_SIZE] = {0};

+    char buffer1[PROPBUF_SIZE] = {0};

+    char buffer2[PROPBUF_SIZE] = {0};

+

+    int line_len = 0;

+    int len = 0;

+    int res;

+    int changed = 0;

+    FILE *fp = NULL;

+

+    if (0 != access(file_name, F_OK)) {    // if file is not exit, create file

+         printf("access file error(%s), Try to create file\r\n", file_name);

+

+         fp = fopen(file_name, "w");  //Create file

+         if (fp == NULL) {

+             printf("create file %s fail(%s)\r\n", file_name, strerror(errno));

+             return -1;

+         }

+    } else {

+        fp = fopen(file_name, "r+");  //Read and write

+        if(fp == NULL)

+        {

+            printf("open error, %s\r\n", strerror(errno));

+            return -1;

+        }

+    }

+

+    while(fgets(linebuffer, PROPBUF_SIZE, fp)) {

+        line_len = strlen(linebuffer);

+        len += line_len;

+        sscanf(linebuffer, "%[^=]=%[^=]", buffer1,buffer2);

+        printf("buffer1:%s, buffer2:%s\r\n", buffer1, buffer2);

+        if(!strcmp(key, buffer1)) {

+            len -= strlen(linebuffer);

+            res = fseek(fp, len, SEEK_SET);

+            if(res < 0) {

+                printf("fseek fail, %s\r\n", strerror(errno));

+                fclose(fp);

+                return -1;

+            }

+            printf("Before modify [%s=%s] in file [%s]\r\n", buffer1, buffer2, file_name);

+            memset(buffer2, 0, PROPBUF_SIZE);

+            LYNQ_STRNCPY(buffer2, val, PROPBUF_SIZE);

+            strncat(buffer1, "=", PROPBUF_SIZE - strlen(buffer1) - 1);

+            strncat(buffer1, buffer2, PROPBUF_SIZE - strlen(buffer1) - 1);

+            printf("After modify [%s] in file [%s]\r\n", buffer1, file_name);

+            changed = 1;

+            fprintf(fp, "%s", buffer1);

+            fclose(fp);

+            return 0;

+        }

+    }

+    if(changed == 0) {  //Not find key

+        memset(linebuffer, 0, PROPBUF_SIZE);

+        strncat(linebuffer, "\n", PROPBUF_SIZE - strlen(linebuffer) - 1);

+        strncat(linebuffer, key, PROPBUF_SIZE - strlen(linebuffer) - 1);

+        strncat(linebuffer, "=", PROPBUF_SIZE - strlen(linebuffer) - 1);

+        strncat(linebuffer, val, PROPBUF_SIZE - strlen(linebuffer) - 1);

+        printf("Add config [%s] to file [%s]", linebuffer, file_name);

+        res = fseek(fp, 0, SEEK_END);

+        if(res < 0) {

+            printf("fseek fail, %s\r\n", strerror(errno));

+            fclose(fp);

+            return -1;

+        }

+        fprintf(fp, "%s", linebuffer);

+

+        fclose(fp);

+    }

+    return 0;

+}

+

+void mnld_write_cfg(char* key, char* val) {

+    int idx;

+    int cnt = sizeof(mnl_prop_path)/sizeof(mnl_prop_path[0]);

+

+    for (idx = 0; idx < cnt; idx++) {

+        if (!write_prop(mnl_prop_path[idx], key, val))

+            break;

+    }

+}
\ No newline at end of file
diff --git a/src/lynq/lib/liblynq-gnss/src/lynq_prop.h b/src/lynq/lib/liblynq-gnss/src/lynq_prop.h
new file mode 100755
index 0000000..ae74e7e
--- /dev/null
+++ b/src/lynq/lib/liblynq-gnss/src/lynq_prop.h
@@ -0,0 +1,27 @@
+#ifndef LYNQ_PROP_H

+#define LYNQ_PROP_H

+ 

+#ifdef _cplusplus

+extern "C" {

+#endif

+    

+#define MTK_GPS_DATA_PATH "\"/usr/share/gps/\""

+

+#define LYNQ_STRNCPY(dst,src,size) do{\

+                                       strncpy((char *)(dst), (char *)(src), (size - 1));\

+                                      (dst)[size - 1] = '\0';\

+                                     }while(0)

+

+

+

+#define F_OK 0

+

+int write_prop(const char *file_name, char* key, char* val);

+

+void mnld_write_cfg(char* key, char* val);

+

+#ifdef _cplusplus

+}

+#endif

+ 

+#endif

diff --git a/src/lynq/packages/apps/lynq-gnss-test/lynq-gnss-test-cb.c b/src/lynq/packages/apps/lynq-gnss-test/lynq-gnss-test-cb.c
new file mode 100755
index 0000000..bfa70de
--- /dev/null
+++ b/src/lynq/packages/apps/lynq-gnss-test/lynq-gnss-test-cb.c
@@ -0,0 +1,107 @@
+#include<pthread.h>

+#include<stdio.h>

+#include<unistd.h>

+#include<errno.h>

+#include<string.h>

+

+#include"lynq_gnss.h"

+#include"lynq-gnss-test.h"

+

+/*extern struct timespec lynq_gnss_open_tm;

+extern int lynq_ttff_time;

+extern int lynq_test_session_end;*/

+lynq_test_gnss_result lynq_test_result;

+

+void lynq_test_gps_location_callback(lynq_GpsLocation_ext* location)

+{

+    if(location->legacyLocation.size == sizeof(lynq_GpsLocation_ext))

+    {

+        memset(&(lynq_test_result.location), 0, sizeof(lynq_GpsLocation_ext));

+        memcpy(&(lynq_test_result.location), location, sizeof(lynq_GpsLocation_ext));

+    }

+    else{

+

+    }

+}

+

+void lynq_test_gps_status_callback(GpsStatus* status)

+{

+    if(status->size == sizeof(GpsStatus))

+    {

+        if(status->status == GPS_STATUS_SESSION_BEGIN)

+        {

+            

+        }

+        if(status->status == GPS_STATUS_SESSION_END)

+        {

+

+        }

+    }else{

+        printf("status error\r\n");

+    }

+}

+

+#define NMEA_ACC "ACCURACY"

+#define NMEA_GSA "GSA"

+#define NMEA_RMC "RMC"

+#define NMEA_GGA "GGA"

+#define NMEA_VTG "VTG"

+#define NMEA_GSV "GSV"

+

+void lynq_test_gps_nmea_callback(GpsUtcTime timestamp, const char* nmea, int length)

+{

+    if(strncmp(nmea+3,NMEA_GSA,strlen(NMEA_GSA))==0)

+    {

+        lynq_test_result.fix_type = *(nmea+9) - '0';

+    }

+    else{

+        

+    }

+    

+    if(strncmp(nmea+3,NMEA_ACC,strlen(NMEA_ACC)) == 0)

+    {

+        lynq_test_result.location.legacyLocation.timestamp= timestamp;

+        //lynq_show_gnss_test_result(&lynq_test_result);

+    }

+	if(strncmp(nmea+3,NMEA_GSA,strlen(NMEA_GSA))==0 || strncmp(nmea+3,NMEA_RMC,strlen(NMEA_RMC)) == 0 || \

+    strncmp(nmea+3,NMEA_GGA,strlen(NMEA_GGA)) == 0 || strncmp(nmea+3,NMEA_VTG,strlen(NMEA_VTG)) == 0|| \

+    strncmp(nmea+3,NMEA_GSV,strlen(NMEA_GSV)) == 0)

+    {

+        printf("%s\r\n",nmea);

+    }

+

+}

+

+

+

+pthread_t lynq_test_gps_create_thread(const char* name, void (*start)(void *), void* arg)

+{

+    pthread_t ntid = 0;

+    int ret = 0;

+

+    ret = pthread_create(&ntid, NULL, (void *(*)(void *))start, arg);

+

+    if(ret != 0)

+    {

+        printf("thread %s create fail(%s)!\r\n", name, strerror(errno));

+        ntid = 0;

+    }else{

+        printf("tread %s create success!\r\n", name);

+    }

+	

+

+    return ntid;

+}

+

+lynq_gnss_cb lynq_gnss_callbacks = {

+    .size = sizeof(lynq_gnss_cb),

+    .lynq_location_cb =lynq_test_gps_location_callback,

+    .lynq_status_cb = lynq_test_gps_status_callback,

+    .lynq_nmea_cb = lynq_test_gps_nmea_callback,

+    .lynq_create_thread_cb = lynq_test_gps_create_thread,

+};

+

+lynq_gnss_cb* lynq_test_get__gnss_callbacks(void)

+{

+    return &lynq_gnss_callbacks;

+}

diff --git a/src/lynq/packages/apps/lynq-gnss-test/lynq-gnss-test.c b/src/lynq/packages/apps/lynq-gnss-test/lynq-gnss-test.c
new file mode 100755
index 0000000..07c879c
--- /dev/null
+++ b/src/lynq/packages/apps/lynq-gnss-test/lynq-gnss-test.c
@@ -0,0 +1,115 @@
+#include <stdarg.h>

+#include <stdio.h>

+#include <stdarg.h>

+#include <unistd.h>

+#include <sys/time.h>

+#include <time.h>

+#include <signal.h>

+#include <string.h>

+#include <errno.h>

+#include <sys/un.h>

+#include <arpa/inet.h>

+#include <dlfcn.h>

+#include <stdlib.h>

+#include <semaphore.h>

+

+#include "lynq_gnss.h"

+#include "liblog/lynq_deflog.h"

+#include "liblog/liblog.h"

+#include "lynq-gnss-test.h"

+

+#define USER_LOG_TAG "LYNQ_GNSS"

+

+lynq_gnss_cb* cbs =NULL;

+

+sem_t g_lynq_test_exit_sem;

+

+extern lynq_test_gnss_result lynq_test_result;

+

+void lynq_show_gnss_test_result(lynq_test_gnss_result* result)

+{

+    if(NULL != result)

+    {

+        LYVERBLOG("------------------------------------------------------------");

+        LYVERBLOG("fix type: %d",result->fix_type);

+        LYVERBLOG("Flags: 0x%x",result->location.legacyLocation.flags);

+        LYVERBLOG("latitude: %.10lf",result->location.legacyLocation.latitude);

+        LYVERBLOG("longitude: %.10lf",result->location.legacyLocation.longitude);

+        LYVERBLOG("altitude: %.10lf",result->location.legacyLocation.altitude);

+        LYVERBLOG("speed: %fm/s",result->location.legacyLocation.speed);

+        LYVERBLOG("bearing: %f",result->location.legacyLocation.bearing);

+        LYVERBLOG("accuracy: %fm",result->location.horizontalAccuracyMeters);

+        LYVERBLOG("timestamp: %ld",result->location.legacyLocation.timestamp);

+        LYVERBLOG("------------------------------------------------------------");

+    }

+}

+

+// -1 means failure

+int lynq_test_block_here() {

+    if (sem_init(&g_lynq_test_exit_sem, 0, 0) == -1) {

+        LYVERBLOG("lynq_test_block_here() sem_init failure reason=%s\n", strerror(errno));

+        return -1;

+    }

+    sem_wait(&g_lynq_test_exit_sem);

+    if (sem_destroy(&g_lynq_test_exit_sem) == -1) {

+        LYVERBLOG("lynq_test_block_here() sem_destroy reason=%s\n", strerror(errno));

+    }

+    LYVERBLOG("lynq_test exit blocking...");

+    return 0;

+}

+

+int main()

+{

+    LYLOGEINIT(USER_LOG_TAG);

+    //registerTriggerCallback(getCallback);

+    //register_key_info();

+    //register_broadcast_send();

+    LYVERBLOG("Log init");

+

+    //pre set

+    int ret_test = lynq_gnss_set_start_mode(LYNQ_MODE_GPS_GLONASS_BEIDOU);

+

+    lynq_gnss_debug_switch(LYNQ_SWITCH_ENABLE);

+

+    lynq_gnss_epo_switch(LYNQ_SWITCH_ENABLE);

+

+    lynq_gnss_output_frequency_set(1);

+    

+    //init

+    LYVERBLOG("pre set successful,%d",ret_test);

+    cbs = lynq_test_get__gnss_callbacks();

+    if(NULL != cbs)

+    {

+        LYVERBLOG("get cbs successful");

+    }

+    else{

+        LYVERBLOG("cbs get error");

+    }

+    //open GNSS

+    ret_test = lynq_gnss_callback_reg(cbs);  

+    LYVERBLOG("cbs reg ret=%d",ret_test);

+    int init_state = lynq_gnss_init();

+    if(init_state == 0)

+    {

+        LYVERBLOG("gnss init ret_test =%d",init_state);

+    }

+    else{

+        LYVERBLOG("error");

+    }

+    

+    unsigned int delete_flags = GPS_DELETE_RTI;

+    int start_state = lynq_gnss_start();

+    if(start_state == 0)

+    {

+    LYVERBLOG("gnss init successful,ret_test =%d",start_state);

+    }

+    else{

+        LYVERBLOG("error");

+    }

+    lynq_gnss_delete_aiding_data(delete_flags);

+    LYVERBLOG("delete_flags:%d",delete_flags);

+

+    lynq_test_block_here();

+

+    return 0;

+}
\ No newline at end of file
diff --git a/src/lynq/packages/apps/lynq-gnss-test/lynq-gnss-test.h b/src/lynq/packages/apps/lynq-gnss-test/lynq-gnss-test.h
new file mode 100755
index 0000000..85f8bdd
--- /dev/null
+++ b/src/lynq/packages/apps/lynq-gnss-test/lynq-gnss-test.h
@@ -0,0 +1,16 @@
+#ifndef LYNQ_GNSS_TEST_H

+#define LYNQ_GNSS_TEST_H

+

+typedef struct 

+{

+    lynq_GpsLocation_ext location;

+    char utc_time[5];

+	int fix_type;

+}lynq_test_gnss_result;

+

+lynq_gnss_cb* lynq_test_get__gnss_callbacks(void);

+void lynq_show_gnss_test_result(lynq_test_gnss_result* result);

+

+

+

+#endif
\ No newline at end of file
diff --git a/src/lynq/packages/apps/lynq-gnss-test/makefile b/src/lynq/packages/apps/lynq-gnss-test/makefile
new file mode 100755
index 0000000..9504bd9
--- /dev/null
+++ b/src/lynq/packages/apps/lynq-gnss-test/makefile
@@ -0,0 +1,90 @@
+SHELL = /bin/sh

+RM = rm -f

+

+LOCAL_CFLAGS := -Wall \

+                -g -Os \

+                -flto \

+                -DRIL_SHLIB \

+                -DATCI_PARSE \

+                -DKEEP_ALIVE \

+                -D__LINUX_OS__ \

+				-D__COMPILE_OPTION__ \

+                -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)/logger \

+  -I$(ROOT)$(includedir)/liblog \

+  -I$(ROOT)$(includedir)/include  \

+  -I$(ROOT)$(includedir)/gps_hal \

+  -I$(ROOT)$(includedir)/gps_hal \

+  -I$(ROOT)$(includedir)/inc \

+  

+

+LOCAL_C_INCLUDES+=$(DNS_FLAGS)

+

+LOCAL_LIBS := \

+    -L. \

+    -ldl \

+    -llynq-log \

+	-lrt \

+    -lpthread \

+	-lgpshal \

+	-llynq-gnss \

+    #-llynq-tele-ril \

+    

+

+#LOCAL_SRC_FILES_CPP = $(wildcard *.cpp gpio/*.cpp ril/*.cpp)

+#LOCAL_SRC_FILES_C = $(wildcard *.c gps/*.c)

+LOCAL_SRC_FILES_C = $(wildcard *.c wildcard src/*.c)

+EXECUTABLE = lynq-gnss-test

+

+OBJECTS=$(LOCAL_SRC_FILES_C:.c=.o)

+all: $(EXECUTABLE)

+$(warning test)

+$(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)