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)