[Feature]SDK service add

Change-Id: Idc75b210fba44f45ee098c447fe2d3aab83e4e20
diff --git a/meta/meta-mediatek-ivt/recipes-core/base-files/base-files/fstab b/meta/meta-mediatek-ivt/recipes-core/base-files/base-files/fstab
old mode 100644
new mode 100755
index 99555fc..6875918
--- a/meta/meta-mediatek-ivt/recipes-core/base-files/base-files/fstab
+++ b/meta/meta-mediatek-ivt/recipes-core/base-files/base-files/fstab
@@ -25,5 +25,7 @@
 /STATE/system/etc/security	/system/etc/security    none       noauto,x-systemd.automount,bind    0  0
 /STATE/etc/adr       		/etc/adr                none       noauto,x-systemd.automount,bind    0  0
 /STATE/usr/share/gps		/usr/share/gps          none       noauto,x-systemd.automount,bind    0  0
+/STATE/var/log		        /var/log                   none       bind    0  0
+/STATE/log		            /log                   none       bind    0  0
 
 /dev/disk/by-partlabel/sncfg              /mnt/sncfg           auto      defaults          1  2
diff --git a/meta/meta-mediatek-ivt/recipes-core/base-files/base-files/fstab-nand b/meta/meta-mediatek-ivt/recipes-core/base-files/base-files/fstab-nand
old mode 100644
new mode 100755
index 91dd286..2b08177
--- a/meta/meta-mediatek-ivt/recipes-core/base-files/base-files/fstab-nand
+++ b/meta/meta-mediatek-ivt/recipes-core/base-files/base-files/fstab-nand
@@ -26,5 +26,7 @@
 /STATE/system/etc/security	/system/etc/security    none       noauto,x-systemd.automount,bind    0  0
 /STATE/etc/adr       		/etc/adr                none       noauto,x-systemd.automount,bind    0  0
 /STATE/usr/share/gps		/usr/share/gps          none       noauto,x-systemd.automount,bind    0  0
+/STATE/var/log		        /var/log                   none       bind    0  0
+/STATE/log		            /log                   none       bind    0  0
 
 ubi5_0               /mnt/sncfg           ubifs      nosuid,nodev          1  2
diff --git a/meta/meta-mediatek-mt2731/conf/machine/auto2731evb-ivt-main-user.conf b/meta/meta-mediatek-mt2731/conf/machine/auto2731evb-ivt-main-user.conf
index 3259349..37adbf5 100644
--- a/meta/meta-mediatek-mt2731/conf/machine/auto2731evb-ivt-main-user.conf
+++ b/meta/meta-mediatek-mt2731/conf/machine/auto2731evb-ivt-main-user.conf
@@ -82,7 +82,9 @@
 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
-NAND_CHIP_NAME = "MT29F4G08ABBDA"
+#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
@@ -142,8 +144,10 @@
 UBOOT_ENTRYPOINT = "0x40008000"
 UBOOT_LOADADDRESS = "0x40008000"
 
+#tianyan@2021.09.17 modify for nand+dram start
 # Scatter File
-SCATTER_PROJECT = "auto2731-ivt-mcp_nand"
+SCATTER_PROJECT = "auto2731-ivt-mcp_nand_lp4"
+#tianyan@2021.09.17 modify for nand+dram end
 
 # Image FS
 IMAGE_FSTYPES ?= "squashfs"
@@ -152,11 +156,13 @@
 EXTRA_IMAGEDEPENDS += "fbtool flashtool platform-tools scatter"
 SERIAL_CONSOLES = "921600;ttyGS1"
 
+#tianyan@2021.09.17 modify for nand+dram start
 #UBI/UBIFS ARGS
-MKUBIFS_ARGS = "-m 2048 -e 126976 -c 1400 -F"
-UBINIZE_ARGS = "-m 2048 -p 128KiB -O 2048"
+MKUBIFS_ARGS = "-m 4096 -e 253952 -c 1400 -F"
+UBINIZE_ARGS = "-m 4096 -p 256KiB -O 4096"
 
-MKUBIFS_CONFIG_ARGS = "-m 2048 -e 126976 -c 22 -F"
+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"
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 bf2353a..902f797 100644
--- 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 = "T103CM2v01.MP2_MR2.01b03"
+LYNQ_SW_VERSION = "T103R4_SZZTv02.MP2_MR2.01b04"
 SMS_INDEX = "0"
 SMS_FLAG = "0"
 # lynq
@@ -87,7 +87,9 @@
 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
-NAND_CHIP_NAME = "MT29F4G08ABBDA"
+#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
@@ -147,8 +149,10 @@
 UBOOT_ENTRYPOINT = "0x40008000"
 UBOOT_LOADADDRESS = "0x40008000"
 
+#tianyan@2021.09.17 modify for nand+dram start
 # Scatter File
-SCATTER_PROJECT = "auto2731-ivt-mcp_nand"
+SCATTER_PROJECT = "auto2731-ivt-mcp_nand_lp4"
+#tianyan@2021.09.17 modify for nand+dram end
 
 # Image FS
 IMAGE_FSTYPES ?= "squashfs"
@@ -156,11 +160,13 @@
 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 2048 -e 126976 -c 1400 -F"
-UBINIZE_ARGS = "-m 2048 -p 128KiB -O 2048"
+MKUBIFS_ARGS = "-m 4096 -e 253952 -c 1400 -F"
+UBINIZE_ARGS = "-m 4096 -p 256KiB -O 4096"
 
-MKUBIFS_CONFIG_ARGS = "-m 2048 -e 126976 -c 22 -F"
+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"
diff --git a/meta/meta-mediatek-mt2731/recipes-lynq/liblynq-call/liblynq-call.bb b/meta/meta-mediatek-mt2731/recipes-lynq/liblynq-call/liblynq-call.bb
new file mode 100755
index 0000000..20dc227
--- /dev/null
+++ b/meta/meta-mediatek-mt2731/recipes-lynq/liblynq-call/liblynq-call.bb
@@ -0,0 +1,49 @@
+inherit externalsrc package

+

+DESCRIPTION = "lynq call"

+LICENSE = "MediaTekProprietary"

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

+DEPENDS += "platform-libs audio-mixer-ctrl libpal gstreamer1.0 glib-2.0 dtmf libapn liblynq-log"

+inherit workonsrc

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

+

+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 -mfpu=neon-vfpv4 -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 -mfpu=neon-vfpv4 -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 -mfpu=neon-vfpv4 -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 -af ${S}/include/libcall/ ${D}${includedir}/libcall

+    fi

+}

diff --git a/meta/meta-mediatek-mt2731/recipes-lynq/liblynq-data/liblynq-data.bb b/meta/meta-mediatek-mt2731/recipes-lynq/liblynq-data/liblynq-data.bb
new file mode 100755
index 0000000..55cf572
--- /dev/null
+++ b/meta/meta-mediatek-mt2731/recipes-lynq/liblynq-data/liblynq-data.bb
@@ -0,0 +1,49 @@
+inherit externalsrc package

+

+DESCRIPTION = "lynq call"

+LICENSE = "MediaTekProprietary"

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

+DEPENDS += "platform-libs audio-mixer-ctrl libpal gstreamer1.0 glib-2.0 dtmf libapn liblynq-log"

+inherit workonsrc

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

+

+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 -mfpu=neon-vfpv4 -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 -mfpu=neon-vfpv4 -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 -mfpu=neon-vfpv4 -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 -af ${S}/include/libdata/ ${D}${includedir}/libdata

+    fi

+}

diff --git a/meta/meta-mediatek-mt2731/recipes-lynq/liblynq-sim/liblynq-sim.bb b/meta/meta-mediatek-mt2731/recipes-lynq/liblynq-sim/liblynq-sim.bb
new file mode 100755
index 0000000..a960bba
--- /dev/null
+++ b/meta/meta-mediatek-mt2731/recipes-lynq/liblynq-sim/liblynq-sim.bb
@@ -0,0 +1,58 @@
+inherit externalsrc package
+
+DESCRIPTION = "liblynq-uci.so demo"
+LICENSE = "CLOSED"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=e1696b147d49d491bcb4da1a57173fff"
+DEPENDS += "platform-libs platform-libs-common libpal liblynq-log libvendor-ril"
+inherit workonsrc
+WORKONSRC = "${TOPDIR}/../src/lynq/lib/liblynq-sim/"
+
+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 "
+
+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 -af ${S}/include/ ${D}${includedir}/
+    fi 
+}
+
+addtask bachclean
+do_bachclean () {
+    oe_runmake clean
+}
diff --git a/meta/meta-mediatek-mt2731/recipes-lynq/liblynq-sim/liblynq-sim.bb.bak b/meta/meta-mediatek-mt2731/recipes-lynq/liblynq-sim/liblynq-sim.bb.bak
new file mode 100755
index 0000000..5568982
--- /dev/null
+++ b/meta/meta-mediatek-mt2731/recipes-lynq/liblynq-sim/liblynq-sim.bb.bak
@@ -0,0 +1,64 @@
+inherit externalsrc package
+
+DESCRIPTION = "libtel-ril.so demo"
+SECTION = "base"
+LICENSE = "MediaTekProprietary"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=e1696b147d49d491bcb4da1a57173fff"
+DEPENDS += "platform-libslibvendor-ril liblynq-log"
+inherit workonsrc
+WORKONSRC = "${TOPDIR}/../src/lynq/lib/liblynq-sim"
+
+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 -mfpu=neon-vfpv4 -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 -mfpu=neon-vfpv4 -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 -mfpu=neon-vfpv4 -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 -af ${S}/include/ ${D}${includedir}/
+    fi
+}
+
+addtask bachclean
+do_bachclean () {
+    oe_runmake clean
+}
+
diff --git a/meta/meta-mediatek-mt2731/recipes-lynq/liblynq-tele-ril/liblynq-tele-ril.bb b/meta/meta-mediatek-mt2731/recipes-lynq/liblynq-tele-ril/liblynq-tele-ril.bb
old mode 100644
new mode 100755
index 2157204..c9243f4
--- a/meta/meta-mediatek-mt2731/recipes-lynq/liblynq-tele-ril/liblynq-tele-ril.bb
+++ b/meta/meta-mediatek-mt2731/recipes-lynq/liblynq-tele-ril/liblynq-tele-ril.bb
@@ -4,9 +4,9 @@
 SECTION = "base"
 LICENSE = "MediaTekProprietary"
 LIC_FILES_CHKSUM = "file://LICENSE;md5=e1696b147d49d491bcb4da1a57173fff"
-DEPENDS += "platform-libs audio-mixer-ctrl libvendor-ril  libpal gstreamer1.0 glib-2.0 dtmf libapn dbus liblynq-log"
+DEPENDS += "platform-libs libvendor-ril liblynq-log"
 inherit workonsrc
-WORKONSRC = "${TOPDIR}/../src/lynq/lib/liblynq-tele-ril"
+WORKONSRC = "${TOPDIR}/../src/lynq/lib/liblynq-sim/"
 
 TARGET_CC_ARCH += "${LDFLAGS}"
 BB_INCLUDE_ADD = "--sysroot=${STAGING_DIR_HOST}"
@@ -53,7 +53,7 @@
 
     if [ -d "${WORKONSRC}" ] ; then
         install -d ${D}${includedir}/libtel
-        cp -af ${S}/include/libtel ${D}${includedir}/libtel
+        cp -af ${S}/include/ ${D}${includedir}/
     fi
 }
 
diff --git a/meta/meta-mediatek-mt2731/recipes-lynq/liblynq-tele-ril/liblynq-tele-ril.bb.bak b/meta/meta-mediatek-mt2731/recipes-lynq/liblynq-tele-ril/liblynq-tele-ril.bb.bak
new file mode 100755
index 0000000..77c8c9d
--- /dev/null
+++ b/meta/meta-mediatek-mt2731/recipes-lynq/liblynq-tele-ril/liblynq-tele-ril.bb.bak
@@ -0,0 +1,64 @@
+inherit externalsrc package
+
+DESCRIPTION = "libtel-ril.so demo"
+SECTION = "base"
+LICENSE = "MediaTekProprietary"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=e1696b147d49d491bcb4da1a57173fff"
+DEPENDS += "platform-libs libvendor-ril liblynq-log"
+inherit workonsrc
+WORKONSRC = "${TOPDIR}/../src/lynq/lib/liblynq-sim/"
+
+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}/libtel
+        cp -af ${S}/include ${D}${includedir}
+    fi
+}
+
+addtask bachclean
+do_bachclean () {
+    oe_runmake clean
+}
+
diff --git a/meta/meta-mediatek-mt2731/recipes-lynq/lynq-function-test/lynq-function-test.bb b/meta/meta-mediatek-mt2731/recipes-lynq/lynq-function-test/lynq-function-test.bb
old mode 100644
new mode 100755
index 63a6323..78eb5bb
--- a/meta/meta-mediatek-mt2731/recipes-lynq/lynq-function-test/lynq-function-test.bb
+++ b/meta/meta-mediatek-mt2731/recipes-lynq/lynq-function-test/lynq-function-test.bb
@@ -3,8 +3,7 @@
 DESCRIPTION = "function test"
 LICENSE = "MediaTekProprietary"
 LIC_FILES_CHKSUM = "file://LICENSE;md5=e1696b147d49d491bcb4da1a57173fff"
-DEPENDS += "platform-libs libpal liblynq-driver-control libvendor-ril liblynq-broadcast gstreamer1.0 glib-2.0 dtmf libapn dbus gpshal liblynq-log liblynq-tele-ril \
-			liblynq-protcl liblynq-fota nandapi"
+DEPENDS += "platform-libs liblynq-data liblynq-call"
 inherit workonsrc
 WORKONSRC = "${TOPDIR}/../src/lynq/packages/apps/lynq-function-test/src"
 
@@ -26,6 +25,6 @@
 
 do_install() {
 	install -d ${D}${bindir}/
-	install -m 0755 ${S}/lynq-function-test ${D}${bindir}/
+	install -m 0755 ${S}/lynq-sim-test ${D}${bindir}/
 	install -d ${D}${includedir}
 }
diff --git a/meta/meta-mediatek-mt2731/recipes-lynq/lynq-function-test/lynq-function-test.bb.bak b/meta/meta-mediatek-mt2731/recipes-lynq/lynq-function-test/lynq-function-test.bb.bak
new file mode 100755
index 0000000..54045cd
--- /dev/null
+++ b/meta/meta-mediatek-mt2731/recipes-lynq/lynq-function-test/lynq-function-test.bb.bak
@@ -0,0 +1,30 @@
+inherit externalsrc package
+
+DESCRIPTION = "function test"
+LICENSE = "MediaTekProprietary"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=e1696b147d49d491bcb4da1a57173fff"
+DEPENDS += "platform-libs liblynq-data"
+inherit workonsrc
+WORKONSRC = "${TOPDIR}/../src/lynq/packages/apps/lynq-function-test/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-sim-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
old mode 100644
new mode 100755
index 37b06f3..9d14979
--- a/meta/meta-mediatek-mt2731/recipes-lynq/packagegroups/packagegroup-lync-mt2731.bb
+++ b/meta/meta-mediatek-mt2731/recipes-lynq/packagegroups/packagegroup-lync-mt2731.bb
@@ -9,16 +9,15 @@
     lynq-broadcast-receive \
     lynq-broadcast-send \
     liblynq-protcl \
-    lynq-threadhandle \
     lynq-tcpcli \
     lynq-tcpser \
     lynq-udpcli \
     lynq-udpser \
     liblynq-log \
-    lynq-factorytest \
 	liblynq-fota \
-    liblynq-tele-ril \
-    lynq-tele-cmd-test \
+	liblynq-sim \
+	liblynq-data \
+	liblynq-call \
     lynq-function-test \
 	logrotate \
 	lynq-logrotate-service \
diff --git a/meta/meta-mediatek-mt2731/recipes-lynq/packagegroups/packagegroup-lync-mt2731.bb.bak b/meta/meta-mediatek-mt2731/recipes-lynq/packagegroups/packagegroup-lync-mt2731.bb.bak
new file mode 100755
index 0000000..f38b1ad
--- /dev/null
+++ b/meta/meta-mediatek-mt2731/recipes-lynq/packagegroups/packagegroup-lync-mt2731.bb.bak
@@ -0,0 +1,26 @@
+SUMMARY = "Lynq Package Group - MT2731"
+LICENSE = "MediaTekProprietary"
+
+inherit packagegroup
+
+RDEPENDS_packagegroup-lync-mt2731 = "\
+    lynq-system-service \     
+    liblynq-driver-control \
+    lynq-broadcast-receive \
+    lynq-broadcast-send \
+    liblynq-protcl \
+    lynq-tcpcli \
+    lynq-tcpser \
+    lynq-udpcli \
+    lynq-udpser \
+    liblynq-log \
+	liblynq-fota \
+	liblynq-sim \
+	liblynq-data \
+    lynq-function-test \
+	logrotate \
+	lynq-logrotate-service \
+	lynq-konoda-rock \
+    lynq-atsvc \
+    liblynq-logdata-handle \
+"
diff --git a/meta/meta-mediatek-mt2731/recipes-yummy/images/mtk-image-bach.inc b/meta/meta-mediatek-mt2731/recipes-yummy/images/mtk-image-bach.inc
old mode 100644
new mode 100755
index 211928f..3fc5e2b
--- a/meta/meta-mediatek-mt2731/recipes-yummy/images/mtk-image-bach.inc
+++ b/meta/meta-mediatek-mt2731/recipes-yummy/images/mtk-image-bach.inc
@@ -6,7 +6,7 @@
 
 IMAGE_ROOTFS_SIZE ?= "1024"
 
-STATE_DIR_CONTENT = "${IMAGE_ROOTFS}/home ${IMAGE_ROOTFS}/usr/lib/tmpfiles.d ${IMAGE_ROOTFS}/etc/firmware ${IMAGE_ROOTFS}/etc/syslog ${IMAGE_ROOTFS}/mnt ${IMAGE_ROOTFS}/srv   ${IMAGE_ROOTFS}/usr/local ${IMAGE_ROOTFS}/system/etc/firmware ${IMAGE_ROOTFS}/custom/etc/firmware ${IMAGE_ROOTFS}/var/lib ${IMAGE_ROOTFS}/data ${IMAGE_ROOTFS}/system/etc/tele ${IMAGE_ROOTFS}/system/etc/adr ${IMAGE_ROOTFS}/system/etc/agps ${IMAGE_ROOTFS}/system/etc/security ${IMAGE_ROOTFS}/etc/adr ${IMAGE_ROOTFS}/usr/share/gps"
+STATE_DIR_CONTENT = "${IMAGE_ROOTFS}/home ${IMAGE_ROOTFS}/usr/lib/tmpfiles.d ${IMAGE_ROOTFS}/etc/firmware ${IMAGE_ROOTFS}/etc/syslog ${IMAGE_ROOTFS}/mnt ${IMAGE_ROOTFS}/srv   ${IMAGE_ROOTFS}/usr/local ${IMAGE_ROOTFS}/system/etc/firmware ${IMAGE_ROOTFS}/custom/etc/firmware ${IMAGE_ROOTFS}/var/lib ${IMAGE_ROOTFS}/data ${IMAGE_ROOTFS}/system/etc/tele ${IMAGE_ROOTFS}/system/etc/adr ${IMAGE_ROOTFS}/system/etc/agps ${IMAGE_ROOTFS}/system/etc/security ${IMAGE_ROOTFS}/etc/adr ${IMAGE_ROOTFS}/usr/share/gps   ${IMAGE_ROOTFS}/var/log   ${IMAGE_ROOTFS}/log"
 STATE_DIR_IMAGE_SIZE ?= "14336"
 VENDOR_PROP_FILE = "${IMAGE_ROOTFS}/vendor/build.prop"
 
diff --git a/src/bach/build.bach/work/libvendor-ril/mtk-rilproxy/framework/base/RfxTransferUtils.h b/src/bach/build.bach/work/libvendor-ril/mtk-rilproxy/framework/base/RfxTransferUtils.h
index c9027ec..2f7da2b 100755
--- a/src/bach/build.bach/work/libvendor-ril/mtk-rilproxy/framework/base/RfxTransferUtils.h
+++ b/src/bach/build.bach/work/libvendor-ril/mtk-rilproxy/framework/base/RfxTransferUtils.h
@@ -47,6 +47,12 @@
 #include "RfxLog.h"
 #include <cutils/jstring.h>
 
+/*Warren add for t800 ril service 2021/12/15 start*/
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+/*Warren add for t800 ril service 2021/12/15 end*/
+
 #ifdef HAVE_AEE_FEATURE
 #include "aee.h"
 #endif
@@ -96,6 +102,11 @@
 
 typedef struct RequestInfo {
     int32_t token;      // this is not RIL_Token
+    /*Warren add for t800 ril service 2021/12/15 start*/
+    int uToken;
+    int lynqEvent;
+    struct sockaddr_in uClient_addr;
+    /*Warren add for t800 ril service 2021/12/15 end*/
     CommandInfo *pCI;
     struct RequestInfo *p_next;
     char cancelled;
diff --git a/src/bach/build.bach/work/libvendor-ril/mtk-rilproxy/framework/include/core/RfxDispatchThread.h b/src/bach/build.bach/work/libvendor-ril/mtk-rilproxy/framework/include/core/RfxDispatchThread.h
old mode 100644
new mode 100755
index 50e5921..b5464b5
--- a/src/bach/build.bach/work/libvendor-ril/mtk-rilproxy/framework/include/core/RfxDispatchThread.h
+++ b/src/bach/build.bach/work/libvendor-ril/mtk-rilproxy/framework/include/core/RfxDispatchThread.h
@@ -80,6 +80,11 @@
     } CommandInfo;
     typedef struct RequestInfo {
         int32_t token;      // this is not RIL_Token
+        /*Warren add for t800 ril service 2021/12/15 start*/
+        int uToken;
+        int lynqEvent;
+        struct sockaddr_in uClient_addr;
+        /*Warren add for t800 ril service 2021/12/15 end*/
         CommandInfo *pCI;
         struct RequestInfo *p_next;
         char cancelled;
diff --git a/src/lynq/framework/lynq-atsvc/src/cc.cpp b/src/lynq/framework/lynq-atsvc/src/cc.cpp
old mode 100644
new mode 100755
index c5ca779..e647c52
--- a/src/lynq/framework/lynq-atsvc/src/cc.cpp
+++ b/src/lynq/framework/lynq-atsvc/src/cc.cpp
@@ -44,6 +44,11 @@
 #include <string>
 #include <thread>
 #include "eCall.h"
+/*Warren add for t800 ril servie 2021/12/23 start*/
+#include "lynq_interface.h"
+#include <binder/Parcel.h>
+using android::Parcel;
+/*Warren add for t800 ril servie 2021/12/23 end*/
 
 static int dtmf_volume = 0;
 void *dtmf_handle = NULL;
@@ -857,6 +862,7 @@
 int setDtmfVolume(int argc, char **argv, RIL_SOCKET_ID socket_id, RequestInfo *pRI)
 {
     int setValue = 0;
+    Parcel p;
     RLOGD("setDtmfVolume start!");
 
     if(argc < 2) {
@@ -869,12 +875,21 @@
     RLOGD("set dtmf Volume value is %d!",setValue);
     if(setValue < DTMF_MIN_VOLUME || setValue > DTMF_MAX_VOLUME) {
         RLOGW("Warning: set volume value is over-range!");
+        /*Warren add for t800 ril service 2021/12/23 start*/
+        android::lynqAssemblyParcelheader(p,socket_id,LYNQ_REQUEST_SET_DTMF_VOLUME,0,2);
+        android::LYNQ_RIL_respSocket_sp(p,pRI);
+        /*Warren add for t800 ril service 2021/12/23 end*/
         free(pRI);
         return -1;
     }
     //paramter is from 0 to 36
     dtmf_volume = setValue;
-
+    printf(">>>>set dtmf Volume<<<< success value is %d!\n",setValue);
+    /*Warren add for t800 ril service 2021/12/23 start*/
+    android::lynqAssemblyParcelheader(p,socket_id,LYNQ_REQUEST_SET_DTMF_VOLUME,0,0);
+    printf(">>>>set dtmf Volume<<<< success value is %d!\n",setValue);
+    /*Warren add for t800 ril service 2021/12/23 end*/
+    android::LYNQ_RIL_respSocket_sp(p,pRI);
     free(pRI);
     return 0;
 }
@@ -1239,19 +1254,36 @@
 //RIL_REQUEST_SET_MUTE
 int setMute(int argc, char **argv, RIL_SOCKET_ID socket_id, RequestInfo *pRI)
 {
-    if(pRI) {
-        free(pRI);
+    Parcel p;
+    printf("WARREN TEST002!!!\n");
+    if(argc<2)
+    {
+        if(pRI)
+        {
+            free(pRI);
+        }
+        return -1;
     }
     bool mute = (atoi(argv[1]) > 0) ? true: false;
     RLOGD("set mute %s", ((atoi(argv[1]) > 0) ? "on": "off"));
     int ret = setCallMute(mute);
     std::string str;
     if(ret) {
-        str.append("set mute fail, please try agian\n");
+        /*Warren add for t800 ril service 2021/12/23 start*/
+        android::lynqAssemblyParcelheader(p,socket_id,RIL_REQUEST_GET_MUTE,0,2);
+        /*Warren add for t800 ril service 2021/12/23 start*/
+        printf("set mute fail, please try agian\n");
     } else {
-        str.append("set mute ");
-        str.append((atoi(argv[1]) > 0) ? "on ": "off ");
-        str.append("success\n");
+        /*Warren add for t800 ril service 2021/12/23 start*/
+        android::lynqAssemblyParcelheader(p,socket_id,RIL_REQUEST_GET_MUTE,0,0);
+        /*Warren add for t800 ril service 2021/12/23 start*/
+    }
+    /*Warren add for t800 ril service 2021/12/23 start*/
+    printf("set mute %s\n", ((atoi(argv[1]) > 0) ? "on": "off"));
+    android::LYNQ_RIL_respSocket(p,(void *)pRI);
+    /*Warren add for t800 ril service 2021/12/23 start*/
+    if(pRI) {
+        free(pRI);
     }
     android::emResultNotify(str.c_str());
     return 0;
@@ -1260,19 +1292,26 @@
 //RIL_REQUEST_GET_MUTE
 int getMute(int argc, char **argv, RIL_SOCKET_ID socket_id, RequestInfo *pRI)
 {
-    if(pRI) {
-        free(pRI);
-    }
-    std::string str;
+    Parcel p;
+    printf("WARREN TEST001!!!\n");
     int mute = getCallMute();
     //TBC -200 fail status
     if(mute == -200) {
-        str.append("get mute state fail, please check whether does call exsit. \n");
+        printf("get mute state fail, please check whether does call exsit.\n");
+        /*Warren add for t800 ril service 2021/12/23 start*/
+        android::lynqAssemblyParcelheader(p,socket_id,RIL_REQUEST_GET_MUTE,0,2);
+        /*Warren add for t800 ril service 2021/12/23 end*/
     } else {
-        str.append("current mute state is ");
-        str.append((mute == 1) ? "on\n" : "off\n");
+        /*Warren add for t800 ril service 2021/12/23 start*/
+        android::lynqAssemblyParcelheader(p,socket_id,RIL_REQUEST_GET_MUTE,0,0);
+        /*Warren add for t800 ril service 2021/12/23 end*/
     }
-    android::emResultNotify(str.c_str());
+    printf("current mute state is%s",((mute == 1) ? "on\n" : "off\n"));
+    p.writeInt32(mute);
+    android::LYNQ_RIL_respSocket(p,(void *)pRI);
+    if(pRI) {
+        free(pRI);
+    }
     return 0;
 }
 
diff --git a/src/lynq/framework/lynq-atsvc/src/commands.h b/src/lynq/framework/lynq-atsvc/src/commands.h
old mode 100644
new mode 100755
index e5fc836..6aa6cb3
--- a/src/lynq/framework/lynq-atsvc/src/commands.h
+++ b/src/lynq/framework/lynq-atsvc/src/commands.h
@@ -90,7 +90,9 @@
     {"RIL_REQUEST_SET_SPEECH_OFF",setSpeechOff,"set Speech Off",-1},
     #endif
     {"RIL_REQUEST_SET_SPEECH_VOLUME",setSpeechVolume,"set Speech Volume",-1},
-    {"RIL_REQUEST_SET_DTMF_VOLUME",setDtmfVolume,"set dtmf Volume",-1},
+    /*Warren change for t800 ril service 2021/12/24 start*/
+    {"RIL_REQUEST_SET_DTMF_VOLUME",setDtmfVolume,"set dtmf Volume",LYNQ_REQUEST_SET_DTMF_VOLUME},
+    /*Warren change for t800 ril service 2021/12/24 start*/
 //    {"RIL_REQUEST_OEM_HOOK_STRINGS",invokeOemRilRequestStrings,"invoke Oem Ril Request Strings",RIL_REQUEST_OEM_HOOK_STRINGS},
     {"RIL_REQUEST_ADD_IMS_CONFERENCE_CALL_MEMBER",addImsConferenceCallMember,"add Ims Conference Call Member",RIL_REQUEST_ADD_IMS_CONFERENCE_CALL_MEMBER},
     {"RIL_REQUEST_REMOVE_IMS_CONFERENCE_CALL_MEMBER",removeImsConferenceCallMember,"remove Ims Conference Call Member",RIL_REQUEST_REMOVE_IMS_CONFERENCE_CALL_MEMBER},
diff --git a/src/lynq/framework/lynq-atsvc/src/common.cpp b/src/lynq/framework/lynq-atsvc/src/common.cpp
old mode 100644
new mode 100755
index 8514f6b..277f88b
--- a/src/lynq/framework/lynq-atsvc/src/common.cpp
+++ b/src/lynq/framework/lynq-atsvc/src/common.cpp
@@ -636,6 +636,17 @@
         }
         break;
     }
+#ifdef TELEMATIC_5G_SUPPORT
+    case RADIO_TECH_NR://5G
+    {
+        if(request == RIL_REQUEST_VOICE_REGISTRATION_STATE) {
+            printf("[QUERY][VOICE REG_STATUS][SIM%d] The registered radio technology is 5G\n", slot);
+        } else {
+            printf("[QUERY][DATA  REG_STATUS][SIM%d] The registered radio technology is 5G\n", slot);
+        }
+        break;
+    }
+#endif
     case RADIO_TECH_UNKNOWN:
     {
         if(request == RIL_REQUEST_VOICE_REGISTRATION_STATE) {
@@ -762,3 +773,60 @@
     pthread_cond_broadcast(&s_DataCond);
     pthread_mutex_unlock(&s_DataMutex);
 }
+bool mtkItTest(const char* data) {
+    std::string str("");
+    str.append(data);
+    RLOGD("%s, data: %s", __FUNCTION__, str.c_str());
+    std::vector<std::string> all;
+    RequestInfo* pRI = NULL;
+    utils::tokenize(str, ',', all);
+    if(all[0] != std::string("TEST")) {
+        return false;
+    }
+    android::Parcel p;
+    size_t pos = p.dataPosition();
+    for(int i = 1 ; i < all.size(); i++) {
+        std::string str = all[i];
+        RLOGD("%s, all[%d]: %s", __FUNCTION__, i, str.c_str());
+        std::vector<std::string> items;
+        utils::tokenize(str, '=', items);
+        if(items.size() == 2) {
+            if(items[0] == std::string("INT")) {
+                int para = std::stoi(items[1]);
+                p.writeInt32(para);
+            } else if(items[0] == std::string("STR")) {
+                writeStringToParcel(p, items[1].c_str());
+            } else if(items[0] == std::string("REQ")) {
+                int request = std::stoi(items[1]);
+                pRI = creatRILInfoAndInit(request, UDP, (RIL_SOCKET_ID) ((0)));
+            }
+        } else {
+            RLOGD("%s, too many \"=\"");
+        }
+    }
+    if(pRI && pRI->pCI) {
+        p.setDataPosition(pos);
+        pRI->pCI->dispatchFunction(p, pRI);
+    } else {
+        if(pRI) {
+            free(pRI);
+            pRI = NULL;
+        }
+    }
+    return true;
+}
+int lynqSocketSendto(int fd,struct sockaddr *dest_addr,int addr_len,char msg[])
+{
+    int ret = 0;
+    ret = sendto(fd,msg,strlen(msg),0,dest_addr,addr_len);
+    if(ret>0)
+    {
+        RLOGD("[lynqSocketSendto] send msg success!!!");
+        return 0;
+    }
+    else
+    {
+        RLOGD("[lynqSocketSendto] send msg fail!!!");
+        return -1;
+    }
+}
diff --git a/src/lynq/framework/lynq-atsvc/src/common.h b/src/lynq/framework/lynq-atsvc/src/common.h
old mode 100644
new mode 100755
index 3ef3d0b..b36822b
--- a/src/lynq/framework/lynq-atsvc/src/common.h
+++ b/src/lynq/framework/lynq-atsvc/src/common.h
@@ -46,6 +46,11 @@
 #include "powerManager.h"
 #include "rfdesense/RfDesenseTxTest.h"
 #include "util/AtLine.h"
+/*Warren add for t800 ril service 2021/12/15 start*/
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+/*Warren add for t800 ril service 2021/12/15 start*/
 
 #define DEBUG 0
 #define FUNCTION_CALLED(time,msg) printf("%s: %s %s called\n",(time), __func__ ,(msg));
@@ -68,11 +73,47 @@
 #define ATCI 3
 #define RSPD 4
 #define OTHER 5
-
+//Warren add for plantform 2021_08_11 start
+#define MAX_LEN 101
+#define MAX_QUEST_LEN 12
+//Warren add for plantform 2021_08_11 end
 #define PROP_DEFAULT_DATA_SIM "persist.vendor.radio.data.sim"
 #define PROP_DEFAULT_DATA_SIM_STATUS "vendor.radio.data.enable"
 #define ATCI_SIM "persist.vendor.service.atci.sim"
 //#define PROP_DATA_ALLOW_STATUS "vendor.ril.data.allow.status"
+//Warren add for plantform 2021_08_11 start
+/* 
+**The range of error values unique to LYNQ is 8000 to 10000.
+**The sim card state is error.
+*/
+typedef enum{
+    LYNQ_E_CARDSTATE_ERROR=8000,
+    /* The voice service state is out of service*/
+    LYNQ_E_STATE_OUT_OF_SERVICE=8001,
+    /* The voice service state is EMERGENCY_ONLY*/
+    LYNQ_E_STATE_EMERGENCY_ONLY=8002,
+    /* The radio power is power off*/
+    LYNQ_E_STATE_POWER_OFF=8003,
+    LYNQ_E_TIME_OUT=8004,
+    /*create or open sms DB fail */
+    LYNQ_E_SMS_DB_FAIL=8005,
+    /*Failed to execute sql statement*/
+    LYNQ_E_SMS_SQL_FAIL = 8006,
+    LYNQ_E_SMS_NOT_FIND = 8007,
+    /* The logic conflict*/
+    LYNQ_E_CONFLICT=9000,
+    /*Null anomaly*/
+    LYNQ_E_NULL_ANONALY=9001
+}LYNQ_E;
+/*Warren add for t800 RIL Service 2021/12/10 start*/
+
+typedef struct{
+    int uToken;
+    int request;
+    int paramLen;
+    char param[1024*8];
+}lynq_client_t;
+/*Warren add for t800 RIL Service 2021/12/10 end*/
 
 #define UNSET -1
 
@@ -89,10 +130,12 @@
     char cancelled;
     char local;         // responses to local commands do not go back to command process
     RIL_SOCKET_ID socket_id;
-    /*Warren add for LYNQ platform 2021/9/30 start*/
-    int lynqEvent;    // 1:lynq event.0;lynq not core.
-    int uToken;       //for mulit user
-    /*Warren add for LYNQ platform 2021/9/30 start*/
+    /*Warren add for t800 ril service 2021/12/15 start*/
+    int uToken;
+    int lynqEvent;
+    struct sockaddr_in uClient_addr;
+    /*Warren add for t800 ril service 2021/12/15 end*/
+    
 } RequestInfo;
 
 /*Warren add for FAW 2021/11/1 start*/
@@ -172,6 +215,7 @@
 int get_default_sim_all_except_data();
 RequestInfo* creatRILInfoAndInit(int request, int mode, RIL_SOCKET_ID soc_id);
 int get_atci_sim();
+bool mtkItTest(const char* data);
 
 void updateSystemTime(const void *data, int datalen);
 void notifyDataSignal();
@@ -203,6 +247,15 @@
     int sendUrcToUsb(char *cmd);
     int lynqSendToRil(int argc,char *argv[],int uToken);
     /*Warren add for FAW platform 2021/9/27 end*/
+    /*Warren add for t800 RIL Service 2021/12/10 start*/
+    int lynqSocketSendto(int fd,struct sockaddr *dest_addr,int addr_len,char msg[]);
+/*Warren add for t800 RIL Service 2021/12/10 end*/
+/*Warren add for t800 ril service 2021/12/23 start*/
+    int lynqAssemblyParcelheader(Parcel &p,int slot,int request,int respType,int error);
+    int LYNQ_RIL_respSocket(Parcel &p,RIL_Token t);
+    int LYNQ_RIL_respSocket_sp(Parcel &p,RequestInfo *pRI);
+    int LYNQ_RIL_urcBroadcast(Parcel &p);
+/*Warren add for t800 ril service 2021/12/23 end*/
 }
 
 #endif
diff --git a/src/lynq/framework/lynq-atsvc/src/data/data.cpp b/src/lynq/framework/lynq-atsvc/src/data/data.cpp
old mode 100644
new mode 100755
index 2055358..1207295
--- a/src/lynq/framework/lynq-atsvc/src/data/data.cpp
+++ b/src/lynq/framework/lynq-atsvc/src/data/data.cpp
@@ -55,6 +55,12 @@
 #include "lynq_common.h"
 /*Warren add for FAW T103 2021/11/2 end*/
 
+/*Warren add forT800 platform 2021/12/25 start*/
+
+#include "lynq_interface.h"
+using android::Parcel;
+/*Warren add for t800 ril service  2021/12/25 end*/
+
 #undef LOG_TAG
 #define LOG_TAG "DEMO_DATA"
 
@@ -759,10 +765,12 @@
 }
 
 int setupDataCall(int argc, char **argv, RIL_SOCKET_ID socket_id, RequestInfo *pRI)
-{
+{   
+    Parcel p;
     if(argc > 2)
     {
         /*Warren add for t103 szzt atsvc 2022/1/5 start*/
+        char* apnType = argv[1];
         int result = 0;
         RLOGD("[setupDataCall] apn_count1:%d\n",apn_count);
         if(apn_count > 0)
@@ -773,12 +781,36 @@
                 if(strcmp(apn_table[i].apntype,argv[1])==0)//it means that argv[1] apn has been created.
                 {
                     //syncRespToUsb(0);
+                    Parcel urc_p;
+                    p.writeInt32(0);
+                    p.writeInt32(pRI->pCI->requestNumber);
+                    p.writeInt32(socket_id);
+                    p.writeInt32(0);
+                    android::LYNQ_RIL_respSocket(p, (void *)pRI);
+                    urc_p.writeInt32(1);
+                    urc_p.writeInt32(LYNQ_URC_DATA_CALL_STATUS_IND);
+                    urc_p.writeInt32(socket_id);
+                    urc_p.writeInt32(apn_table[i].apnstatus);
+                    writeStringToParcel(urc_p, apn_table[i].apn);
+                    writeStringToParcel(urc_p, apn_table[i].apntype);
+                    writeStringToParcel(urc_p, apn_table[i].ifaceName);
+                    android::LYNQ_RIL_urcBroadcast(urc_p);
                     RLOGD("apn:%s,apntype:%s",apn_table[i].apn,apn_table[i].apntype);
                     return -1;
                 }
             }
         }
         result = setupDataCallargc(argc,argv,socket_id,pRI);
+        p.writeInt32 (0);
+        p.writeInt32 (pRI->pCI->requestNumber);
+        p.writeInt32(socket_id);
+        p.writeInt32 (0);
+        android::LYNQ_RIL_respSocket(p, (void *)pRI);
+        if (pRI != NULL)
+        {
+            free(pRI);
+        }
+        result = setupDataCallargc(argc,argv,socket_id,pRI);
         return result;
         /*Warren add for t103 szzt atsvc 2022/1/5 end*/
     }
@@ -791,6 +823,20 @@
             if(strcmp(apn_table[i].apntype,"default")==0)//it means that default apn has been created.
             {
                 //syncRespToUsb(0);
+                Parcel urc_p;
+                p.writeInt32 (0);
+                p.writeInt32 (pRI->pCI->requestNumber);
+                p.writeInt32(socket_id);
+                p.writeInt32 (0);
+                android::LYNQ_RIL_respSocket(p, (void *)pRI);
+                urc_p.writeInt32(1);
+                urc_p.writeInt32(LYNQ_URC_DATA_CALL_STATUS_IND);
+                urc_p.writeInt32(socket_id);
+                urc_p.writeInt32(apn_table[i].apnstatus);
+                writeStringToParcel(urc_p, apn_table[i].apn);
+                writeStringToParcel(urc_p, apn_table[i].apntype);
+                writeStringToParcel(urc_p, apn_table[i].ifaceName);
+                android::LYNQ_RIL_urcBroadcast(urc_p);
                 RLOGD("apn:%s,apntype:%s",apn_table[i].apn,apn_table[i].apntype);
                 return -1;
             }
@@ -805,6 +851,11 @@
     memset(line, 27*sizeof(char), 0);
 
     updataDataConnectState(get_default_sim_data(), true);
+    p.writeInt32 (0);
+    p.writeInt32 (pRI->pCI->requestNumber);
+    p.writeInt32(socket_id);
+    p.writeInt32 (0);
+    android::LYNQ_RIL_respSocket(p, (void *)pRI);
     /* no response from telecore, free pRI prevent memory leak */
     if (pRI != NULL) {
         free(pRI);
@@ -856,7 +907,7 @@
 {
     if(argc != 8)
     {
-        free(pRI);
+        //free(pRI);
         RLOGD("the parameters numbers isn't right , so return");
         return -1;
     }
@@ -866,19 +917,19 @@
     char* apnType = argv[2];
     if(strcasecmp(apnType, "null") == 0)
     {
-        free(pRI);
+        //free(pRI);
         RLOGD("apnType shouldn't is null");
         return -1;
     }
     if(!isEnableLocalconf()) {
-        free(pRI);
+        //free(pRI);
         return enableData(true, apnType);
     }
     for(int i =0; i < 8; i++)
     {
         if(apnType != NULL && strcmp(current_cid[i].apn_type, apnType) == 0)
         {
-            free(pRI);
+            //free(pRI);
             RLOGD("PDN existed, only return. type: %s",apnType);
             return -1;
         }
@@ -891,7 +942,7 @@
     char* apn = argv[1];
     if(strcasecmp(apn, "null") == 0)
     {
-        free(pRI);
+        //free(pRI);
         RLOGD("apn shouldn't is null");
         return -1;
     }
@@ -930,7 +981,7 @@
 
     if(getIntefaceId(apnType) == INVALID_VALUE)
     {
-        free(pRI);
+        //free(pRI);
         RLOGE("the PDN exsited for %s type or PDN number max", apnType);
         return -1;
     }
@@ -962,14 +1013,14 @@
 {
     if(argc != 2)
     {
-        free(pRI);
+        //free(pRI);
         RLOGD("the peremeters numbers isn't right , so return");
         return -1;
     }
 
     char* apnType = argv[1];
     if(!isEnableLocalconf()) {
-        free(pRI);
+        //free(pRI);
         return enableData(false, apnType);
     }
     char cid[8];
@@ -977,7 +1028,7 @@
     int temp_cid = getcid(apnType);
     if(temp_cid == INVALID_VALUE)
     {
-        free(pRI);
+        //free(pRI);
         RLOGD("cid is invalid");
         return -1;
     }
@@ -1001,6 +1052,8 @@
 int deactivateDataCall(int argc, char **argv, RIL_SOCKET_ID socket_id, RequestInfo *pRI)
 {
     int ret = -1;
+    bool hasDeactivate = TRUE;
+    Parcel p;
     if(argc == 2)
     {
         char* apnType = argv[1];
@@ -1025,13 +1078,25 @@
                 }
             }
             if(!flag)
-            {
+            {   
+                p.writeInt32 (0);
+                p.writeInt32 (pRI->pCI->requestNumber);
+                p.writeInt32(socket_id);
+                p.writeInt32 (2);//RIL_E_GENERIC_FAILURE
+                android::LYNQ_RIL_respSocket(p, (void *)pRI);
                 goto invalid;
+                return -1;
             }
         }
         else
-        {
+        {   
+            p.writeInt32 (0);
+            p.writeInt32 (pRI->pCI->requestNumber);
+            p.writeInt32(socket_id);
+            p.writeInt32 (2);//RIL_E_GENERIC_FAILURE
+            android::LYNQ_RIL_respSocket(p, (void *)pRI);
             goto invalid;
+            return -1;
         }
         re = deactivateDataCallarc(argc,argv,socket_id,pRI);
         return re;
@@ -1055,13 +1120,25 @@
             }
         }
         if(!flag)
-        {
+        {   
+            p.writeInt32 (0);
+            p.writeInt32 (pRI->pCI->requestNumber);
+            p.writeInt32(socket_id);
+            p.writeInt32 (2);//RIL_E_GENERIC_FAILURE
+            android::LYNQ_RIL_respSocket(p, (void *)pRI);
             goto invalid;
+            return -1;
         }
     }
     else
     {
-        goto invalid;
+            p.writeInt32 (0);
+            p.writeInt32 (pRI->pCI->requestNumber);
+            p.writeInt32(socket_id);
+            p.writeInt32 (2);//RIL_E_GENERIC_FAILURE
+            android::LYNQ_RIL_respSocket(p, (void *)pRI);
+            goto invalid;
+            return -1;
     }
     /*Warren add for FAW T103 2021/11/2 end*/
     char cmd[256];
@@ -1072,6 +1149,11 @@
     memset(line, LEN*sizeof(char), 0);
     memset(line, 27*sizeof(char), 0);
     updataDataConnectState(get_default_sim_data(), false);
+    p.writeInt32 (0);
+    p.writeInt32 (pRI->pCI->requestNumber);
+    p.writeInt32(socket_id);
+    p.writeInt32 (0);//RIL_E_GENERIC_FAILURE
+    android::LYNQ_RIL_respSocket(p, (void *)pRI);
     /* no response from telecore, free pRI prevent memory leak */
     if (pRI != NULL) {
         free(pRI);
diff --git a/src/lynq/framework/lynq-atsvc/src/data/data_gdbus.cpp b/src/lynq/framework/lynq-atsvc/src/data/data_gdbus.cpp
old mode 100644
new mode 100755
index d6e1bd3..d70490b
--- a/src/lynq/framework/lynq-atsvc/src/data/data_gdbus.cpp
+++ b/src/lynq/framework/lynq-atsvc/src/data/data_gdbus.cpp
@@ -43,9 +43,13 @@
 }
 
 #include "common.h"
-/*Warren add for FAW T103 2021/11/2 start*/
-#include "lynq_common.h"

-/*Warren add for FAW T103 2021/11/2 end*/
+/*Warren add for t800 ril service 2021/12/25 start*/
+#include "lynq_common.h"
+#include "lynq_interface.h"
+#include <binder/Parcel.h>
+using android::Parcel;
+
+/*Warren add for t800 ril service 2021/12/25 end*/
 
 #define LOG_TAG "DEMO_DATA_GDBUS"
 #define TELEPHONY_SERVICE "mtk.telephony" /*well-known bus name */
@@ -56,6 +60,201 @@
 GDBusProxy *proxy = NULL;
 MTK_Data_Call_Response_v1 req_response;
 MTK_Data_Call_Response_v1 urc_response;
+/*Warren add for t800 ril service 2021/12/25 start*/
+int lynq_data_management(MTK_Data_Call_Response_v1 *urc_response)
+{
+    char apn_t[LYNQ_APN_LEN_MAX] = {};
+    char apnType_t[LYNQ_APNTPYE_LEN_MAX] = {};
+    char iface_t[LYNQ_APNTPYE_LEN_MAX] = {};
+    if(!urc_response)
+    {
+        RLOGD("urc_response is null!!!");
+        return -1;
+    }
+    bool apnHasCreated = FALSE;
+    char Buf[1024] = {0};
+    bzero(Buf, 1024);
+    Parcel p;
+    if(urc_response->cId > 0)
+    {
+        if(urc_response->pdnState==PDN_DISCONNECTED)//if user disable data call,the pdn state wiil change to disconnected.
+        {
+            for(int i = 0;i < LYNQ_APN_CHANNEL_MAX;i++)
+            {
+                //printf("data test 002:count:%d\n",i);
+                RLOGD("[PDN_DISCONNECTED]apn_table[%d],apntype:%s,apnstatus:%d,,,urc_response->apnName:%s\n",i,apn_table[i].apntype,apn_table[i].apnstatus,urc_response->apnType);
+                if((strcmp(apn_table[i].apntype,urc_response->apnType)==0)&&(apn_table[i].apnstatus==0))
+                {
+                    bzero(apn_table[i].apn,LYNQ_APN_LEN_MAX);
+                    bzero(apn_table[i].apntype,LYNQ_APNTPYE_LEN_MAX);
+                    apn_table[i].used=0;
+                    apn_table[i].netId=0;
+                    apn_count--;
+                    p.writeInt32 (1);
+                    p.writeInt32 (LYNQ_URC_DATA_CALL_STATUS_IND);
+                    p.writeInt32 (0);//temporary plan
+                    p.writeInt32(PDN_DISCONNECTED);
+                    android::LYNQ_RIL_urcBroadcast(p);
+                    RLOGD("removed apn:%s,apntype:%s",apn_table[i].apn,apn_table[i].apntype);
+                    //printf("removed apn:%s,apntype:%s\n",apn_table[i].apn,apn_table[i].apntype);
+                    break;
+                }
+            }
+            for(int i = 0;i < LYNQ_APN_CHANNEL_MAX;i++)
+            {
+                RLOGD("for apn_table[%d].apn:%s,apntype:%s,used:%d,apnstatus:%d\n",i,apn_table[i].apn,
+                apn_table[i].apntype,apn_table[i].used,apn_table[i].apnstatus);
+            }
+        }
+        else
+        {
+            /*if the pdn status change,tele-fwk will send pdn status to me.
+            **The reason for the status change may be that enable data call, 
+            **the user disable the data call, and the signal is interrupted.
+            */
+            if(apn_count==0)//first new apn has created 
+            {
+                RLOGD("first apn_count:%d\n",apn_count);
+                memcpy(apn_table[apn_count].apn,urc_response->apnName,strlen(urc_response->apnName)+1);
+                memcpy(apn_table[apn_count].apntype,urc_response->apnType,strlen(urc_response->apnType)+1);
+                memcpy(apn_table[apn_count].ifaceName,urc_response->ifname,strlen(urc_response->ifname)+1);
+                //printf("apn_table[%d].apn:%s,,,,urc_response->apnName:%s\n",apn_count,apn_table[apn_count].apn,urc_response->apnName);
+                RLOGD("apn_table[%d].apn:%s,apntype:%s,,,urc_response->apnName:%s,urc_response->apntype:%s\n",apn_count,apn_table[apn_count].apn,apn_table[apn_count].apntype,urc_response->apnName,urc_response->apnType);
+                apn_table[apn_count].apnstatus=1;
+                apn_table[apn_count].used=1;
+                apn_table[apn_count].netId=urc_response->netId;
+                apn_count++;
+                p.writeInt32(1);
+                p.writeInt32(LYNQ_URC_DATA_CALL_STATUS_IND);
+                p.writeInt32(0);//temporary plan
+                p.writeInt32(PDN_CONNECTED);
+                writeStringToParcel(p,urc_response->apnName);
+                writeStringToParcel(p,urc_response->apnType);
+                writeStringToParcel(p,urc_response->ifname);
+                android::LYNQ_RIL_urcBroadcast(p);
+            }
+            else
+            {
+                for(int i = 0;i < LYNQ_APN_CHANNEL_MAX;i++)
+                {
+                    RLOGD("for apn_table[%d].apn:%s,,,,urc_response->apnName:%s\n",i,apn_table[i].apn,urc_response->apnName);
+                    if(strcmp(apn_table[i].apn,urc_response->apnName)==0)
+                    {
+                        RLOGD("This apn has been created!!!");
+                        printf("This apn has been created!!!\n");
+                        apnHasCreated = TRUE;
+                        if(apn_table[i].netId!=urc_response->netId)
+                        {
+                            apn_table[i].netId=urc_response->netId;
+                            memcpy(iface_t,apn_table[i].ifaceName,strlen(apn_table[i].ifaceName)+1);
+                            memcpy(apnType_t,apn_table[i].apntype,strlen(apn_table[i].apntype)+1);
+                            memcpy(apn_t,apn_table[i].apn,strlen(apn_table[i].apn)+1);
+                            /*send urc to client
+                            send apn_t,apnType_t,urc_response->pdnState,iface_t to client 
+                            */
+                            p.writeInt32(1);
+                            p.writeInt32(LYNQ_URC_DATA_CALL_STATUS_IND);
+                            p.writeInt32(0);//temporary plan
+                            p.writeInt32(urc_response->pdnState);
+                            writeStringToParcel(p,apn_t);
+                            writeStringToParcel(p,apnType_t);
+                            writeStringToParcel(p,iface_t);
+                            android::LYNQ_RIL_urcBroadcast(p);
+                            //lynq_data_callback(apn_t,apnType_t,urc_response->pdnState,iface_t);
+                            //sprintf(Buf,"+LAPNST:%s,%s,%d,%s\n",apn_table[i].apn,apn_table[i].apntype,urc_response->pdnState,urc_response->ifname);
+                            //printf("eBuf:%s\n",Buf);
+                            //int n = write(ttyGS3_fd,Buf,strlen(Buf));
+                            //if(n<0)
+                            //{
+                            //     perror("lynq resp write:");
+                            //}
+                        }
+                        break;
+                    }
+                }
+                if(!apnHasCreated)//new apn has created
+                {
+                    bool getLable = FALSE;
+                    int lable = 0;
+                    for(lable;lable < LYNQ_APN_CHANNEL_MAX;lable++)
+                    {
+                        if(apn_table[lable].used==0)
+                        {
+                            getLable = TRUE;
+                            break;
+                        }
+                    }
+                    if(getLable)
+                    {
+                        RLOGD("[getLable]:label==%d\n",lable);
+                        memcpy(apn_table[lable].apn,urc_response->apnName,strlen(urc_response->apnName)+1);
+                        memcpy(apn_table[lable].apntype,urc_response->apnType,strlen(urc_response->apnType)+1);
+                        memcpy(apn_table[lable].ifaceName,urc_response->ifname,strlen(urc_response->ifname)+1);
+                        RLOGD("new apn_table[%d].apn:%s,apntype:%s,,,urc_response->apnName:%s,urc_response->apntype:%s\n",lable,apn_table[lable].apn,apn_table[lable].apntype,urc_response->apnName,urc_response->apnType);
+                        apn_table[lable].apnstatus=1;
+                        apn_table[lable].used=1;
+                        apn_table[lable].netId=urc_response->netId;
+                        apn_count++;
+                        p.writeInt32(1);
+                        p.writeInt32(LYNQ_URC_DATA_CALL_STATUS_IND);
+                        p.writeInt32(0);//temporary plan
+                        p.writeInt32(urc_response->pdnState);
+                        writeStringToParcel(p,urc_response->apnName);
+                        writeStringToParcel(p,urc_response->apnType);
+                        writeStringToParcel(p,urc_response->ifname);
+                        android::LYNQ_RIL_urcBroadcast(p);
+                    }
+                    else
+                    {
+                        RLOGD("unkown error");
+                    }
+                }
+            }
+        }
+    }
+    else
+    {
+        apnHasCreated = FALSE;
+        RLOGD("[cid < 0] apn_count:%d\n",apn_count);
+        if(apn_count>0)
+        {
+            int i = 0;
+            for(i;i < LYNQ_APN_CHANNEL_MAX;i++)
+            {
+                RLOGD("[cid<0]apn_table[%d].apntype:%s,,,,urc_response->apntype:%s\n",i,apn_table[i].apntype,urc_response->apnType);
+                if(strcmp(apn_table[i].apntype,urc_response->apnType)==0)
+                {
+                    RLOGD("apntype:%s PDN status has changed!!!\n",urc_response->apnType);
+                    apnHasCreated = TRUE;
+                    break;
+                }
+            }
+            if(apnHasCreated)
+            {
+                //sprintf(Buf,"+LAPNST:%s,%s,%d\n",apn_table[i].apn,apn_table[i].apntype,urc_response->pdnState);
+                //printf("Buf:%s\n",Buf);
+                memcpy(iface_t,apn_table[i].ifaceName,strlen(apn_table[i].ifaceName)+1);
+                memcpy(apnType_t,apn_table[i].apntype,strlen(apn_table[i].apntype)+1);
+                memcpy(apn_t,apn_table[i].apn,strlen(apn_table[i].apn)+1);
+                p.writeInt32(1);
+                p.writeInt32(LYNQ_URC_DATA_CALL_STATUS_IND);
+                p.writeInt32(0);//temporary plan
+                p.writeInt32(urc_response->pdnState);
+                writeStringToParcel(p,apn_t);
+                writeStringToParcel(p,apnType_t);
+                writeStringToParcel(p,iface_t);
+                android::LYNQ_RIL_urcBroadcast(p);
+                //int n = write(ttyGS3_fd,Buf,strlen(Buf));
+                //if(n<0)
+                //{
+                //    perror("lynq resp write:");
+                //}
+            }
+        }
+    }
+    return 0;
+}
+/*Warren add for t800 ril service 2021/12/25 end*/
 
 void freeMem(MTK_Data_Call_Response_v1 response)
 {
@@ -265,141 +464,141 @@
                               gpointer     user_data)
 {
     bool apnHasCreated = FALSE;
-    char Buf[1024] = {0};

-    bzero(Buf, 1024);

+    char Buf[1024] = {0};
+    bzero(Buf, 1024);
     RLOGD("signal_name: %s", signal_name);
     freeMem(urc_response);
     parse(parameters, &urc_response);
     dumpResponse(&urc_response);
-    /*Warren add for FAW T103 2021/11/2 start*/

+    /*Warren add for FAW T103 2021/11/2 start*/
     if(urc_response.cId > 0)
     {
-        if(urc_response.pdnState==PDN_DISCONNECTED)//if user disable data call,the pdn state wiil change to disconnected.

-        {

-            printf("data test 001\n");

-            for(int i = 0;i < LYNQ_APN_CHANNEL_MAX;i++)

-            {

-                printf("data test 002:count:%d\n",i);

-                printf("[PDN_DISCONNECTED]apn_table[%d],apntype:%s,apnstatus:%d,,,urc_response.apnName:%s\n",i,apn_table[i].apntype,apn_table[i].apnstatus,urc_response.apnType);

-                if((strcmp(apn_table[i].apntype,urc_response.apnType)==0)&&(apn_table[i].apnstatus==0))

-                {

-                    bzero(apn_table[i].apn,LYNQ_APN_LEN_MAX);

-                    bzero(apn_table[i].apntype,LYNQ_APNTPYE_LEN_MAX);

-                    apn_table[i].used=0;

-                    apn_table[i].netId=0;

-                    apn_count--;

-                    //int n = write(ttyGS3_fd,urc_response.ifname,strlen(urc_response.ifname));

-                    int n = write(ttyGS3_fd,"OK\n",3);

+        if(urc_response.pdnState==PDN_DISCONNECTED)//if user disable data call,the pdn state wiil change to disconnected.
+        {
+            printf("data test 001\n");
+            for(int i = 0;i < LYNQ_APN_CHANNEL_MAX;i++)
+            {
+                printf("data test 002:count:%d\n",i);
+                printf("[PDN_DISCONNECTED]apn_table[%d],apntype:%s,apnstatus:%d,,,urc_response.apnName:%s\n",i,apn_table[i].apntype,apn_table[i].apnstatus,urc_response.apnType);
+                if((strcmp(apn_table[i].apntype,urc_response.apnType)==0)&&(apn_table[i].apnstatus==0))
+                {
+                    bzero(apn_table[i].apn,LYNQ_APN_LEN_MAX);
+                    bzero(apn_table[i].apntype,LYNQ_APNTPYE_LEN_MAX);
+                    apn_table[i].used=0;
+                    apn_table[i].netId=0;
+                    apn_count--;
+                    //int n = write(ttyGS3_fd,urc_response.ifname,strlen(urc_response.ifname));
+                    int n = write(ttyGS3_fd,"OK\n",3);
                     if(n<0)
                     {
                         perror("lynq resp write:");
-                    }

-                    RLOGD("removed apn:%s,apntype:%s",apn_table[i].apn,apn_table[i].apntype);

-                    printf("removed apn:%s,apntype:%s\n",apn_table[i].apn,apn_table[i].apntype);

-                    break;

-                }

-            }

-            //test

-            for(int i = 0;i < LYNQ_APN_CHANNEL_MAX;i++)

-            {

-                printf("for apn_table[%d].apn:%s,apntype:%s,used:%d,apnstatus:%d\n",i,apn_table[i].apn,

-                apn_table[i].apntype,apn_table[i].used,apn_table[i].apnstatus);

-            }

-        }

-        else

-        {

-            /*if the pdn status change,tele-fwk will send pdn status to me.

-            **The reason for the status change may be that enable data call, 

-            **the user disable the data call, and the signal is interrupted.

-            */

+                    }
+                    RLOGD("removed apn:%s,apntype:%s",apn_table[i].apn,apn_table[i].apntype);
+                    printf("removed apn:%s,apntype:%s\n",apn_table[i].apn,apn_table[i].apntype);
+                    break;
+                }
+            }
+            //test
+            for(int i = 0;i < LYNQ_APN_CHANNEL_MAX;i++)
+            {
+                printf("for apn_table[%d].apn:%s,apntype:%s,used:%d,apnstatus:%d\n",i,apn_table[i].apn,
+                apn_table[i].apntype,apn_table[i].used,apn_table[i].apnstatus);
+            }
+        }
+        else
+        {
+            /*if the pdn status change,tele-fwk will send pdn status to me.
+            **The reason for the status change may be that enable data call, 
+            **the user disable the data call, and the signal is interrupted.
+            */
             if(apn_count==0)//first new apn has created 
             {
-                printf("first apn_count:%d\n",apn_count);

+                printf("first apn_count:%d\n",apn_count);
                 memcpy(apn_table[apn_count].apn,urc_response.apnName,strlen(urc_response.apnName));
-                memcpy(apn_table[apn_count].apntype,urc_response.apnType,strlen(urc_response.apnType));

-                //printf("apn_table[%d].apn:%s,,,,urc_response.apnName:%s\n",apn_count,apn_table[apn_count].apn,urc_response.apnName);

-                printf("apn_table[%d].apn:%s,apntype:%s,,,urc_response.apnName:%s,urc_response.apntype:%s\n",apn_count,apn_table[apn_count].apn,apn_table[apn_count].apntype,urc_response.apnName,urc_response.apnType);

-                apn_table[apn_count].apnstatus=1;

-                apn_table[apn_count].used=1;

-                apn_table[apn_count].netId=urc_response.netId;

+                memcpy(apn_table[apn_count].apntype,urc_response.apnType,strlen(urc_response.apnType));
+                //printf("apn_table[%d].apn:%s,,,,urc_response.apnName:%s\n",apn_count,apn_table[apn_count].apn,urc_response.apnName);
+                printf("apn_table[%d].apn:%s,apntype:%s,,,urc_response.apnName:%s,urc_response.apntype:%s\n",apn_count,apn_table[apn_count].apn,apn_table[apn_count].apntype,urc_response.apnName,urc_response.apnType);
+                apn_table[apn_count].apnstatus=1;
+                apn_table[apn_count].used=1;
+                apn_table[apn_count].netId=urc_response.netId;
                 apn_count++;
-                lynqUpdateApnStatus(urc_response.apnName,urc_response.apnType,urc_response.pdnState,urc_response.ifname);

+                lynqUpdateApnStatus(urc_response.apnName,urc_response.apnType,urc_response.pdnState,urc_response.ifname);
             }
             else
             {
                 for(int i = 0;i < LYNQ_APN_CHANNEL_MAX;i++)
                 {
-                    printf("for apn_table[%d].apn:%s,,,,urc_response.apnName:%s\n",i,apn_table[i].apn,urc_response.apnName);

+                    printf("for apn_table[%d].apn:%s,,,,urc_response.apnName:%s\n",i,apn_table[i].apn,urc_response.apnName);
                     if(strcmp(apn_table[i].apn,urc_response.apnName)==0)
                     {
                         RLOGD("This apn has been created!!!");
-                        printf("This apn has been created!!!\n");

+                        printf("This apn has been created!!!\n");
                         apnHasCreated = TRUE;
-                        if(apn_table[i].netId!=urc_response.netId)

-                        {

-                            apn_table[i].netId = urc_response.netId;

-                            lynqUpdateApnStatus(apn_table[i].apn,apn_table[i].apntype,urc_response.pdnState,urc_response.ifname);

-                        }

-                        break;

+                        if(apn_table[i].netId!=urc_response.netId)
+                        {
+                            apn_table[i].netId = urc_response.netId;
+                            lynqUpdateApnStatus(apn_table[i].apn,apn_table[i].apntype,urc_response.pdnState,urc_response.ifname);
+                        }
+                        break;
                     }
                 }
                 if(!apnHasCreated)//new apn has created
                 {
-                    bool getLable = FALSE;

-                    int lable = 0;

-                    for(lable;lable < LYNQ_APN_CHANNEL_MAX;lable++)

-                    {

-                        if(apn_table[lable].used==0)

-                        {

-                            getLable = TRUE;

-                            break;

-                        }

-                    }

-                    if(getLable)

-                    {

-                        printf("[getLable]:label==%d\n",lable);

+                    bool getLable = FALSE;
+                    int lable = 0;
+                    for(lable;lable < LYNQ_APN_CHANNEL_MAX;lable++)
+                    {
+                        if(apn_table[lable].used==0)
+                        {
+                            getLable = TRUE;
+                            break;
+                        }
+                    }
+                    if(getLable)
+                    {
+                        printf("[getLable]:label==%d\n",lable);
                         memcpy(apn_table[lable].apn,urc_response.apnName,strlen(urc_response.apnName));
-                        memcpy(apn_table[lable].apntype,urc_response.apnType,strlen(urc_response.apnType));

-                        printf("new apn_table[%d].apn:%s,apntype:%s,,,urc_response.apnName:%s,urc_response.apntype:%s\n",lable,apn_table[lable].apn,apn_table[lable].apntype,urc_response.apnName,urc_response.apnType);

-                        apn_table[lable].apnstatus=1;

-                        apn_table[lable].used=1;

-                        apn_table[lable].netId=urc_response.netId;

+                        memcpy(apn_table[lable].apntype,urc_response.apnType,strlen(urc_response.apnType));
+                        printf("new apn_table[%d].apn:%s,apntype:%s,,,urc_response.apnName:%s,urc_response.apntype:%s\n",lable,apn_table[lable].apn,apn_table[lable].apntype,urc_response.apnName,urc_response.apnType);
+                        apn_table[lable].apnstatus=1;
+                        apn_table[lable].used=1;
+                        apn_table[lable].netId=urc_response.netId;
                         apn_count++;
-                        lynqUpdateApnStatus(urc_response.apnName,urc_response.apnType,urc_response.pdnState,urc_response.ifname);

-                    }

-                    else

-                    {

-                        RLOGD("unkown error");

-                    }

+                        lynqUpdateApnStatus(urc_response.apnName,urc_response.apnType,urc_response.pdnState,urc_response.ifname);
+                    }
+                    else
+                    {
+                        RLOGD("unkown error");
+                    }
                 }
             }
-        }

+        }
     }
     else
     {
         apnHasCreated = FALSE;
-        printf("apn_count:%d\n",apn_count);

+        printf("apn_count:%d\n",apn_count);
         if(apn_count>0)
         {
             int i = 0;
             for(i;i < LYNQ_APN_CHANNEL_MAX;i++)
             {
-                printf("[cid<0]apn_table[%d].apntype:%s,,,,urc_response.apntype:%s\n",i,apn_table[i].apntype,urc_response.apnType);

+                printf("[cid<0]apn_table[%d].apntype:%s,,,,urc_response.apntype:%s\n",i,apn_table[i].apntype,urc_response.apnType);
                 if(strcmp(apn_table[i].apntype,urc_response.apnType)==0)
                 {
                     RLOGD("apntype:%s PDN status has changed!!!",urc_response.apnType);
-                    printf("apntype:%s PDN status has changed!!!\n",urc_response.apnType);

+                    printf("apntype:%s PDN status has changed!!!\n",urc_response.apnType);
                     apnHasCreated = TRUE;
-                    break;

+                    break;
                 }
             }
             if(apnHasCreated)
             {
-                lynqUpdateApnStatus(apn_table[i].apn,apn_table[i].apntype,urc_response.pdnState,NULL);

+                lynqUpdateApnStatus(apn_table[i].apn,apn_table[i].apntype,urc_response.pdnState,NULL);
             }
         }
     }
-    /*Warren add for FAW T103 2021/11/2 end*/

+    /*Warren add for FAW T103 2021/11/2 end*/
     if(g_strcmp0(signal_name, "default") == 0)
     {
         if(urc_response.pdnState == RIL_Data_Call_PdnState::PDN_DISCONNECTED) {
diff --git a/src/lynq/framework/lynq-atsvc/src/em/em.cpp b/src/lynq/framework/lynq-atsvc/src/em/em.cpp
old mode 100644
new mode 100755
index 7e9609f..eb0cf97
--- a/src/lynq/framework/lynq-atsvc/src/em/em.cpp
+++ b/src/lynq/framework/lynq-atsvc/src/em/em.cpp
@@ -131,6 +131,32 @@
     {"ANRITSU",0,NULL,1,1},
     {"CMW500",0,NULL,1,1},
 };
+/*T800->T103*/
+em_arry_t modem_iot[] = {
+    {"General",0,NULL,1,1},
+    {"NSN",0,NULL,1,1},
+    {"DCM CB",0,NULL,1,1},
+    {"ERICSSON",0,NULL,1,1},
+};
+
+em_arry_t modem_operator[] = {
+    {"MS_USIM_COMPATIPLE",0,NULL,1,1},
+    {"ATNT",0,NULL,1,1},
+    {"TMOBILE",0,NULL,1,1},
+    {"ORANGE",0,NULL,1,1},
+    {"VODAFONE",0,NULL,1,1},
+    {"O2",0,NULL,1,1},
+    {"TELEFONICA",0,NULL,1,1},
+    {"DOCOMO",0,NULL,1,1},
+    {"SOFTBANK",0,NULL,1,1},
+    {"VIVO",0,NULL,1,1},
+    {"CLARO",0,NULL,1,1},
+    {"TIM",0,NULL,1,1},
+    {"CU",0,NULL,1,1},
+    {"KDDI",0,NULL,1,1},
+    {"CT IR LAB TEST",0,NULL,1,1},
+};
+/*T800->T103*/
 em_arry_t modem_C2K_Test_MODEM[] = {
     { "NONE", 0, NULL, 1, 1 },
     { "SPIRENT", 0,NULL, 1, 1 },
diff --git a/src/lynq/framework/lynq-atsvc/src/em/em_antennatest.cpp b/src/lynq/framework/lynq-atsvc/src/em/em_antennatest.cpp
old mode 100644
new mode 100755
index 87c8380..ab1fefe
--- a/src/lynq/framework/lynq-atsvc/src/em/em_antennatest.cpp
+++ b/src/lynq/framework/lynq-atsvc/src/em/em_antennatest.cpp
@@ -60,6 +60,9 @@
 static const int MSG_SET_ANTENNA_EGMC_4G = 6;
 static const int MSG_INIT_ANTENNA_EGMC_4G = 7;
 static const int MODE_INDEX_BASE_3G = 10;
+/*T800->T103*/
+static const int MODE_INDEX_BASE_2G = 20;
+/*T800->T103*/
 static const int MODE_EPCM_VALID = 0xFF;
 static const int CELL_2RX_LENGTH = 2;
 static const int CELL_4RX_LENGTH = 4;
diff --git a/src/lynq/framework/lynq-atsvc/src/em/em_modemtest.cpp b/src/lynq/framework/lynq-atsvc/src/em/em_modemtest.cpp
old mode 100644
new mode 100755
index 38b9497..ea50e4b
--- a/src/lynq/framework/lynq-atsvc/src/em/em_modemtest.cpp
+++ b/src/lynq/framework/lynq-atsvc/src/em/em_modemtest.cpp
@@ -40,6 +40,10 @@
 #include <unistd.h>
 #include <math.h>
 #include <string>
+/*T800->T103*/
+#include <thread>
+#include <chrono>
+/*T800->T103*/
 #include <vector>
 
 #include "Phone_utils.h"
diff --git a/src/lynq/framework/lynq-atsvc/src/lynq_common.cpp b/src/lynq/framework/lynq-atsvc/src/lynq_common.cpp
old mode 100644
new mode 100755
index a9af830..834059d
--- a/src/lynq/framework/lynq-atsvc/src/lynq_common.cpp
+++ b/src/lynq/framework/lynq-atsvc/src/lynq_common.cpp
@@ -15,7 +15,9 @@
 #include "common.h"
 #include <pthread.h>
 #define USB_BUF_SIZE 8192
-
+#include <liblog/lynq_deflog.h>
+#include <sys/time.h>
+#include "Phone_utils.h"
 usb_cmd_t Usb_commands[] = {
 #include "lynq_commands.h"
 };
@@ -23,6 +25,8 @@
 usb_at_transfer_t Usb_transfer_commands[] = {
 #include "lynq_at_transfer_table.h"
 };
+#undef LOG_TAG
+#define LOG_TAG "LYNQ_COMMON"
 
 extern apn_table_t apn_table[LYNQ_APN_CHANNEL_MAX] = {};
 extern int apn_count = 0;
@@ -152,6 +156,8 @@
             string = token;
             token = strtok(NULL, "=?");
         }
+        if(string == NULL)
+            return -1;
         parameter = strtok(string, ",");
         int i = 3;
         while (parameter != NULL)
@@ -171,6 +177,8 @@
             string = token;
             token = strtok(NULL, "=");
         }
+        if(string == NULL)
+            return -1;
         parameter = strtok(string, ",");
         int i = 3;
         while (parameter != NULL)
@@ -191,6 +199,8 @@
             token = strtok(NULL, "?");
         }
         parameter = strtok(string, ",");
+        if(string == NULL)
+            return -1;
         int i = 3;
         while (parameter != NULL)
         {
diff --git a/src/lynq/framework/lynq-atsvc/src/lynq_common.h b/src/lynq/framework/lynq-atsvc/src/lynq_common.h
old mode 100644
new mode 100755
index d962324..f44d427
--- a/src/lynq/framework/lynq-atsvc/src/lynq_common.h
+++ b/src/lynq/framework/lynq-atsvc/src/lynq_common.h
@@ -8,6 +8,14 @@
 **=============================================================================*/
 #ifndef LYNQ_COMMON
 #define LYNQ_COMMON
+#include <stdlib.h>
+#include <stdio.h>
+#include <log/log.h>
+#include <stdint.h>
+#include <unistd.h>
+#include "common.h"
+#include <stateManager/stateManager.h>
+#include <liblog/lynq_deflog.h>
 # include <pthread.h>
 
 #define LYNQ_GOTO_AT 1
@@ -24,6 +32,7 @@
 #define LYNQ_APNTPYE_LEN_MAX 50
 #define LYNQ_APN_CHANNEL_MAX 10
 #define LYNQ_AT_LEN_MAX 20
+#define LYNQ_EVENT_WAIT_TIME_MAX 25 //m
 
 #define LYNQ_VERSION 8500
 #define LYNQ_REQUEST_CGMI (LYNQ_VERSION+1)
@@ -63,6 +72,7 @@
 {
     char apn[LYNQ_APN_LEN_MAX];
     char apntype[LYNQ_APNTPYE_LEN_MAX];
+    char ifaceName[LYNQ_APNTPYE_LEN_MAX];
     int netId;
     int used;//0:not use,1:used.
     int apnstatus;//1:has enable;0:need disable.
diff --git a/src/lynq/framework/lynq-atsvc/src/lynq_interface.h b/src/lynq/framework/lynq-atsvc/src/lynq_interface.h
new file mode 100755
index 0000000..f1d0f7c
--- /dev/null
+++ b/src/lynq/framework/lynq-atsvc/src/lynq_interface.h
@@ -0,0 +1,13 @@
+#define LYNQ_REQUEST_VENDOR_BASE 8000
+#define LYNQ_URC_VENDOR_BASE 9000
+#define LYNQ_AT_SNED (LYNQ_REQUEST_VENDOR_BASE +1)
+#define LYNQ_URC_CALL_STATUS_IND (LYNQ_URC_VENDOR_BASE+1)
+#define LYNQ_URC_DATA_STATUS_IND (LYNQ_URC_VENDOR_BASE+2)
+#define LYNQ_URC_DATA_CALL_STATUS_IND (LYNQ_URC_VENDOR_BASE+3)
+#define LYNQ_AUTO_ANSWER_CALL (LYNQ_REQUEST_VENDOR_BASE +2)
+#define LYNQ_REQUEST_SET_DTMF_VOLUME (LYNQ_REQUEST_VENDOR_BASE +3)
+typedef struct{
+    int request;
+    int waitTime;
+    char * name;
+}lynq_sp_command_t;
\ No newline at end of file
diff --git a/src/lynq/framework/lynq-atsvc/src/main.cpp b/src/lynq/framework/lynq-atsvc/src/main.cpp
old mode 100644
new mode 100755
index d956ef6..7aeb69e
--- a/src/lynq/framework/lynq-atsvc/src/main.cpp
+++ b/src/lynq/framework/lynq-atsvc/src/main.cpp
@@ -140,9 +140,9 @@
     }
 
     android::RIL_startEventLoop();
-    android::startATCILoop();
-    android::startPMLoop();
-    android::startWakupLoop();
+    //android::startATCILoop();
+    //android::startPMLoop();
+    //android::startWakupLoop();
 
     rilInit =
         (const RIL_RadioFunctions *(*)(const struct RIL_Env *, int, char **))
diff --git a/src/lynq/framework/lynq-atsvc/src/ril.cpp b/src/lynq/framework/lynq-atsvc/src/ril.cpp
old mode 100644
new mode 100755
index ae1afc2..14a0917
--- a/src/lynq/framework/lynq-atsvc/src/ril.cpp
+++ b/src/lynq/framework/lynq-atsvc/src/ril.cpp
@@ -70,6 +70,12 @@
 #include "Phone_utils.h"
 #include "utils.h"
 #include "Radio_capability_switch_util.h"
+
+/*Warren add for t800 RIL service 2021_12_10 start*/
+#include <sys/epoll.h>
+#include "lynq_interface.h"
+/*Warren add for t800 RIL service 2021_12_10 end*/
+
 /*Warren add for FAW platform 2021/9/28 start*/
 #include "lynq_common.h"
 #include "lynq_at.h"
@@ -78,6 +84,19 @@
 #include "lynq_rndis.h"
 /*Warren add for FAW platform 2021/9/28 end*/
 
+
+/*Warren add for t800 RIL service 2021_12_10 start*/
+#define LYNQ_SOCKET_ENVNT_FD_MAX 100
+#define LYNQ_SERVICE_PORT 8088
+#define LYNQ_BRODCAST_PORT 8086
+#define LYNQ_SOCKET_BUFFER (1024*8+sizeof(int)*3+10)
+//int LYNQ_RIL_respSocket(Parcel &p,RIL_Token t);
+//int LYNQ_RIL_urcBroadcast(Parcel &p);
+
+int lynq_urc_socket_fd = 0;
+struct sockaddr_in urc_broadcast_addr;
+/*Warren add for t800 RIL service 2021_12_10 end*/
+
 #define LOG_TAG "DEMO_RIL"
 
 
@@ -2770,8 +2789,11 @@
     }
 
     if (responselen >= sizeof (RIL_SignalStrength_v5)) {
+#ifdef TELEMATIC_5G_SUPPORT
+        RIL_SignalStrength_v14 *p_cur = ((RIL_SignalStrength_v14 *) response);
+#else
         RIL_SignalStrength_v10 *p_cur = ((RIL_SignalStrength_v10 *) response);
-
+#endif
         p.writeInt32(p_cur->GW_SignalStrength.signalStrength);
         p.writeInt32(p_cur->GW_SignalStrength.bitErrorRate);
         p.writeInt32(p_cur->GW_SignalStrength.timingAdvance);
@@ -2793,8 +2815,54 @@
         p.writeInt32(p_cur->WCDMA_SignalStrength.bitErrorRate);
         p.writeInt32(p_cur->WCDMA_SignalStrength.rscp);
         p.writeInt32(p_cur->WCDMA_SignalStrength.ecno);
-
+#ifdef TELEMATIC_5G_SUPPORT
+        p.writeInt32(p_cur->NR_SignalStrength.ssRsrp);
+        p.writeInt32(p_cur->NR_SignalStrength.ssRsrq);
+        p.writeInt32(p_cur->NR_SignalStrength.ssSinr);
+        p.writeInt32(p_cur->NR_SignalStrength.csiRsrp);
+        p.writeInt32(p_cur->NR_SignalStrength.csiRsrq);
+        p.writeInt32(p_cur->NR_SignalStrength.csiSinr);
+#endif
         startResponse;
+
+#ifdef TELEMATIC_5G_SUPPORT
+        appendPrintBuf("%s[GW_SS.signalStrength=%d,GW_SS.bitErrorRate=%d,GW_SS.timingAdvance=%d,\
+                CDMA_SS.dbm=%d,CDMA_SS.ecio=%d,\
+                EVDO_SS.dbm=%d,EVDO_SS.ecio=%d,EVDO_SS.signalNoiseRatio=%d,\
+                LTE_SS.signalStrength=%d,LTE_SS.rsrp=%d,LTE_SS.rsrq=%d,LTE_SS.rssnr=%d,LTE_SS.cqi=%d,LTE_SS.timingAdvance=%d,\
+                TDSCDMA_SS.signalStrength=%d,TDSCDMA_SS.bitErrorRate=%d,TDSCDMA_SS.rscp=%d,\
+                WCDMA_SS.signalStrength=%d,WCDMA_SS.bitErrorRate=%d,WCDMA_SS.rscp=%d,WCDMA_SS.ecno=%d,\
+                NR_SignalStrength.ssRsrp=%d,NR_SignalStrength.ssRsrq=%d,NR_SignalStrength.ssSinr=%d,\
+                NR_SignalStrength.csiRsrp=%d,NR_SignalStrength.csiRsrq=%d,NR_SignalStrength.csiSinr=%d]",
+                printBuf,
+                p_cur->GW_SignalStrength.signalStrength,
+                p_cur->GW_SignalStrength.bitErrorRate,
+                p_cur->GW_SignalStrength.timingAdvance,
+                p_cur->CDMA_SignalStrength.dbm,
+                p_cur->CDMA_SignalStrength.ecio,
+                p_cur->EVDO_SignalStrength.dbm,
+                p_cur->EVDO_SignalStrength.ecio,
+                p_cur->EVDO_SignalStrength.signalNoiseRatio,
+                p_cur->LTE_SignalStrength.signalStrength,
+                p_cur->LTE_SignalStrength.rsrp,
+                p_cur->LTE_SignalStrength.rsrq,
+                p_cur->LTE_SignalStrength.rssnr,
+                p_cur->LTE_SignalStrength.cqi,
+                p_cur->LTE_SignalStrength.timingAdvance,
+                p_cur->TD_SCDMA_SignalStrength.signalStrength,
+                p_cur->TD_SCDMA_SignalStrength.bitErrorRate,
+                p_cur->TD_SCDMA_SignalStrength.rscp,
+                p_cur->WCDMA_SignalStrength.signalStrength,
+                p_cur->WCDMA_SignalStrength.bitErrorRate,
+                p_cur->WCDMA_SignalStrength.rscp,
+                p_cur->WCDMA_SignalStrength.ecno,
+                p_cur->NR_SignalStrength.ssRsrp,
+                p_cur->NR_SignalStrength.ssRsrq,
+                p_cur->NR_SignalStrength.ssSinr,
+                p_cur->NR_SignalStrength.csiRsrp,
+                p_cur->NR_SignalStrength.csiRsrq,
+                p_cur->NR_SignalStrength.csiSinr);
+#else
         appendPrintBuf("%s[GW_SS.signalStrength=%d,GW_SS.bitErrorRate=%d,GW_SS.timingAdvance=%d,\
                 CDMA_SS.dbm=%d,CDMA_SS.ecio=%d,\
                 EVDO_SS.dbm=%d,EVDO_SS.ecio=%d,EVDO_SS.signalNoiseRatio=%d,\
@@ -2823,8 +2891,9 @@
                 p_cur->WCDMA_SignalStrength.bitErrorRate,
                 p_cur->WCDMA_SignalStrength.rscp,
                 p_cur->WCDMA_SignalStrength.ecno);
+        
+#endif  
         closeResponse;
-
         if (signal_strength_printf != 0) {
             printf(
                     "\n\n[QUERY][SIGNAL]\nsignalStrength=%d,\nbitErrorRate=%d,\nLTE_SS.signalStrength=%d,\n"
@@ -3100,6 +3169,39 @@
                 p.writeInt32(p_cur->CellInfo.tdscdma.cellIdentityTdscdma.cid);
                 p.writeInt32(p_cur->CellInfo.tdscdma.cellIdentityTdscdma.cpid);
                 p.writeInt32(p_cur->CellInfo.tdscdma.signalStrengthTdscdma.rscp);
+#ifdef TELEMATIC_5G_SUPPORT
+            case RIL_CELL_INFO_TYPE_NR: {
+                appendPrintBuf("%s NR id: mcc=%d,mnc=%d,nci=%d,pci=%d,tac=%d", printBuf,
+                    p_cur->CellInfo.nr.cellidentity.mcc,
+                    p_cur->CellInfo.nr.cellidentity.mnc,
+                    p_cur->CellInfo.nr.cellidentity.nci,
+                    p_cur->CellInfo.nr.cellidentity.pci,
+                    p_cur->CellInfo.nr.cellidentity.tac,
+                    p_cur->CellInfo.nr.cellidentity.nrarfcn);
+
+                p.writeInt32(p_cur->CellInfo.nr.cellidentity.mcc);
+                p.writeInt32(p_cur->CellInfo.nr.cellidentity.mnc);
+                p.writeInt32(p_cur->CellInfo.nr.cellidentity.nci);
+                p.writeInt32(p_cur->CellInfo.nr.cellidentity.pci);
+                p.writeInt32(p_cur->CellInfo.nr.cellidentity.tac);
+                p.writeInt32(p_cur->CellInfo.nr.cellidentity.nrarfcn);
+
+                appendPrintBuf("%s NRSS: ssRsrp=%d,ssRsrq=%d,ssSinr=%d,csiRsrp=%d,csiRsrq=%d,csiSinr=%d", printBuf,
+                    p_cur->CellInfo.nr.signalStrength.ssRsrp,
+                    p_cur->CellInfo.nr.signalStrength.ssRsrq,
+                    p_cur->CellInfo.nr.signalStrength.ssSinr,
+                    p_cur->CellInfo.nr.signalStrength.csiRsrp,
+                    p_cur->CellInfo.nr.signalStrength.csiRsrq,
+                    p_cur->CellInfo.nr.signalStrength.csiSinr);
+                p.writeInt32(p_cur->CellInfo.nr.signalStrength.ssRsrp);
+                p.writeInt32(p_cur->CellInfo.nr.signalStrength.ssRsrq);
+                p.writeInt32(p_cur->CellInfo.nr.signalStrength.ssSinr);
+                p.writeInt32(p_cur->CellInfo.nr.signalStrength.csiRsrp);
+                p.writeInt32(p_cur->CellInfo.nr.signalStrength.csiRsrq);
+                p.writeInt32(p_cur->CellInfo.nr.signalStrength.csiSinr);
+                break;
+            }
+#endif
                 break;
             }
         }
@@ -3752,6 +3854,9 @@
 
         p.writeInt32 (RESPONSE_SOLICITED);
         p.writeInt32 (pRI->pCI->requestNumber);
+        /*warren add for t800 ril servie 2021/12/15 start*/
+        p.writeInt32(socket_id);
+        /*warren add for t800 ril servie 2021/12/15 end*/
         errorOffset = p.dataPosition();
 
         p.writeInt32 (e);
@@ -3826,6 +3931,10 @@
                                   tempVal == RADIO_TECH_EVDO_A ||
                                   tempVal == RADIO_TECH_EVDO_B) { //3G
                            sprintf(respStr,"%s radioTech is 3G!",respStr);
+#ifdef TELEMATIC_5G_SUPPORT
+                       } else if(tempVal == RADIO_TECH_NR) { //5G
+                           sprintf(respStr,"%s radioTech is 5G!",respStr);
+#endif
                        } else { //unknown
                            sprintf(respStr,"%s radioTech is unkown!",respStr);
                        }
@@ -3978,6 +4087,7 @@
             RLOGD ("RIL onRequestComplete: Command channel closed");
         }
 #endif
+        LYNQ_RIL_respSocket(p,t);
         sendResponse(p, socket_id);
     }
 #if ATCI_ENABLE_RESPONSE
@@ -4271,7 +4381,9 @@
 
     p.writeInt32 (RESPONSE_UNSOLICITED);
     p.writeInt32 (unsolResponse);
-
+    /*Warren add for t800 ril service 2021/12/16 start*/
+    p.writeInt32 (soc_id);
+    /*Warren add for t800 ril service 2021/12/16 end*/
     if (unsolResponse >= RIL_UNSOL_VENDOR_BASE) {
         UnsolResponseInfo* unsolRspInof = find_mtk_unsol_command(unsolResponse);
         if(unsolRspInof == NULL){
@@ -4312,13 +4424,15 @@
 #if VDBG
     RLOGI("%s UNSOLICITED: %s length:%d", rilSocketIdToString(soc_id), requestToString(unsolResponse), p.dataSize());
 #endif
+    /*Warren add for t800 ril service 2021/12/16 start*/
+    ret = LYNQ_RIL_urcBroadcast(p);
+    /*Warren add for t800 ril service 2021/12/16 end*/
     ret = sendResponse(p, soc_id);
-
 //unsol trigger other things.
     switch(unsolResponse) {
-    case RIL_UNSOL_RESPONSE_CALL_STATE_CHANGED:
-        ARspRequest(RIL_REQUEST_GET_CURRENT_CALLS, soc_id);
-        break;
+    // case RIL_UNSOL_RESPONSE_CALL_STATE_CHANGED:
+    //     ARspRequest(RIL_REQUEST_GET_CURRENT_CALLS, soc_id);
+    //     break;
     case RIL_UNSOL_CALL_RING:
         callRing(soc_id);
         break;
@@ -4333,6 +4447,11 @@
         unreadStatusWriteSMSToSim((const char*)data, datalen, soc_id);
         sendSMSACK(soc_id);
         break;
+    case RIL_UNSOL_RESPONSE_NEW_BROADCAST_SMS:
+    {
+        RLOGD("Receive RIL_UNSOL_RESPONSE_NEW_BROADCAST_SMS data: %s, length: %d", (char*)data, datalen);
+        break;
+    }
     case RIL_UNSOL_RESPONSE_NEW_SMS_STATUS_REPORT:
         sendSMSACK(soc_id);
         break;
@@ -4531,6 +4650,254 @@
         default: return "<unknown state>";
     }
 }
+const char *lynq_requset_to_string(int request)
+{
+    switch(request) {
+        case RIL_REQUEST_GET_SIM_STATUS: return "RIL_REQUEST_GET_SIM_STATUS";
+        case RIL_REQUEST_ENTER_SIM_PIN: return "RIL_REQUEST_ENTER_SIM_PIN";
+        case RIL_REQUEST_ENTER_SIM_PUK: return "RIL_REQUEST_ENTER_SIM_PUK";
+        case RIL_REQUEST_ENTER_SIM_PIN2: return "RIL_REQUEST_ENTER_SIM_PIN2";
+        case RIL_REQUEST_ENTER_SIM_PUK2: return "RIL_REQUEST_ENTER_SIM_PUK2";
+        case RIL_REQUEST_CHANGE_SIM_PIN: return "RIL_REQUEST_CHANGE_SIM_PIN";
+        case RIL_REQUEST_CHANGE_SIM_PIN2: return "RIL_REQUEST_CHANGE_SIM_PIN2";
+        case RIL_REQUEST_ENTER_NETWORK_DEPERSONALIZATION: return "RIL_REQUEST_ENTER_NETWORK_DEPERSONALIZATION";
+        case RIL_REQUEST_GET_CURRENT_CALLS: return "RIL_REQUEST_GET_CURRENT_CALLS";
+        case RIL_REQUEST_DIAL: return "RIL_REQUEST_DIAL";
+        case RIL_REQUEST_GET_IMSI: return "RIL_REQUEST_GET_IMSI";
+        case RIL_REQUEST_HANGUP: return "RIL_REQUEST_HANGUP";
+        case RIL_REQUEST_HANGUP_WAITING_OR_BACKGROUND: return "RIL_REQUEST_HANGUP_WAITING_OR_BACKGROUND";
+        case RIL_REQUEST_HANGUP_FOREGROUND_RESUME_BACKGROUND: return "RIL_REQUEST_HANGUP_FOREGROUND_RESUME_BACKGROUND";
+        case RIL_REQUEST_SWITCH_WAITING_OR_HOLDING_AND_ACTIVE: return "RIL_REQUEST_SWITCH_WAITING_OR_HOLDING_AND_ACTIVE";
+        case RIL_REQUEST_CONFERENCE: return "RIL_REQUEST_CONFERENCE";
+        case RIL_REQUEST_UDUB: return "RIL_REQUEST_UDUB";
+        case RIL_REQUEST_LAST_CALL_FAIL_CAUSE: return "RIL_REQUEST_LAST_CALL_FAIL_CAUSE";
+        case RIL_REQUEST_SIGNAL_STRENGTH: return "RIL_REQUEST_SIGNAL_STRENGTH";
+        case RIL_REQUEST_VOICE_REGISTRATION_STATE: return "RIL_REQUEST_VOICE_REGISTRATION_STATE";
+        case RIL_REQUEST_DATA_REGISTRATION_STATE: return "RIL_REQUEST_DATA_REGISTRATION_STATE";
+        case RIL_REQUEST_OPERATOR: return "RIL_REQUEST_OPERATOR";
+        case RIL_REQUEST_RADIO_POWER: return "RIL_REQUEST_RADIO_POWER";
+        case RIL_REQUEST_DTMF: return "RIL_REQUEST_DTMF";
+        case RIL_REQUEST_SEND_SMS: return "RIL_REQUEST_SEND_SMS";
+        case RIL_REQUEST_SEND_SMS_EXPECT_MORE: return "RIL_REQUEST_SEND_SMS_EXPECT_MORE";
+        case RIL_REQUEST_SETUP_DATA_CALL: return "RIL_REQUEST_SETUP_DATA_CALL";
+        case RIL_REQUEST_SIM_IO: return "RIL_REQUEST_SIM_IO";
+        case RIL_REQUEST_SEND_USSD: return "RIL_REQUEST_SEND_USSD";
+        case RIL_REQUEST_CANCEL_USSD: return "RIL_REQUEST_CANCEL_USSD";
+        case RIL_REQUEST_GET_CLIR: return "RIL_REQUEST_GET_CLIR";
+        case RIL_REQUEST_SET_CLIR: return "RIL_REQUEST_SET_CLIR";
+        case RIL_REQUEST_QUERY_CALL_FORWARD_STATUS: return "RIL_REQUEST_QUERY_CALL_FORWARD_STATUS";
+        case RIL_REQUEST_SET_CALL_FORWARD: return "RIL_REQUEST_SET_CALL_FORWARD";
+        case RIL_REQUEST_QUERY_CALL_WAITING: return "RIL_REQUEST_QUERY_CALL_WAITING";
+        case RIL_REQUEST_SET_CALL_WAITING: return "RIL_REQUEST_SET_CALL_WAITING";
+        case RIL_REQUEST_SMS_ACKNOWLEDGE: return "RIL_REQUEST_SMS_ACKNOWLEDGE";
+        case RIL_REQUEST_GET_IMEI: return "RIL_REQUEST_GET_IMEI";
+        case RIL_REQUEST_GET_IMEISV: return "RIL_REQUEST_GET_IMEISV";
+        case RIL_REQUEST_ANSWER: return "RIL_REQUEST_ANSWER";
+        case RIL_REQUEST_DEACTIVATE_DATA_CALL: return "RIL_REQUEST_DEACTIVATE_DATA_CALL";
+        case RIL_REQUEST_QUERY_FACILITY_LOCK: return "RIL_REQUEST_QUERY_FACILITY_LOCK";
+        case RIL_REQUEST_SET_FACILITY_LOCK: return "RIL_REQUEST_SET_FACILITY_LOCK";
+        case RIL_REQUEST_CHANGE_BARRING_PASSWORD: return "RIL_REQUEST_CHANGE_BARRING_PASSWORD";
+        case RIL_REQUEST_QUERY_NETWORK_SELECTION_MODE: return "RIL_REQUEST_QUERY_NETWORK_SELECTION_MODE";
+        case RIL_REQUEST_SET_NETWORK_SELECTION_AUTOMATIC: return "RIL_REQUEST_SET_NETWORK_SELECTION_AUTOMATIC";
+        case RIL_REQUEST_SET_NETWORK_SELECTION_MANUAL: return "RIL_REQUEST_SET_NETWORK_SELECTION_MANUAL";
+        case RIL_REQUEST_QUERY_AVAILABLE_NETWORKS : return "RIL_REQUEST_QUERY_AVAILABLE_NETWORKS";
+        case RIL_REQUEST_DTMF_START: return "RIL_REQUEST_DTMF_START";
+        case RIL_REQUEST_DTMF_STOP: return "RIL_REQUEST_DTMF_STOP";
+        case RIL_REQUEST_BASEBAND_VERSION: return "RIL_REQUEST_BASEBAND_VERSION";
+        case RIL_REQUEST_SEPARATE_CONNECTION: return "RIL_REQUEST_SEPARATE_CONNECTION";
+        case RIL_REQUEST_SET_PREFERRED_NETWORK_TYPE: return "RIL_REQUEST_SET_PREFERRED_NETWORK_TYPE";
+        case RIL_REQUEST_GET_PREFERRED_NETWORK_TYPE: return "RIL_REQUEST_GET_PREFERRED_NETWORK_TYPE";
+        case RIL_REQUEST_GET_NEIGHBORING_CELL_IDS: return "RIL_REQUEST_GET_NEIGHBORING_CELL_IDS";
+        case RIL_REQUEST_SET_MUTE: return "RIL_REQUEST_SET_MUTE";
+        case RIL_REQUEST_GET_MUTE: return "RIL_REQUEST_GET_MUTE";
+        case RIL_REQUEST_QUERY_CLIP: return "RIL_REQUEST_QUERY_CLIP";
+        case RIL_REQUEST_LAST_DATA_CALL_FAIL_CAUSE: return "RIL_REQUEST_LAST_DATA_CALL_FAIL_CAUSE";
+        case RIL_REQUEST_DATA_CALL_LIST: return "RIL_REQUEST_DATA_CALL_LIST";
+        case RIL_REQUEST_RESET_RADIO: return "RIL_REQUEST_RESET_RADIO";
+        case RIL_REQUEST_OEM_HOOK_RAW: return "RIL_REQUEST_OEM_HOOK_RAW";
+        case RIL_REQUEST_OEM_HOOK_STRINGS: return "RIL_REQUEST_OEM_HOOK_STRINGS";
+        case RIL_REQUEST_SET_BAND_MODE: return "RIL_REQUEST_SET_BAND_MODE";
+        case RIL_REQUEST_QUERY_AVAILABLE_BAND_MODE: return "RIL_REQUEST_QUERY_AVAILABLE_BAND_MODE";
+        case RIL_REQUEST_STK_GET_PROFILE: return "RIL_REQUEST_STK_GET_PROFILE";
+        case RIL_REQUEST_STK_SET_PROFILE: return "RIL_REQUEST_STK_SET_PROFILE";
+        case RIL_REQUEST_STK_SEND_ENVELOPE_COMMAND: return "RIL_REQUEST_STK_SEND_ENVELOPE_COMMAND";
+        case RIL_REQUEST_STK_SEND_TERMINAL_RESPONSE: return "RIL_REQUEST_STK_SEND_TERMINAL_RESPONSE";
+        case RIL_REQUEST_STK_HANDLE_CALL_SETUP_REQUESTED_FROM_SIM: return "RIL_REQUEST_STK_HANDLE_CALL_SETUP_REQUESTED_FROM_SIM";
+        case RIL_REQUEST_SCREEN_STATE: return "RIL_REQUEST_SCREEN_STATE";
+        case RIL_REQUEST_EXPLICIT_CALL_TRANSFER: return "RIL_REQUEST_EXPLICIT_CALL_TRANSFER";
+        case RIL_REQUEST_SET_LOCATION_UPDATES: return "RIL_REQUEST_SET_LOCATION_UPDATES";
+        case RIL_REQUEST_CDMA_SET_SUBSCRIPTION_SOURCE:return"RIL_REQUEST_CDMA_SET_SUBSCRIPTION_SOURCE";
+        case RIL_REQUEST_CDMA_SET_ROAMING_PREFERENCE:return"RIL_REQUEST_CDMA_SET_ROAMING_PREFERENCE";
+        case RIL_REQUEST_CDMA_QUERY_ROAMING_PREFERENCE:return"RIL_REQUEST_CDMA_QUERY_ROAMING_PREFERENCE";
+        case RIL_REQUEST_SET_TTY_MODE:return"RIL_REQUEST_SET_TTY_MODE";
+        case RIL_REQUEST_QUERY_TTY_MODE:return"RIL_REQUEST_QUERY_TTY_MODE";
+        case RIL_REQUEST_CDMA_SET_PREFERRED_VOICE_PRIVACY_MODE:return"RIL_REQUEST_CDMA_SET_PREFERRED_VOICE_PRIVACY_MODE";
+        case RIL_REQUEST_CDMA_QUERY_PREFERRED_VOICE_PRIVACY_MODE:return"RIL_REQUEST_CDMA_QUERY_PREFERRED_VOICE_PRIVACY_MODE";
+        case RIL_REQUEST_CDMA_FLASH:return"RIL_REQUEST_CDMA_FLASH";
+        case RIL_REQUEST_CDMA_BURST_DTMF:return"RIL_REQUEST_CDMA_BURST_DTMF";
+        case RIL_REQUEST_CDMA_SEND_SMS:return"RIL_REQUEST_CDMA_SEND_SMS";
+        case RIL_REQUEST_CDMA_SMS_ACKNOWLEDGE:return"RIL_REQUEST_CDMA_SMS_ACKNOWLEDGE";
+        case RIL_REQUEST_GSM_GET_BROADCAST_SMS_CONFIG:return"RIL_REQUEST_GSM_GET_BROADCAST_SMS_CONFIG";
+        case RIL_REQUEST_GSM_SET_BROADCAST_SMS_CONFIG:return"RIL_REQUEST_GSM_SET_BROADCAST_SMS_CONFIG";
+        case RIL_REQUEST_GSM_SMS_BROADCAST_ACTIVATION:return "RIL_REQUEST_GSM_SMS_BROADCAST_ACTIVATION";
+        case RIL_REQUEST_CDMA_GET_BROADCAST_SMS_CONFIG:return "RIL_REQUEST_CDMA_GET_BROADCAST_SMS_CONFIG";
+        case RIL_REQUEST_CDMA_SET_BROADCAST_SMS_CONFIG:return "RIL_REQUEST_CDMA_SET_BROADCAST_SMS_CONFIG";
+        case RIL_REQUEST_CDMA_SMS_BROADCAST_ACTIVATION:return "RIL_REQUEST_CDMA_SMS_BROADCAST_ACTIVATION";
+        case RIL_REQUEST_CDMA_VALIDATE_AND_WRITE_AKEY: return"RIL_REQUEST_CDMA_VALIDATE_AND_WRITE_AKEY";
+        case RIL_REQUEST_CDMA_SUBSCRIPTION: return"RIL_REQUEST_CDMA_SUBSCRIPTION";
+        case RIL_REQUEST_CDMA_WRITE_SMS_TO_RUIM: return "RIL_REQUEST_CDMA_WRITE_SMS_TO_RUIM";
+        case RIL_REQUEST_CDMA_DELETE_SMS_ON_RUIM: return "RIL_REQUEST_CDMA_DELETE_SMS_ON_RUIM";
+        case RIL_REQUEST_DEVICE_IDENTITY: return "RIL_REQUEST_DEVICE_IDENTITY";
+        case RIL_REQUEST_EXIT_EMERGENCY_CALLBACK_MODE: return "RIL_REQUEST_EXIT_EMERGENCY_CALLBACK_MODE";
+        case RIL_REQUEST_GET_SMSC_ADDRESS: return "RIL_REQUEST_GET_SMSC_ADDRESS";
+        case RIL_REQUEST_SET_SMSC_ADDRESS: return "RIL_REQUEST_SET_SMSC_ADDRESS";
+        case RIL_REQUEST_REPORT_SMS_MEMORY_STATUS: return "RIL_REQUEST_REPORT_SMS_MEMORY_STATUS";
+        case RIL_REQUEST_REPORT_STK_SERVICE_IS_RUNNING: return "RIL_REQUEST_REPORT_STK_SERVICE_IS_RUNNING";
+        case RIL_REQUEST_CDMA_GET_SUBSCRIPTION_SOURCE: return "RIL_REQUEST_CDMA_GET_SUBSCRIPTION_SOURCE";
+        case RIL_REQUEST_ISIM_AUTHENTICATION: return "RIL_REQUEST_ISIM_AUTHENTICATION";
+        case RIL_REQUEST_ACKNOWLEDGE_INCOMING_GSM_SMS_WITH_PDU: return "RIL_REQUEST_ACKNOWLEDGE_INCOMING_GSM_SMS_WITH_PDU";
+        case RIL_REQUEST_STK_SEND_ENVELOPE_WITH_STATUS: return "RIL_REQUEST_STK_SEND_ENVELOPE_WITH_STATUS";
+        case RIL_REQUEST_VOICE_RADIO_TECH: return "RIL_REQUEST_VOICE_RADIO_TECH";
+        case RIL_REQUEST_GET_CELL_INFO_LIST: return"RIL_REQUEST_GET_CELL_INFO_LIST";
+        case RIL_REQUEST_SET_UNSOL_CELL_INFO_LIST_RATE: return"RIL_REQUEST_SET_UNSOL_CELL_INFO_LIST_RATE";
+        case RIL_REQUEST_SET_INITIAL_ATTACH_APN: return "RIL_REQUEST_SET_INITIAL_ATTACH_APN";
+        case RIL_REQUEST_IMS_REGISTRATION_STATE: return "RIL_REQUEST_IMS_REGISTRATION_STATE";
+        case RIL_REQUEST_IMS_SEND_SMS: return "RIL_REQUEST_IMS_SEND_SMS";
+        case RIL_REQUEST_SIM_TRANSMIT_APDU_BASIC: return "RIL_REQUEST_SIM_TRANSMIT_APDU_BASIC";
+        case RIL_REQUEST_SIM_OPEN_CHANNEL: return "RIL_REQUEST_SIM_OPEN_CHANNEL";
+        case RIL_REQUEST_SIM_CLOSE_CHANNEL: return "RIL_REQUEST_SIM_CLOSE_CHANNEL";
+        case RIL_REQUEST_SIM_TRANSMIT_APDU_CHANNEL: return "RIL_REQUEST_SIM_TRANSMIT_APDU_CHANNEL";
+        case RIL_REQUEST_GET_RADIO_CAPABILITY: return "RIL_REQUEST_GET_RADIO_CAPABILITY";
+        case RIL_REQUEST_SET_RADIO_CAPABILITY: return "RIL_REQUEST_SET_RADIO_CAPABILITY";
+        case RIL_REQUEST_SET_UICC_SUBSCRIPTION: return "RIL_REQUEST_SET_UICC_SUBSCRIPTION";
+        case RIL_REQUEST_ALLOW_DATA: return "RIL_REQUEST_ALLOW_DATA";
+        case RIL_REQUEST_GET_HARDWARE_CONFIG: return "RIL_REQUEST_GET_HARDWARE_CONFIG";
+        case RIL_REQUEST_SIM_AUTHENTICATION: return "RIL_REQUEST_SIM_AUTHENTICATION";
+        case RIL_REQUEST_GET_DC_RT_INFO: return "RIL_REQUEST_GET_DC_RT_INFO";
+        case RIL_REQUEST_SET_DC_RT_INFO_RATE: return "RIL_REQUEST_SET_DC_RT_INFO_RATE";
+        case RIL_REQUEST_SET_DATA_PROFILE: return "RIL_REQUEST_SET_DATA_PROFILE";
+        case RIL_UNSOL_RESPONSE_RADIO_STATE_CHANGED: return "RIL_UNSOL_RESPONSE_RADIO_STATE_CHANGED";
+        case RIL_UNSOL_RESPONSE_CALL_STATE_CHANGED: return "RIL_UNSOL_RESPONSE_CALL_STATE_CHANGED";
+        case RIL_UNSOL_RESPONSE_VOICE_NETWORK_STATE_CHANGED: return "RIL_UNSOL_RESPONSE_VOICE_NETWORK_STATE_CHANGED";
+        case RIL_UNSOL_RESPONSE_NEW_SMS: return "RIL_UNSOL_RESPONSE_NEW_SMS";
+        case RIL_UNSOL_RESPONSE_NEW_SMS_STATUS_REPORT: return "RIL_UNSOL_RESPONSE_NEW_SMS_STATUS_REPORT";
+        case RIL_UNSOL_RESPONSE_NEW_SMS_ON_SIM: return "RIL_UNSOL_RESPONSE_NEW_SMS_ON_SIM";
+        case RIL_UNSOL_ON_USSD: return "RIL_UNSOL_ON_USSD";
+        case RIL_UNSOL_ON_USSD_REQUEST: return "RIL_UNSOL_ON_USSD_REQUEST";
+        case RIL_UNSOL_NITZ_TIME_RECEIVED: return "RIL_UNSOL_NITZ_TIME_RECEIVED";
+        case RIL_UNSOL_SIGNAL_STRENGTH: return "RIL_UNSOL_SIGNAL_STRENGTH";
+        case RIL_UNSOL_STK_SESSION_END: return "RIL_UNSOL_STK_SESSION_END";
+        case RIL_UNSOL_STK_PROACTIVE_COMMAND: return "RIL_UNSOL_STK_PROACTIVE_COMMAND";
+        case RIL_UNSOL_STK_EVENT_NOTIFY: return "RIL_UNSOL_STK_EVENT_NOTIFY";
+        case RIL_UNSOL_STK_CALL_SETUP: return "RIL_UNSOL_STK_CALL_SETUP";
+        case RIL_UNSOL_SIM_SMS_STORAGE_FULL: return "RIL_UNSOL_SIM_SMS_STORAGE_FULL";
+        case RIL_UNSOL_SIM_REFRESH: return "RIL_UNSOL_SIM_REFRESH";
+        case RIL_UNSOL_DATA_CALL_LIST_CHANGED: return "RIL_UNSOL_DATA_CALL_LIST_CHANGED";
+        case RIL_UNSOL_CALL_RING: return "RIL_UNSOL_CALL_RING";
+        case RIL_UNSOL_RESPONSE_SIM_STATUS_CHANGED: return "RIL_UNSOL_RESPONSE_SIM_STATUS_CHANGED";
+        case RIL_UNSOL_RESPONSE_CDMA_NEW_SMS: return "RIL_UNSOL_RESPONSE_CDMA_NEW_SMS";
+        case RIL_UNSOL_RESPONSE_NEW_BROADCAST_SMS: return "RIL_UNSOL_RESPONSE_NEW_BROADCAST_SMS";
+        case RIL_UNSOL_CDMA_RUIM_SMS_STORAGE_FULL: return "RIL_UNSOL_CDMA_RUIM_SMS_STORAGE_FULL";
+        case RIL_UNSOL_RESTRICTED_STATE_CHANGED: return "RIL_UNSOL_RESTRICTED_STATE_CHANGED";
+        case RIL_UNSOL_ENTER_EMERGENCY_CALLBACK_MODE: return "RIL_UNSOL_ENTER_EMERGENCY_CALLBACK_MODE";
+        case RIL_UNSOL_CDMA_CALL_WAITING: return "RIL_UNSOL_CDMA_CALL_WAITING";
+        case RIL_UNSOL_CDMA_OTA_PROVISION_STATUS: return "RIL_UNSOL_CDMA_OTA_PROVISION_STATUS";
+        case RIL_UNSOL_CDMA_INFO_REC: return "RIL_UNSOL_CDMA_INFO_REC";
+        case RIL_UNSOL_OEM_HOOK_RAW: return "RIL_UNSOL_OEM_HOOK_RAW";
+        case RIL_UNSOL_RINGBACK_TONE: return "RIL_UNSOL_RINGBACK_TONE";
+        case RIL_UNSOL_RESEND_INCALL_MUTE: return "RIL_UNSOL_RESEND_INCALL_MUTE";
+        case RIL_UNSOL_CDMA_SUBSCRIPTION_SOURCE_CHANGED: return "RIL_UNSOL_CDMA_SUBSCRIPTION_SOURCE_CHANGED";
+        case RIL_UNSOL_CDMA_PRL_CHANGED: return "RIL_UNSOL_CDMA_PRL_CHANGED";
+        case RIL_UNSOL_EXIT_EMERGENCY_CALLBACK_MODE: return "RIL_UNSOL_EXIT_EMERGENCY_CALLBACK_MODE";
+        case RIL_UNSOL_RIL_CONNECTED: return "RIL_UNSOL_RIL_CONNECTED";
+        case RIL_UNSOL_VOICE_RADIO_TECH_CHANGED: return "RIL_UNSOL_VOICE_RADIO_TECH_CHANGED";
+        case RIL_UNSOL_CELL_INFO_LIST: return "RIL_UNSOL_CELL_INFO_LIST";
+        case RIL_UNSOL_RESPONSE_IMS_NETWORK_STATE_CHANGED: return "RIL_UNSOL_RESPONSE_IMS_NETWORK_STATE_CHANGED";
+        case RIL_UNSOL_UICC_SUBSCRIPTION_STATUS_CHANGED: return "RIL_UNSOL_UICC_SUBSCRIPTION_STATUS_CHANGED";
+        case RIL_UNSOL_SRVCC_STATE_NOTIFY: return "RIL_UNSOL_SRVCC_STATE_NOTIFY";
+        case RIL_UNSOL_HARDWARE_CONFIG_CHANGED: return "RIL_UNSOL_HARDWARE_CONFIG_CHANGED";
+        case RIL_UNSOL_DC_RT_INFO_CHANGED: return "RIL_UNSOL_DC_RT_INFO_CHANGED";
+        case RIL_REQUEST_SHUTDOWN: return "RIL_REQUEST_SHUTDOWN";
+        case RIL_UNSOL_RADIO_CAPABILITY: return "RIL_UNSOL_RADIO_CAPABILITY";
+        case RIL_REQUEST_SET_TRM: return "RIL_REQUEST_SET_TRM";
+        case RIL_REQUEST_SET_IMS_ENABLE:return "RIL_REQUEST_SET_IMS_ENABLE";
+        case RIL_REQUEST_SET_AUDIO_PATH: return "RIL_REQUEST_SET_AUDIO_PATH";
+        case RIL_REQUEST_HANGUP_ALL: return "RIL_REQUEST_HANGUP_ALL";
+        case RIL_REQUEST_FORCE_RELEASE_CALL: return "RIL_REQUEST_FORCE_RELEASE_CALL";
+        case RIL_REQUEST_EMERGENCY_DIAL: return "RIL_REQUEST_EMERGENCY_DIAL";
+        case RIL_REQUEST_SET_ECC_SERVICE_CATEGORY: return "RIL_REQUEST_SET_ECC_SERVICE_CATEGORY";
+        case RIL_REQUEST_SET_ECC_LIST: return "RIL_REQUEST_SET_ECC_LIST";
+        case RIL_REQUEST_AT_COMMAND_WITH_PROXY: return "RIL_REQUEST_AT_COMMAND_WITH_PROXY";
+        case RIL_REQUEST_SET_SUPP_SVC_NOTIFICATION: return "RIL_REQUEST_SET_SUPP_SVC_NOTIFICATION";
+        case RIL_REQUEST_SET_CLIP: return "RIL_REQUEST_SET_CLIP";
+        case RIL_REQUEST_GET_COLP: return "RIL_REQUEST_GET_COLP";
+        case RIL_REQUEST_SET_COLP: return "RIL_REQUEST_SET_COLP";
+        case RIL_REQUEST_GET_COLR: return "RIL_REQUEST_GET_COLR";
+        case RIL_REQUEST_ADD_IMS_CONFERENCE_CALL_MEMBER: return "RIL_REQUEST_ADD_IMS_CONFERENCE_CALL_MEMBER";
+        case RIL_REQUEST_REMOVE_IMS_CONFERENCE_CALL_MEMBER: return "RIL_REQUEST_REMOVE_IMS_CONFERENCE_CALL_MEMBER";
+        case RIL_REQUEST_CONFERENCE_DIAL: return "RIL_REQUEST_CONFERENCE_DIAL";
+        case RIL_REQUEST_DIAL_WITH_SIP_URI: return "RIL_REQUEST_DIAL_WITH_SIP_URI";
+        case RIL_REQUEST_HOLD_CALL: return "RIL_REQUEST_HOLD_CALL";
+        case RIL_REQUEST_RESUME_CALL: return "RIL_REQUEST_RESUME_CALL";
+        case RIL_UNSOL_ECONF_SRVCC_INDICATION : return "RIL_UNSOL_ECONF_SRVCC_INDICATION";
+        case RIL_UNSOL_ECONF_RESULT_INDICATION : return "RIL_UNSOL_ECONF_RESULT_INDICATION";
+        case RIL_UNSOL_MAL_AT_INFO : return "RIL_UNSOL_MAL_AT_INFO";
+        case RIL_REQUEST_MODEM_POWEROFF: return "RIL_REQUEST_MODEM_POWEROFF";
+        case RIL_REQUEST_MODEM_POWERON: return "RIL_REQUEST_MODEM_POWERON";
+        case RIL_REQUEST_WRITE_SMS_TO_SIM: return "RIL_REQUEST_WRITE_SMS_TO_SIM";
+        case RIL_REQUEST_QUERY_ICCID: return "RIL_REQUEST_QUERY_ICCID";
+        case RIL_UNSOL_TX_POWER: return "RIL_UNSOL_TX_POWER";
+        case RIL_UNSOL_NETWORK_INFO: return "RIL_UNSOL_NETWORK_INFO";
+        case RIL_REQUEST_DELETE_SMS_ON_SIM: return "RIL_REQUEST_DELETE_SMS_ON_SIM";
+        case RIL_REQUEST_SET_IMSCFG: return "RIL_REQUEST_SET_IMSCFG";
+#ifdef ECALL_SUPPORT
+        case RIL_REQUEST_ECALL_FAST_MAKE_ECALL: return "RIL_REQUEST_ECALL_FAST_MAKE_ECALL";
+        case RIL_REQUEST_ECALL_SET_IVS: return "RIL_REQUEST_ECALL_SET_IVS";
+        case RIL_REQUEST_ECALL_SET_PSAP: return "RIL_REQUEST_ECALL_SET_PSAP";
+        case RIL_REQUEST_ECALL_MAKE_ECALL: return "RIL_REQUEST_ECALL_MAKE_ECALL";
+        case RIL_REQUEST_ECALL_IVS_PUSH_MSD: return "RIL_REQUEST_ECALL_IVS_PUSH_MSD";
+        case RIL_REQUEST_ECALL_PSAP_PULL_MSD: return "RIL_REQUEST_ECALL_PSAP_PULL_MSD";
+        case RIL_UNSOL_ECALL_MSDHACK : return "RIL_UNSOL_ECALL_MSDHACK";
+        case RIL_REQUEST_ECALL_SET_MSD: return "RIL_REQUEST_ECALL_SET_MSD";
+        case RIL_REQUEST_ECALL_CTRL_SEQUENCE: return "RIL_REQUEST_ECALL_CTRL_SEQUENCE";
+        case RIL_UNSOL_ECALL_INDICATIONS : return "RIL_UNSOL_ECALL_INDICATIONS";
+        case RIL_REQUEST_ECALL_RESET_IVS: return "RIL_REQUEST_ECALL_RESET_IVS";
+        case RIL_REQUEST_ECALL_SET_PRI: return "RIL_REQUEST_ECALL_SET_PRI";
+        case RIL_REQUEST_ECALL_SET_TEST_NUM: return "RIL_REQUEST_ECALL_SET_TEST_NUM";
+        case RIL_REQUEST_ECALL_SET_RECONF_NUM: return "RIL_REQUEST_ECALL_SET_RECONF_NUM";
+        case RIL_REQUEST_SYNC_DATA_SETTINGS_TO_MD: return "RIL_REQUEST_SYNC_DATA_SETTINGS_TO_MD";
+        case RIL_REQUEST_ECALL_SET_NAD_DEREGISTRATION_TIME: return "RIL_REQUEST_ECALL_SET_NAD_DEREGISTRATION_TIME";
+        case RIL_REQUEST_ECALL_SET_REGISTRATION_STATE: return "RIL_REQUEST_ECALL_SET_REGISTRATION_STATE";
+#endif /*ECALL_SUPPORT*/
+#ifdef KEEP_ALIVE
+        case RIL_REQUEST_START_KEEPALIVE_PRO: return "RIL_REQUEST_START_KEEPALIVE_PRO";
+        case RIL_REQUEST_STOP_KEEPALIVE_PRO: return "RIL_REQUEST_STOP_KEEPALIVE_PRO";
+        case RIL_UNSOL_KEEPALIVE_STATUS_PRO: return "RIL_UNSOL_KEEPALIVE_STATUS_PRO";
+#endif /*KEEP_ALIVE*/
+        case RIL_REQUEST_SEND_USSI: return "RIL_REQUEST_SEND_USSI";
+        case RIL_REQUEST_CANCEL_USSI: return "RIL_REQUEST_CANCEL_USSI";
+        case RIL_REQUEST_GET_SMS_SIM_MEM_STATUS: return "RIL_REQUEST_GET_SMS_SIM_MEM_STATUS";
+        case RIL_UNSOL_SIP_CALL_PROGRESS_INDICATOR: return "RIL_UNSOL_SIP_CALL_PROGRESS_INDICATOR";
+        case RIL_REQUEST_REPORT_AIRPLANE_MODE: return "RIL_REQUEST_REPORT_AIRPLANE_MODE";
+        case RIL_REQUEST_SET_ECC_NUM: return "RIL_REQUEST_SET_ECC_NUM";
+        case RIL_REQUEST_GET_ECC_NUM: return "RIL_REQUEST_GET_ECC_NUM";
+        case RIL_UNSOL_ECC_NUM: return "RIL_UNSOL_ECC_NUM";
+        case RIL_REQUEST_QUERY_AVAILABLE_NETWORKS_WITH_ACT: return "RIL_REQUEST_QUERY_AVAILABLE_NETWORKS_WITH_ACT";
+        case RIL_REQUEST_GSM_GET_BROADCAST_LANGUAGE: return "RIL_REQUEST_GSM_GET_BROADCAST_LANGUAGE";
+        case RIL_REQUEST_GSM_SET_BROADCAST_LANGUAGE: return "RIL_REQUEST_GSM_SET_BROADCAST_LANGUAGE";
+        case RIL_UNSOL_CALL_INFO_INDICATION: return "RIL_UNSOL_CALL_INFO_INDICATION";
+#ifdef TARGET_PLATFORM_MT2731
+        case RIL_REQUEST_MODIFY_APN: return "RIL_REQUEST_MODIFY_APN";
+        case RIL_REQUEST_RESET_APN: return "RIL_REQUEST_RESET_APN";
+#endif
+        case RIL_REQUEST_QUERY_SIM_RETRY_COUNT: return "RIL_REQUEST_QUERY_SIM_RETRY_COUNT";
+        case RIL_REQUEST_QUERY_EID: return "RIL_REQUEST_QUERY_EID";
+        /*LYNQ CMD*/
+        case LYNQ_AUTO_ANSWER_CALL: return "LYNQ_AUTO_ANSWER_CALL";
+        case LYNQ_REQUEST_SET_DTMF_VOLUME: return "RIL_REQUEST_SET_DTMF_VOLUME";
+        default: return "<unknown request>";
+    }
+}
 
 const char *
 requestToString(int request) {
@@ -4785,6 +5152,7 @@
         case RIL_REQUEST_QUERY_SIM_RETRY_COUNT: return "RIL_REQUEST_QUERY_SIM_RETRY_COUNT";
 #endif
         case RIL_REQUEST_QUERY_EID: return "RIL_REQUEST_QUERY_EID";
+        case LYNQ_REQUEST_SET_DTMF_VOLUME: return "RIL_REQUEST_SET_DTMF_VOLUME";
         default: return "<unknown request>";
     }
 }
@@ -5107,7 +5475,67 @@
 
     return argc;
 }
+/*mobiletek add*/
+int parse_param_test(char *cmd, char *argv[], int max_args)
+{
+    char *pos, *pos2;
+    int argc = 0;
 
+    pos = cmd;
+    while (1) {
+        // Trim the space characters.
+        while (*pos == ' ') {
+            pos++;
+        }
+
+        if (*pos == '\0') {
+            break;
+        }
+
+        // One token may start with '"' or other characters.
+        if (*pos == '"' && (pos2 = strrchr(pos+1, '"'))) {
+            argv[argc++] = pos + 1;
+            *pos2 = '\0';
+            pos = pos2 + 1;
+            if(*pos == '\n'){
+                *pos = '\0';
+                pos = pos + 1;
+            }
+
+        } else {
+            argv[argc++] = pos;
+            while (*pos != '\0' && *pos != ' '&& *pos != '\n') {
+                pos++;
+            }
+            *pos++ = '\0';
+
+            if(argc == 1) {
+              char* at_cmd = strstr(argv[0], "RIL_REQUEST_OEM_HOOK_RAW");
+              if(at_cmd != NULL) {
+                while (*pos == ' ') {
+                    pos++;
+                }
+                argv[argc++] = pos;
+                while (*pos != '\0' && *pos != '\n') {
+                    pos++;
+                }
+                *pos++ = '\0';
+                break;
+              }
+            }
+
+        }
+
+        // Check if the maximum of arguments is reached.
+        if (argc == max_args) {
+            break;
+        }
+    }
+
+    return argc;
+}
+/*mobiletek add*/
+/**/
 /* Look up NAME as the name of a command, and return a pointer to that
    command.  Return a NULL pointer if NAME isn't a command name. */
 COMMAND* find_command (char *name)
@@ -5185,6 +5613,299 @@
 
     return;
 }
+/*Warren add for t800 RIL Service 2021/12/10 start*/
+
+
+void LYNQ_RIL_RecSocket()
+{
+    RLOGD("LYNQ_RIL_RecSocket start\n");
+    //printf("LYNQ_RIL_RecSocket start\n");
+    char *argv[MAX_ARGS];
+    int argc = 0;
+    int ep_fd = 0;
+    int en_fd = 0;
+    struct epoll_event lynq_ev;
+    struct epoll_event lynq_events[LYNQ_SOCKET_ENVNT_FD_MAX];
+    //prctl(PR_SET_NAME,(unsigned long)"UDP_Thr");
+
+    /*listen UPD SOCKET port */
+    struct sockaddr_in server_addr;
+    struct sockaddr_in lynqClient_addr;
+    bzero(&server_addr, sizeof(server_addr));
+    server_addr.sin_family = AF_INET;
+    server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
+    server_addr.sin_port = htons(LYNQ_SERVICE_PORT);
+    /* create socket */
+    //int server_socket_fd = socket(AF_INET, SOCK_DGRAM, 0);
+    server_socket_fd = socket(AF_INET, SOCK_DGRAM, 0);
+    if(server_socket_fd == -1)
+    {
+        RLOGE("Create Socket Failed:");
+        exit(1);
+    }
+
+    /* bind socket port*/
+    if(-1 == (bind(server_socket_fd,(struct sockaddr*)&server_addr,sizeof(server_addr))))
+    {
+         RLOGE("Server Bind Failed:");
+         exit(1);
+    }
+    /* create epoll fd,add socket to epoll */
+    ep_fd = epoll_create(LYNQ_SOCKET_ENVNT_FD_MAX);
+    //int len = sizeof(struct sockaddr_in);
+    lynq_ev.events = EPOLLIN | EPOLLET;
+    lynq_ev.data.fd = server_socket_fd;
+    if(epoll_ctl(ep_fd, EPOLL_CTL_ADD, server_socket_fd, &lynq_ev) < 0) 
+    {
+        fprintf(stderr, "epoll set insertion error: fd=%d\n", server_socket_fd);
+        return;
+    }
+    else
+    {
+        printf("monitor socket add epoll success!!!\n");
+    }
+    char buffer[LYNQ_SOCKET_BUFFER];
+    lynq_client_t *client_tmp = NULL;
+    /* tranlate data */
+    while(true)
+    {
+        if(!s_registerCalled)
+        {
+            sleep(1);
+            continue;
+        }
+        en_fd = epoll_wait(ep_fd, lynq_events, 10000, -1);//###Check  valid
+        if(en_fd <=0 )
+        {
+            continue;
+        }
+        for (int n = 0; n < en_fd; ++n)
+        {
+            if (lynq_events[n].data.fd == server_socket_fd)
+            {
+                /* define address to catch the client addreess*/
+                //struct sockaddr_in client_addr;
+                printf("LYNQ_RIL_RecSocket start\n");
+                socklen_t client_addr_length = sizeof(lynqClient_addr);
+                /* receive the data */
+                bzero(buffer, LYNQ_SOCKET_BUFFER);
+                if(recvfrom(server_socket_fd, buffer, LYNQ_SOCKET_BUFFER,0,(struct sockaddr*)&lynqClient_addr, &client_addr_length) == -1)
+                {
+                    RLOGE("Receive Data Failed:");
+                    printf("Receive Data Failed:\n");
+                    continue;
+                }
+                client_tmp = (lynq_client_t*)buffer;
+                RLOGD("[LYNQ socketId] utoken=%d,request=%d,len=%d,param=%s",client_tmp->uToken,client_tmp->request,client_tmp->paramLen,client_tmp->param);
+                //char test[36] = {};
+                //sprintf(test,"test okay len = %d",client_tmp->paramLen);
+                //sendto(server_socket_fd,test,strlen(test),0,(struct sockaddr*)&client_addr,client_addr_length);
+                argv[0] = (char *)lynq_requset_to_string(client_tmp->request);
+                argc = 0;
+                if(client_tmp->paramLen > 0)
+                {
+                    /*transfer struct*/
+                    argc = parse_param_test(client_tmp->param, argv+1, MAX_ARGS);
+                    if(argc < 1)
+                    {
+                        RLOGE("%s: error input.", buffer);
+                        continue;
+                    }
+                }
+                printf("argc =%d\n",argc);
+                argc = argc+1;
+                for(int t = 0;t<argc;t++)
+                {
+                    RLOGD("warren test argv[%d]=%s\n",t,argv[t]);
+                }
+                COMMAND *command = find_command(argv[0]);
+                if(!command)
+                {
+                    RLOGE("%s: No such command for DemoApp", argv[0]);
+                    continue;
+                }
+                int32_t request;
+                request = command->request;
+                RIL_SOCKET_ID id = RIL_SOCKET_1;
+                if(utils::is_support_dsds()) {
+                    id = (RIL_SOCKET_ID)get_default_sim_all_except_data();
+                } else if(utils::is_suppport_dsss()) {
+                    id = (RIL_SOCKET_ID)Phone_utils::get_enable_sim_for_dsss();
+                }
+                if(request == -1)
+                {
+                    (*(command->func)) (argc, argv, id, NULL);
+                    continue;
+                }
+                if (request < 1 || (request >= (int32_t)NUM_ELEMS(s_commands) && request < RIL_REQUEST_VENDOR_BASE)) {
+                    RLOGW("unsupported request code %d token %d", request);
+                    // FIXME this should perhaps return a response
+                    continue;
+                }
+                RLOGD("REQUEST: %s ParamterNum:%d", requestToString(request), argc);
+                RequestInfo *pRI  = creatRILInfoAndInit(request, UDP, (RIL_SOCKET_ID)(id));
+                pRI->uToken = client_tmp->uToken;
+                pRI->lynqEvent = 1;
+                pRI->uClient_addr.sin_family = lynqClient_addr.sin_family;
+                pRI->uClient_addr.sin_addr.s_addr = lynqClient_addr.sin_addr.s_addr;
+                pRI->uClient_addr.sin_port = lynqClient_addr.sin_port;
+                //sendto(server_socket_fd,test,strlen(test),0,(struct sockaddr*)&pRI->uClient_addr,client_addr_length);
+                //pRI->uClient_addr.sa_family = (struct sockaddr)client_addr.sa_family;
+                //memcpy(pRI->uClient_addr.sa_data,&client_addr
+                //Radio on/off only allow one thread operate.
+                if(request == RIL_REQUEST_RADIO_POWER)
+                {
+                    speciaRequest_wait();
+                }
+                memset(Time_buf,0,sizeof(Time_buf));
+                GetTimeString(Time_buf);
+                //FUNCTION_CALLED(Time_buf,requestToString(request));
+                int waittoken = pRI->token;
+                (*(command->func)) (argc, argv, pRI->socket_id, pRI);
+                FUNCTION_CALLED(Time_buf,requestToString(request));
+                waitResponse(waittoken);
+                memset(Time_buf,0,sizeof(Time_buf));
+                GetTimeString(Time_buf);
+                FUNCTION_RETURN(Time_buf,requestToString(request));
+            }
+        }
+     }
+     RLOGD("close socket fd");
+     close(server_socket_fd);
+     return ;
+}
+
+int LYNQ_RIL_urcBroadcast(Parcel &p)
+{
+    RLOGD("LYNQ_RIL_urcBroadcast send start");
+    int ret =0;
+    bool sendResult =false;
+    ssize_t sent = 0;
+    uint8_t dataLength[4];
+    int verify = 0x55aa;
+    int dataSize = p.dataSize();
+    const uint8_t* data = p.data();
+    sent = sendto(lynq_urc_socket_fd, data, dataSize, 0, (struct sockaddr *)&urc_broadcast_addr, sizeof(urc_broadcast_addr));
+    if( sent < 0 )
+    {
+        RLOGE("LYNQ_RIL_urcBroadcast send datalen fail (sent=%d, sendFD=%d, dataSize=%d)",
+                sent,lynq_urc_socket_fd, dataSize);
+        return -1;
+    }
+    return 0;
+}
+/*Warren add for t800 RIL Service 2021/12/10 end*/
+
+/*Warren add for t800 RIL Service 2021/12/10 start*/
+int lynqAssemblyParcelheader(Parcel &p,int slot,int request,int respType,int error)
+{
+   p.writeInt32 (respType);
+   p.writeInt32 (request);
+   /*warren add for t800 ril servie 2021/12/15 start*/
+   p.writeInt32(slot);
+   /*warren add for t800 ril servie 2021/12/15 end*/
+   p.writeInt32 (error);
+   return 0;
+}
+void LYNQ_RIL_urcClientInit()
+{
+    int len = 0;
+    int on=1;
+    int ret = 0;
+    lynq_urc_socket_fd = socket(AF_INET,SOCK_DGRAM,0);
+    if(lynq_urc_socket_fd < 0)
+    {
+        perror("creaet socket for udp fail");
+        return;
+    }
+    /* 设置socket允许重复使用地址与端口,SO_REUSEADDR值为2 */
+    //setsockopt(socket_fd,SOL_SOCKET,SO_REUSEADDR,&on,sizeof on);
+    /* 使能广播功能,SO_BROADCAST值为6 */
+    ret= setsockopt(lynq_urc_socket_fd,SOL_SOCKET,SO_BROADCAST,&on,sizeof(on));
+    if(ret<0)
+    {
+        RLOGD("set broadcast fail!!!\n");
+        exit(1);
+    }
+    urc_broadcast_addr.sin_family = AF_INET;        //IPv4
+    urc_broadcast_addr.sin_port = htons(LYNQ_BRODCAST_PORT);
+    urc_broadcast_addr.sin_addr.s_addr = inet_addr("255.255.255.255" );//255.255.255.255 broadcast addrress.
+    printf("LYNQ_RIL_urcClientInit success!!!\n");
+    return;
+    /*
+    while(1)
+    {
+        len = sendto(lynq_urc_socket_fd,"hello world",11,0,(struct sockaddr *)&urc_broadcast_addr,sizeof(urc_broadcast_addr));
+        if(len > 0)
+        {
+            printf("sendto success,len=%d\n",len);
+        }
+        else
+        {
+            printf("sendto fail\n");
+        }
+        sleep(1);
+    }
+    */
+}
+
+int LYNQ_RIL_respSocket(Parcel &p,RIL_Token t)
+{
+    RLOGD("LYNQ_RIL_respSocket send start");
+    RequestInfo *pRI = (RequestInfo *)t;
+    if(pRI->lynqEvent!=1)
+    {
+        RLOGD("this is not internal event!!!");
+        return -1;
+    }
+    int sent;
+    int dataSize = p.dataSize();
+    const uint8_t* data = p.data();
+    RLOGD("lynqSocketSend RESPONSE!!!! ");
+    printf("lynqSocketSend RESPONSE!!!!\n");
+    sent = sendto(server_socket_fd, data, dataSize, 0, (struct sockaddr *)&pRI->uClient_addr, sizeof(pRI->uClient_addr));
+    if( sent < 0 )
+    {
+        RLOGE("lynqSocketSend send datalen fail (sent=%d, sendFD=%d, dataSize=%d)",
+                sent,server_socket_fd, dataSize);
+        printf("lynqSocketSend send datalen fail (sent=%d, sendFD=%d, dataSize=%d) %s %d\n",
+        sent,server_socket_fd, dataSize, __FUNCTION__, __LINE__);
+        return -1;
+    }
+    return 0;
+}
+int LYNQ_RIL_respSocket_sp(Parcel &p,RequestInfo *pRI)
+{
+    RLOGD("LYNQ_RIL_respSocket send start");
+    int ret =0;
+    bool sendResult =false;
+    ssize_t sent = 0;
+    uint8_t dataLength[4];
+    int verify = 0x55aa;
+    int dataSize = p.dataSize();
+    const uint8_t* data = p.data();
+    if(pRI->lynqEvent!=1)
+    {
+        RLOGD("this is internal event!!!");
+        return -1;
+    }
+    RLOGD("lynqSocketSend RESPONSE!!!! ");
+    printf("lynqSocketSend RESPONSE!!!!\n");
+
+    sent = sendto(server_socket_fd, data, dataSize, 0, (struct sockaddr *)&pRI->uClient_addr, sizeof(pRI->uClient_addr));
+    if( sent < 0 )
+    {
+        RLOGE("lynqSocketSend send datalen fail (sent=%d, sendFD=%d, dataSize=%d)",
+                sent,server_socket_fd, dataSize);
+        printf("lynqSocketSend send datalen fail (sent=%d, sendFD=%d, dataSize=%d)",
+        sent,server_socket_fd, dataSize);
+        return -1;
+    }
+    return 0;
+}
+
+
+/*Warren add for t800 RIL Service 2021/12/10 end*/
 
 void
 RIL_StartRevSocket()
@@ -5238,6 +5959,10 @@
             continue;
         }
         RLOGD("DemoAPP:%s, receve: %s", inet_ntoa(client_addr.sin_addr), buffer);
+        if(mtkItTest(buffer)) {
+            RLOGD("mtkItTest() handle.");
+            continue;
+        }
         int argc = parse_param(buffer, argv, MAX_ARGS);
         if(argc < 1)
         {
@@ -5362,6 +6087,24 @@
     return NULL;
 }
 
+void *
+eventLoop_sdk(void *param) {
+    pthread_mutex_lock(&s_startupMutex);
+    s_started = 1;
+    pthread_cond_broadcast(&s_startupCond);
+    pthread_mutex_unlock(&s_startupMutex);
+    /*warren add for t800 ril service 2021/12/13 start*/
+    //RIL_StartRevSocket();
+    LYNQ_RIL_urcClientInit();
+    LYNQ_RIL_RecSocket();
+    /*warren add for t800 ril service 2021/12/13 end*/
+    RLOGD("error in event_loop_base errno:%d", errno);
+    // kill self to restart on error
+    kill(0, SIGKILL);
+
+    return NULL;
+}
+
 const int RspDispFunction(int request,char* arg, RIL_SOCKET_ID socket_id)
 {
     int waittoken;
@@ -5871,7 +6614,17 @@
     while (s_started == 0) {
         pthread_cond_wait(&s_startupCond, &s_startupMutex);
     }
-
+    /*mobiletek add*/
+    s_started = 0;
+    result = pthread_create(&s_tid_dispatch, &attr, eventLoop_sdk, NULL);
+    if (result != 0) {
+        RLOGW("Failed to create dispatch thread: %s", strerror(result));
+        goto done;
+    }
+    while (s_started == 0) {
+        pthread_cond_wait(&s_startupCond, &s_startupMutex);
+    }
+    /*mobiletek add*/
     result = pthread_create(&s_tid_dispatch, &attr, responseLoop, NULL);
     if (result != 0) {
         RLOGW("Failed to create response dispatch thread: %s", strerror(result));
diff --git a/src/lynq/framework/lynq-atsvc/src/stateManager/stateManager.cpp b/src/lynq/framework/lynq-atsvc/src/stateManager/stateManager.cpp
old mode 100644
new mode 100755
index 0a9b766..a20fc58
--- a/src/lynq/framework/lynq-atsvc/src/stateManager/stateManager.cpp
+++ b/src/lynq/framework/lynq-atsvc/src/stateManager/stateManager.cpp
@@ -44,7 +44,11 @@
 #include "../util/AtLine.h"
 #include "powerManager.h"
 #include "util/utils.h"
-
+/*T800->T103*/
+#include <string.h>
+#include <cutils/jstring.h>
+#include <liblog/lynq_deflog.h>
+/*T800->T103*/
 #undef LOG_TAG
 #define LOG_TAG "DEMO_MANAGER"
 
diff --git a/src/lynq/lib/liblynq-call/LICENSE b/src/lynq/lib/liblynq-call/LICENSE
new file mode 100755
index 0000000..77f59ed
--- /dev/null
+++ b/src/lynq/lib/liblynq-call/LICENSE
@@ -0,0 +1,31 @@
+Copyright Statement:
+
+This software/firmware and related documentation ("MediaTek Software") are
+protected under relevant copyright laws. The information contained herein is
+confidential and proprietary to MediaTek Inc. and/or its licensors. Without
+the prior written permission of MediaTek inc. and/or its licensors, any
+reproduction, modification, use or disclosure of MediaTek Software, and
+information contained herein, in whole or in part, shall be strictly
+prohibited.
+
+MediaTek Inc. (C) 2015. All rights reserved.
+
+BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
+ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL
+WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
+WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH
+RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
+INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES
+TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
+RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
+OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK
+SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE
+RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S
+ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE
+RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE
+MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
+CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
diff --git a/src/lynq/lib/liblynq-call/include/libcall/lynq_call.h b/src/lynq/lib/liblynq-call/include/libcall/lynq_call.h
new file mode 100755
index 0000000..c37f86a
--- /dev/null
+++ b/src/lynq/lib/liblynq-call/include/libcall/lynq_call.h
@@ -0,0 +1,58 @@
+#ifndef LYNQ_CALL_H

+#define LYNQ_CALL_H 1

+#ifdef __cplusplus

+extern "C" {

+#endif

+#define LYNQ_PHONE_NUMBER_MAX 32

+#define INDEX_IS_NUMBER( alpha_char )   \

+   ( ( (alpha_char >= '0') && (alpha_char <= '9') ) ? 1 : 0 )

+#define LYNQ_CALL_MAX 10

+#define LYNQ_CALL_FAIL_VENDOR_CAUSE 64

+typedef enum {

+    CALL_FAIL_UNOBTAINABLE_NUMBER = 1,

+    CALL_FAIL_NORMAL = 16,

+    CALL_FAIL_BUSY = 17,

+    CALL_FAIL_CONGESTION = 34,

+    CALL_FAIL_ACM_LIMIT_EXCEEDED = 68,

+    CALL_FAIL_CALL_BARRED = 240,

+    CALL_FAIL_FDN_BLOCKED = 241,

+    CALL_FAIL_IMSI_UNKNOWN_IN_VLR = 242,

+    CALL_FAIL_IMEI_NOT_ACCEPTED = 243,

+    CALL_FAIL_DIAL_MODIFIED_TO_USSD = 244, /* STK Call Control */

+    CALL_FAIL_DIAL_MODIFIED_TO_SS = 245,

+    CALL_FAIL_DIAL_MODIFIED_TO_DIAL = 246,

+    CALL_FAIL_CDMA_LOCKED_UNTIL_POWER_CYCLE = 1000,

+    CALL_FAIL_CDMA_DROP = 1001,

+    CALL_FAIL_CDMA_INTERCEPT = 1002,

+    CALL_FAIL_CDMA_REORDER = 1003,

+    CALL_FAIL_CDMA_SO_REJECT = 1004,

+    CALL_FAIL_CDMA_RETRY_ORDER = 1005,

+    CALL_FAIL_CDMA_ACCESS_FAILURE = 1006,

+    CALL_FAIL_CDMA_PREEMPTED = 1007,

+    CALL_FAIL_CDMA_NOT_EMERGENCY = 1008, /* For non-emergency number dialed

+                                            during emergency callback mode */

+    CALL_FAIL_CDMA_ACCESS_BLOCKED = 1009, /* CDMA network access probes blocked */

+    CALL_FAIL_ERROR_UNSPECIFIED = 0xffff

+} lynq_last_call_fail_cause_t;

+typedef struct

+{

+    lynq_last_call_fail_cause_t cause_code;

+    char vendor_cause[LYNQ_CALL_FAIL_VENDOR_CAUSE];

+}lynqLastCallFailCause;

+int lynq_init_call(int uToken);

+int lynq_deinit_call();

+int lynq_call(int *handle,char addr[]);

+int lynq_call_answer();

+int lynq_call_hungup(int*handle);

+int lynq_call_hungup_all();

+int lynq_wait_incoming_call(int *handle);

+int lynq_set_auto_answercall(const int mode);

+int lynq_get_mute_status(int *status);

+int lynq_set_mute_mic(const int enable);

+int lynq_set_DTMF(const char callnum);

+int lynq_set_DTMF_volume(const int volume);

+int lynq_get_current_call_state(int *handle,    int *call_state,int *toa,int *direction,char addr[]);

+#ifdef __cplusplus

+}

+#endif

+#endif

diff --git a/src/lynq/lib/liblynq-call/lynq_call.cpp b/src/lynq/lib/liblynq-call/lynq_call.cpp
new file mode 100755
index 0000000..cb9cde6
--- /dev/null
+++ b/src/lynq/lib/liblynq-call/lynq_call.cpp
@@ -0,0 +1,901 @@
+#include <stdio.h>

+#include <sys/types.h>

+#include <sys/socket.h>

+#include <arpa/inet.h>

+#include <fcntl.h>

+#include <string.h>

+#include <stdlib.h>

+#include <unistd.h>

+#include <binder/Parcel.h>

+#include <log/log.h>

+#include "lynq_call.h"

+#include <cutils/jstring.h>

+#include <pthread.h>

+#include "liblog/lynq_deflog.h"

+#include <sys/time.h>

+

+#define LYNQ_SERVICE_PORT 8088

+#define LYNQ_URC_SERVICE_PORT 8086

+#define LYNQ_REC_BUF 8192

+#define LYNQ_REQUEST_PARAM_BUF 8192

+#define LYQN_SEDN_BUF 1024*8+sizeof(int)*3

+#define USER_LOG_TAG "LYNQ_CALL"

+

+using ::android::Parcel;

+ typedef enum {

+     LYNQ_CALL_ACTIVE = 0,

+     LYNQ_CALL_HOLDING = 1,

+     LYNQ_CALL_DIALING = 2,    /* MO call only */

+     LYNQ_CALL_ALERTING = 3,   /* MO call only */

+     LYNQ_CALL_INCOMING = 4,   /* MT call only */

+     LYNQ_CALL_WAITING = 5       ,/* MT call only */

+}lynq_call_state_t;

+

+typedef struct{

+    int uToken;

+    int request;

+    int paramLen;

+    char param[LYNQ_REQUEST_PARAM_BUF];

+}lynq_client_t;

+typedef struct

+{

+    int used;

+    int call_id;

+    int call_state;

+    int toa;

+    int direction;/*0: MO call,1:MT call*/

+    char addr[LYNQ_PHONE_NUMBER_MAX];

+    int hasTimeout;

+}lynq_call_list_e_t;

+typedef struct

+{

+    int call_id;

+    int call_state;

+    int toa;

+    int direction;/*0: MO call,1:MT call*/

+    char addr[LYNQ_PHONE_NUMBER_MAX];

+}lynq_call_list_t;

+

+lynq_call_list_e_t lynq_call_lists[LYNQ_CALL_MAX]={};

+static pthread_mutex_t call_state_change_mutex = PTHREAD_MUTEX_INITIALIZER;

+static pthread_cond_t call_state_change_cond = PTHREAD_COND_INITIALIZER;

+static pthread_mutex_t s_urc_call_state_change_mutex = PTHREAD_MUTEX_INITIALIZER;

+static pthread_cond_t s_urc_call_state_change_cond = PTHREAD_COND_INITIALIZER;

+static pthread_mutex_t s_incoming_call_mutex = PTHREAD_MUTEX_INITIALIZER;

+static pthread_cond_t s_incoming_call_cond = PTHREAD_COND_INITIALIZER;

+

+

+int s_urc_event_complete = 1;

+

+enum{

+    CALL_OFF=0,

+    CALL_ON=1

+}call_state;

+typedef enum{

+    LYNQ_E_CARDSTATE_ERROR=8000,

+    /* The voice service state is out of service*/

+    LYNQ_E_STATE_OUT_OF_SERVICE=8001,

+    /* The voice service state is EMERGENCY_ONLY*/

+    LYNQ_E_STATE_EMERGENCY_ONLY=8002,

+    /* The radio power is power off*/

+    LYNQ_E_STATE_POWER_OFF=8003,

+    LYNQ_E_TIME_OUT=8004,

+    /*create or open sms DB fail */

+    LYNQ_E_SMS_DB_FAIL=8005,

+    /*Failed to execute sql statement*/

+    LYNQ_E_SMS_SQL_FAIL = 8006,

+    LYNQ_E_SMS_NOT_FIND = 8007,

+    /* The logic conflict*/

+    LYNQ_E_CONFLICT=9000,

+    /*Null anomaly*/

+    LYNQ_E_NULL_ANONALY=9001

+}LYNQ_E;

+

+int lynq_call_state =CALL_OFF;

+int lynq_client_sockfd = 0;

+int Global_uToken = 0;

+int global_call_count =0;

+int global_call_auto_answer = 0;

+bool urc_recive_status = 1;

+bool call_list_loop = 1;

+int isDial = 0;

+int lynqIncomingCallId = 0;

+

+int JumpHeader(Parcel &p,int *resp_type,int *request,int *slot_id,int *error)

+{

+    if(p.dataAvail() > 0)

+    {

+        p.readInt32(resp_type);

+        p.readInt32(request);

+        p.readInt32(slot_id);

+        p.readInt32(error);

+        return 0;

+    }

+    else

+    {

+        return -1;

+    }

+}

+int send_request(int sockfd,lynq_client_t *client_tmp)

+{

+    int ret=0;

+    ret = write(sockfd, client_tmp, LYQN_SEDN_BUF);

+    if(ret==-1)

+    {

+        perror("write error");

+        return -1;

+    }

+    return 0;

+}

+

+int get_response(int sockfd,Parcel &p)

+{

+    int len = 0;

+    char recvline[LYNQ_REC_BUF];

+    bzero(recvline,LYNQ_REC_BUF);

+    /* receive data from server */

+    len = read(sockfd, recvline, LYNQ_REC_BUF);

+    if(len == -1)

+    {

+        perror("read error");

+        return -1;

+    }

+    printf("===>n=%d\n",len);

+    if (recvline != NULL) {

+        p.setData((uint8_t *)recvline,len); // p.setData((uint8_t *) buffer, buflen);

+        p.setDataPosition(0);

+    }

+    return 0;

+}

+static char *strdupReadString(Parcel &p) {

+    size_t stringlen;

+    const char16_t *s16;

+    s16 = p.readString16Inplace(&stringlen);

+    return strndup16to8(s16, stringlen);

+}

+

+int lynq_get_current_call_list(lynq_call_list_t call_list[LYNQ_CALL_MAX])

+{

+    Parcel p;

+    lynq_client_t client;

+    int resp_type = -1;

+    int request = -1;

+    int slot_id = -1;

+    int error = -1;

+    int call_num = 0;

+    int temp = 0;

+    char *remote_phoneNum = NULL;

+    char *remote_name= NULL;

+    char *uusData = NULL;

+    client.uToken = Global_uToken;

+    client.request = 9;//RIL_REQUEST_GET_CURRENT_CALLS

+    client.paramLen = 0;

+    bzero(client.param,LYNQ_REQUEST_PARAM_BUF);

+    LYDBGLOG("uToken=%d,request=%d,paralen=%d,param=%s\n",client.uToken,client.request,client.paramLen,client.param);

+    if(send_request(lynq_client_sockfd,&client)==-1)

+    {

+        LYERRLOG("send request fail");

+        perror("[LYNQ_CALL] send request fail:");

+        return -1;

+    }

+    get_response(lynq_client_sockfd,p);

+    JumpHeader(p,&resp_type,&request,&slot_id,&error);

+    LYINFLOG("resp_type=%d,request=%d,slot_id=%d,error_code=%d",resp_type,request,slot_id,error);

+    if(error == 0)

+    {

+        p.readInt32(&call_num);

+        global_call_count = call_num;

+        if(call_num<=0)

+        {

+            lynq_call_state = CALL_OFF;

+            return 0;

+        }

+        for(int i = 0;i < call_num;i++)

+        {

+            p.readInt32(&temp);

+            call_list[i].call_state = temp;

+            p.readInt32(&call_list[i].call_id);

+            p.readInt32(&call_list[i].toa);

+            p.readInt32(&temp);

+            p.readInt32(&temp);

+            call_list[i].direction = temp;

+            p.readInt32(&temp);

+            p.readInt32(&temp);

+            p.readInt32(&temp);

+            remote_phoneNum = strdupReadString(p);

+            memcpy(call_list[i].addr,remote_phoneNum,strlen(remote_phoneNum));

+            LYINFLOG("call_id=%d,call_state=%d,direction=%d,addr=%s,toa=%d",call_list[i].call_id,call_list[i].call_state,

+            call_list[i].direction,call_list[i].addr,call_list[i].toa);

+            p.readInt32(&temp);

+            remote_name = strdupReadString(p);

+            p.readInt32(&temp);

+            p.readInt32(&temp);

+            if(temp==0)

+            {

+                continue;

+            }

+            p.readInt32(&temp); /* UUS Information is present */

+            p.readInt32(&temp);

+            p.readInt32(&temp);

+            p.read(uusData,temp);

+        }

+    }

+    return 0;

+}

+

+void cleanCallList(int lynq_call_id)

+{

+    lynq_call_lists[lynq_call_id].call_id = 0;

+    lynq_call_lists[lynq_call_id].call_state = 0;

+    lynq_call_lists[lynq_call_id].toa = 0;

+    lynq_call_lists[lynq_call_id].direction = 0;

+    lynq_call_lists[lynq_call_id].used = 0;

+    lynq_call_lists[lynq_call_id].hasTimeout = 0;

+    memset(lynq_call_lists[lynq_call_id].addr,0,sizeof(lynq_call_lists[lynq_call_id].addr));

+}

+int getUnusedElement()

+{

+    for(int i=0;i < LYNQ_CALL_MAX; i++)

+    {

+        if(lynq_call_lists[i].used!=1)

+        {

+            return i;

+        }

+    }

+    return -1;

+}

+int updateAddr(char addr[])

+{

+    int ret = 0;

+    ret = getUnusedElement();

+    memcpy(lynq_call_lists[ret].addr,addr,strlen(addr)+1);

+    lynq_call_lists[ret].used = 1;

+    return ret;

+}

+void updateCallList(lynq_call_list_e_t *callList,    int call_id,int call_state,int toa,int direction)

+{

+    callList->call_id = call_id;

+    callList->call_state = call_state;

+    callList->toa = toa;

+    callList->direction = direction;

+    callList->used = 1;

+    callList->hasTimeout = 0;

+    return;

+}

+int waitCallstateChange(int mtime)

+{

+    int ret = 0;

+    int sec = 0;

+    int usec = 0;

+    struct timeval now;

+    struct timespec timeout;

+    gettimeofday(&now,NULL);

+    sec = mtime/1000;

+    usec = mtime%1000;

+    timeout.tv_sec = now.tv_sec+sec;

+    timeout.tv_nsec = now.tv_usec*1000+usec*1000000;

+    pthread_mutex_lock(&call_state_change_mutex);

+    ret = pthread_cond_timedwait(&call_state_change_cond,&call_state_change_mutex,&timeout);

+    pthread_mutex_unlock(&call_state_change_mutex);

+    return ret;

+}

+int waitIncomingCall()

+{

+    int ret = 0;

+    pthread_mutex_lock(&s_incoming_call_mutex);

+    ret = pthread_cond_wait(&s_incoming_call_cond,&s_incoming_call_mutex);

+    pthread_mutex_unlock(&s_incoming_call_mutex);

+    return ret;

+}

+int checkHasCall(char addr[])

+{

+    for(int i = 0;i<LYNQ_CALL_MAX;i++)

+    {

+        if(strcmp(lynq_call_lists[i].addr,addr)==0)

+        {

+            return 1;

+        }

+    }

+    return 0;

+}

+void sendSignalToWaitCallStateChange()

+{

+    pthread_mutex_lock(&call_state_change_mutex);

+    pthread_cond_signal(&call_state_change_cond);

+    pthread_mutex_unlock(&call_state_change_mutex);

+}

+void sendSignalIncomingCall()

+{

+    pthread_mutex_lock(&s_incoming_call_mutex);

+    pthread_cond_signal(&s_incoming_call_cond);

+    pthread_mutex_unlock(&s_incoming_call_mutex);

+}

+

+void addCallListToLynqCallList(lynq_call_list_e_t *callList,    int call_id,int call_state,int toa,int direction,char addr[LYNQ_PHONE_NUMBER_MAX])

+{

+    callList->call_id = call_id;

+    callList->call_state = call_state;

+    callList->toa = toa;

+    callList->direction = direction;

+    memcpy(callList->addr,addr,strlen(addr)+1);

+    callList->used = 1;

+    callList->hasTimeout = 0;

+    return;

+}

+

+void *triggerGetCallList(void *parg)

+{

+    int ret=0;

+    lynq_call_list_t call_list[LYNQ_CALL_MAX];

+    while(call_list_loop)

+    {

+        pthread_mutex_lock(&s_urc_call_state_change_mutex);

+        pthread_cond_wait(&s_urc_call_state_change_cond, &s_urc_call_state_change_mutex);

+        LYDBGLOG("triggerGetCallList event!!!\n");

+        memset(call_list,0,sizeof(call_list));

+        ret = lynq_get_current_call_list(call_list);

+        if(ret != 0)

+        {

+            printf("get current call list failure!!!\n");

+            break;

+        }

+        for(int i = 0;i < LYNQ_CALL_MAX;i++)

+        {

+            if(call_list[i].direction == 1)//MT call

+            {

+                if(call_list[i].call_state ==4)//LYNQ_CALL_INCOMING = 4,   /* MT call only */

+                {

+                    if(!checkHasCall(call_list[i].addr))

+                    {

+                        lynqIncomingCallId = getUnusedElement();

+                        addCallListToLynqCallList(&lynq_call_lists[lynqIncomingCallId],call_list[i].call_id,call_list[i].call_state,call_list[i].toa,call_list[i].direction,call_list[i].addr);

+                        sendSignalIncomingCall();

+                    }

+                }

+            }

+            else

+            {

+                if(call_list[i].call_id==0)

+                {

+                    break;

+                }

+                for(int n = 0 ; n < LYNQ_CALL_MAX; n++)

+                {

+                    if(lynq_call_lists[n].hasTimeout==1)

+                    {

+                        /*hangup call with id*/

+                        lynq_call_hungup(&n);

+                        lynq_call_lists[n].hasTimeout==0;

+                        continue;

+                    }

+                    if(strcmp(call_list[i].addr,lynq_call_lists[n].addr)==0)

+                    {

+                        updateCallList(&lynq_call_lists[n],call_list[i].call_id,call_list[i].call_state,call_list[i].toa,call_list[i].direction);

+                    }

+                }

+                LYDBGLOG("[count:%d]call_id=%d,call_state=%d,direction=%d,addr=%s,toa=%d",i,call_list[i].call_id,call_list[i].call_state,

+                call_list[i].direction,call_list[i].addr,call_list[i].toa);

+            }

+        }

+        s_urc_event_complete = 1;

+        if(isDial==1)

+        {

+            sendSignalToWaitCallStateChange();

+            isDial = 0;

+        }

+        pthread_mutex_unlock(&s_urc_call_state_change_mutex);

+    }

+    return NULL;

+}

+

+void lynqRespWatingEvent()

+{

+    if(s_urc_event_complete==1)

+    {

+        pthread_mutex_lock(&s_urc_call_state_change_mutex);

+        pthread_cond_signal(&s_urc_call_state_change_cond);

+        s_urc_event_complete = 0;

+        pthread_mutex_unlock(&s_urc_call_state_change_mutex);

+    }

+    return;

+}

+

+/*Warren add for T800 platform 2021/11/19 start*/

+int lynq_socket_client_start()

+{

+    struct sockaddr_in lynq_socket_server_addr;

+    /* init lynq_socket_server_addr */

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

+    lynq_socket_server_addr.sin_family = AF_INET;

+    lynq_socket_server_addr.sin_port = htons(LYNQ_SERVICE_PORT);

+    lynq_socket_server_addr.sin_addr.s_addr = htons(INADDR_ANY);

+    /*

+    if(inet_pton(AF_INET,"127.0.0.1", &lynq_socket_server_addr.sin_addr) <= 0)

+    {

+        printf("[%s] is not a valid IPaddress\n", argv[1]);

+        exit(1);

+    }

+*/

+    lynq_client_sockfd = socket(AF_INET, SOCK_DGRAM, 0);

+    if(connect(lynq_client_sockfd, (struct sockaddr *)&lynq_socket_server_addr, sizeof(lynq_socket_server_addr)) == -1)

+    {

+        perror("connect error");

+        return -1;

+    }

+    return 0;

+}

+int lynq_update_call_list_loop()

+{

+    int ret = 0;

+    pthread_t tid;

+    pthread_attr_t attr;

+    pthread_attr_init(&attr);

+    pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);

+    ret = pthread_create(&tid,&attr,triggerGetCallList,NULL);

+    if(ret < 0)

+    {

+        LYERRLOG("lynq_update_call_list_loop fail!!!");

+        return -1;

+    }

+    LYDBGLOG("lynq_update_call_list_loop success!!!\n");

+    return 0;

+

+}

+void *thread_urc_recv(void *parg)

+{

+    int socket_fd = (int64_t)parg;

+    int len=0;

+    socklen_t addr_len=0;

+    uint8_t *dataLength = NULL;

+    char urc_data[LYNQ_REC_BUF];

+    int slot_id = -1;

+    int resp_type = -1;

+    int urcid = -1;

+    Parcel *p = NULL;

+    struct sockaddr_in dest_addr;

+    LYINFLOG("thread_urc_recv in running....\n");

+    while(urc_recive_status)

+    {

+        bzero(urc_data,LYNQ_REC_BUF);

+        //get data msg

+        len = recvfrom(socket_fd,urc_data,LYNQ_REC_BUF,0,(struct sockaddr *)&dest_addr,&addr_len);

+        if(len <= 0)

+        {

+            perror("thread_urc_recv step2 fail:");

+            break;

+        }

+        LYDBGLOG("=====>urc data len<=====:%d\n",len);

+        p = new Parcel();

+        if(p==NULL)

+        {

+            RLOGD("new parcel failure!!!");

+            break;

+        }

+        p->setData((uint8_t *)urc_data,len); // p.setData((uint8_t *) buffer, buflen);

+        p->setDataPosition(0);

+        if(p->dataAvail() > 0)

+        {

+            p->readInt32(&resp_type);

+            p->readInt32(&urcid);

+            p->readInt32(&slot_id);

+            //LYDBGLOG("*******Warren test*******:resp_type=%d,urcid=%d,slot_id=%d\n",resp_type,urcid,slot_id);

+            switch (urcid)

+            {

+                case 1001://RIL_UNSOL_RESPONSE_CALL_STATE_CHANGED

+                {

+                    LYINFLOG("**************:resp_type=%d,urcid=%d,slot_id=%d\n",resp_type,urcid,slot_id);

+                    lynqRespWatingEvent();

+                    break;

+                }

+                case 1018://RIL_UNSOL_CALL_RING

+                {

+                    if(global_call_auto_answer==1)

+                    {

+                        lynq_call_answer();

+                    }

+                    break;

+                }

+                case 1029://RIL_UNSOL_RINGBACK_TONE

+                case 3049://RIL_UNSOL_CALL_INFO_INDICATION

+                {

+                     LYINFLOG("**************:resp_type=%d,urcid=%d,slot_id=%d\n",resp_type,urcid,slot_id);

+                    break;

+                }

+                default:

+                    break;

+            }

+        }

+        delete p;

+        p = NULL;

+    }

+    close(socket_fd);

+}

+int lynq_socket_urc_start()

+{

+    int socket_fd=0;

+    int rt=0;

+    int len=0;

+    int on=1;

+    struct sockaddr_in urc_local_addr;

+    pthread_t tid;

+    pthread_attr_t attr;

+    socket_fd = socket(AF_INET,SOCK_DGRAM,0);

+    printf("test 001\n");

+    if(socket_fd < 0)

+    {

+        perror("creaet socket for udp fail");

+        return -1;

+    }

+    urc_local_addr.sin_family = AF_INET;

+    urc_local_addr.sin_port = htons(LYNQ_URC_SERVICE_PORT);

+    urc_local_addr.sin_addr.s_addr = htons(INADDR_ANY);

+    /* Set socket to allow reuse of address and port, SO_REUSEADDR value is 2*/

+    rt = setsockopt(socket_fd,SOL_SOCKET,SO_REUSEADDR,&on,sizeof on);

+    if(rt<0)

+    {

+        perror("SO_REUSEADDR fail\n");

+        return -1;

+    }

+    rt = bind(socket_fd ,(struct sockaddr*)&urc_local_addr, sizeof(urc_local_addr));

+    if (rt == -1)

+    {

+        perror("bind failed");

+        return -1;

+    }

+    pthread_attr_init(&attr);

+    pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);

+    rt = pthread_create(&tid,&attr,thread_urc_recv,(void *)socket_fd);

+    if(rt < 0)

+    {

+        printf("urc loop failure!!!\n");

+        return -1;

+    }

+    printf("urc loop success!!!\n");

+    return 0;

+}

+int getSelfElement(char addr[])

+{

+    for(int i=0;i < LYNQ_CALL_MAX; i++)

+    {

+        if(lynq_call_lists[i].used==1)

+        {

+            if(strcmp(lynq_call_lists[i].addr,addr)==0)

+            {

+                return i;

+            }

+            

+        }

+    }

+    return -1;

+}

+

+void lynq_call_state_change_test(int soc_id)

+{

+    printf("call state change,sim:%d\n",soc_id);

+}

+int lynq_init_call(int uToken)

+{

+    int result = 0;

+    Global_uToken = uToken;

+    LYLOGSET(LOG_INFO);

+    LYLOGEINIT(USER_LOG_TAG);

+    result = lynq_socket_client_start();

+    if(result!=0)

+    {

+        return -1;

+    }

+    result = lynq_socket_urc_start();

+    if(result!=0)

+    {

+        return -1;

+    }

+    result = lynq_update_call_list_loop();

+    if(result!=0)

+    {

+        return -1;

+    }

+    memset(lynq_call_lists,0,sizeof(lynq_call_lists));

+    LYDBGLOG("lynq init call success!!!");

+    return 0;

+}

+int lynq_deinit_call()

+{

+    close(lynq_client_sockfd);

+    urc_recive_status = 0;

+    call_list_loop = 0;

+    return 0;

+}

+int lynq_call(int* handle,char addr[])

+{

+    Parcel p;

+    lynq_client_t client;

+    int resp_type = -1;

+    int request = -1;

+    int slot_id = -1;

+    int error = -1;

+    int lynq_call_id = -1;

+    if(addr==NULL)

+    {

+        LYERRLOG("Phone num is null!!!");

+        return -1;

+    }

+    client.uToken = Global_uToken;

+    client.request = 10;//RIL_REQUEST_DIAL

+    client.paramLen = 2;

+    bzero(client.param,LYNQ_REQUEST_PARAM_BUF);

+    memcpy(client.param,addr,strlen(addr)+1);

+    strcat(client.param," 0");

+    LYERRLOG("uToken=%d,request=%d,paralen=%d,param=%s",client.uToken,client.request,client.paramLen,client.param);

+    if(send_request(lynq_client_sockfd,&client)==-1)

+    {

+        LYERRLOG("send request fail");

+        perror("[LYNQ_CALL] send request fail:");

+        return -1;

+    }

+    get_response(lynq_client_sockfd,p);

+    JumpHeader(p,&resp_type,&request,&slot_id,&error);

+    LYINFLOG("resp_type=%d,request=%d,slot_id=%d,error_code=%d",resp_type,request,slot_id,error);

+    lynq_call_id = updateAddr(addr);

+    if(error==0)

+    {

+        isDial = 1;

+        if(waitCallstateChange(3000)==ETIMEDOUT)//3000ms

+        {

+            error = LYNQ_E_TIME_OUT;

+            LYERRLOG("timeout:wait Call state fail!!!");

+            lynq_call_lists[lynq_call_id].hasTimeout = 1;

+            *handle = lynq_call_id;

+            return error;

+        }

+    *handle = lynq_call_id;

+    }

+    return error;

+}

+int lynq_call_answer()

+{

+    Parcel p;

+    lynq_client_t client;

+    int resp_type = -1;

+    int request = -1;

+    int slot_id = -1;

+    int error = -1;

+    client.uToken = Global_uToken;

+    client.request = 40;//RIL_REQUEST_DIAL

+    client.paramLen = 0;

+    bzero(client.param,LYNQ_REQUEST_PARAM_BUF);

+    LYDBGLOG("uToken=%d,request=%d,paralen=%d,param=%s\n",client.uToken,client.request,client.paramLen,client.param);

+    if(send_request(lynq_client_sockfd,&client)==-1)

+    {

+        LYERRLOG("send request fail");

+        perror("[LYNQ_CALL] send request fail:");

+        return -1;

+    }

+    get_response(lynq_client_sockfd,p);

+    JumpHeader(p,&resp_type,&request,&slot_id,&error);

+    LYINFLOG("resp_type=%d,request=%d,slot_id=%d,error_code=%d",resp_type,request,slot_id,error);

+    return error;

+}

+int lynq_call_hungup(int* handle)

+{

+    Parcel p;

+    lynq_client_t client;

+    int resp_type = -1;

+    int request = -1;

+    int slot_id = -1;

+    int error = -1;

+    int call_id = 0;

+    int lynq_call_id = 0;

+    client.uToken = Global_uToken;

+    client.request = 12;//RIL_REQUEST_HUNGUP

+    client.paramLen = 1;

+    bzero(client.param,LYNQ_REQUEST_PARAM_BUF);

+    lynq_call_id = *handle;

+    call_id = lynq_call_lists[lynq_call_id].call_id;

+    sprintf(client.param,"%d",call_id);

+    LYDBGLOG("uToken=%d,request=%d,paralen=%d,param=%s\n",client.uToken,client.request,client.paramLen,client.param);

+    if(send_request(lynq_client_sockfd,&client)==-1)

+    {

+        LYERRLOG("send request fail");

+        perror("[LYNQ_CALL] send request fail:");

+        return -1;

+    }

+    get_response(lynq_client_sockfd,p);

+    JumpHeader(p,&resp_type,&request,&slot_id,&error);

+    LYINFLOG("resp_type=%d,request=%d,slot_id=%d,error_code=%d",resp_type,request,slot_id,error);

+    if(error==0)

+    {

+        cleanCallList(lynq_call_id);

+    }

+    return error;

+}

+int lynq_call_hungup_all()

+{

+    Parcel p;

+    lynq_client_t client;

+    int resp_type = -1;

+    int request = -1;

+    int slot_id = -1;

+    int error = -1;

+    client.uToken = Global_uToken;

+    client.request = 17;//RIL_REQUEST_UDUB

+    client.paramLen = 0;

+    bzero(client.param,LYNQ_REQUEST_PARAM_BUF);

+    LYDBGLOG("uToken=%d,request=%d,paralen=%d,param=%s\n",client.uToken,client.request,client.paramLen,client.param);

+    if(send_request(lynq_client_sockfd,&client)==-1)

+    {

+        LYERRLOG("send request fail");

+        perror("[LYNQ_CALL] send request fail:");

+        return -1;

+    }

+    get_response(lynq_client_sockfd,p);

+    JumpHeader(p,&resp_type,&request,&slot_id,&error);

+    LYINFLOG("resp_type=%d,request=%d,slot_id=%d,error_code=%d",resp_type,request,slot_id,error);

+    return error;

+}

+int lynq_wait_incoming_call(int *handle)

+{

+    waitIncomingCall();

+    *handle = lynqIncomingCallId;

+    LYINFLOG("lynq incoming call id:%d",lynqIncomingCallId);

+    return 0;

+}

+

+int lynq_set_auto_answercall(const int mode)

+{

+    global_call_auto_answer = mode;

+    LYINFLOG("auto answer call mode =%d",mode);

+    return 0;

+}

+int lynq_get_mute_status(int *status)

+{

+    Parcel p;

+    lynq_client_t client;

+    int resp_type = -1;

+    int request = -1;

+    int slot_id = -1;

+    int error = -1;

+    if(status==NULL)

+    {

+        LYERRLOG("status is null");

+        return -1;

+    }

+    client.uToken = Global_uToken;

+    client.request = 54;//RIL_REQUEST_GET_MUTE

+    client.paramLen = 0;

+    bzero(client.param,LYNQ_REQUEST_PARAM_BUF);

+    LYDBGLOG("uToken=%d,request=%d,paralen=%d,param=%s\n",client.uToken,client.request,client.paramLen,client.param);

+    if(send_request(lynq_client_sockfd,&client)==-1)

+    {

+        LYERRLOG("send request fail");

+        perror("[LYNQ_CALL] send request fail:");

+        return -1;

+    }

+    get_response(lynq_client_sockfd,p);

+    JumpHeader(p,&resp_type,&request,&slot_id,&error);

+    p.readInt32(status);

+    LYINFLOG("resp_type=%d,request=%d,slot_id=%d,error_code=%d",resp_type,request,slot_id,error);

+    return error;

+}

+int lynq_set_mute_mic(const int enable)

+{

+    Parcel p;

+    lynq_client_t client;

+    int resp_type = -1;

+    int request = -1;

+    int slot_id = -1;

+    int error = -1;

+    client.uToken = Global_uToken;

+    client.request = 53;//RIL_REQUEST_SET_MUTE

+    client.paramLen = 1;

+    bzero(client.param,LYNQ_REQUEST_PARAM_BUF);

+    sprintf(client.param,"%d",enable);

+    LYDBGLOG("uToken=%d,request=%d,paralen=%d,param=%s\n",client.uToken,client.request,client.paramLen,client.param);

+    if(send_request(lynq_client_sockfd,&client)==-1)

+    {

+        LYERRLOG("send request fail");

+        perror("[LYNQ_CALL] send request fail:");

+        return -1;

+    }

+    get_response(lynq_client_sockfd,p);

+    JumpHeader(p,&resp_type,&request,&slot_id,&error);

+    LYINFLOG("resp_type=%d,request=%d,slot_id=%d,error_code=%d",resp_type,request,slot_id,error);

+    return error;

+}

+int lynq_set_DTMF(const char callnum)

+{

+    Parcel p;

+    lynq_client_t client;

+    int resp_type = -1;

+    int request = -1;

+    int slot_id = -1;

+    int error = -1;

+    if(!lynq_call_state)

+    {

+        LYERRLOG("LYNQ_E_CONFLICT");

+        return LYNQ_E_CONFLICT;

+    }

+    client.uToken = Global_uToken;

+    client.request = 24;//RIL_REQUEST_DTMF

+    client.paramLen = 1;

+    bzero(client.param,LYNQ_REQUEST_PARAM_BUF);

+    sprintf(client.param,"%c",callnum);

+    LYDBGLOG("uToken=%d,request=%d,paralen=%d,param=%s\n",client.uToken,client.request,client.paramLen,client.param);

+    if(send_request(lynq_client_sockfd,&client)==-1)

+    {

+        LYERRLOG("send request fail");

+        perror("[LYNQ_CALL] send request fail:");

+        return -1;

+    }

+    get_response(lynq_client_sockfd,p);

+    JumpHeader(p,&resp_type,&request,&slot_id,&error);

+    LYINFLOG("resp_type=%d,request=%d,slot_id=%d,error_code=%d",resp_type,request,slot_id,error);

+    return error;

+

+}

+int lynq_set_DTMF_volume(const int volume)

+{

+    Parcel p;

+    lynq_client_t client;

+    int resp_type = -1;

+    int request = -1;

+    int slot_id = -1;

+    int error = -1;

+    //if(!lynq_call_state)

+    //{

+    //    LYERRLOG("LYNQ_E_CONFLICT");

+    //    return LYNQ_E_CONFLICT;

+    //}

+    client.uToken = Global_uToken;

+    client.request = 8003;//LYNQ_REQUEST_SET_DTMF_VOLUME

+    client.paramLen = 1;

+    bzero(client.param,LYNQ_REQUEST_PARAM_BUF);

+    sprintf(client.param,"%d",volume);

+    LYDBGLOG("uToken=%d,request=%d,paralen=%d,param=%s\n",client.uToken,client.request,client.paramLen,client.param);

+    if(send_request(lynq_client_sockfd,&client)==-1)

+    {

+        LYERRLOG("send request fail");

+        perror("[LYNQ_CALL] send request fail:");

+        return -1;

+    }

+    get_response(lynq_client_sockfd,p);

+    JumpHeader(p,&resp_type,&request,&slot_id,&error);

+    LYINFLOG("resp_type=%d,request=%d,slot_id=%d,error_code=%d",resp_type,request,slot_id,error);

+    return 0;

+}

+int lynq_get_current_call_state(int *handle,    int *call_state,int *toa,int *direction,char addr[])

+{

+    int lynq_call_id = 0;

+    if(handle==NULL)

+    {

+        return LYNQ_E_NULL_ANONALY;

+    }

+    lynq_call_id = *handle;

+    *call_state = lynq_call_lists[lynq_call_id].call_state;

+    *toa = lynq_call_lists[lynq_call_id].toa;

+    *direction = lynq_call_lists[lynq_call_id].direction;

+    memcpy(addr,lynq_call_lists[lynq_call_id].addr,strlen(lynq_call_lists[lynq_call_id].addr)+1);

+    return 0;

+}

+

+#if 0

+int main(int argc,char **argv)

+{

+    int n = 0;

+    n = lynq_init_call(lynq_call_state_change_test,2222);

+    if(n<0)

+    {

+        printf("lynq init call fail!!!\n");

+        return -1;

+    }

+    printf("lynq call init success!!!\n");

+    char phoneNum[LYNQ_PHONE_NUMBER_MAX];

+    sprintf(phoneNum,"18180053406 0",strlen("18180053406 0")+1);

+    lynq_call(phoneNum);

+    while(1)

+    {

+        sleep(1);

+    }

+    return 0;

+}

+#endif

+/*Warren add for T800 platform 2021/11/19 end*/

diff --git a/src/lynq/lib/liblynq-call/makefile b/src/lynq/lib/liblynq-call/makefile
new file mode 100755
index 0000000..cacaf71
--- /dev/null
+++ b/src/lynq/lib/liblynq-call/makefile
@@ -0,0 +1,70 @@
+SHELL = /bin/sh
+RM = rm -f
+
+LOCAL_CFLAGS := -Wall \
+                -std=gnu++14 \
+                -g -Os \
+                -flto \
+                -DRIL_SHLIB \
+                -DATCI_PARSE \
+                -fPIC \
+                -DKEEP_ALIVE \
+                -DECALL_SUPPORT \
+                -fpermissive \
+
+
+
+$(warning ################# lynq data demo ROOT: $(ROOT),includedir:$(includedir))
+LOCAL_PATH   = .
+
+LOCAL_C_INCLUDES = \
+  -I. \
+  -I$(LOCAL_PATH)/include/libcall \
+  -I$(ROOT)$(includedir)/logger \
+  -I$(ROOT)$(includedir)/liblog \
+
+
+LOCAL_LIBS := \
+    -L. \
+    -ldl \
+    -lstdc++ \
+    -llog \
+    -lcutils \
+    -lutils \
+    -lbinder \
+    -lpthread \
+    -llynq-log \
+
+
+SOURCES = $(wildcard *.cpp)
+
+EXECUTABLE = liblynq-call.so
+
+OBJECTS=$(SOURCES:.cpp=.o)
+
+
+.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 : %.cpp
+	$(CXX) $(LOCAL_C_INCLUDES) $(LOCAL_CFLAGS) $(LOCAL_LIBS) -o $@ -c $<
+
+build:  $(EXECUTABLE)
+	$(warning ########## build $(EXECUTABLE)  ##########)
+install:
+	mkdir -p $(ROOT)$(base_libdir)/
+	install $(EXECUTABLE) $(ROOT)$(base_libdir)/
+	mkdir -p $(ROOT)$(includedir)/$(NAME)/sdk
+pack_rootfs:
+	mkdir -p $(PACK_INITRAMFS_TO)$(base_libdir)/
+	cp -af $(EXECUTABLE) $(PACK_INITRAMFS_TO)$(base_libdir)/
+	$(CROSS)strip $(PACK_INITRAMFS_TO)$(base_libdir)/$(EXECUTABLE)
+	mkdir -p $(PACK_TO)$(base_libdir)/
+	cp -af $(EXECUTABLE) $(PACK_TO)$(base_libdir)/
+	$(CROSS)strip $(PACK_TO)$(base_libdir)/$(EXECUTABLE)
+.PHONY: clean
+clean:
+	$(RM) $(OBJECTS) $(EXECUTABLE)
+	-find . -name "*.o" -delete
diff --git a/src/lynq/lib/liblynq-data/LICENSE b/src/lynq/lib/liblynq-data/LICENSE
new file mode 100755
index 0000000..77f59ed
--- /dev/null
+++ b/src/lynq/lib/liblynq-data/LICENSE
@@ -0,0 +1,31 @@
+Copyright Statement:
+
+This software/firmware and related documentation ("MediaTek Software") are
+protected under relevant copyright laws. The information contained herein is
+confidential and proprietary to MediaTek Inc. and/or its licensors. Without
+the prior written permission of MediaTek inc. and/or its licensors, any
+reproduction, modification, use or disclosure of MediaTek Software, and
+information contained herein, in whole or in part, shall be strictly
+prohibited.
+
+MediaTek Inc. (C) 2015. All rights reserved.
+
+BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
+ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL
+WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
+WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH
+RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
+INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES
+TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
+RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
+OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK
+SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE
+RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S
+ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE
+RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE
+MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
+CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
diff --git a/src/lynq/lib/liblynq-data/include/libdata/lynq_data.h b/src/lynq/lib/liblynq-data/include/libdata/lynq_data.h
new file mode 100755
index 0000000..2503f5d
--- /dev/null
+++ b/src/lynq/lib/liblynq-data/include/libdata/lynq_data.h
@@ -0,0 +1,63 @@
+#ifndef LYNQ_DATA_H
+#define LYNQ_DATA_H 1
+#ifdef __cplusplus
+extern "C" {
+#endif
+#define LYNQ_APN_CHANNEL_MAX 10
+#define LYNQ_PDP_TYPE_MAX_LEN 16
+#define LYNQ_IFACE_NAME_MAX_LEN 50
+#define LYNQ_APN_MAX_LEN 50
+#define LYNQ_APN_TYPE_MAX_LEN 50
+#define LYNQ_PDP_ADDR_MAX_LEN 64
+#define LYNQ_DNS_ADDR_MAX_LEN 64
+#define LYNQ_GETWAYS_ADDR_MAX_LEN 64
+#define LYNQ_POXY_ADDR_MAX_LEN 64
+
+typedef struct {
+    int            status;     /* A RIL_DataCallFailCause, 0 which is PDP_FAIL_NONE if no error */
+    int            suggestedRetryTime; /* If status != 0, this fields indicates the suggested retry
+                                           back-off timer value RIL wants to override the one
+                                           pre-configured in FW.
+                                           The unit is miliseconds.
+                                           The value < 0 means no value is suggested.
+                                           The value 0 means retry should be done ASAP.
+                                           The value of INT_MAX(0x7fffffff) means no retry. */
+    int            cid;        /* Context ID, uniquely identifies this call */
+    int            active;     /* 0=inactive, 1=active/physical link down, 2=active/physical link up */
+    char           type[LYNQ_PDP_TYPE_MAX_LEN];       /* One of the PDP_type values in TS 27.007 section 10.1.1.
+                                   For example, "IP", "IPV6", "IPV4V6", or "PPP". If status is
+                                   PDP_FAIL_ONLY_SINGLE_BEARER_ALLOWED this is the type supported
+                                   such as "IP" or "IPV6" */
+    char           ifname[LYNQ_IFACE_NAME_MAX_LEN];     /* The network interface name */
+    char           addresses[LYNQ_PDP_ADDR_MAX_LEN];  /* A space-delimited list of addresses with optional "/" prefix length,
+                                   e.g., "192.0.1.3" or "192.0.1.11/16 2001:db8::1/64".
+                                   May not be empty, typically 1 IPv4 or 1 IPv6 or
+                                   one of each. If the prefix length is absent the addresses
+                                   are assumed to be point to point with IPv4 having a prefix
+                                   length of 32 and IPv6 128. */
+    char           dnses[LYNQ_DNS_ADDR_MAX_LEN];      /* A space-delimited list of DNS server addresses,
+                                   e.g., "192.0.1.3" or "192.0.1.11 2001:db8::1".
+                                   May be empty. */
+    char           gateways[LYNQ_GETWAYS_ADDR_MAX_LEN];   /* A space-delimited list of default gateway addresses,
+                                   e.g., "192.0.1.3" or "192.0.1.11 2001:db8::1".
+                                   May be empty in which case the addresses represent point
+                                   to point connections. */
+    char           pcscf[LYNQ_POXY_ADDR_MAX_LEN];    /* the Proxy Call State Control Function address
+                                 via PCO(Protocol Configuration Option) for IMS client. */
+    int            mtu;        /* MTU received from network
+                                   Value <= 0 means network has either not sent a value or
+                                   sent an invalid value */
+} lynq_data_call_response_v11_t;
+int lynq_init_data(int uToken);
+int lynq_deinit_data();
+int lynq_setup_data_call(int *handle);
+int lynq_deactive_data_call(int *handle);
+int lynq_setup_data_call_sp(int *handle,char *apn,char *apnType,char *user,char *password,char *authType,char *normalProtocol,char *roamingProtocol);
+//int lynq_deactive_data_call_sp(int *handle,char *apnType);
+int lynq_get_data_call_list(int *handle,lynq_data_call_response_v11_t dataCallList);
+int lynq_wait_data_call_state_change(int *handle);
+
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/src/lynq/lib/liblynq-data/lynq_data.cpp b/src/lynq/lib/liblynq-data/lynq_data.cpp
new file mode 100755
index 0000000..b1f8512
--- /dev/null
+++ b/src/lynq/lib/liblynq-data/lynq_data.cpp
@@ -0,0 +1,772 @@
+#include <stdio.h>

+#include <sys/types.h>

+#include <sys/socket.h>

+#include <arpa/inet.h>

+#include <fcntl.h>

+#include <string.h>

+#include <stdlib.h>

+#include <unistd.h>

+#include <binder/Parcel.h>

+#include <log/log.h>

+#include "lynq_data.h"

+#include <cutils/jstring.h>

+#include <pthread.h>

+#include "liblog/lynq_deflog.h"

+#include <sys/time.h>

+#define LYNQ_SERVICE_PORT 8088

+#define LYNQ_URC_SERVICE_PORT 8086

+#define LYNQ_REC_BUF 8192

+#define LYNQ_REQUEST_PARAM_BUF 8192

+#define LYQN_SEDN_BUF 1024*8+sizeof(int)*3

+#define USER_LOG_TAG "LYNQ_DATA"

+

+using ::android::Parcel;

+typedef struct{

+    int uToken;

+    int request;

+    int paramLen;

+    char param[LYNQ_REQUEST_PARAM_BUF];

+}lynq_client_t;

+typedef enum{
+    LYNQ_E_CARDSTATE_ERROR=8000,
+    /* The voice service state is out of service*/
+    LYNQ_E_STATE_OUT_OF_SERVICE=8001,
+    /* The voice service state is EMERGENCY_ONLY*/
+    LYNQ_E_STATE_EMERGENCY_ONLY=8002,
+    /* The radio power is power off*/
+    LYNQ_E_STATE_POWER_OFF=8003,
+    LYNQ_E_TIME_OUT=8004,
+    /*create or open sms DB fail */
+    LYNQ_E_SMS_DB_FAIL=8005,
+    /*Failed to execute sql statement*/
+    LYNQ_E_SMS_SQL_FAIL = 8006,
+    LYNQ_E_SMS_NOT_FIND = 8007,
+    /* The logic conflict*/
+    LYNQ_E_CONFLICT=9000,
+    /*Null anomaly*/
+    LYNQ_E_NULL_ANONALY=9001
+}LYNQ_E;

+

+int lynq_client_sockfd = 0;

+int Global_uToken = 0;

+bool urc_recive_status = 1;

+int lynq_data_call_change_id = -1;

+static pthread_mutex_t s_data_call_state_change_mutex = PTHREAD_MUTEX_INITIALIZER;

+static pthread_cond_t s_data_call_state_change_cond = PTHREAD_COND_INITIALIZER;

+static pthread_mutex_t s_pdn_change_mutex = PTHREAD_MUTEX_INITIALIZER;

+static pthread_cond_t s_pdn_change_cond = PTHREAD_COND_INITIALIZER;

+

+typedef struct{

+    char apn[LYNQ_APN_MAX_LEN];

+    char apnType[LYNQ_APN_TYPE_MAX_LEN];

+    char ifaceName[LYNQ_IFACE_NAME_MAX_LEN];

+    int hasUsed;

+    int hasTimeout;

+}lynq_apn_t;

+lynq_apn_t lynq_apn_table[LYNQ_APN_CHANNEL_MAX] = {};

+lynq_data_call_response_v11_t lynq_data_call_lists[LYNQ_APN_CHANNEL_MAX] = {};

+int lynq_data_call = 0;

+

+int getLynqApnID(char apnType[])

+{

+    int ret = 0;

+    for(ret;ret<LYNQ_APN_CHANNEL_MAX;ret++)

+    {

+        if(strcmp(lynq_apn_table[ret].apnType,apnType)==0)

+        {

+            return ret;

+        }

+    }

+    return -1;

+}

+void updateApnTable(lynq_apn_t *apn_table,char apn[],char apntype[],char ifaceName[])

+{

+    if(apn_table==NULL)

+    {

+        LYERRLOG("apn_table is null");

+        return;

+    }

+    memcpy(apn_table->apn,apn,strlen(apn)+1);

+    memcpy(apn_table->apnType,apntype,strlen(apntype)+1);

+    memcpy(apn_table->ifaceName,ifaceName,strlen(ifaceName)+1);

+    apn_table->hasTimeout = 0;

+    apn_table->hasUsed = 1;

+    return;

+}

+void cleanOnceApnTable(int apnId)

+{

+    if((apnId < 0) || (apnId > LYNQ_APN_CHANNEL_MAX-1))

+    {

+        LYERRLOG("apn id is invalid!!!");

+        return;

+    }

+    lynq_apn_table[apnId].hasTimeout = 0;

+    lynq_apn_table[apnId].hasUsed = 0;

+    bzero(lynq_apn_table[apnId].apn,LYNQ_APN_MAX_LEN);

+    bzero(lynq_apn_table[apnId].apnType,LYNQ_APN_TYPE_MAX_LEN);

+    bzero(lynq_apn_table[apnId].ifaceName,LYNQ_IFACE_NAME_MAX_LEN);

+    return;

+}

+int getUnusedElement()

+{

+    for(int i=0;i < LYNQ_APN_CHANNEL_MAX; i++)

+    {

+        if(lynq_apn_table[i].hasUsed!=1)

+        {

+            return i;

+        }

+    }

+    return -1;

+}

+int updateApn(char apnType[])

+{

+    int ret = 0;

+    ret = getUnusedElement();

+    memcpy(lynq_apn_table[ret].apnType,apnType,strlen(apnType)+1);

+    lynq_apn_table[ret].hasUsed = 1;

+    return ret;

+}

+

+int waitPdnChange()

+{

+    int ret = 0;

+    pthread_mutex_lock(&s_pdn_change_mutex);

+    ret = pthread_cond_wait(&s_pdn_change_cond,&s_pdn_change_mutex);

+    pthread_mutex_unlock(&s_pdn_change_mutex);

+    return ret;

+}

+int waitDataCallstateChange(int mtime)

+{

+    int ret = 0;

+    int sec = 0;

+    int usec = 0;

+    struct timeval now;

+    struct timespec timeout;

+    gettimeofday(&now,NULL);

+    sec = mtime/1000;

+    usec = mtime%1000;

+    timeout.tv_sec = now.tv_sec+sec;

+    timeout.tv_nsec = now.tv_usec*1000+usec*1000000;

+    pthread_mutex_lock(&s_data_call_state_change_mutex);

+    ret = pthread_cond_timedwait(&s_data_call_state_change_cond,&s_data_call_state_change_mutex,&timeout);

+    pthread_mutex_unlock(&s_data_call_state_change_mutex);

+    return ret;

+}

+void sendSignalDataCallStateChange()

+{

+    pthread_mutex_lock(&s_data_call_state_change_mutex);

+    pthread_cond_signal(&s_data_call_state_change_cond);

+    pthread_mutex_unlock(&s_data_call_state_change_mutex);

+    return;

+}

+void sendSignalPdnChange()

+{

+    pthread_mutex_lock(&s_pdn_change_mutex);

+    pthread_cond_signal(&s_pdn_change_cond);

+    pthread_mutex_unlock(&s_pdn_change_mutex);

+    return;

+}

+

+int get_response(int sockfd,Parcel &p)

+{

+    int len = 0;

+    char recvline[LYNQ_REC_BUF];

+    bzero(recvline,LYNQ_REC_BUF);

+    /* receive data from server */

+    len = read(sockfd, recvline, LYNQ_REC_BUF);

+    if(len == -1)

+    {

+        perror("read error");

+        return -1;

+    }

+    printf("===>n=%d\n",len);

+    if (recvline != NULL) {

+        p.setData((uint8_t *)recvline,len); // p.setData((uint8_t *) buffer, buflen);

+        p.setDataPosition(0);

+    }

+    return 0;

+}

+int JumpHeader(Parcel &p,int *resp_type,int *request,int *slot_id,int *error)

+{

+    if(p.dataAvail() > 0)

+    {

+        p.readInt32(resp_type);

+        p.readInt32(request);

+        p.readInt32(slot_id);

+        p.readInt32(error);

+        return 0;

+    }

+    else

+    {

+        return -1;

+    }

+}

+int send_request(int sockfd,lynq_client_t *client_tmp)

+{

+    int ret=0;

+    ret = write(sockfd, client_tmp, LYQN_SEDN_BUF);

+    if(ret==-1)

+    {

+        perror("write error");

+        return -1;

+    }

+    return 0;

+}

+static char *strdupReadString(Parcel &p) {

+    size_t stringlen;
+    const char16_t *s16;

+    s16 = p.readString16Inplace(&stringlen);

+    return strndup16to8(s16, stringlen);
+}

+static char *strdupReadString_p(Parcel *p) {

+    size_t stringlen;
+    const char16_t *s16;

+    s16 = p->readString16Inplace(&stringlen);

+    return strndup16to8(s16, stringlen);
+}

+

+

+/*Warren add for T800 platform 2021/11/19 start*/

+int lynq_socket_client_start()

+{

+    struct sockaddr_in lynq_socket_server_addr;

+    /* init lynq_socket_server_addr */

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

+    lynq_socket_server_addr.sin_family = AF_INET;

+    lynq_socket_server_addr.sin_port = htons(LYNQ_SERVICE_PORT);

+    lynq_socket_server_addr.sin_addr.s_addr = htons(INADDR_ANY);

+    /*

+    if(inet_pton(AF_INET,"127.0.0.1", &lynq_socket_server_addr.sin_addr) <= 0)

+    {

+        printf("[%s] is not a valid IPaddress\n", argv[1]);

+        exit(1);

+    }

+*/

+    lynq_client_sockfd = socket(AF_INET, SOCK_DGRAM, 0);

+    if(connect(lynq_client_sockfd, (struct sockaddr *)&lynq_socket_server_addr, sizeof(lynq_socket_server_addr)) == -1)

+    {

+        perror("connect error");

+        return -1;

+    }

+    return 0;

+}

+void *thread_urc_recv(void *parg)

+{
+    int socket_fd = (int64_t)parg;

+    int len=0;

+    socklen_t addr_len=0;

+    uint8_t *dataLength = NULL;

+    char urc_data[LYNQ_REC_BUF];

+    char apn[LYNQ_APN_MAX_LEN];

+    char apnType[LYNQ_APN_TYPE_MAX_LEN];

+    int pdnState = 0;

+    char ifaceName[LYNQ_IFACE_NAME_MAX_LEN];

+    int slot_id = -1;

+    int resp_type = -1;

+    int urcid = -1;

+    char *urc_msg = NULL;

+    Parcel *p = NULL;

+    struct sockaddr_in dest_addr;

+    LYINFLOG("thread_urc_recv in running....\n");

+    while(urc_recive_status)

+    {

+        bzero(urc_data,LYNQ_REC_BUF);

+        //get data msg

+        len = recvfrom(socket_fd,urc_data,LYNQ_REC_BUF,0,(struct sockaddr *)&dest_addr,&addr_len);

+        if(len <= 0)

+        {
+            perror("thread_urc_recv step2 fail:");

+            break;
+        }

+        LYDBGLOG("=====>urc data len<=====:%d\n",len);

+        p = new Parcel();

+        if(p==NULL)

+        {

+            RLOGD("new parcel failure!!!");

+            break;

+        }

+        p->setData((uint8_t *)urc_data,len); // p.setData((uint8_t *) buffer, buflen);

+        p->setDataPosition(0);

+        if(p->dataAvail() > 0)

+        {

+            p->readInt32(&resp_type);

+            p->readInt32(&urcid);

+            p->readInt32(&slot_id);

+            //LYDBGLOG("*******Warren test*******:resp_type=%d,urcid=%d,slot_id=%d\n",resp_type,urcid,slot_id);

+            switch (urcid)

+            {

+                case 9003://LYNQ_URC_DATA_CALL_STATUS_IND

+                {

+                    LYINFLOG("**************:resp_type=%d,urcid=%d,slot_id=%d\n",resp_type,urcid,slot_id);

+                    p->readInt32(&pdnState);

+                    bzero(apn,LYNQ_APN_MAX_LEN);

+                    bzero(apnType,LYNQ_APN_TYPE_MAX_LEN);

+                    bzero(ifaceName,LYNQ_IFACE_NAME_MAX_LEN);

+                    if(pdnState!=4)//PDN_DISCONNECTED

+                    {

+                        urc_msg = strdupReadString_p(p);

+                        int len = strlen(urc_msg);

+                        if(len < LYNQ_APN_MAX_LEN-1)

+                        {

+                            memcpy(apn,urc_msg,len+1);

+                        }

+                        urc_msg = strdupReadString_p(p);

+                        len = strlen(urc_msg);

+                        if(len < LYNQ_APN_TYPE_MAX_LEN-1)

+                        {

+                            memcpy(apnType,urc_msg,len+1);

+                        }

+                        urc_msg = strdupReadString_p(p);

+                        len = strlen(urc_msg);

+                        if(len < LYNQ_IFACE_NAME_MAX_LEN-1)

+                        {

+                            memcpy(ifaceName,urc_msg,strlen(urc_msg)+1);

+                        }

+                        //sendSignalDataCallStateChange();

+                    }

+                    int apnId = getLynqApnID(apnType);

+                    if(lynq_apn_table[apnId].hasTimeout==1)

+                    {

+                        LYERRLOG("apn:%s has time out",lynq_apn_table[apnId].apn);

+                        lynq_deactive_data_call(&apnId);

+                        continue;

+                    }

+                    updateApnTable(&lynq_apn_table[apnId], apn,apnType,ifaceName);

+                    sendSignalPdnChange();

+                    lynq_data_call_change_id = apnId;

+                    if(lynq_data_call==1)

+                    {

+                        sendSignalDataCallStateChange();

+                        lynq_data_call = 0;

+                    }

+                    /*

+                    if(dataCb!=NULL)

+                    {

+                        (*dataCb)(apn,apnType,pdnState,ifaceName);

+                    }

+                    */

+                    break;

+                }

+                default:

+                    break;

+            }

+        }

+        delete p;

+        p = NULL;

+    }

+    close(socket_fd);

+}

+int lynq_socket_urc_start()

+{

+    int socket_fd=0;

+    int rt=0;

+    int len=0;

+    int on=1;

+    struct sockaddr_in urc_local_addr;

+    pthread_t tid;

+    pthread_attr_t attr;

+    socket_fd = socket(AF_INET,SOCK_DGRAM,0);
+    printf("test 001\n");
+    if(socket_fd < 0)
+    {
+        perror("creaet socket for udp fail");

+        return -1;
+    }

+    urc_local_addr.sin_family = AF_INET;

+    urc_local_addr.sin_port = htons(LYNQ_URC_SERVICE_PORT);

+    urc_local_addr.sin_addr.s_addr = htons(INADDR_ANY);

+    /* Set socket to allow reuse of address and port, SO_REUSEADDR value is 2*/

+    rt = setsockopt(socket_fd,SOL_SOCKET,SO_REUSEADDR,&on,sizeof on);
+    if(rt<0)
+    {
+        perror("SO_REUSEADDR fail\n");

+        return -1;

+    }

+    rt = bind(socket_fd ,(struct sockaddr*)&urc_local_addr, sizeof(urc_local_addr));

+    if (rt == -1)
+    {
+        perror("bind failed");

+        return -1;
+    }

+    pthread_attr_init(&attr);

+    pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);

+    rt = pthread_create(&tid,&attr,thread_urc_recv,(void *)socket_fd);

+    if(rt < 0)

+    {

+        printf("urc loop failure!!!\n");

+        return -1;

+    }

+    printf("urc loop success!!!\n");

+    return 0;

+}

+void lynq_call_state_change_test(int soc_id)

+{

+    printf("call state change,sim:%d\n",soc_id);

+}

+void lynq_data_call_state_cb_test(char apn[LYNQ_APN_MAX_LEN],char apnType[LYNQ_APN_TYPE_MAX_LEN],int pdnState,char ifaceName[LYNQ_IFACE_NAME_MAX_LEN])

+{

+    printf("data state change,apn=%s,apntype=%s,pdnstate=%d,ifacename=%s:%d\n",apn,apnType,pdnState,ifaceName);

+}

+

+int lynq_init_data(int uToken)

+{

+    int result = 0;

+    Global_uToken = uToken;

+    LYLOGSET(LOG_INFO);

+    LYLOGEINIT(USER_LOG_TAG);

+    result = lynq_socket_client_start();

+    if(result!=0)

+    {

+        LYERRLOG("init socket client fail!!!");

+        return -1;

+    }

+    result = lynq_socket_urc_start();

+    if(result!=0)

+    {

+        LYERRLOG("init socket urc fail!!!");

+        return -1;

+    }

+    memset(lynq_apn_table,0,sizeof(lynq_apn_table));

+    LYDBGLOG("lynq init call success!!!");

+    return 0;

+

+}

+int lynq_deinit_data()

+{

+    close(lynq_client_sockfd);

+    for(int i =0;i<LYNQ_APN_CHANNEL_MAX;i++)

+    {

+        if(lynq_apn_table[i].apnType!=NULL)

+        {

+            lynq_deactive_data_call(&i);

+        }

+    }

+    urc_recive_status = 0;

+    return 0;

+}

+int lynq_setup_data_call(int *handle)

+{

+    Parcel p;

+    lynq_client_t client;

+    int resp_type = -1;

+    int request = -1;

+    int slot_id = -1;

+    int error = -1;

+    char iface = NULL;

+    int lynq_data_call_id = 0;

+    if(handle==NULL)

+    {

+        LYERRLOG("handle is null!!!");

+        return LYNQ_E_NULL_ANONALY;

+    }

+    client.uToken = Global_uToken;

+    client.request = 27;//RIL_REQUEST_SETUP_DATA_CALL

+    client.paramLen = 0;

+    bzero(client.param,LYNQ_REQUEST_PARAM_BUF);

+    LYERRLOG("uToken=%d,request=%d,paralen=%d,param=%s",client.uToken,client.request,client.paramLen,client.param);

+    if(send_request(lynq_client_sockfd,&client)==-1)

+    {

+        LYERRLOG("send request fail");

+        perror("[LYNQ_DATA] send request fail:");

+        return -1;

+    }

+    get_response(lynq_client_sockfd,p);

+    JumpHeader(p,&resp_type,&request,&slot_id,&error);

+    LYINFLOG("resp_type=%d,request=%d,slot_id=%d,error_code=%d",resp_type,request,slot_id,error);

+    lynq_data_call_id = updateApn("default");

+    lynq_data_call = 1;

+    if(error==0)

+    {

+        if(waitDataCallstateChange(1000)==ETIMEDOUT)//1000ms

+        {

+            error = LYNQ_E_TIME_OUT;

+            LYERRLOG("timeout:wait data Call state fail!!!");

+            lynq_apn_table[lynq_data_call_id].hasTimeout = 1;

+            return error;

+        }

+        *handle = lynq_data_call_id;

+    }

+    return error;

+}

+int lynq_deactive_data_call(int *handle)

+{

+    Parcel p;

+    lynq_client_t client;

+    int resp_type = -1;

+    int request = -1;

+    int slot_id = -1;

+    int error = -1;

+    int lynq_data_call_id = -1;

+    lynq_data_call_id = *handle;

+    if(handle==NULL)

+    {

+        LYERRLOG("handle is null!!!");

+        return -1;

+    }

+    client.uToken = Global_uToken;

+    client.request = 41;//RIL_REQUEST_DEACTIVATE_DATA_CALL

+    if(strcmp(lynq_apn_table[lynq_data_call_id].apnType,"default")==0)

+    {

+        client.paramLen = 0;

+        bzero(client.param,LYNQ_REQUEST_PARAM_BUF);

+    }

+    else

+    {

+        client.paramLen = 1;

+        bzero(client.param,LYNQ_REQUEST_PARAM_BUF);

+        sprintf(client.param,"%s",lynq_apn_table[lynq_data_call_id].apnType);

+    }

+    LYERRLOG("uToken=%d,request=%d,paralen=%d,param=%s",client.uToken,client.request,client.paramLen,client.param);

+    if(send_request(lynq_client_sockfd,&client)==-1)

+    {

+        LYERRLOG("send request fail");

+        perror("[LYNQ_DATA] send request fail:");

+        return -1;

+    }

+    get_response(lynq_client_sockfd,p);

+    JumpHeader(p,&resp_type,&request,&slot_id,&error);

+    LYINFLOG("resp_type=%d,request=%d,slot_id=%d,error_code=%d",resp_type,request,slot_id,error);

+    cleanOnceApnTable(lynq_data_call_id);

+    return error;

+}

+int lynq_setup_data_call_sp(int *handle,char *apn,char *apnType,char *user,char *password,char *authType,char *normalProtocol,char *roamingProtocol)

+{

+    Parcel p;

+    lynq_client_t client;

+    int resp_type = -1;

+    int request = -1;

+    int slot_id = -1;

+    int error = -1;

+    char iface = NULL;

+    int lynq_data_call_id = -1;

+    char *argv[10] = {};

+    if(handle==NULL||apn==NULL||apnType==NULL)

+    {

+        LYERRLOG("handle ,apn or apntype is null!!!");

+        return -1;

+    }

+    if(user==NULL)

+    {
+        argv[1] = "null";

+    }
+    else
+    {
+        argv[1] = user;

+    }
+    if(password==NULL)
+    {
+        argv[2] = "null";

+    }
+    else
+    {
+        argv[2] = password;

+    }
+    if(authType==NULL)
+    {
+        argv[3] = "null";

+    }
+    else
+    {
+        argv[3] = authType;

+    }
+    if(normalProtocol==NULL)
+    {
+        argv[4] = "null";

+    }
+    else
+    {
+        argv[4] = normalProtocol;

+    }
+    if(roamingProtocol==NULL)
+    {
+        argv[5] = "null";

+    }
+    else
+    {
+        argv[5] = roamingProtocol;

+    }

+    client.uToken = Global_uToken;

+    client.request = 27;//RIL_REQUEST_SETUP_DATA_CALL

+    client.paramLen = 7;

+    bzero(client.param,LYNQ_REQUEST_PARAM_BUF);

+    sprintf(client.param,"%s %s %s %s %s %s %s",apn,apnType,argv[1],argv[2],argv[3],argv[4],argv[5]);

+    LYERRLOG("uToken=%d,request=%d,paralen=%d,param=%s",client.uToken,client.request,client.paramLen,client.param);

+    if(send_request(lynq_client_sockfd,&client)==-1)

+    {

+        LYERRLOG("send request fail");

+        perror("[LYNQ_DATA] send request fail:");

+        return -1;

+    }

+    get_response(lynq_client_sockfd,p);

+    JumpHeader(p,&resp_type,&request,&slot_id,&error);

+    LYINFLOG("resp_type=%d,request=%d,slot_id=%d,error_code=%d",resp_type,request,slot_id,error);

+    lynq_data_call_id = updateApn(apnType);

+    if(error==0)

+    {

+        if(waitDataCallstateChange(1000)==ETIMEDOUT)//1000ms

+        {

+            error = LYNQ_E_TIME_OUT;

+            LYERRLOG("timeout:wait data Call state fail!!!");

+            lynq_apn_table[lynq_data_call_id].hasTimeout = 1;

+            return error;

+        }

+        *handle = lynq_data_call_id;

+    }

+    return error;

+}

+/*

+int lynq_deactive_data_call_sp(int *handle,char *apnType)

+{

+    Parcel p;

+    lynq_client_t client;

+    int resp_type = -1;

+    int request = -1;

+    int slot_id = -1;

+    int error = -1;

+    if(handle==NULL||apnType==NULL)

+    {

+        LYERRLOG("handle is null!!!");

+        return -1;

+    }

+    client.uToken = Global_uToken;

+    client.request = 41;//RIL_REQUEST_DEACTIVATE_DATA_CALL

+    client.paramLen = 1;

+    bzero(client.param,LYNQ_REQUEST_PARAM_BUF);

+    sprintf(client.param,"%s",apnType);

+    LYERRLOG("uToken=%d,request=%d,paralen=%d,param=%s",client.uToken,client.request,client.paramLen,client.param);

+    if(send_request(lynq_client_sockfd,&client)==-1)

+    {

+        LYERRLOG("send request fail");

+        perror("[LYNQ_DATA] send request fail:");

+        return -1;

+    }

+    get_response(lynq_client_sockfd,p);

+    JumpHeader(p,&resp_type,&request,&slot_id,&error);

+    LYINFLOG("resp_type=%d,request=%d,slot_id=%d,error_code=%d",resp_type,request,slot_id,error);

+    return error;

+}

+*/

+int getDataCallLists(lynq_data_call_response_v11_t dataCallList[LYNQ_APN_CHANNEL_MAX],int *realNum)

+{

+    Parcel p;

+    lynq_client_t client;

+    int resp_type = -1;

+    int request = -1;

+    int slot_id = -1;

+    int error = -1;

+    int version =0;

+    int num = 0;

+    int temp_int =0;

+    char *temp_char = NULL;

+    if(dataCallList==NULL)

+    {

+        LYERRLOG("dataCallList is null!!!");

+        return -1;

+    }

+    client.uToken = Global_uToken;

+    client.request = 57;//RIL_REQUEST_DATA_CALL_LIST

+    client.paramLen = 0;

+    bzero(client.param,LYNQ_REQUEST_PARAM_BUF);

+    LYERRLOG("uToken=%d,request=%d,paralen=%d,param=%s",client.uToken,client.request,client.paramLen,client.param);

+    if(send_request(lynq_client_sockfd,&client)==-1)

+    {

+        LYERRLOG("send request fail");

+        perror("[LYNQ_DATA] send request fail:");

+        return -1;

+    }

+    get_response(lynq_client_sockfd,p);

+    JumpHeader(p,&resp_type,&request,&slot_id,&error);

+    LYINFLOG("resp_type=%d,request=%d,slot_id=%d,error_code=%d",resp_type,request,slot_id,error);

+    p.readInt32(&version);

+    if(version==11)

+    {

+        p.readInt32(&num);

+        *realNum = num;

+        for (int i = 0; i < num; i++)

+        {

+            p.readInt32(&dataCallList[i].status);

+            p.readInt32(&dataCallList[i].suggestedRetryTime);

+            p.readInt32(&dataCallList[i].cid);

+            p.readInt32(&dataCallList[i].active);

+            temp_char = strdupReadString(p);

+            memcpy(dataCallList[i].type,temp_char,strlen(temp_char)+1);

+            temp_char = strdupReadString(p);

+            memcpy(dataCallList[i].ifname,temp_char,strlen(temp_char)+1);

+            temp_char = strdupReadString(p);

+            memcpy(dataCallList[i].addresses,temp_char,strlen(temp_char)+1);

+            temp_char = strdupReadString(p);

+            memcpy(dataCallList[i].dnses,temp_char,strlen(temp_char)+1);

+            temp_char = strdupReadString(p);

+            memcpy(dataCallList[i].gateways,temp_char,strlen(temp_char)+1);

+            temp_char = strdupReadString(p);

+            memcpy(dataCallList[i].pcscf,temp_char,strlen(temp_char)+1);

+            p.readInt32(&dataCallList[i].mtu);

+        }

+    }

+    return error;

+}

+int lynq_get_data_call_list(int *handle,lynq_data_call_response_v11_t dataCallList)

+{

+    lynq_data_call_response_v11_t interDataCallList[LYNQ_APN_CHANNEL_MAX]={};

+    int number = 0;

+    int lynq_data_call_id = 0;

+    int error = 0;

+    lynq_data_call_id = *handle;

+    if(handle==NULL)

+    {

+        LYERRLOG("handle is NULL");

+        return LYNQ_E_NULL_ANONALY;

+    }

+    memset(interDataCallList,0,sizeof(interDataCallList));

+    error = getDataCallLists(interDataCallList,&number);

+    if(error == 0)

+    {

+        for(int i = 0;i < number;i++)

+        {

+            if(strcmp(interDataCallList[i].ifname,lynq_apn_table[lynq_data_call_id].ifaceName)==0)

+            {

+                dataCallList.active = interDataCallList[i].active;

+                dataCallList.suggestedRetryTime = interDataCallList[i].suggestedRetryTime;

+                dataCallList.cid = interDataCallList[i].cid;

+                dataCallList.status = interDataCallList[i].status;

+                dataCallList.mtu = interDataCallList[i].mtu;

+                memcpy(dataCallList.addresses,interDataCallList[i].addresses,sizeof(interDataCallList[i].addresses));

+                memcpy(dataCallList.ifname,interDataCallList[i].ifname,sizeof(interDataCallList[i].ifname));

+                memcpy(dataCallList.dnses,interDataCallList[i].dnses,sizeof(interDataCallList[i].dnses));

+                memcpy(dataCallList.type,interDataCallList[i].type,sizeof(interDataCallList[i].type));

+                memcpy(dataCallList.gateways,interDataCallList[i].gateways,sizeof(interDataCallList[i].gateways));

+                memcpy(dataCallList.pcscf,interDataCallList[i].pcscf,sizeof(interDataCallList[i].pcscf));

+            }

+        }

+    }

+    return error;

+}

+int lynq_wait_data_call_state_change(int *handle)

+{

+    waitPdnChange();

+    *handle = lynq_data_call_change_id;

+    LYINFLOG("lynq data call id:%d",lynq_data_call_change_id);

+    return 0;

+}

+#if 0

+int main(int argc,char **argv)

+{

+    int n = 0;

+    n = lynq_init_call(lynq_call_state_change_test,2222);

+    if(n<0)

+    {

+        printf("lynq init call fail!!!\n");

+        return -1;

+    }

+    printf("lynq call init success!!!\n");

+    char phoneNum[LYNQ_PHONE_NUMBER_MAX];

+    sprintf(phoneNum,"18180053406 0",strlen("18180053406 0")+1);

+    lynq_call(phoneNum);

+    while(1)

+    {

+        sleep(1);

+    }

+    return 0;

+}

+#endif

+/*Warren add for T800 platform 2021/11/19 end*/

diff --git a/src/lynq/lib/liblynq-data/makefile b/src/lynq/lib/liblynq-data/makefile
new file mode 100755
index 0000000..0a02ec8
--- /dev/null
+++ b/src/lynq/lib/liblynq-data/makefile
@@ -0,0 +1,70 @@
+SHELL = /bin/sh
+RM = rm -f
+
+LOCAL_CFLAGS := -Wall \
+                -std=gnu++14 \
+                -g -Os \
+                -flto \
+                -DRIL_SHLIB \
+                -DATCI_PARSE \
+                -fPIC \
+                -DKEEP_ALIVE \
+                -DECALL_SUPPORT \
+                -fpermissive \
+
+
+
+$(warning ################# lynq data demo ROOT: $(ROOT),includedir:$(includedir))
+LOCAL_PATH   = .
+
+LOCAL_C_INCLUDES = \
+  -I. \
+  -I$(LOCAL_PATH)/include/libdata \
+  -I$(ROOT)$(includedir)/logger \
+  -I$(ROOT)$(includedir)/liblog \
+
+
+LOCAL_LIBS := \
+    -L. \
+    -ldl \
+    -lstdc++ \
+    -llog \
+    -lcutils \
+    -lutils \
+    -lbinder \
+    -lpthread \
+    -llynq-log \
+
+
+SOURCES = $(wildcard *.cpp)
+
+EXECUTABLE = liblynq-data.so
+
+OBJECTS=$(SOURCES:.cpp=.o)
+
+
+.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 : %.cpp
+	$(CXX) $(LOCAL_C_INCLUDES) $(LOCAL_CFLAGS) $(LOCAL_LIBS) -o $@ -c $<
+
+build:  $(EXECUTABLE)
+	$(warning ########## build $(EXECUTABLE)  ##########)
+install:
+	mkdir -p $(ROOT)$(base_libdir)/
+	install $(EXECUTABLE) $(ROOT)$(base_libdir)/
+	mkdir -p $(ROOT)$(includedir)/$(NAME)/sdk
+pack_rootfs:
+	mkdir -p $(PACK_INITRAMFS_TO)$(base_libdir)/
+	cp -af $(EXECUTABLE) $(PACK_INITRAMFS_TO)$(base_libdir)/
+	$(CROSS)strip $(PACK_INITRAMFS_TO)$(base_libdir)/$(EXECUTABLE)
+	mkdir -p $(PACK_TO)$(base_libdir)/
+	cp -af $(EXECUTABLE) $(PACK_TO)$(base_libdir)/
+	$(CROSS)strip $(PACK_TO)$(base_libdir)/$(EXECUTABLE)
+.PHONY: clean
+clean:
+	$(RM) $(OBJECTS) $(EXECUTABLE)
+	-find . -name "*.o" -delete
diff --git a/src/lynq/lib/liblynq-sim/LICENSE b/src/lynq/lib/liblynq-sim/LICENSE
new file mode 100755
index 0000000..77f59ed
--- /dev/null
+++ b/src/lynq/lib/liblynq-sim/LICENSE
@@ -0,0 +1,31 @@
+Copyright Statement:
+
+This software/firmware and related documentation ("MediaTek Software") are
+protected under relevant copyright laws. The information contained herein is
+confidential and proprietary to MediaTek Inc. and/or its licensors. Without
+the prior written permission of MediaTek inc. and/or its licensors, any
+reproduction, modification, use or disclosure of MediaTek Software, and
+information contained herein, in whole or in part, shall be strictly
+prohibited.
+
+MediaTek Inc. (C) 2015. All rights reserved.
+
+BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
+ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL
+WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
+WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH
+RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
+INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES
+TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
+RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
+OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK
+SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE
+RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S
+ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE
+RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE
+MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
+CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
diff --git a/src/lynq/lib/liblynq-sim/Makefile b/src/lynq/lib/liblynq-sim/Makefile
new file mode 100755
index 0000000..d01b9ca
--- /dev/null
+++ b/src/lynq/lib/liblynq-sim/Makefile
@@ -0,0 +1,72 @@
+SHELL = /bin/sh
+RM = rm -f
+
+LOCAL_CFLAGS := -Wall \
+                -g -Os \
+                -flto \
+                -fPIC \
+                -DRIL_SHLIB \
+                -DATCI_PARSE \
+                -DKEEP_ALIVE \
+                -DECALL_SUPPORT
+
+
+
+$(warning ################# lynq network demo ROOT: $(ROOT),includedir:$(includedir))
+LOCAL_PATH   = .
+
+LOCAL_C_INCLUDES = \
+  -I. \
+  -I$(LOCAL_PATH)/include/ \
+  -I$(ROOT)$(includedir)/logger \
+  -I$(ROOT)$(includedir)/liblog \
+  -I$(ROOT)$(includedir)/vendor-ril \
+  -I$(ROOT)$(includedir)/include \
+
+
+
+LOCAL_LIBS := \
+    -L. \
+    -ldl \
+    -llog \
+    -lbinder \
+    -lpthread \
+    -llynq-log \
+    -lutils \
+    -lcutils \
+
+SOURCES = $(wildcard *.cpp  wildcard *.h src/*.cpp)
+
+EXECUTABLE = liblynq-sim.so
+
+OBJECTS=$(SOURCES:.c=.o)
+all: $(EXECUTABLE)
+
+$(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 $<
+
+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)
+	mkdir -p $(PACK_TO)$(base_libdir)/
+	cp -af $(EXECUTABLE) $(PACK_TO)$(base_libdir)/
+	$(CROSS)strip $(PACK_TO)$(base_libdir)/$(EXECUTABLE)
+
+.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
new file mode 100755
index 0000000..9b9593f
--- /dev/null
+++ b/src/lynq/lib/liblynq-sim/include/lynq_sim.h
@@ -0,0 +1,89 @@
+/*============================================================================= 
+#     FileName: lynq_sim.cpp
+#     Desc: about SIMAPI
+#     Author: mobiletek 
+#     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.
+=============================================================================*/
+#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_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*/
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+
diff --git a/src/lynq/lib/liblynq-sim/include/operator.h b/src/lynq/lib/liblynq-sim/include/operator.h
new file mode 100755
index 0000000..8001868
--- /dev/null
+++ b/src/lynq/lib/liblynq-sim/include/operator.h
@@ -0,0 +1,32 @@
+

+/*============================================================================= 

+**     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
new file mode 100755
index 0000000..1a1f38e
--- /dev/null
+++ b/src/lynq/lib/liblynq-sim/src/lynq_sim.cpp
@@ -0,0 +1,602 @@
+/*============================================================================= 
+#     FileName: lynq_sim.cpp
+#     Desc: about SIM API
+#     Author: mobiletek 
+#     Version: V1.0
+#     LastChange: 2021-12-29 
+#     History: 
+=============================================================================*/
+#include <dlfcn.h>
+#include <string.h>
+#include <stdint.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include "lynq_sim.h"
+
+#include <errno.h>
+
+
+#define MAX_NUM 10
+#define USER_LOG_TAG "LYNQ_SIM"
+
+using ::android::Parcel;
+#define DEST_PORT 8088
+#define DSET_IP_ADDRESS  "127.0.0.1"
+lynq_client_t client_t;
+/* socket文件描述符 */ 
+int len_addr_serv;
+struct sockaddr_in addr_serv;
+static int sock_fd = 0;
+int Global_uToken = 0; 
+int resp_type = -1;
+int request = -1;
+int slot_id = -1;
+int error1 = -1;
+
+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);
+}
+
+int lynq_sim_init(int utoken){
+    if(utoken < 0){
+        printf("init  err.");
+        return -1;
+    }
+    // LYLOGSET(LOG_INFO);
+    // LYLOGEINIT(USER_LOG_TAG);
+    Global_uToken = utoken;
+    sock_fd = socket(AF_INET, SOCK_DGRAM, 0);
+	if (-1 == sock_fd)
+	{
+		printf("socket open err.");
+		return -1;
+	}
+    /* 设置address */  
+    memset(&addr_serv, 0, sizeof(addr_serv));  
+    addr_serv.sin_family = AF_INET;  
+    addr_serv.sin_addr.s_addr = inet_addr(DSET_IP_ADDRESS);  
+    addr_serv.sin_port = htons(DEST_PORT);  
+    len_addr_serv = sizeof(addr_serv);  
+    /*test*/
+    return 0;
+}
+
+int lynq_sim_deinit(void){
+    close(sock_fd);
+    return 0;
+}
+
+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.*/
+int lynq_get_sim_status(int *card_status)
+{   
+    int ret = -1;
+    if(card_status == NULL)
+        return ret;
+    int send_num = 0;
+    int recv_num = 0;
+    int len = 0;
+    lynq_client_t client_t1;
+    memset(&client_t1, 0, sizeof(client_t1) );
+    client_t1.request = RIL_REQUEST_GET_SIM_STATUS;
+    client_t1.paramLen = 0;
+    client_t1.uToken = Global_uToken;
+    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;
+    }
+    //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;
+    }
+    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);
+    if(p.dataAvail() > 0)
+    {
+        p.readInt32(&resp_type);
+        p.readInt32(&request);
+        p.readInt32(&slot_id);
+        p.readInt32(&error1);
+        p.readInt32(card_status);
+    }
+    return error1;
+}
+/*AT> AT+CIMI     AT< IMSI*/
+int lynq_get_imsi(char buf[])
+{   
+    int ret = -1;
+    if(buf == NULL)
+        return ret;
+    int send_num = 0;
+    int recv_num = 0;
+    int len = 0;
+    lynq_client_t client_t1;
+    memset(&client_t1, 0, sizeof(client_t1) );
+    client_t1.request = RIL_REQUEST_GET_IMSI;
+    client_t1.paramLen = 0;
+    client_t1.uToken = Global_uToken;
+    char res_data[MAX_LEN] = {0};
+    memset(client_t1.param, 0, sizeof(client_t1.param));
+    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;
+    }
+    //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;
+    }
+    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);
+    if(p.dataAvail() > 0)
+    {
+        p.readInt32(&resp_type);
+        p.readInt32(&request);
+        p.readInt32(&slot_id);
+        p.readInt32(&error1);
+        if(!error1){
+            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;
+}
+
+
+/*add by lei*/
+
+int lynq_get_iccid(char buf[]){
+    int ret = -1;
+    if(buf == NULL)
+        return ret;
+    int send_num = 0;
+    int recv_num = 0;
+    int len = 0; 
+    client_t.request = RIL_REQUEST_QUERY_ICCID;
+    client_t.paramLen = 0;
+    client_t.uToken = Global_uToken;
+    char res_data[MAX_LEN] = {0};
+    memset(client_t.param, 0, sizeof(client_t.param));
+    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;
+    }
+    //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;
+    }
+    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);
+    if(p.dataAvail() > 0)
+    {
+        p.readInt32(&resp_type);
+        p.readInt32(&request);
+        p.readInt32(&slot_id);
+        p.readInt32(&error1);
+        if(!error1){
+            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;
+}
+
+int lynq_enable_pin(char *pin){
+    int ret = -1;
+    if(pin == NULL)
+        return ret;
+    int send_num = 0;
+    int recv_num = 0;  
+    char res_data[MAX_LEN] = {0};
+    client_t.request = RIL_REQUEST_SET_FACILITY_LOCK;
+    client_t.paramLen = 4;
+    client_t.uToken = Global_uToken;
+    sprintf(client_t.param, "%s %s %s %s\n", "SC", pin, "11", "1");
+    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;
+    }
+
+    //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;
+    }
+    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);
+    if(p.dataAvail() > 0)
+    {
+        p.readInt32(&resp_type);
+        p.readInt32(&request);
+        p.readInt32(&slot_id);
+        p.readInt32(&error1);
+    }
+    return error1;
+  
+}
+
+int lynq_disable_pin(char *pin){
+    int ret = -1;
+    if(pin == NULL)
+        return ret;
+    int send_num = 0;  
+    int recv_num = 0;
+    char res_data[MAX_LEN] = {0};
+    client_t.request = RIL_REQUEST_SET_FACILITY_LOCK;
+    client_t.paramLen = 4;
+    client_t.uToken = Global_uToken;
+    sprintf(client_t.param, "%s %s %s %s\n", "SC", pin, "11", "0");
+    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;
+    }
+    //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;
+    }
+    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);
+    if(p.dataAvail() > 0)
+    {
+        p.readInt32(&resp_type);
+        p.readInt32(&request);
+        p.readInt32(&slot_id);
+        p.readInt32(&error1);
+    }
+    return error1;
+}
+
+int lynq_query_pin_lock(char *pin,int buf[]){
+    int ret = -1;
+    if(pin == NULL)
+        return ret;
+    int send_num = 0;
+    int recv_num = 0;
+    int len = 0; 
+    client_t.request = RIL_REQUEST_QUERY_FACILITY_LOCK;
+    client_t.paramLen = 3;
+    client_t.uToken = Global_uToken;
+    char res_data[MAX_LEN] = {0};
+    sprintf(client_t.param, "%s %s %s\n", "SC", pin, "11");
+    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;
+    }
+    //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;
+    }
+    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);
+    int num = -1;
+    if(p.dataAvail() > 0)
+    {
+        p.readInt32(&resp_type);
+        p.readInt32(&request);
+        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];
+        }
+        free(test);
+    }
+    return error1;
+}
+
+int lynq_verify_pin(char *pin){
+    int ret = -1;
+    if(pin == NULL)
+        return ret;
+    int send_num = 0;
+    int recv_num = 0;
+    char res_data[MAX_LEN] = {0};
+    int len = 0; 
+    client_t.request = RIL_REQUEST_ENTER_SIM_PIN;
+    client_t.paramLen = 1;
+    client_t.uToken = Global_uToken;
+    sprintf(client_t.param, "%s\n", pin);
+    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;
+    }
+   //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;
+    }
+    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);
+    if(p.dataAvail() > 0)
+    {
+        p.readInt32(&resp_type);
+        p.readInt32(&request);
+        p.readInt32(&slot_id);
+        p.readInt32(&error1);
+    }
+    return error1;
+}
+
+int lynq_change_pin(char *old_pin, char *new_pin){
+    int ret = -1;
+    if(old_pin == NULL || new_pin == NULL)
+        return ret;
+    int send_num = 0;
+    int recv_num = 0;
+    char res_data[MAX_LEN] = {0};
+    int len = 0; 
+    client_t.request = RIL_REQUEST_CHANGE_SIM_PIN;
+    client_t.paramLen = 2;
+    client_t.uToken = Global_uToken;
+    sprintf(client_t.param, "%s %s\n", old_pin, new_pin);
+    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;
+    }
+    //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;
+    }
+    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);
+    if(p.dataAvail() > 0)
+    {
+        p.readInt32(&resp_type);
+        p.readInt32(&request);
+        p.readInt32(&slot_id);
+        p.readInt32(&error1);
+    }
+    return error1;
+}
+
+int lynq_unlock_pin(char *puk, char *pin){
+    int ret = -1;
+    if(puk == NULL || pin == NULL)
+        return ret;
+    int send_num = 0;
+    int recv_num = 0;
+    char res_data[MAX_LEN] = {0};
+    int len = 0; 
+    client_t.request = RIL_REQUEST_ENTER_SIM_PUK;
+    client_t.paramLen = 2;
+    client_t.uToken = Global_uToken;
+    sprintf(client_t.param, "%s %s\n", puk, pin);
+    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;
+    }
+    //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;
+    }
+    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);
+    if(p.dataAvail() > 0)
+    {
+        p.readInt32(&resp_type);
+        p.readInt32(&request);
+        p.readInt32(&slot_id);
+        p.readInt32(&error1);
+    }
+    return error1;
+}
+
+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")){
+        //char *test = strchr(cmd, ':')+1;
+        int len = strlen(cmd);
+        memcpy(buf, cmd, len);
+        buf[len] = '\0';
+        return 3;
+    }
+    else{
+        int argc = 0;
+        char *token;
+        token = strtok(cmd, ",");
+        if(strstr(token, "CNUM")){
+            char *string;
+            while (token != NULL)
+            {  
+                string = token;
+                argv[argc++] = string;
+                token = strtok(NULL, ",");
+            }
+            int lengh = strlen(argv[1]);
+            memcpy(buf, argv[1], lengh);
+            buf[lengh] = '\0';
+            delete_char(buf, '"');
+        }
+        else{
+            const char *warning = "9001";
+            int len = strlen(warning);
+            memcpy(buf, warning, len);
+            buf[len] = '\0';
+        }
+        
+    }
+    return 0;
+}
+
+int lynq_query_phone_number(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+CNUM");
+    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;
+    }
+     //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;
+    }
+    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);
+    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){
+            memcpy(buf, "-1", 2);
+        }else{
+            p.read(test, num);
+            parse_param(test, argv, buf);
+        }
+    }
+    return error1;
+}
+
+int lynq_query_operator(char buf[]){
+    int32_t token = -1;
+    if(buf == NULL)
+        return token;
+    char msg_imsi[20] = {0};
+    memset(msg_imsi,0,sizeof(msg_imsi));
+    token = lynq_get_imsi(msg_imsi);
+    if(strlen(msg_imsi) != 0){
+        FindOperator *ope_command = NULL;
+        ope_command = find_ope_command(msg_imsi, findOperator);
+        if(ope_command){
+            memcpy(buf, ope_command->buf, strlen(ope_command->buf));
+            buf[strlen(ope_command->buf)] = '\0';
+        }
+        else{
+            /*more*/
+            char mccmnc[5] = {0};
+            memcpy(buf, msg_imsi, 5);
+            buf[5] = '\0';
+            /*more*/
+        }
+        return token;
+    }
+    else{
+        //msg->base.e = err;
+        const char *test = "please insert sim card";
+        memcpy(buf, test, strlen(test));
+        return token;
+    }
+}
+
+
+
+
+
diff --git a/src/lynq/packages/apps/lynq-function-test/src/commands.h b/src/lynq/packages/apps/lynq-function-test/src/commands.h
deleted file mode 100644
index 71316d4..0000000
--- a/src/lynq/packages/apps/lynq-function-test/src/commands.h
+++ /dev/null
@@ -1,60 +0,0 @@
-/*============================================================================= 

-**     FileName: command.h

-**     Desc: about function test

-**     Author: Warren

-**     Version: V1.0

-**     LastChange: 2021-02-26 

-**     History: 

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

-//call api

-{"dial",eventDial, "dial a call"},

-{"an",eventAnswer,"answer in coming call"},

-{"atan",eventAutoAnswer,"auto answer mode"},

-{"stme",eventSetMute, "set mute"},

-{"gtme",eventGetMute, "get mute status"},

-{"lcfc",eventLastCallFailCause, "last call fail cause"},

-{"hup",eventCallHangUp, "hang up a call"},

-{"udub",eventRejectCall, "hang up all call or reject a call"},

-{"dtmf",eventSetDTMF, "send DTMF number"},

-{"dtmfv",eventSetDTMFVolume, "set DTMF volume"},

-{"hwc",eventHangupWatingForCall, "hang up waiting or background call"},

-{"hfrb",eventHangupForegroundResumeBackground, "hang up foregound call and resume background call"},

-{"swha",eventSwitchWaitOrHoldAndActiveCall, "switch waiting or holding call to active"},

-{"dmc",eventDoMultiConference, "do multi conference"},

-{"och",eventOthercallHold, "separate conferece"},

-//data api

-{"edc",eventSetupDataCall, "enable data call"},

-{"ddc",eventDeactiveDataCall, "disable data call"},

-{"gdcl",eventGetDataCalllist,"get data call list"},

-//network

-{"qop",eventQueryOperator, "query operator"},

-{"qnsm",eventQueryNetSelectMode, "query network selection mode"},

-{"snsm",eventSetNetSelectMode,"set network selection mode"},

-{"qan",eventQueryAvailableNetwork, "query available network"},

-{"qrs",eventQueryRegistrationState, "query registration state"},

-{"gpnt",eventQueryPrefferredNetworkType,"get preferred network type"},

-{"spnt",eventSetPrefferredNetworkType, "set preferred network type"},

-{"gcil",eventQueryCellInfo, "get cell info list"},

-{"sucilr",eventSetUnsolCellInfoListrate,"set unsol cell info list rate"},

-{"gncid",eventQueryNeighboringCellids, "get neighboring cell IDs"},

-{"sbm",eventSetBandMode, "set band mode"},

-{"qabm",eventQueryAvailableBandmode,"query available band mode"},

-{"rpo",eventRadioOn,"set radio power on/off"},

-{"vrt",eventQueryRadioTech,"voice radio tech"},

-{"sst",eventSolicitedSignalStrength,"singal strength"},

-{"mpo",eventModemOn,"modem power"},

-//sim api

-{"gss",eventGetSimStatus, "get sim status"},

-{"gimsi",eventGetImsi, "get IMSI"},

-//sms api

-{"ssm",eventSendSms,"send sms"},

-{"iss",eventImsSendSms,"send  sms over IMS"},

-{"wsts",eventWriteSmsToSim,"write sms to sim card"},

-{"rsms",eventReportSmsMemoryStatus,"report sms memory state"},

-{"dsos",eventDeletSmsOnSim,"delete sms on sim"},

-{"gsmsc",eventGetSmscAddress,"get smsc address"},

-{"ssmsc",eventSetSmscAddress,"set smsc address"},

-{"sstm",evenStoreSmsToMemory,"srore sms to memory"},

-{"gsfm",eventGetSmsFromMemory,"get sms from memory"},

-{"dmfm",eventDeleteMessageFromMemory,"delete sms from memory"},

-{(char *)NULL, NULL, (char *)NULL},

diff --git a/src/lynq/packages/apps/lynq-function-test/src/fota_test.cpp b/src/lynq/packages/apps/lynq-function-test/src/fota_test.cpp
deleted file mode 100644
index 973e235..0000000
--- a/src/lynq/packages/apps/lynq-function-test/src/fota_test.cpp
+++ /dev/null
@@ -1,280 +0,0 @@
-/*============================================================================= 

-**     FileName: fota_test.c

-**     Desc: about function test

-**     Author: victor

-**     Version: V1.0

-**     LastChange: 2021-10-11

-**     History: 

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

-#include "function_common.h"

-#include <log/log.h>

-#include <stdio.h>

-#include <string.h>

-#include <stdlib.h>

-#include "fota_test.h"

-#include "fcntl.h"

-#include "mtk_device_wrap.h"

-

-

-#ifdef __cplusplus

-extern "C" {

-#endif

-#include "include/iot_rock.h"

-#include "ftp/lynq_ftp.h"

-#ifdef __cplusplus

-}

-#endif

-

-lynq_ftp_socker_info ftp_log_info;
-

-#define UPDATA_ADDR "/tmp/fota.delta"
-#define READ_BLOCK_SIZE 0x40000

-

-int lynq_fota_md5_flag = -1;

-

-#define FLASH_DEV_DELTA       "/dev/disk/by-partlabel/delta"	

-

-#if 0

-#define BUF_SIZE 		1024

-int lynq_fota_str_arr(char *str, char *substr, char parts[][BUF_SIZE])

-{         

-	char *p = NULL;  

-	char *q = NULL;		

-	char tmp[BUF_SIZE] = {0};	

-	char end[BUF_SIZE] = {0};			

-	int i = 0, j = 0, k = 0, par_num=0;

-

-	char *start = strdup(str);	

-

-	while(*str != '\0')    

-	{        

-		p = str;        

-		q = substr;		

-		tmp[i] = *str;		

-		i++;

-		

-		while((*p == *q) && (*p != '\0') && (*q != '\0'))        

-		{            

-			p++;            

-			q++;        

-		}         

-		if(*q == '\0')

-		{			

-			memset(end, 0, sizeof(end));			

-			strcpy(end, p);

-

-			memset(parts[j], 0, sizeof(parts[j]));

-			

-			j == 0 ? memcpy(parts[j], tmp, strlen(tmp)-1) : memcpy(parts[j], tmp+1, strlen(tmp)-2) ;			

-

-			j++;			

-			memset(tmp, 0, sizeof(tmp));			

-			i = 0;			            

-			par_num++;         

-		}		

-

-		str++;

-	}	

-	

-	

-	if (!par_num) {

-		LYDBGLOG("[%s-%d] cmd is error!!!\n", __FUNCTION__, __LINE__);

-		LYVERBLOG("+[thhandle]: error \n");

-		return -1;

-	}

-		

-	

-	if (strcmp(end, "") != 0) {		

-		memset(parts[j], 0, sizeof(parts[j]));

-		memcpy(parts[j], tmp+1, strlen(tmp)-2);

-	}

-

-	for (i = 0 ; i < par_num + 1 ; i++)

-		memcpy(parts[i], strchr(parts[i],'"')+1,strlen(parts[i]));	

-	

-	return par_num; 			

-}

-#endif

-

-int lynq_ftp_download_fota_package(char *string[])

-{

-

-   sprintf(ftp_log_info.sevname,"%s",string[1]);

-   LYVERBLOG("[+UP]: sevname:%s\n",ftp_log_info.sevname);

-    ftp_log_info.portnum = atoi(string[2]);

-  LYVERBLOG("[+UP]: portnum:%d\n",ftp_log_info.portnum);

- 

-   sprintf(ftp_log_info.username,"%s",string[3]);

-   sprintf(ftp_log_info.pw,"%s",string[4]);

-LYVERBLOG("[+UP]: username:%s\n",ftp_log_info.username);

-LYVERBLOG("[+UP]: pw:%s\n",ftp_log_info.pw);

-

-   sprintf(ftp_log_info.is_pasv_mode,"%s",string[5]);

-   sprintf(ftp_log_info.file_type,"%s",string[6]);

-   sprintf(ftp_log_info.put_opt,"%s",string[7]);

-

-   sprintf(ftp_log_info.getfilename_path,"%s",string[8]);

-   sprintf(ftp_log_info.getfilename,"%s",string[9]);

-  LYVERBLOG("[+UP]: getfilename_path:%s\n",ftp_log_info.getfilename_path);

-
-   LYVERBLOG("[+UP]: Download the FTP data start\n");

-   lynq_ftp_login(&ftp_log_info);
-   lynq_ftp_download(&ftp_log_info);
-   LYVERBLOG("[+UP]: Download the FTP data end\n");

-

-   return 0;

-}

-

-int lynq_md5_fota_package(char *string[])

-{

-    int ret = 0;

-    int fd_down,size,fd_target;

-    char delta_data[READ_BLOCK_SIZE];

-    char input_md5_data[64] = {0};

-	

-    sprintf(input_md5_data,"%s",string[0]);

-//LYVERBLOG("[+UP]: input_md5_data:%s\n",input_md5_data);

-	lynq_fota_md5_flag = lynq_md5_file_verfy(UPDATA_ADDR, input_md5_data);

-	if(lynq_fota_md5_flag == 0)

-	{

-		LYVERBLOG("[+UP]: md5 fota package success\n");

-	}

-	else

-	{

-		LYVERBLOG("[+UP]: md5 fota package fail\n");

-		return 1;

-	}

-

-	   fd_down = open(UPDATA_ADDR,O_RDONLY);

-		if (fd_down < 0) {

-			LYVERBLOG("[+UP]: open source  error\n");

-		    return 1;

-		}

-

-	    fd_target = mtk_device_wrap_open(FLASH_DEV_DELTA,O_RDWR);

-	 

-	    if (fd_target < 0) {

-	       close(fd_down);

-		LYERRLOG("+[UA]: open target  error\n");

-	        return 1;

-	    } 

-

-		LYVERBLOG("[+UP]: Get ftp data write to delta\n");

-		while(( size = read(fd_down,delta_data,READ_BLOCK_SIZE))>0) {

-	    	   mtk_device_wrap_write(fd_target,delta_data,READ_BLOCK_SIZE);

-		   memset(delta_data,0,READ_BLOCK_SIZE);

-	    }

-		

-		LYVERBLOG("[+UP]: Store upgrade data to delta success\n");

-		

-		mtk_device_wrap_close(fd_target);

-		close(fd_down);

-		

-		return 0;

-}

-

-#if 0

-int lynq_md5_fota_package_new(char *string[])

-{

-    int ret = 0;

-    int fd_down,size,fd_target;

-    int total_len = 0,pack_len = 0;

-    char delta_data[READ_BLOCK_SIZE];

-    char input_md5_data[64] = {0};

-	

-    sprintf(input_md5_data,"%s",string[0]);

-    pack_len = atoi(string[1]);

-//LYVERBLOG("[+UP]: input_md5_data:%s\n",input_md5_data);

-	lynq_fota_md5_flag = md5_file_verfy_new(FLASH_DEV_DELTA, input_md5_data,pack_len);

-	if(lynq_fota_md5_flag == 0)

-	{

-		LYVERBLOG("[+UP]: md5 fota package success\n");

-	}

-	else

-	{

-		LYVERBLOG("[+UP]: md5 fota package fail\n");

-		return 1;

-	}

-

-	   fd_down = open(UPDATA_ADDR,O_RDONLY);

-		if (fd_down < 0) {

-			LYVERBLOG("[+UP]: open source  error\n");

-		    return 1;

-		}

-

-	    fd_target = mtk_device_wrap_open(FLASH_DEV_DELTA,O_RDWR);

-	 

-	    if (fd_target < 0) {

-	       close(fd_down);

-		LYERRLOG("+[UA]: open target  error\n");

-	        return 1;

-	    } 

-

-		LYVERBLOG("[+UP]: Get ftp data write to delta\n");

-		while(( size = read(fd_down,delta_data,READ_BLOCK_SIZE))>0) {

-	    	   mtk_device_wrap_write(fd_target,delta_data,READ_BLOCK_SIZE);

-		   memset(delta_data,0,READ_BLOCK_SIZE);

-	    }

-		LYVERBLOG("[+UP]: Store upgrade data to delta success\n");

-		

-		mtk_device_wrap_close(fd_target);

-		close(fd_down);

-		

-		return 0;

-}

-#endif

-int lynq_fota_func_test(void)

-{

-	int first_run = 1; 

-	LYVERBLOG("+[UA]: Upgrade to start\n");

-	if(lynq_fota_md5_flag == 0)

-	{
-		lynq_rock_main(first_run);

-	}

-	else

-	{

-		LYVERBLOG("+[UA]: MD5 verify fail\n");

-		return 1;

-	}

-	LYVERBLOG("+[UA]: Upgrade to end\n");

-	return 0;

-}

-

-int fota_test(char *api,char *string) 

-{

-//    char argv[20][BUF_SIZE] = {0};

-//    int line = lynq_fota_str_arr(string, "\"&", argv)+1;

-    char *argv[100] = {0};

-    parseParameters(string,argv);

-    if(!strcmp(api, "download"))

-   {

-      if(!(strcmp(argv[0], "ftp")))

-      	{

-		lynq_ftp_download_fota_package(argv);

-	 }

-	 else if(!(strcmp(argv[0], "http")))

-	 {

-

-	 }

-

-    }

-   else if(!(strcmp(api, "md5")))

-   {

-        lynq_md5_fota_package(argv);

-   }

-//   else if(!(strcmp(api, "md5new")))

-//   {

-//        lynq_md5_fota_package_new(argv);

-//   }

-    else if(!(strcmp(api, "upgrade")))

-   {

-        lynq_fota_func_test();

-   }

-   else

-   {

-	LYVERBLOG("+[fota][fota_test]: fota api error!!!\n");

-   }

-    return 0;

-}

-

-

diff --git a/src/lynq/packages/apps/lynq-function-test/src/fota_test.h b/src/lynq/packages/apps/lynq-function-test/src/fota_test.h
deleted file mode 100644
index 06187d8..0000000
--- a/src/lynq/packages/apps/lynq-function-test/src/fota_test.h
+++ /dev/null
@@ -1,4 +0,0 @@
-#ifndef __FOTA_TEST_H__

-#define __FOTA_TEST_H__

-int fota_test(char *api,char *string);

-#endif //__FOTA_TEST_H__
\ No newline at end of file
diff --git a/src/lynq/packages/apps/lynq-function-test/src/function_common.cpp b/src/lynq/packages/apps/lynq-function-test/src/function_common.cpp
deleted file mode 100644
index 7d2f170..0000000
--- a/src/lynq/packages/apps/lynq-function-test/src/function_common.cpp
+++ /dev/null
@@ -1,220 +0,0 @@
-/*============================================================================= 

-**     FileName: function_common.cpp

-**     Desc: about function test

-**     Author: Warren

-**     Version: V1.0

-**     LastChange: 2021-02-26 

-**     History: 

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

-/*Get private menu,take only the first two parameters, and return the head pointer of the remaining string*/

-#include <stdio.h>

-#include <string.h>

-#include "function_common.h"

-#include <sys/time.h>

-#include <unistd.h>

-#include <stdlib.h>

-void set_timer(int it_interval_sec, int it_interval_usec,int it_value_sec,int it_value_usec)

-{

-    struct itimerval itv, oldtv;

-    itv.it_interval.tv_sec = it_interval_sec;

-    itv.it_interval.tv_usec = it_interval_usec;

-    itv.it_value.tv_sec = it_value_sec;

-    itv.it_value.tv_usec = it_value_usec;

-    setitimer(ITIMER_REAL, &itv, &oldtv);

-}

- 

-int sleep_with_restart(int second)

-{

-    int left = second;

-    while (left > 0) 

-    {

-        left = sleep(left);

-    }

-    return 0;

-}

-int millli_sleep_with_restart(int millisecond)

-{

-    int left = millisecond*1000;

-    while (left > 0) 

-    { 

-        left = usleep(left);

-    }

-

-    return 0;

-}

-//Get private menu,take only the first two parameters, and return the head pointer of the remaining string

-char* getMenu(char * str,char *argv[])

-{

-    char* pos = str;

-    int menu = 0;

-    int num = 0;

-    if (str == NULL)

-    {

-        return NULL;

-    }

-    while (1)

-    {

-        menu = 0;

-        if (num == 2)

-        {

-            break;

-        }

-        while (1)

-        {

-            if (*pos == '"')

-            {

-                if (menu == 0)

-                {

-                    menu++;

-                    argv[num++] = pos+1;

-                }

-                else if (menu == 1)

-                {

-                    *pos++ = '\0';

-                    break;

-                }

-                else 

-                {

-                    break;

-                }

-            }

-            pos++;

-        }

-        

-    }

-    printf("moudle = %s\nAPI = %s\n", argv[0], argv[1]);

-    return pos;

-}

-/*parse the parameters,and then stroge every parameter to argv.*/

-/*return the number of parameters.*/

-int getParam(char * str,char *argv[])

-{

-    char* pos = str;

-    int num = 0;

-    if (str == NULL)

-    {

-        return 0;

-    }

-    while (1)

-    {

-        if (*pos == '\0')

-        {

-            break;

-        }

-        while (1)

-        {

-            if (*(pos - 1) == '=' && *pos == '"')// "="" as the basis for starting the parameter.   

-            {

-                argv[num++] = pos+1;

-            }

-            else if (*(pos - 1) == '"' && *pos == '&')// "="" as the basis for the end of the parameter

-            {

-                *(pos - 1) = '\0';

-                pos++;

-                break;

-            }

-            else if (*pos == '\0'&&*(pos-1) == '"')//the string end.

-            {

-                *(pos - 1) = '\0';

-                break;

-            }

-            else if (*pos == '\0')//the string end.

-            {

-                break;

-            }

-            pos++;

-        }

-    }

-  //  for (int i = 0;i < num;i++)

-  //  {

-   //     printf("argv[%d] = %s\n",i,argv[i]);

-   // }

-    return num;

-}

-

-/*remove the escape character '\'*/

-int removeTage(const int length,char* argv[])

-{

-    char* temp = NULL;

-    char* temp1 = NULL;

-    char** pos = argv;

-    for (int i = 0;i < length;i++)

-    {

-        temp1 = pos[i];

-        while (1)

-        {

-            if (*pos[i] == '\0')

-            {

-                break;

-            }

-            if ((*pos[i] == '"') && (*(pos[i] - 1) == '\\'))//Remove "\"" when encountering '\'

-            {

-                temp = pos[i];

-                while (1)

-                {

-                    *(pos[i] - 1) = *(pos[i]);

-                    if (*(pos[i]) == '\0')

-                    {

-                        break;

-                    }

-                    pos[i]++;

-                }

-                pos[i] = temp;

-            }

-            pos[i]++;

-        }

-        pos[i] = temp1;

-    }

-    return 0;

-}

-int parseParameters(char *str,char *argv[])

-{

-    int argc = 0;

-    argc = getParam(str,argv);

-    removeTage(argc,argv);

-   // for (int i = 0;i < argc; i++)

-   // {

-  //      printf("param %d = %s\n",i, argv[i]);

-  //  }

-    return 0;

-}

-RIL_COMMAND*find_command (char *name,RIL_COMMAND *Class)

-{

-    register int i;

-    for (i = 0; Class[i].name; i++)

-        if (strcmp (name, Class[i].name) == 0)

-            return (&Class[i]);

-    return ((RIL_COMMAND *)NULL);

-}

-

-int check_numScope(char **argv){

-   if(!strcmp(argv[0], "0"))

-        return 1;

-    if(!atoi(argv[0])){

-        return -1;

-    }

-    else{

-        int num = atoi(argv[0]);

-        if(num < 0 || num > 36)

-            return -1;

-        return 1;

-    }

-}

-int check_special(char **argv){

-    if(!strcmp(argv[0], "0"))

-        return 1;

-    if(!strcmp(argv[0], "#"))

-        return 1;

-    if(!strcmp(argv[0], "*"))

-        return 1;

-    if(!atoi(argv[0])){

-        return -1;

-    } 

-    else{

-        int num = atoi(argv[0]);

-        if(num < 0 || num > 9)

-            return -1;

-        return 1;

-    }

-}

-

diff --git a/src/lynq/packages/apps/lynq-function-test/src/function_common.h b/src/lynq/packages/apps/lynq-function-test/src/function_common.h
deleted file mode 100644
index d3d4141..0000000
--- a/src/lynq/packages/apps/lynq-function-test/src/function_common.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/*============================================================================= 

-**     FileName: function_common.h

-**     Desc: about function test

-**     Author: Warren 

-**     Version: V1.0

-**     LastChange: 2021-02-26 

-**     History: 

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

-#ifndef __FUNCTION_COMMON_H__

-#define __FUNCTION_COMMON_H__

- 

-#ifdef __cplusplus

-extern "C" {

-#endif

-  #include "liblog/liblog.h"

-  #include "liblog/lynq_deflog.h"

-#ifdef __cplusplus

-}

-#endif

-typedef enum{

-    MENU_INPUT_ERROR=0,

-    MODULE_INPUT_ERROR,

-    API_INPUT_ERROR,

-    INVALID_CMD,

-}COMMAND_ERROR;

-typedef struct {

-    char *name;                    /* User printable name of the function. */

-    int (*func)(char **param); /* Function to call to do the job. */

-    char *doc;                    /* Documentation for this function.  */

-} RIL_COMMAND;

-RIL_COMMAND*find_command (char *name,RIL_COMMAND *Class);

-

-void set_timer(int it_interval_sec, int it_interval_usec,int it_value_sec,int it_value_usec);

-int sleep_with_restart(int second);

-int millli_sleep_with_restart(int millisecond);

-

-int check_numScope(char **argv);

-int check_special(char **argv);

-char* getMenu(char * str,char *argv[]);

-int parseParameters(char *str,char *argv[]);

-//int getParam(char * str,char *argv[]);

-//int removeTage(const int length,char* argv[]);

-

-#endif
\ No newline at end of file
diff --git a/src/lynq/packages/apps/lynq-function-test/src/gpio_test.cpp b/src/lynq/packages/apps/lynq-function-test/src/gpio_test.cpp
deleted file mode 100644
index 837ab94..0000000
--- a/src/lynq/packages/apps/lynq-function-test/src/gpio_test.cpp
+++ /dev/null
@@ -1,99 +0,0 @@
-/*============================================================================= 

-**     FileName: gpio_test.cpp

-**     Desc: about function test

-**     Author: zhou

-**     Version: V1.0

-**     LastChange: 2021-03-04 

-**     History: 

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

-#include "function_common.h"

-#include <log/log.h>

-#include <stdio.h>

-#include "gpio_test.h"

-#include <stdio.h>

-#include <string.h>

-#include <stdlib.h>

-#ifdef __cplusplus

-extern "C" {

-#endif   

-#include "liblynq-driver-control/libdriver.h"

-#ifdef __cplusplus

-}

-#endif

-int check_mode(const char *mode)

-{

-if(!strcmp(mode, GPIO_DIR))

-{

-  return 1;

-}

-if(!strcmp(mode, GPIO_OUT))

-{

-	return 1;

-}

-if(!strcmp(mode, GPIO_MODE))

-{

-	return 1;	

-}

-  return -1;

-}

-static int check_status(char **argv)

-{

-    if(!strcmp(argv[2],"0")){

-        return 1;

-    }

-    if(!atoi(argv[2])){

-        return -1;

-    }

-    int num = atoi(argv[2]);

-    if(num == 1)

-        return 1;

-    return -1;

-}

-int gpio_test(char *api,char *string) {

-    char *argv[100] = {0};

-    parseParameters(string,argv);

-    if(!strcmp(api, "get")){

-        char output1[1024] = {0};

-        int value = atoi(argv[0]);

-        lynq_get_gpio (value,output1);

-       // printf("Factory_result get %d gpio:%s \n",value,output1)

-        LYVERBLOG("+[gpio][get]: data = %s\n",output1);

-

-    }

-    else if(!strcmp(api, "set")){

-        int check_prame;

-        check_prame = check_status(argv);

-        if(check_prame == -1)

-        {

-         LYVERBLOG("+[gpio][set]: error num = %d \n",GPIO_PRAME_ERROR);

-         return 0;

-        }

-        int gpio_numb = atoi(argv[1]);

-        

-        int gpio_statu = atoi(argv[2]);

-        

-        check_prame = check_mode(argv[0]);

-        if(check_prame == -1)

-        {

-         LYVERBLOG("+[gpio][set]: error num = %d \n",GPIO_PRAME_ERROR);

-        return 0;

-        }

-       

-        int result = lynq_set_gpio(argv[0], gpio_numb,gpio_statu);

-        if(result == -1)

-        {

-         LYVERBLOG("+[gpio][set]: error num = %d \n",GPIO_SET_ERROR);

-         return 0;

-        }

-        else

-        {

-         LYVERBLOG("+[gpio][set]: ok!!\n",result);

-         return 1;

-        }

-    }

-    else {

-        LYVERBLOG("+[gpio][lynq_set_gpio]: error num =%d\n",GPIO_PRAME_ERROR);

-    }

-

-    return 0;

-}
\ No newline at end of file
diff --git a/src/lynq/packages/apps/lynq-function-test/src/gpio_test.h b/src/lynq/packages/apps/lynq-function-test/src/gpio_test.h
deleted file mode 100644
index 204cfe0..0000000
--- a/src/lynq/packages/apps/lynq-function-test/src/gpio_test.h
+++ /dev/null
@@ -1,12 +0,0 @@
-#ifndef __LYNQ_GPIO_TEST_H__

-#define __LYNQ_GPIO_TEST_H__

-#define GPIO_MODE "mode"

-#define GPIO_DIR "dir"

-#define GPIO_OUT "out"

-typedef enum {

-   GPIO_SET_SUCCESS  = 0 ,

-   GPIO_PRAME_ERROR = 1,

-   GPIO_SET_ERROR  = 2,

-}GPIO_SET_RESULT;

-int gpio_test(char *api,char *string);

-#endif //__LYNQ_GPIO_TEST_H__
\ No newline at end of file
diff --git a/src/lynq/packages/apps/lynq-function-test/src/main.cpp b/src/lynq/packages/apps/lynq-function-test/src/main.cpp
old mode 100644
new mode 100755
index e75c768..93c80e4
--- a/src/lynq/packages/apps/lynq-function-test/src/main.cpp
+++ b/src/lynq/packages/apps/lynq-function-test/src/main.cpp
@@ -1,374 +1,573 @@
-/* gets example */
 #include <stdio.h>
+#include <dlfcn.h>
+#include <signal.h>
 #include <string.h>
 #include <stdlib.h>
-#include <libtel/lib_tele.h>
-#include "ril_test.h"
-#include "gpio_test.h"
-#include "fota_test.h"
-#include "function_common.h"
-//#include "exception_multicast.h"
-#include "usb_switch.h"
-#ifdef __cplusplus
-extern "C" {
-#endif
-#include "liblynq-broadcast/broadcast_send.h"
-#include <gio/gio.h>
-#include <glib.h>
-#include "liblynq-driver-control/libdriver.h"
-#ifdef __cplusplus
-}
-#endif
-#define BUFFER_SIZE 8192
-#define USER_LOG_TAG "FUNCTION_TEST"
-#define MAX_ARGS 5
-typedef enum {
-    API_MENU = 1,
-    DEMO_MENU,
-}TEST_MAIN_ITEM;
-typedef enum{
-    API_RIL=0,
-    API_GPIO,
-    API_MQTT,
-    API_HTTP,
-    API_WIFI,
-    API_GNSS,
-    API_USB,
-	API_FOTA,
-} API_MOUDLE;
+//#include <lynq_sim.h>
+#include <lynq_data.h>
+#include <lynq_call.h>
 
+#define BUF_SIZE 32
+#define BUF_PIN 4
 
-void lynq_incoming_call_cb(RIL_SOCKET_ID soc_id,int index, char * addr, RIL_CallState state, int toa)
+int flag_init = 0;
+void* handler;
+typedef struct
 {
-   // printf("[SIM%d]index is %d,addr is %s,state is %d,toa is %d\n",soc_id,index,addr,state,toa);
-    LYVERBLOG("[SIM%d]index is %d,addr is %s,state is %d,toa is %d\n",soc_id,index,addr,state,toa);
-}
+    int cmdIdx;
+    char *funcName;
+}st_api_test_case;
 
-void lynq_recive_new_sms_cb(RIL_SOCKET_ID soc_id,char * num, char * smsc, char * msg, int charset)
+st_api_test_case api_testcases[] = 
 {
-  //  printf("[SIM%d]num is %s,smsc is %s,msg is %s,charset is %d\n",soc_id,num,smsc,msg,charset);
-    LYVERBLOG("[SIM%d]num is %s,smsc is %s,msg is %s,charset is %d\n",soc_id,num,smsc,msg,charset);
-}
-static user_cb mytest={
-    lynq_recive_new_sms_cb,
-    lynq_incoming_call_cb
+    {0,    "lynq_sim_init"},
+    {1,    "lynq_enable_pin"},
+    {2,    "lynq_disable_pin"},
+    {3,    "lynq_query_operator"}, 
+    {4,    "lynq_get_iccid"},
+    {5,    "lynq_query_pin_lock"},
+    {6,    "lynq_verify_pin"},
+    {7,    "lynq_change_pin"},
+    {8,    "lynq_unlock_pin"},
+    {9,    "lynq_query_phone_number"},
+    {10,    "lynq_get_imsi"},
+    {11,    "lynq_get_sim_status"},
+    {12,    "lynq_sim_deinit"},
+    {13,    "lynq_setup_data_call"},
+    {14,    "lynq_deactive_data_call"},
+    {15,    "lynq_setup_data_call_sp"},
+    {16,    "lynq_get_data_call_list"},
+    {17,    "lynq_wait_data_call_state_change"},
+    {18,    "lynq_init_data"},
+    {19,    "lynq_deinit_data"},
+    {21,    "lynq_init_call"},
+    {22,    "lynq_call"},
+    {23,    "lynq_call_answer"},
+    {24,    "lynq_call_hungup"},
+    {26,    "lynq_call_hungup_all"},
+    {27,    "lynq_wait_incoming_call"},
+    {28,    "lynq_deinit_call"},
+    {-1,    NULL}
 };
 
-static void getCallback(const char* str_arg, int int_arg )
+void print_help(void)
 {
-    //printf("SignalCallback,str_arg:%s,int_arg:%d\n", str_arg,int_arg);
-    LYVERBLOG("SignalCallback,str_arg:%s,int_arg:%d\n", str_arg,int_arg);
+    int i;
 
-    return;
-}
-
-void hold_on(){
-    char any[5]={ 0 };
-    printf("Press any key to return\n");
-    fgets(any, 5, stdin);
-}
-
-int parse_param(char *cmd, char *argv[], int max_args){
-    char *pos, *pos2;
-    int argc = 0;
-
-    pos = cmd;
-    while (1) {
-        // Trim the space characters.
-        while (*pos == ' ') {
-            pos++;
-        }
-
-        if (*pos == '\0') {
-          break;
-        }
-
-        // One token may start with '"' or other characters.
-        if (*pos == '"' && (pos2 = strchr(pos + 1, '"'))) {
-            argv[argc++] = pos + 1;
-            *pos2 = '\0';
-            pos = pos2 + 1;
-            if (*pos == '\n'){
-                *pos = '\0';
-                pos = pos + 1;
-            }
-        }
-        else {
-            argv[argc++] = pos;
-            while (*pos != '\0' && *pos != ' '&& *pos != '\n') 
-                {
-                    if (*pos == '"' && (pos2 = strchr(pos + 1, '"'))) 
-                    {
-                        pos = pos2 ;
-                    }
-                    else
-                    pos++;
-                }
-            *pos++ = '\0';
-        }
-
-    // Check if the maximum of arguments is reached.
-        if (argc == max_args) {
+    printf("Supported test cases:\n");
+    for(i = 0; ; i++)
+    {
+        if(api_testcases[i].cmdIdx == -1)
+        {
             break;
         }
+        printf("%d:\t%s\n", api_testcases[i].cmdIdx, api_testcases[i].funcName);
     }
-
-    return argc;
 }
-int getRilModule(char *module)
+
+int (*lynq_sim_init)(int);
+int (*lynq_sim_deinit)(void);
+static void signal_handler(int signum)
 {
-    if (module==NULL)
-    {
-       //printf("[ERROR] Please input module,and try again!");
-       // LYVERBLOG("+[command error]:error num = %d\n",MODULE_INPUT_ERROR);
-        return -1;
-    }
-    if(!strcmp(module,"ril"))
-    {
-        return API_RIL;
-    }
-    else if(!strcmp(module,"gpio"))
-    {
-        return API_GPIO;
-    }
-    else if(!strcmp(module,"MQTT"))
-    {
-        return API_MQTT;
-    }
-    else if(!strcmp(module,"HTTP"))
-    {
-        return API_HTTP;
-    }
-    else if(!strcmp(module,"WIFI"))
-    {
-        return API_WIFI;
-    }
-    else if(!strcmp(module,"GNSS"))
-    {
-        return API_GNSS;
-    }
-    else if(!strcmp(module,"usb_switch"))
-    {
-        return API_USB;
-    }
-	else if(!strcmp(module, "fota"))
-    {
-        return API_FOTA;
-    }
-    else
-    {
-       LYVERBLOG("+[command error]:error num = %d\n",MODULE_INPUT_ERROR);
-       // printf("can not find %s API  module ",module);
-        return -1;
-    }
-    return -1;
-}
-
-int api_start(int argc, char *argv[]){
-    LYDBGLOG("api_start,argc:%d\n",argc);
-    char *menu[2] = {0};// menu[0] is the "moudle",menu[1] is the "API"
-    char* argvHead=NULL;
-    int module = -1;
-    argvHead = getMenu(argv[2],menu);//find the "module" and the "API"
-    module = getRilModule(menu[0]);
-   // if(argvHead == NULL)
-   // {
-    //     printf("pram api error\n");
-    //     return 0;
-   // }
-    switch(module)
-    {
-        case API_RIL:
-        {
-            if(argvHead)
-            {
-                ril_test(menu[1],argvHead);
-                break;
-            }
-        }
-        /* Add the code of the owner modules below*/
-        case API_GPIO:
-        {
-            gpio_test(menu[1],argvHead);
+    switch(signum){
+         case SIGABRT:
+            printf("[sim_demo] recv SIGABRT\n");
             break;
-        }
-        case API_USB:
-        {
-            usb_switch_test(menu[1],argvHead);
+         case SIGBUS:
+            printf("[sim_demo] recv SIGBUS\n");
             break;
-        }
-		case API_FOTA:
-		{
-			fota_test(menu[1],argvHead);		
-			break;
-		}
-        case API_MQTT:
-        case API_HTTP:
-        case API_WIFI:
-        case API_GNSS:
+         case SIGFPE:
+            printf("[sim_demo] recv SIGFPE\n");
             break;
-        default:
-          //  printf("pram module error\n");
-          LYVERBLOG("+[command error]:error num = %d\n",API_INPUT_ERROR);
-
+         case SIGILL:
+            printf("[sim_demo] recv SIGILL\n");
+            break;
+         case SIGSEGV:
+            printf("[sim_demo] recv SIGSEGV\n");
+            break;
+         default:
+            printf("[sim_demo] recv unknown signal\n");
             break;
     }
-   // hold_on(); //add by zhouqunchao delete help message
-    return 1;
+	lynq_sim_deinit();
+    dlclose(handler);
+    exit(0);
 }
 
-int function_start(int argc, char *argv[])
-{
-	int select_menu = atoi(argv[0]);
-	int thread = atoi(argv[1]);
-	// printf("select_menu:%d,thread:%d\n",select_menu,thread);
- 	switch(select_menu)
-	{
-		case API_MENU:
-		{
-			if (thread == 1)//rita add @2021.6.21 for threadhandle test
-			{
-				LYDBGLOG("[%s-%d] argv[2] = [%s]\n", __FUNCTION__, __LINE__, argv[2]);
-				if(strlen(argv[2])){//rita add @2021.6.21 for data error
-					LYDBGLOG("[%s-%d] argv[2] = [%s]\n", __FUNCTION__, __LINE__, argv[2]);
-					send_broadcast_by_name("function", strlen(argv[2]), argv[2]);
-				}
-				else{
-					LYVERBLOG("+[thhandle]: error num = %d\n", INVALID_CMD);
-					return INVALID_CMD;
-				}
-			}
-			else if(thread ==2){//rita add @2021.6.21 for local test
-				api_start(argc,argv);
-			}
-			else{
-				//printf("thread 1,local 2\n");
-				LYDBGLOG("thread 1,local 2\n");
-			}
-			break;
-		}
-		case DEMO_MENU:
-		{
-			//printf("DEMO_MENU\n");
-			LYDBGLOG("DEMO_MENU\n");
-			break;
-		}
-		default:
-        break;
-    }
-    return 0; 
-}
-
-void help_display(){
-    printf("\n");
-    printf("*****************************************************************************\n");
-    printf("0:help ------- help\n");
-    printf("*****************************************************************************\n");
-    printf("1:API TEST\n" );
-    printf("          1-1:Async api-\n" );
-    printf("                        --MQTT\n" );
-    printf("\n");
-    printf("                        --HTTP\n" );
-    printf("          1-2:Sync api-\n" );
-    printf("                        --GPIO\n" );
-    printf("\n");
-    printf("                        --RIL\n" );
-    printf("\n");
-    printf("                        --WIFI\n" );
-    printf("\n");
-    printf("                        --GNSS\n" );
-    printf("\n");
-    printf("                        --SERVICE\n" );
-    printf("*****************************************************************************\n");
-    printf("2:DEMO TEST:Subsequent updates\n" );
-    printf("*****************************************************************************\n");
-    printf("\n");
-    printf("1:API TEST The format is as follows :\n" );
-    printf("{menu}-{mode selection} moudle=\"{moudle}\"&API=\"{api interface}\"&session=\"{session id}\"\"&parameterA=\"{parameter A}\"\n" );
-    /*
-    printf("The main parameters are as follows:\n");
-    printf("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
-    printf("menu:1--API TEST,2--DEMO TEST\n" );
-    printf("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
-    printf("mode selection:1--async api,2--sync api\n" );
-    printf("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
-    printf("moudle:Test module--includes the following modules\n" );
-    printf("RIL, GPIO,MQTT,HTTP,WIFI,GNSS\n" );
-    printf("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
-    printf("api interface:--Interface corresponding to module\n" );
-    printf("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
-    printf("session id:--Used to distinguish different session groups of the same module\n" );
-    printf("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
-    printf("parameter A:--API parameter,Add format {\"&parameter_name=\"{parameter}\"} \n" );
-    printf("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
-    */
-    printf("Select menu:\n");
-}
-void menu_display(){
-    printf("\n");
-    printf("**********************\n");
-    printf("0:help menu\n");
-    printf("1:API TEST\n");
-    printf("2:DEMO TEST\n");
-    printf("**********************\n");
-    printf("\n");
-    printf("Select menu:\n");
-}
-int main(int argc, char const *argv[])
+int main()
 {   
+    int cmdIdx = 0;
+    int ret    = -1;
+    char buf[BUF_SIZE] = {0};
+    int flag = 0;
+    //打开库文件
+    handler = dlopen("/lib/liblynq-sim.so",RTLD_LAZY);
+    if(dlerror() != NULL){
+        printf("%s\n",dlerror());
+        return 0;
+    }
    
-    
-        LYLOGEINIT(USER_LOG_TAG);
-        registerTriggerCallback(getCallback);
-        register_key_info();
-        lynqRegisterUnsolicitedResponse(&mytest);
-        lynq_ril_init();
-        sleep_with_restart(1);
-        register_broadcast_send();
-        while (1) {
-            char *argv[MAX_ARGS];
-            char str[BUFFER_SIZE]={ 0 };
-            menu_display();
-            fgets(str, BUFFER_SIZE, stdin);
-            LYDBGLOG("[%s-%d] str= [%s]\n", __FUNCTION__, __LINE__, str);
-            str[strlen(str)-1]='\0';
-            if(!strcmp(str, "0")){
-            help_display();
-            //hold_on(); //add by zhouqunchao delete help message
+    lynq_sim_init=(int (*)(int))dlsym(handler,"lynq_sim_init");
+    if(dlerror()!=NULL){
+        printf("%s\n",dlerror());
+    }
+    int(*lynq_enable_pin)(char *)=(int (*)(char *))dlsym(handler,"lynq_enable_pin");
+    if(dlerror()!=NULL){
+        printf("%s\n",dlerror());
+    }
+    int(*lynq_disable_pin)(char *)=(int (*)(char *))dlsym(handler,"lynq_disable_pin");
+    if(dlerror()!=NULL){
+        printf("%s\n",dlerror());
+    }
+    int(*lynq_query_operator)(char *)=(int (*)(char *))dlsym(handler,"lynq_query_operator");
+    if(dlerror()!=NULL){
+        printf("%s\n",dlerror());
+    }
+    int(*lynq_get_iccid)(char *)=(int (*)(char *))dlsym(handler,"lynq_get_iccid");
+    if(dlerror()!=NULL){
+        printf("%s\n",dlerror());
+    }
+    int(*lynq_query_pin_lock)(char *,int *)=(int (*)(char *, int *))dlsym(handler,"lynq_query_pin_lock");
+    if(dlerror()!=NULL){
+        printf("%s\n",dlerror());
+    }
+    int(*lynq_verify_pin)(char *)=(int (*)(char *))dlsym(handler,"lynq_verify_pin");
+    if(dlerror()!=NULL){
+        printf("%s\n",dlerror());
+    }
+    int(*lynq_change_pin)(char *,char *)=(int (*)(char *, char *))dlsym(handler,"lynq_change_pin");
+    if(dlerror()!=NULL){
+        printf("%s\n",dlerror());
+    }
+    int(*lynq_unlock_pin)(char *,char *)=(int (*)(char *, char *))dlsym(handler,"lynq_unlock_pin");
+    if(dlerror()!=NULL){
+        printf("%s\n",dlerror());
+    }
+    int(*lynq_query_phone_number)(char *)=(int (*)(char *))dlsym(handler,"lynq_query_phone_number");
+    if(dlerror()!=NULL){
+        printf("%s\n",dlerror());
+    }
+    int(*lynq_get_imsi)(char *)=(int (*)(char *))dlsym(handler,"lynq_get_imsi");
+    if(dlerror()!=NULL){
+        printf("%s\n",dlerror());
+    }
+    int(*lynq_get_sim_status)(int *)=(int (*)(int *))dlsym(handler,"lynq_get_sim_status");
+    if(dlerror()!=NULL){
+        printf("%s\n",dlerror());
+    }
+    lynq_sim_deinit=(int (*)(void))dlsym(handler,"lynq_sim_deinit");
+    if(dlerror()!=NULL){
+        printf("%s\n",dlerror());
+    }
+   
+    if(dlerror()!=NULL){
+        printf("%s\n",dlerror());
+    }
+    signal(SIGPIPE, signal_handler);
+    signal(SIGABRT, signal_handler);
+    signal(SIGBUS, signal_handler);
+    signal(SIGFPE, signal_handler);
+    signal(SIGILL, signal_handler);
+    signal(SIGSEGV, signal_handler);
+    print_help();
+    while(1)
+    {
+        printf("please input cmd index(-1 exit, 80-help): ");
+        if (scanf("%d", &cmdIdx) != 1)
+        {
+            char c;
+            while((c = getchar()) != '\n' && c != EOF);
+            printf("Illegal input.Please input correctly\n");
+            print_help();
             continue;
+        }
+        memset(buf, 0, sizeof(buf));
+        int handle_data = -1;
+        int handle_call = -1;
+        switch(cmdIdx)
+        {
+            case 0: /* lynq_sim_init  */
+            {   
+                
+                if(flag_init == 1)
+                {
+                   printf("init is already\n"); 
+                   break;
+                }
+                else{
+                    int x;
+                    printf("input token\n");
+                    scanf("%d", &x);
+                    lynq_sim_init(x);
+                    printf("Run lynq_sim_init\n");
+                    flag_init = 1;
+                    break;
+                }
+                
             }
-            if(!strcmp(str,"quit"))
-            {
+
+            case 1: /* lynq_enable_pin */
+            {   
+                if(flag_init == 0){
+                    printf("must init first\n");
+                }
+                else{
+                    char pin[BUF_PIN] = {0};
+                    printf("input pin\n");
+                    scanf("%s", pin);
+                    int ret = lynq_enable_pin(pin);                                      
+                    if(!ret){
+                        printf("ok\n");
+                    }else{
+                        printf("error num is %d\n", ret);
+                    }
+                }
                 break;
             }
-            if ((strncmp(str,"1-",2) == 0)||
-            (strncmp(str,"2-",2)== 0))
-            {
-            char* at_cmd = strstr(str, "-");
-            strncpy(at_cmd, " ", 1);
-            LYDBGLOG("[%s-%d] at_cmd = [%s]\n", __FUNCTION__, __LINE__, at_cmd);
 
+            case 2: /* lynq_disable_pin */
+            {
+				if(flag_init == 0){
+                    printf("must init first\n");
+                }
+                else{
+                    char pin[BUF_PIN] = {0};
+                    printf("input pin\n");
+                    scanf("%s", pin);
+                    int ret = lynq_disable_pin(pin);                                         
+                    if(!ret){
+                        printf("ok\n");
+                    }else{
+                        printf("error num is %d\n", ret);
+                    }
+                    
+                }
+                break;
+            }
         
-            int argc = parse_param(str, argv, MAX_ARGS);
-            //add by zqc  Format error judgment start
-            if(argv[2] == NULL)
-            {
-            LYVERBLOG("+[command error]:error num = %d\n",MENU_INPUT_ERROR);
-            continue;
+            case 3: /* lynq_query_operator */
+            {   
+                if(flag_init == 0){
+                    printf("must init first\n");
+                }
+                else{
+                    char operator1[BUF_SIZE] = {0};
+                    int ret = lynq_query_operator(operator1);                                          
+                    if(!ret){
+                        printf("operator is %s\n", operator1);
+                    }else{
+                        printf("error num is %d\n", ret);
+                    }
+                    
+                }
+                break;
             }
-            //add by zqc  Format error judgment end
-            function_start(argc,argv);
-            continue;
-            }
-            else{
-            // printf("pram error\n");
-            LYVERBLOG("+[command error]:error num = %d\n",MENU_INPUT_ERROR);
-            continue;
-            }
-        }
-    
-  
-   
-    return 0;
-}
 
+            case 4: /* lynq_get_iccid */
+            {
+				if(flag_init == 0){
+                    printf("must init first\n");
+                }
+                else{
+                    char iccid[BUF_SIZE] = {0};
+                    int ret = lynq_get_iccid(iccid);
+                     if(!ret){
+                        printf("iccid is %s\n", iccid);
+                    }else{
+                        printf("error num is %d\n", ret);
+                    }                                                   
+                }
+                break;
+            }
+
+            case 5:  /* lynq_query_pin_lock */
+            {
+				if(flag_init == 0){
+                    printf("must init first\n");
+                }
+                else{
+                    char pin[BUF_PIN] = {0};
+                    printf("input pin\n");
+                    scanf("%s", pin);
+                    int lock[BUF_SIZE] = {0};
+                    int ret = lynq_query_pin_lock(pin, lock);
+                     if(!ret){
+                        printf("lock is %d\n", lock[0]);
+                    }else{
+                        printf("error num is %d\n", ret);
+                    }                                               
+                    
+                }
+                break;
+			}
+            case 6: /* lynq_verify_pin */
+            {
+				if(flag_init == 0){
+                    printf("must init first\n");
+                }
+                else{
+                    char pin[BUF_PIN] = {0};
+                    printf("input pin\n");
+                    scanf("%s", pin);
+                    int ret = lynq_verify_pin(pin);
+                    if(!ret){
+                        printf("ok\n");
+                    }else{
+                        printf("error num is %d\n", ret);
+                    }
+                    
+                }
+                break;
+            }            
+            case 7: /* lynq_change_pin */
+            {
+                if(flag_init == 0){
+                    printf("must init first\n");
+                }
+                else{
+                    char old_pin[BUF_PIN] = {0};
+                    printf("input old pin\n");
+                    scanf("%s", old_pin);
+                    char new_pin[BUF_PIN] = {0};
+                    printf("input new pin\n");
+                    scanf("%s", new_pin);                                            
+                    int ret = lynq_change_pin(old_pin, new_pin);
+                    if(!ret){
+                        printf("ok\n");
+                    }else{
+                        printf("error num is %d\n", ret);
+                    }
+                }
+                break;
+            }
+            case 8: /* lynq_unlock_pin */
+            {
+                if(flag_init == 0){
+                    printf("must init first\n");
+                }
+                else{
+                    char puk[BUF_SIZE] = {0};
+                    printf("input  puk\n");
+                    scanf("%s", puk);
+                    char new_pin[BUF_PIN] = {0};
+                    printf("input new pin\n");
+                    scanf("%s", new_pin);                                            
+                    int ret = lynq_unlock_pin(puk, new_pin);
+                    if(!ret){
+                        printf("ok\n");
+                    }else{
+                        printf("error num is %d\n", ret);
+                    }
+                }
+                break;
+            }
+            case 9: /* lynq_query_phone_number */
+            {
+                if(flag_init == 0){
+                    printf("must init first\n");
+                }
+                else{
+                    char number[BUF_SIZE] = {0};                                        
+                    int ret = lynq_query_phone_number(number);
+                    if(!ret){
+                        printf("ok number is %s\n", number);
+                    }else{
+                        printf("error num is %d\n", ret);
+                    }
+                }
+                break;
+            }
+            case 10: /* lynq_get_imsi */
+            {
+                if(flag_init == 0){
+                    printf("must init first\n");
+                }
+                else{
+                    char imsi[BUF_SIZE] = {0};                                        
+                    int ret = lynq_get_imsi(imsi);
+                    if(!ret){
+                        printf("ok imsi is %s\n", imsi);
+                    }else{
+                        printf("error num is %d\n", ret);
+                    }
+                }
+                break;
+            }
+            case 11: /* lynq_get_sim_status */
+            {
+                if(flag_init == 0){
+                    printf("must init first\n");
+                }
+                else{
+                    int x = -1;
+                    int *y = &x;                                      
+                    int ret = lynq_get_sim_status(y);
+                    if(!ret){
+                        printf("state is %d\n", *y);
+                    }else{
+                        printf("error num is %d\n", ret);
+                    }
+                }
+                break;
+            }
+            case 12:
+            {
+                lynq_sim_deinit();
+                flag_init = 0;
+                break;
+            }
+            
+            case 13:
+            {
+                
+                int *y = &handle_data;
+                int ret = lynq_setup_data_call(y);
+                if(!ret){
+                printf("state is %d\n", *y);
+                }else{
+                    printf("error num is %d\n", ret);
+                }
+                break;
+            }
+            case 14:
+            {
+                int *y = &handle_data;
+                int ret = lynq_deactive_data_call(y);
+                if(!ret){
+                printf("state is %d\n", *y);
+                }else{
+                    printf("error num is %d\n", ret);
+                }
+                break;
+            }
+            // case 15:
+            // {
+            //     lynq_setup_data_call_sp();
+            //     flag_init = 0;
+            //     break;
+            // }
+            // case 16:
+            // {
+            //     lynq_get_data_call_list();
+            //     flag_init = 0;
+            //     break;
+            // }
+            // case 17:
+            // {
+            //     lynq_wait_data_call_state_change();
+            //     flag_init = 0;
+            //     break;
+            // }
+            case 18:
+            {
+                int x;
+                printf("input token\n");
+                scanf("%d", &x);
+                int ret = lynq_init_data(x);
+                if(!ret){
+                    printf("init success %d\n", ret);
+                }else{
+                    printf("error num is %d\n", ret);
+                }
+                break;
+            }
+            case 19:
+            {
+                lynq_deinit_data();
+            }
+            case 21:
+            {
+                int x;
+                printf("input token\n");
+                scanf("%d", &x);
+                int ret = lynq_init_call(x);
+                if(!ret){
+                    printf("init success %d\n", ret);
+                }else{
+                    printf("error num is %d\n", ret);
+                }
+                break;
+            }
+            
+            case 22:
+            {   
+                int *y= &handle_call;
+                printf("before:\n");
+                printf("handle_call %p\n", &y);
+                char add[20] = {0};
+                printf("input tele num\n");
+                scanf("%s",add);
+                int ret = lynq_call(y,add);
+                printf("after:\n");
+                printf("handle_call %p\n", &y);
+                if(!ret){
+                    printf("lynq_call success %d\n", ret);
+                }else{
+                    printf("error num is %d\n", ret);
+                }
+                break;
+            }
+            case 23:
+            {
+                int ret = lynq_call_answer();
+                if(!ret){
+                    printf("lynq_call_answer success %d\n", ret);
+                }else{
+                    printf("error num is %d\n", ret);
+                }
+                break;
+            }
+            case 24:
+            {   
+                int *y= &handle_call;
+                printf("after:\n");
+                printf("handle_call %p\n", &y);
+                int ret = lynq_call_hungup(y);
+                if(!ret){
+                    printf("lynq_call_hungup success %d\n", ret);
+                }else{
+                    printf("error num is %d\n", ret);
+                }
+                break;
+            }
+            case 26:
+            {
+                int ret = lynq_call_hungup_all();
+                if(!ret){
+                    printf("lynq_call_hungup_all success %d\n", ret);
+                }else{
+                    printf("error num is %d\n", ret);
+                }
+                break;
+            }
+            case 28:
+            {
+                int ret = lynq_deinit_call();
+                if(!ret){
+                    printf("lynq_deinit_call success %d\n", ret);
+                }else{
+                    printf("error num is %d\n", ret);
+                }
+                break;
+            }
+
+            case -1:
+            {
+                flag = 1;        /* exit */
+                break;
+            }
+            case 80:
+                print_help(); 
+                break;
+            default:
+                print_help();
+            break;     
+        }
+
+        if(flag == 1)
+            break;
+    }
+    //关闭库文件
+    dlclose(handler);
+    return 0;
+}
\ No newline at end of file
diff --git a/src/lynq/packages/apps/lynq-function-test/src/makefile b/src/lynq/packages/apps/lynq-function-test/src/makefile
old mode 100644
new mode 100755
index bfd29e9..7c75562
--- a/src/lynq/packages/apps/lynq-function-test/src/makefile
+++ b/src/lynq/packages/apps/lynq-function-test/src/makefile
@@ -46,22 +46,8 @@
 LOCAL_C_INCLUDES = \
   -I. \
   -I$(LOCAL_PATH) \
-  -I$(ROOT)$(includedir)/logger \
-   -I$(ROOT)$(includedir)/ftp \
-  -I$(ROOT)$(includedir)/liblynq-broadcast \
-  -I$(ROOT)$(includedir)/vendor-ril \
-  -I$(ROOT)$(includedir)/liblog \
-  -I$(ROOT)$(includedir)/liblynq-driver-control \
-  -I$(ROOT)$(includedir)/libtel \
-  -I$(ROOT)$(includedir)/gstreamer-1.0 \
-  -I$(ROOT)$(includedir)/glib-2.0 \
-  -I$(ROOT)$(libdir)/glib-2.0/include \
-  -I$(ROOT)$(libdir)/gstreamer-1.0/include\
-  -I$(ROOT)$(includedir)/dbus-1.0 \
-  -I../gps_hal/inc \
-  -I../gps_hal/inc/hardware \
-  -I$(ROOT)$(libdir)/dbus-1.0/include \
-  -I$(ROOT)$(includedir)/include  \
+  -I$(ROOT)$(includedir)/libdata  \
+  -I$(ROOT)$(includedir)/libcall  \
   -DLIB_GNSS_HAL_DIR='"$(libdir)"'
 
 LOCAL_C_INCLUDES+=$(DNS_FLAGS)
@@ -70,36 +56,16 @@
     -L. \
     -ldl \
     -lstdc++ \
-    -llog \
-    -lsncfg \
     -lcutils \
     -lutils \
-    -lpower \
     -lbinder \
-    -llynq-log \
-    -llynq-tele-ril \
     -lpthread \
-    -lrt \
-    -llynq-driver-control \
-    -lgpshal \
-    -lpal \
-    -lgstreamer-1.0 \
-    -lglib-2.0 \
-    -lgstbase-1.0 \
-    -lgstreamer-1.0 \
-    -lgobject-2.0 \
-    -lgio-2.0 \
-    -ldtmf \
-    -lapn \
-    -ldbus-1 \
-    -llynq-broadcast \
-    -llynq-protcl \
-    -llynq-fota \
-    -lnandapi  \
+    -llynq-data\
+    -llynq-call \
 
 LOCAL_SRC_FILES_CPP = $(wildcard *.cpp gpio/*.cpp ril/*.cpp)
 LOCAL_SRC_FILES_C = $(wildcard *.c gps/*.c)
-EXECUTABLE = lynq-function-test
+EXECUTABLE = lynq-sim-test
 
 OBJECTS=$(LOCAL_SRC_FILES_CPP:.cpp=.o) $(LOCAL_SRC_FILES_C:.c=.o)
 all: $(EXECUTABLE)
diff --git a/src/lynq/packages/apps/lynq-function-test/src/ril_test.cpp b/src/lynq/packages/apps/lynq-function-test/src/ril_test.cpp
deleted file mode 100644
index bdcb958..0000000
--- a/src/lynq/packages/apps/lynq-function-test/src/ril_test.cpp
+++ /dev/null
@@ -1,1799 +0,0 @@
-/*============================================================================= 

-**     FileName: ril_test.cpp

-**     Desc: about function test

-**     Author: Warren

-**     Version: V1.0

-**     LastChange: 2021-02-26 

-**     History: 

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

-#include "function_common.h"

-#include <log/log.h>

-#include <liblog/lynq_deflog.h>

-#include "libtel/lib_tele.h"

-#include <libtel/lynq_call.h>

-#include <libtel/lynq_sim.h>

-#include <libtel/lynq_network.h>

-#include <libtel/lynq_data.h>

-#include <libtel/lynq_sms.h>

-#include "ril_test.h"

-#include <cutils/properties.h>

-#include <string.h>

-#define MAX_P 1024

-RIL_COMMAND api_commands[] = {

-#include "commands.h"

-};

-static int check_status(char **argv)

-{

-    if(!strcmp(argv[0],"0")){

-        return 1;

-    }

-    if(!atoi(argv[0])){

-        return -1;

-    }

-    int num = atoi(argv[0]);

-    if(num == 1)

-        return 1;

-    return -1;

-}

-static int strUpper(char * str)

-{

-    int i=0;

-    while(1)

-    {

-        if(str[i]=='\0')

-        {

-            break;

-        }

-        if(str[i]>='a'&&str[i]<='z')

-        {

-             //printf("str %c\n",str[i]-32);

-             str[i]=str[i]-32;

-        }

-        i++;

-    }

-    return 0;

-}

-

-int eventDial(char **argv)

-{

-    int32_t token;

-    if(argv[0]==NULL)

-    {

-        LYERRLOG("+[ril][dial]: Please input phony number,and try again\n");

-        return -1;

-    }

-    char* addr = argv[0];

-    char output[1024] = {0};

-    lynqCallList *msg = (lynqCallList*)malloc(sizeof(lynqCallList));

-    memset(msg,0,sizeof(lynqCallList));

-    msg->addr=(char *)malloc(sizeof(char));

-    memset(msg->addr,0,sizeof(char));

-    token = lynq_call(addr, msg);

-    LYINFLOG("[MAIN_LOG] request is %d,phone number is %s,token is %x,error is %d,call_state is %d\n",

-        msg->base.request,msg->addr,msg->base.token,msg->base.e,msg->call_state);

-    if(msg->base.e!=0)

-    {

-        LYVERBLOG( "+[ril][dial]: error num = %d\n",msg->base.e);

-    }

-    else

-    {

-        LYVERBLOG( "+[ril][dial]: ok!!\n");

-    }

-    free(msg->addr);

-    msg->addr=NULL;

-    free(msg);

-    msg=NULL;

-    return 0;

-}

-

-int eventAnswer(char **argv)

-{

-    int32_t token;

-    char output[1024] = {0};

-    lynqCallList *msg = (lynqCallList*)malloc(sizeof(lynqCallList));

-    memset(msg,0,sizeof(lynqCallList));

-    msg->addr=(char *)malloc(sizeof(char));

-    memset(msg->addr,0,sizeof(char));

-    //printf("call start \n");

-    token = lynq_call_answer(msg);

-    //printf("[MAIN_LOG] request is %d,phone number is %s,token is %x,error is %d,call_state is %d\n",

-        //msg->base.request,msg->addr,msg->base.token,msg->base.e,msg->call_state);

-    LYINFLOG("[MAIN_LOG] request is %d,phone number is %s,token is %x,error is %d,call_state is %d",

-        msg->base.request,msg->addr,msg->base.request,msg->base.e,msg->call_state);

-    if(msg->base.e!=0)

-    {

-        LYVERBLOG( "+[ril][an]: error num = %d\n",msg->base.e);

-    }

-    else

-    {

-        LYVERBLOG( "+[ril][an]: ok!!\n");

-    }

-    //emResultNotify(output,command);

-    free(msg->addr);

-    msg->addr=NULL;

-    free(msg);

-    msg=NULL;

-    return 0;

-}

-int eventAutoAnswer(char **argv)

-{

-    int32_t token=0;

-    int mode=0;

-    char output[1024] = {0};

-    if(argv[0]==NULL)

-    {

-        LYERRLOG("+[ril][atan]: Please input auto answer mode value:0 or 1,and try again\n");

-        return -1;

-    }

-    int status = atoi(argv[0]);

-    if(!(status==1 ||status ==0))

-    {

-        LYERRLOG("+[ril][atan]: Please input auto answer mode value:0 or 1,and try again\n");

-        return -1;

-    }

-    token = lynq_set_auto_answercall(status,&mode);

-    if(mode!=status)

-    {

-        LYVERBLOG( "+[ril][atan]: error num = %d\n",RIL_E_GENERIC_FAILURE);

-    }

-    else

-    {

-        LYVERBLOG( "+[ril][atan]: ok!!\n");

-    }

-    return 0;

-}

-int eventSetMute(char **argv)

-{

-    int32_t token = 0;

-    int status =0;

-    if(argv[0]==NULL)

-    {

-        LYERRLOG("+[ril][stme]: Please input set mute mode:0 or 1,and try again!\n");

-        return -1;

-    }

-    int mute = atoi(argv[0]);

-    token = lynq_set_mute_mic(mute, &status);

-    LYINFLOG("set mute status is %s,current mute status is %s\n",mute>0?"mute on":"mute off",status>0?"mute on":"mute off");

-    if(mute!=status)

-    {

-        LYVERBLOG("+[ril][stme]: error num = %d\n",RIL_E_GENERIC_FAILURE);

-    }

-    else

-    {

-        LYVERBLOG("+[ril][stme]: ok!!\n");

-    }

-    return 0;

-}

-int eventGetMute(char **argv)

-{

-    int32_t token = 0;

-    int status =0;

-    char output[1024] = {0};

-    token = lynq_get_mute_status(&status);

-    LYVERBLOG("+[ril][gtme]: status = %d\n",status>0?1:0);

-    LYVERBLOG("+[ril][gtme]: ok!!\n");

-    return 0;

-}

-int eventLastCallFailCause(char **argv)

-{

-    int32_t token = 0;

-    int status =0;

-    char output[1024] = {0};

-    lynqLastCallFailCause * msg = (lynqLastCallFailCause*)malloc(sizeof(lynqLastCallFailCause));

-    memset(msg,0,sizeof(lynqLastCallFailCause));

-    msg->vendor_cause = (char *)malloc(sizeof(char)*64);

-    memset(msg->vendor_cause,0,sizeof(char));

-    token = lynq_get_last_call_fail_cause(msg);

-    LYINFLOG("token is %x,request is %d,error_code is %d,cause_code is %d,vendor_cause  is %s\n",msg->base.token,

-        msg->base.request,msg->base.e,msg->cause_code,msg->vendor_cause);

-    if(msg->base.e!=0)

-    {

-        LYVERBLOG("+[ril][lcfc]: error num = %d\n",msg->base.e);

-    }

-    else

-    {

-        LYVERBLOG("+[ril][lcfc]: cause_code = %d,vendor_cause = %s\n",msg->cause_code,msg->vendor_cause);

-        LYVERBLOG("+[ril][lcfc]: ok!!\n");

-    }

-    free(msg->vendor_cause);

-    free(msg);

-    return 0;

-}

-int eventCallHangUp(char **argv)

-{

-    lynqBase msg;

-    char output[1024] = {0};

-    if(argv[0]==NULL)

-    {

-        LYERRLOG("+[ril][hup]: Please input call index,and try again!\n");

-        return -1;

-    }

-    int index = atoi(argv[0]);

-    lynq_call_hang_up(index,&msg);

-    //printf("request is %d,token is %x,error is %d\n",msg.request,msg.token,msg.e);

-    LYINFLOG("request is %d,token is %x,error is %d",msg.request,msg.token,msg.e);

-    if(msg.e!=0)

-    {

-        LYVERBLOG("+[ril][hup]: error num = %d\n",msg.e);

-    }

-    else

-    {

-        LYVERBLOG("+[ril][hup]: ok!!\n");

-    }

-    return 0;

-}

-int eventRejectCall(char **argv)

-{

-    lynqBase msg;

-    char output[1024] = {0};

-    lynq_reject_call(&msg);

-    //printf("request is %d,token is %x,error is %d\n",msg.request,msg.token,msg.e);

-    LYINFLOG("request is %d,token is %x,error is %d\n",msg.request,msg.token,msg.e);

-    if(msg.e!=0)

-    {

-        LYVERBLOG("+[ril][udub]: error num = %d\n",msg.e);

-    }

-    else

-    {

-        LYVERBLOG("+[ril][udub]: ok!!\n");

-    }

-    return 0;

-}

-int eventSetDTMF(char **argv)

-{

-    if(check_special(argv) == -1){

-        LYVERBLOG("+[ril][dtmf]: Please  input DTMF value:0-9,8,#,and try again!\n");

-        return -1;

-    }

-    if(argv[0]==NULL || strlen(argv[0]) == 0)

-    {

-        LYVERBLOG("+[ril][dtmf]: Please  input DTMF value:0-9,8,#,and try again!\n");

-        return -1;

-    }

-    lynqBase msg;

-    char output[1024] = {0};

-    char value = argv[0][0];

-    lynq_set_DTMF(value,&msg);

-    LYINFLOG("request is %d,token is %x,error is %d\n",msg.request,msg.token,msg.e);

-    if(msg.e!=0)

-    {

-        LYVERBLOG("+[ril][dtmf]: error num = %d\n",msg.e);

-    }

-    else

-    {

-        LYVERBLOG("+[ril][dtmf]: ok!!\n");

-    }

-    return 0;

-}

-int eventSetDTMFVolume(char **argv)

-{   

-    if(check_numScope(argv) == -1){

-        LYVERBLOG("+[ril][dtmfv]: Please  input DTMF volume(0-36),and try again!\n");

-        return -1;

-    }

-    int32_t token =0;

-    if(argv[0]==NULL)

-    {

-        LYERRLOG("+[ril][dtmfv]: Please  input DTMF volume(0-36),and try again!\n");

-        return -1;

-    }

-    int volume = atoi(argv[0]);

-    token = lynq_set_DTMF_volume(volume);

-    LYVERBLOG("+[ril][dtmfv]: ok!!\n");

-    //printf("Factory_result set DTMF Volume is %s\n",(token>0?"success":"fail"));

-    return 0;

-}

-int eventDoMultiConference(char **argv)

-{

-    lynqCallList msg;

-    msg.addr=NULL;

-    lynq_do_multi_conference(&msg);

-    LYINFLOG("request is %d,call id is %d,phone number is %s,type of address is %d,token is %x,error is %d,call_state is %d\n",

-        msg.base.request,msg.call_id,msg.addr,msg.toa,msg.base.token,msg.base.e,msg.call_state);

-    if(msg.base.e!=0)

-    {

-        LYVERBLOG("+[ril][dmc]: error num = %d\n",msg.base.e);

-    }

-    else

-    {

-        LYVERBLOG("+[ril][dmc]: ok!!\n");

-    }

-    return 0;

-}

-int eventOthercallHold(char **argv)

-{

-    lynqBase msg;

-    if(argv[0]==NULL)

-    {

-        LYERRLOG("+[ril][och]: Please  input call id,and try again!\n");

-        return -1;

-    }

-    int call_id = atoi(argv[0]);

-    lynq_othercall_hold(call_id,&msg);

-    LYINFLOG("request is %d,token is %x,error is %d\n",msg.request,msg.token,msg.e);

-    if(msg.e!=0)

-    {

-        LYVERBLOG("+[ril][och]: error num = %d\n",msg.e);

-    }

-    else

-    {

-        LYVERBLOG("+[ril][och]: ok!!\n");

-    }

-    return 0;

-}

-int eventHangupWatingForCall(char **argv)

-{

-    lynqCallList msg;

-    msg.addr=NULL;

-    lynq_hangup_wating_for_call(&msg);

-    LYINFLOG("[MAIN_LOG] request is %d,call id is %d,phone number is %s,type of address is %d,token is %x,error is %d,call_state is %d\n",

-        msg.base.request,msg.call_id,msg.addr,msg.toa,msg.base.token,msg.base.e,msg.call_state);

-    if(msg.base.e!=0)

-    {

-        LYVERBLOG("+[ril][hwc]: error num = %d\n",msg.base.e);

-    }

-    else

-    {

-        LYVERBLOG("+[ril][hwc]: ok!!\n");

-    }

-    return 0;

-}

-int eventHangupForegroundResumeBackground(char **argv)

-{

-    lynqCallList msg;

-    msg.addr=NULL;

-    lynq_hangup_foreground_resume_background(&msg);

-    LYINFLOG("[MAIN_LOG] request is %d,call id is %d,phone number is %s,type of address is %d,token is %x,error is %d,call_state is %d\n",

-        msg.base.request,msg.call_id,msg.addr,msg.toa,msg.base.token,msg.base.e,msg.call_state);

-    if(msg.base.e!=0)

-    {

-        LYVERBLOG("+[ril][hfrb]: error num = %d\n",msg.base.e);

-    }

-    else

-    {

-        LYVERBLOG("+[ril][hfrb]: ok!!\n");

-    }

-    return 0;

-}

-int eventSwitchWaitOrHoldAndActiveCall(char ** argv)

-{

-    lynqCallList msg;

-    msg.addr=NULL;

-    lynq_switch_hold_and_active_call(&msg);

-    LYINFLOG("[MAIN_LOG] request is %d,call id is %d,phone number is %s,type of address is %d,token is %x,error is %d,call_state is %d\n",

-        msg.base.request,msg.call_id,msg.addr,msg.toa,msg.base.token,msg.base.e,msg.call_state);

-    if(msg.base.e!=0)

-    {

-        LYVERBLOG("+[ril][swha]: error num = %d\n",msg.base.e);

-    }

-    else

-    {

-        LYVERBLOG("+[ril][swha]: ok!!\n");

-    }

-    return 0;

-}

-

-int eventQueryOperator(char ** argv)

-{

-    operatorInfo msg;

-    msg.OperatorFN=NULL;

-    msg.OperatorSH=NULL;

-    msg.MccMnc=NULL;

-    lynq_query_operater(&msg);

-    LYINFLOG("request is %d,token is %x,error is %d\n",msg.base.request,msg.base.token,msg.base.e);

-    if(msg.base.e!=0)

-    {

-        LYVERBLOG("+[ril][qop]: error num = %d\n",msg.base.e);

-    }

-    else

-    {

-        LYVERBLOG("+[ril][qop]: OperatorFN = %s,OperatorSH = %s,MccMnc = %s\n",msg.OperatorFN,msg.OperatorSH,msg.MccMnc);

-        LYVERBLOG("+[ril][qop]: ok!!\n");

-    }

-    return 0;

-}

-int eventQueryNetSelectMode(char ** argv)

-{

-    networkSelecttionMode msg;

-    lynq_query_network_selection_mode(& msg);

-    //printf("request is %d,token is %x,error is %d,mode is %d\n",msg.base.request,msg.base.token,msg.base.e,msg.mode);

-    LYINFLOG("request is %d,token is %x,error is %d,mode is %d\n",msg.base.request,msg.base.token,msg.base.e,msg.mode);

-    if(msg.base.e!=0)

-    {

-        LYVERBLOG("+[ril][qnsm]: error num = %d\n",msg.base.e);

-    }

-    else

-    {

-        LYVERBLOG("+[ril][qnsm]: mode = %d\n",msg.mode);

-        LYVERBLOG("+[ril][qnsm]: ok!!\n");

-    }

-    return 0;

-}

-int eventSetNetSelectMode(char ** argv)

-{

-    char str[100]={0};

-     if(check_status(argv)==-1){

-        LYVERBLOG("+[ril][snsm]: Please  input network selection mode,and try again!\n");

-        return -1;

-    }

-    if(argv[0]==NULL || strlen(argv[0]) == 0)

-    {

-        LYERRLOG("+[ril][snsm]: Please  input network selection mode,and try again!\n");

-        return -1;

-    }

-    int mode = atoi(argv[0]);

-    const char * mccmnc = "46000";//just China Mobile Communications Group

-    lynqBase msg;

-    sprintf(str,"%s",(mode==0?"Auto":"Manual"));

-    if(mode==0)

-    {

-        lynq_set_network_selection_mode(str,NULL,&msg);

-    }

-    else if(mode ==1)

-    {

-        LYVERBLOG("+[ril][snsm]: You have selected manual mode, this command only supports CMCC SIM card temporarily");

-        lynq_set_network_selection_mode(str,mccmnc,&msg);

-    }

-    else

-    {

-        LYERRLOG("+[ril][snsm]: please input network selection mode:0 or 1,and try again\n");

-        return 0;

-    }

-    if(msg.e!=0)

-    {

-        LYVERBLOG("+[ril][snsm]: error num = %d\n",msg.e);

-    }

-    else

-    {

-        LYVERBLOG("+[ril][snsm]: ok!!\n");

-    }

-    return 0;

-}

-int eventQueryAvailableNetwork(char **argv)

-{

-    int32_t token=0;

-    availableNetwork msg;

-    msg.OperatorFN=NULL;

-    msg.OperatorSH=NULL;

-    msg.MccMnc=NULL;

-    msg.NetStatus=NULL;

-    lynq_query_available_network(&msg);

-    LYINFLOG("request is %d,token is %x,error is %d\n",msg.base.request,msg.base.token,msg.base.e);

-    if(msg.base.e!=0)

-    {

-        LYVERBLOG("+[ril][qan]: error num = %d\n",msg.base.e);

-    }

-    else

-    {

-        LYVERBLOG("+[ril][qan]: OperatorFN = %s,OperatorSH = %s,MccMnc = %s,NetStatus = %s\n",msg.OperatorFN,msg.OperatorSH,msg.MccMnc,msg.NetStatus);

-        LYVERBLOG("+[ril][qan]: ok!!\n");

-    }

-    return 0;

-

-}

- int eventQueryRegistrationState(char ** argv)

-{

-    registrationStateInfo msg;

-    msg.CID=NULL;

-    msg.LAC=NULL;

-    char str[10];

-    if(argv[0]==NULL)

-    {

-        LYERRLOG("+[ril][qrs]: Please  input voice/data/ims,and try again!\n");

-        return -1;

-    }

-    char *type = argv[0];

-    if (strlen(type)>10)

-    {

-        LYERRLOG("+[ril][qrs]: the parameter is inavaliable !\n");

-        return -1;

-    }

-    memcpy(str,type,strlen(type)+1);

-    strUpper(str);

-    //printf("upper str is %s\n",str);

-    lynq_query_registration_state(str,&msg);

-    if(!strcmp(str,"VOICE")){

-        LYINFLOG("request is %d,token is %x,error is %d\n",msg.base.request,msg.base.token,msg.base.e);

-        if(msg.base.e!=0)

-        {

-            LYVERBLOG("+[ril][qrs]: error num = %d\n",msg.base.e);

-        }

-        else

-        {

-            LYVERBLOG("+[ril][qrs]: registrationState = %d\n",msg.regState);

-            LYVERBLOG("+[ril][qrs]: ok!!\n");

-        }

-    }else if(!strcmp(str,"DATA")){

-

-        LYINFLOG("request is %d,token is %x,error is %d\n",msg.base.request,msg.base.token,msg.base.e);

-        if(msg.base.e!=0)

-        {

-            LYVERBLOG("+[ril][qrs]: error num = %d\n",msg.base.e);

-        }

-        else

-        {

-            LYVERBLOG("+[ril][qrs]: registrationState = %d,LAC = %s,CID = %s,networkTyp = %d\n",msg.regState,msg.LAC,msg.CID,msg.netType);

-            LYVERBLOG("+[ril][qrs]: ok!!\n");

-        }

-    }else if(!strcmp(str,"IMS")){

-        LYINFLOG("request is %d,token is %x,error is %d\n",msg.base.request,msg.base.token,msg.base.e);

-        if(msg.base.e!=0)

-        {

-            LYVERBLOG("+[ril][qrs]: error num = %d\n",msg.base.e);

-        }

-        else

-        {

-            LYVERBLOG("+[ril][qrs]: imsRegistrationState = %d,radioTechFamily = %d\n",msg.imsRegState,msg.radioTechFam);

-            LYVERBLOG("+[ril][qrs]: ok!!\n");

-        }

-    }else{

-        LYERRLOG("+[ril][qrs]: [%s][%d] query ims registration state about voice, data, and ims!!! \n",__FUNCTION__,__LINE__);

-        return -1;

-    }

-    return 0;

- }

- int eventQueryPrefferredNetworkType(char ** argv)

-{

-    prefferredNetworkType msg;

-    lynq_query_prefferred_networktype(&msg);

-    LYINFLOG("request is %d,token is %x,error is %d\n",msg.base.request,msg.base.token,msg.base.e);

-    if(msg.base.e!=0)

-    {

-        LYVERBLOG("+[ril][gpnt]: error num = %d\n",msg.base.e);

-    }

-    else

-    {

-        LYVERBLOG("+[ril][gpnt]: pnt = %d\n",msg.pnt);

-        LYVERBLOG("+[ril][gpnt]: ok!!\n");

-    }

-    return 0;

-}

- int eventSetPrefferredNetworkType(char ** argv)

-{

-    lynqBase msg;

-    if(argv[0]==NULL)

-    {

-        LYERRLOG("+[ril][spnt]: Please  input prefferrend neteork type,and try again!\n");

-        return -1;

-    }

-    int type = atoi(argv[0]);

-    lynq_set_prefferred_networktype(type,&msg);

-    LYINFLOG("request is %d,token is %x,error is %d\n",msg.request,msg.token,msg.e);

-    if(msg.e!=0)

-    {

-        LYVERBLOG("+[ril][spnt]: error num = %d\n",msg.e);

-    }

-    else

-    {

-        LYVERBLOG("+[ril][spnt]: ok!!\n");

-    }

-    return 0;

-}

-int eventQueryCellInfo(char ** argv)

-{

-    cellInfoList **msg;

-    int num=5;

-    int realNum =0;

-    int32_t token=0;

-    msg = (cellInfoList **)malloc(sizeof(cellInfoList *)*num);

-    if(msg==NULL)

-    {

-        LYERRLOG("+[ril][gcil]: malloc LYNQ_Data_Call_Response_v11 fail \n");

-        return -1;

-    }

-    for(int i =0;i<num;i++)

-    {

-        msg[i] = (cellInfoList*)malloc(sizeof(cellInfoList));

-        if (msg[i]==NULL)

-        {

-            for (int n=0;n<i;n++)

-            {

-                free(msg[n]);

-            }

-            return -1;

-        }

-        memset(msg[i],0,sizeof(cellInfoList));

-    }

-    token = lynq_query_cell_info(msg, num, &realNum);

-    LYINFLOG("+[ril][gcil]: request is %d,token is %x,e is %d\n",msg[0]->base.request,msg[0]->base.token,msg[0]->base.e);

-    if(msg[0]->base.e!=0)

-    {

-        LYVERBLOG("+[ril][gcil]: error num = %d\n",msg[0]->base.e);

-    }

-    else

-    {

-        for(int i = 0; i<realNum; i++)

-        {

-            LYVERBLOG("+[ril][gcil]: cellInfoType = %d,registered = %d,timeStampType = %d,timeStamp = %d\n",msg[i]->cellinfo.cellInfoType,msg[i]->cellinfo.registered,msg[i]->cellinfo.timeStampType,msg[i]->cellinfo.timeStamp);

-            switch(msg[i]->cellinfo.cellInfoType) {

-                case RIL_CELL_INFO_TYPE_GSM: {

-                    LYVERBLOG("+[ril][gcil]: gsm_mcc = %d,gsm_mnc = %d,gsm_lac = %d,gsm_cid = %d,gsm_signalStrength = %d,gsm_bitErrorRate%d,gsm_timingAdvance = %d\n",

-                        msg[i]->cellinfo.CellInfo.gsm.cellIdentityGsm.mcc,

-                        msg[i]->cellinfo.CellInfo.gsm.cellIdentityGsm.mnc,

-                        msg[i]->cellinfo.CellInfo.gsm.cellIdentityGsm.lac,

-                        msg[i]->cellinfo.CellInfo.gsm.cellIdentityGsm.cid,

-                        msg[i]->cellinfo.CellInfo.gsm.signalStrengthGsm.signalStrength,

-                        msg[i]->cellinfo.CellInfo.gsm.signalStrengthGsm.bitErrorRate,

-                        msg[i]->cellinfo.CellInfo.gsm.signalStrengthGsm.timingAdvance);

-                    break;

-                }

-                case RIL_CELL_INFO_TYPE_WCDMA: {

-                    LYVERBLOG("+[ril][gcil]: wcdma_mcc = %d,wcdma_mnc = %d,wcdma_lac = %d,wcdma_cid = %d,wcdma_psc = %d,wcdma_signalStrength = %d,wcdma_bitErrorRate = %d\n",

-                        msg[i]->cellinfo.CellInfo.wcdma.cellIdentityWcdma.mcc,

-                        msg[i]->cellinfo.CellInfo.wcdma.cellIdentityWcdma.mnc,

-                        msg[i]->cellinfo.CellInfo.wcdma.cellIdentityWcdma.lac,

-                        msg[i]->cellinfo.CellInfo.wcdma.cellIdentityWcdma.cid,

-                        msg[i]->cellinfo.CellInfo.wcdma.cellIdentityWcdma.psc,

-                        msg[i]->cellinfo.CellInfo.wcdma.signalStrengthWcdma.signalStrength,

-                        msg[i]->cellinfo.CellInfo.wcdma.signalStrengthWcdma.bitErrorRate);

-                    break;

-                }

-                case RIL_CELL_INFO_TYPE_CDMA: {

-                    LYVERBLOG("+[ril][gcil]: cdma_networkId = %d,cdma_systemId = %d,cdma_basestationId = %d,cdma_longitude = %d,cdma_latitude = %d,cdma_dbm = %d,cdma_ecio = %d,cdma_Evdo_dbm = %d,cdma_Evdo_ecio = %d,cdma_Evdo_signalNoiseRatio = %d\n",

-                        msg[i]->cellinfo.CellInfo.cdma.cellIdentityCdma.networkId,

-                        msg[i]->cellinfo.CellInfo.cdma.cellIdentityCdma.systemId,

-                        msg[i]->cellinfo.CellInfo.cdma.cellIdentityCdma.basestationId,

-                        msg[i]->cellinfo.CellInfo.cdma.cellIdentityCdma.longitude,

-                        msg[i]->cellinfo.CellInfo.cdma.cellIdentityCdma.latitude,

-                        msg[i]->cellinfo.CellInfo.cdma.signalStrengthCdma.dbm,

-                        msg[i]->cellinfo.CellInfo.cdma.signalStrengthCdma.ecio,

-                        msg[i]->cellinfo.CellInfo.cdma.signalStrengthEvdo.dbm,

-                        msg[i]->cellinfo.CellInfo.cdma.signalStrengthEvdo.ecio,

-                        msg[i]->cellinfo.CellInfo.cdma.signalStrengthEvdo.signalNoiseRatio);

-                    break;

-                }

-                case RIL_CELL_INFO_TYPE_LTE: {

-                    LYVERBLOG("+[ril][gcil]: lte_mcc = %d,lte_mnc = %d,lte_ci = %d,lte_pci = %d,lte_tac = %d,lte_signalStrength = %d,lte_rsrp = %d,lte_rsrq = %d,lte_rssnr = %d,lte_cqi = %d,lte_timingAdvance = %d\n",

-                        msg[i]->cellinfo.CellInfo.lte.cellIdentityLte.mcc,

-                        msg[i]->cellinfo.CellInfo.lte.cellIdentityLte.mnc,

-                        msg[i]->cellinfo.CellInfo.lte.cellIdentityLte.ci,

-                        msg[i]->cellinfo.CellInfo.lte.cellIdentityLte.pci,

-                        msg[i]->cellinfo.CellInfo.lte.cellIdentityLte.tac,

-                        msg[i]->cellinfo.CellInfo.lte.signalStrengthLte.signalStrength,

-                        msg[i]->cellinfo.CellInfo.lte.signalStrengthLte.rsrp,

-                        msg[i]->cellinfo.CellInfo.lte.signalStrengthLte.rsrq,

-                        msg[i]->cellinfo.CellInfo.lte.signalStrengthLte.rssnr,

-                        msg[i]->cellinfo.CellInfo.lte.signalStrengthLte.cqi,

-                        msg[i]->cellinfo.CellInfo.lte.signalStrengthLte.timingAdvance);

-                    break;

-                }

-                case RIL_CELL_INFO_TYPE_TD_SCDMA: {

-                    LYVERBLOG("+[ril][gcil]: tdscdma_mcc = %d,tdscdma_mnc = %d,tdscdma_lac = %d,tdscdma_cid = %d,tdscdma_cpid = %d,tdscdma_rscp = %d\n",

-                        msg[i]->cellinfo.CellInfo.tdscdma.cellIdentityTdscdma.mcc,

-                        msg[i]->cellinfo.CellInfo.tdscdma.cellIdentityTdscdma.mnc,

-                        msg[i]->cellinfo.CellInfo.tdscdma.cellIdentityTdscdma.lac,

-                        msg[i]->cellinfo.CellInfo.tdscdma.cellIdentityTdscdma.cid,

-                        msg[i]->cellinfo.CellInfo.tdscdma.cellIdentityTdscdma.cpid,

-                        msg[i]->cellinfo.CellInfo.tdscdma.signalStrengthTdscdma.rscp);

-                    break;

-                }

-                default:

-                    break;

-            }

-        }

-        LYVERBLOG("+[ril][gcil]: ok!!\n");

-    }

-    for (int i = 0; i < num; i++) 

-    {

-        if (msg[i]!=NULL)

-        {    

-            free(msg[i]);

-            msg[i]=NULL;

-        }

-    }

-    free(msg);

-    msg=NULL;

-    return 0;

-}

-int eventSetUnsolCellInfoListrate(char ** argv)

-{

-    lynqBase msg;

-    if(argv[0]==NULL)

-    {

-        LYERRLOG("+[ril][sucilr]:Please  input unsolicited cell infomation list rate,and try again!\n");

-        return -1;

-    }

-    int rate = atoi(argv[0]);

-    lynq_set_unsol_cell_info_listrate(rate,&msg);

-    LYINFLOG("request is %d,token is %x,error is %d\n",msg.request,msg.token,msg.e);

-    if(msg.e!=0)

-    {

-        LYVERBLOG("+[ril][sucilr]: error num = %d\n",msg.e);

-    }

-    else

-    {

-        LYVERBLOG("+[ril][sucilr]: ok!!\n");

-    }

-    return 0;

-}

-int eventQueryNeighboringCellids(char ** argv)

-{

-    neighboringCellIDs **msg=NULL;

-    int num=5;

-    int realNum =0;

-    int32_t token=0;

-    msg = (neighboringCellIDs **)malloc(sizeof(neighboringCellIDs *)*num);

-    if(msg==NULL)

-    {

-        RLOGD("malloc LYNQ_Data_Call_Response_v11 fail \n");

-        return -1;

-    }

-    for(int i =0;i<num;i++)

-    {

-        msg[i] = (neighboringCellIDs*)malloc(sizeof(neighboringCellIDs));

-        msg[i]->cid = (char*)malloc(sizeof(char));

-        if (msg[i]==NULL)

-        {

-            for (int n=0;n<i;n++)

-            {

-                free(msg[n]->cid);

-                free(msg[n]);

-            }

-            return -1;

-        }

-        memset(msg[i],0,sizeof(neighboringCellIDs));

-    }

-    msg[0]->base.e=(RIL_Errno)(-1);

-    token = lynq_query_neighboring_cellids(msg, num, &realNum);

-    if(msg[0]->base.e!=0)

-    {

-        LYVERBLOG("+[ril][gncid]: error num = %d\n",msg[0]->base.e);

-    }

-    else

-    {

-        LYINFLOG("request is %d,token is %x,error is %d\n",msg[0]->base.request,msg[0]->base.token,msg[0]->base.e);

-        for(int i =0;i<realNum;i++)

-        {

-            LYVERBLOG("+[ril][gncid]: cid = %s,rssi = %d\n",msg[i]->cid,msg[i]->rssi);

-        }

-        LYVERBLOG("+[ril][gncid]: ok!!\n");

-    }

-    for (int i = 0; i < num; i++) 

-    {

-        if (msg[i]!=NULL)

-        {

-            free(msg[i]->cid);

-            msg[i]->cid=NULL;

-            free(msg[i]);

-            msg[i]=NULL;

-        }

-    }

-    free(msg);

-    msg=NULL;

-    return 0;

-}

-int eventSetBandMode(char ** argv)

-{

-    lynqBase msg;

-    if(argv[0]==NULL)

-    {

-        LYERRLOG("+[ril][sbm]: Please  input band mode,and try again!\n");

-        return -1;

-    }

-    int mode = atoi(argv[0]);

-    lynq_set_band_mode(mode,&msg);

-    LYINFLOG("request is %d,token is %x,error is %d\n",msg.request,msg.token,msg.e);

-    if(msg.e!=0)

-    {

-        LYVERBLOG("+[ril][sbm]: error num = %d\n",msg.e);

-    }

-    else

-    {

-        LYVERBLOG("+[ril][sbm]: ok!!\n");

-    }

-    return 0;

-}

-int eventQueryAvailableBandmode(char ** argv)

-{

-    availableBandMode msg;

-    lynq_query_available_bandmode(&msg);

-    char buffer[256] = {0};

-    char element[256] = {0};

-    LYINFLOG("request is %d,token is %x,error is %d\n",msg.base.request,msg.base.token,msg.base.e);

-    if(msg.bandmode[0]>0)

-    {

-        for(int i =1;i<=msg.bandmode[0];i++)

-        {

-            sprintf(element,"%d,",msg.bandmode[i]);

-            strncat(buffer, element, strlen(element));

-        }

-        LYVERBLOG("+[ril][qabm]: availableBandMode = %s\n",buffer);

-        LYVERBLOG("+[ril][qabm]: ok!!\n",buffer);

-        return 0;

-    }

-    LYVERBLOG("+[ril][qabm]: error num = %d\n",msg.base.e);

-    LYINFLOG("available band mode is null");

-    return 0;

-}

-int eventRadioOn(char ** argv)

-{

-    lynqBase msg;

-    if(check_status(argv)==-1){

-        LYVERBLOG("+[ril][rpo]: Please  input radio on value,0 or 1,and try again!\n");

-        return -1;

-    }

-    if(argv[0]==NULL || strlen(argv[0]) == 0)

-    {

-        LYVERBLOG("+[ril][rpo]: Please  input radio on value,0 or 1,and try again!\n");

-        return -1;

-    }

-    int state = atoi(argv[0]);

-    lynq_radio_on(state,&msg);

-    LYINFLOG("request is %d,token is %x,error is %d\n",msg.request,msg.token,msg.e);

-    if(msg.e!=0)

-    {

-        LYVERBLOG("+[ril][rpo]: error num = %d\n",msg.e);

-    }

-    else

-    {

-        LYVERBLOG("+[ril][rpo]: ok!!\n");

-    }

-    return 0;

-}

-int eventQueryRadioTech(char ** argv)

-{

-    radioTechnology msg;

-    char output[1024] = {0};

-    lynq_query_radio_tech(&msg);

-    LYINFLOG("request is %d,token is %x,error is %d\n",msg.base.request,msg.base.token,msg.base.e);

-    if(msg.base.e!=0)

-    {

-        LYVERBLOG("+[ril][vrt]: error num = %d\n",msg.base.e);

-    }

-    else

-    {

-        LYVERBLOG("+[ril][vrt]: RadioTech = %d\n",msg.radioTech);

-        LYVERBLOG("+[ril][vrt]: ok!!\n");

-    }

-    return 0;

-}

-int eventSolicitedSignalStrength(char ** argv)

-{

-    solicitedSignalStrength msg;

-    lynq_solicited_signal_strength(&msg);

-    LYINFLOG("request is %d,token is %x,error is %d\n",msg.base.request,msg.base.token,msg.base.e);

-    if(msg.base.e!=0)

-    {

-        LYVERBLOG("+[ril][sst]: error num = %d\n",msg.base.e);

-    }

-    else

-    {

-        LYVERBLOG("+[ril][sst]: GW_signalStrength = %d,GW_bitErrorRate = %d,GW_timingAdvance = %d\n",

-            msg.signalStrength.GW_SignalStrength.signalStrength,

-            msg.signalStrength.GW_SignalStrength.bitErrorRate,

-            msg.signalStrength.GW_SignalStrength.timingAdvance);

-        LYVERBLOG("+[ril][sst]: CDMA_dbm = %d,CDMA_ecio = %d\n",

-            msg.signalStrength.CDMA_SignalStrength.dbm,

-            msg.signalStrength.CDMA_SignalStrength.ecio);

-        LYVERBLOG("+[ril][sst]: EVDO_dbm = %d,EVDO_ecio = %d,EVDO_signalNoiseRatio = %d\n",

-            msg.signalStrength.EVDO_SignalStrength.dbm,

-            msg.signalStrength.EVDO_SignalStrength.ecio,

-            msg.signalStrength.EVDO_SignalStrength.signalNoiseRatio);

-        LYVERBLOG("+[ril][sst]: LTE_signalStrength = %d,LTE_rsrp = %d,LTE_rsrq = %d,LTE_rssnr = %d,LTE_cqi = %d,LTE_timingAdvance = %d\n",

-            msg.signalStrength.LTE_SignalStrength.signalStrength,

-            msg.signalStrength.LTE_SignalStrength.rsrp,

-            msg.signalStrength.LTE_SignalStrength.rsrq,

-            msg.signalStrength.LTE_SignalStrength.rssnr,

-            msg.signalStrength.LTE_SignalStrength.cqi,

-            msg.signalStrength.LTE_SignalStrength.timingAdvance);

-        LYVERBLOG("+[ril][sst]: TD_SCDMA_signalStrength = %d,TD_SCDMA_bitErrorRate = %d,TD_SCDMA_rscp = %d\n",

-            msg.signalStrength.TD_SCDMA_SignalStrength.signalStrength,

-            msg.signalStrength.TD_SCDMA_SignalStrength.bitErrorRate,

-            msg.signalStrength.TD_SCDMA_SignalStrength.rscp);

-        LYVERBLOG("+[ril][sst]: WCDMA_signalStrength = %d,WCDMA_bitErrorRate = %d,WCDMA_rscp = %d,WCDMA_ecno = %d\n",

-            msg.signalStrength.WCDMA_SignalStrength.signalStrength,

-            msg.signalStrength.WCDMA_SignalStrength.bitErrorRate,

-            msg.signalStrength.WCDMA_SignalStrength.rscp,

-            msg.signalStrength.WCDMA_SignalStrength.ecno);

-        LYVERBLOG("+[ril][sst]: ok!!\n");

-    }

-    return 0;

-}

-int eventModemOn(char **argv)

-{

-    lynqBase msg;

-    if(argv[0]==NULL)

-    {

-        LYERRLOG("+[ril][mpo]: Please  input mode on value,0 or 1,and try again!\n");

-        return -1;

-    }

-    int state = atoi(argv[0]);

-    lynq_modem_on(state,&msg);

-    //printf("request is %d,token is %x,error is %d\n",msg.request,msg.token,msg.e);

-    LYINFLOG("request is %d,token is %x,error is %d\n",msg.request,msg.token,msg.e);

-    if(msg.e!=0)

-    {

-        LYVERBLOG("+[ril][mpo]: error num = %d\n",msg.e);

-    }

-    else

-    {

-        LYVERBLOG("+[ril][mpo]: ok!!\n");

-    }

-    return 0;

-}

-int eventSetupDataCall(char ** argv)

-{

-    int32_t token;

-    int state=0;

-    token = lynq_data_enable_data(&state);

-    //printf("pdn state is %s\n",state<0?"disconnect":"connect");

-    if(state<0)

-    {

-        LYVERBLOG("+[ril][edc]: error num = %d\n",RIL_E_GENERIC_FAILURE);

-    }

-    else

-    {

-        LYVERBLOG("+[ril][edc]: ok!!\n");

-    }

-    return 0;

-}

-int eventDeactiveDataCall(char ** argv)

-{

-    int32_t token;

-    int state=0;

-    token = lynq_data_dectivate_data_call(&state);

-    LYVERBLOG("+[ril][ddc]: ok!!\n");

-    //printf("Factory_result pdn state is %s\n",state<0?"connect":"disconnect");

-    return 0;

-}

-int eventGetDataCalllist(char ** argv)

-{

-    int32_t token=0;

-    int num=5;

-    int realNum=0;

-    LYNQ_Data_Call_Response_v11 **msg=(LYNQ_Data_Call_Response_v11**)malloc(sizeof(LYNQ_Data_Call_Response_v11*)*num);

-    if (msg == NULL)

-    {

-        LYERRLOG("+[ril][gdcl]: malloc LYNQ_Data_Call_Response_v11 fail \n");

-        return -1;

-    }

-    for(int i =0;i<num;i++)

-    {

-        msg[i] = (LYNQ_Data_Call_Response_v11*)malloc(sizeof(LYNQ_Data_Call_Response_v11));

-        if (msg[i]==NULL)

-        {

-            for (int n=0;n<i;n++)

-            {

-                free(msg[n]);

-            }

-            return -1;

-        }

-        memset(msg[i],0,sizeof(LYNQ_Data_Call_Response_v11));

-    }

-    token = lynq_get_data_call_list(msg, num,&realNum);

-    /*

-    for(int i = 0; i<realNum; i++)

-    {

-        printf("status is %d,\nsuggestedRetryTime is %d,\ncid is %d,\nactive is %d,\nmtu is %d\n",msg[i]->status,msg[i]->suggestedRetryTime,msg[i]->cid,msg[i]->active,msg[i]->mtu);

-        printf("type is %s\n",msg[i]->type);

-        printf("ifname is %s\n",msg[i]->ifname);

-        printf("addresses is %s\n",msg[i]->addresses);

-        printf("dnses is %s\n",msg[i]->dnses);

-        printf("gateways is %s\n",msg[i]->gateways);

-        printf("pcscf is %s\n",msg[i]->pcscf);

-    }

-    */

-    if(realNum>0)

-    {

-    

-        //printf("Factory_result error code 1\n");

-        for(int i = 0; i<realNum; i++)

-        {

-            LYVERBLOG("+[ril][gdcl]: status = %d,suggestedRetryTime = %d,cid = %d,active = %d,mtu = %d\n",msg[i]->status,msg[i]->suggestedRetryTime,msg[i]->cid,msg[i]->active,msg[i]->mtu);

-            LYVERBLOG("+[ril][gdcl]: type = %s,ifname = %s,addresses = %s,dnses = %s,gateways = s%,pcscf = %s\n",msg[i]->type,msg[i]->ifname,msg[i]->addresses,msg[i]->dnses,msg[i]->gateways,msg[i]->pcscf);

-        }

-        LYVERBLOG("+[ril][gdcl]: ok!!\n");

-    }

-    else

-    {

-        LYVERBLOG("+[ril][gdcl]: error num = %d\n",RIL_E_GENERIC_FAILURE);

-    }

-    for (int i = 0; i < num; i++) 

-    {

-        if (msg[i]!=NULL)

-        {    

-            free(msg[i]);

-            msg[i]=NULL;

-        }

-    }

-    free(msg);

-    msg=NULL;

-    return 0;

-}

-

-int eventGetSimStatus(char ** argv)

-{

-    static int32_t token=0;

-    simStatus * sim_status=NULL;

-    sim_status = (simStatus *)malloc(sizeof(simStatus));

-    token = lynq_get_sim_status(sim_status);

-    LYINFLOG("card_status:%d,card_type:%d,pin_state:%d,error_code:%d,request:%d,token:%x\n",sim_status->card_status,

-        sim_status->card_type,sim_status->pin_state,sim_status->base.e,sim_status->base.request,sim_status->base.token);

-    if(sim_status->base.e!=0)

-    {

-        LYVERBLOG("+[ril][gss]: error num = %d\n",sim_status->base.e);

-    }

-    else

-    {

-        LYVERBLOG("+[ril][gss]: card_status = %d,card_type = %d,pin_state = %d\n",sim_status->card_status,

-        sim_status->card_type,sim_status->pin_state);

-        LYVERBLOG("+[ril][gss]: ok!!\n");

-    }

-    if (sim_status->base.e==-1)

-    {

-        free(sim_status);

-        sim_status=NULL;

-        return -1;

-    }

-    free(sim_status);

-    sim_status=NULL;

-    return 0;

-}

-int eventGetImsi(char ** argv)

-{

-    simImsi msg;

-    lynq_get_imsi(&msg);

-    //printf("request is %d, token is %x,error_code %d,imsi is %s\n",msg.base.request,msg.base.token, msg.base.e,msg.imsi);

-    LYINFLOG("request is %d, token is %x,error_code %d,imsi is %s\n",msg.base.request,msg.base.token, msg.base.e,msg.imsi);

-    if(msg.base.e!=0)

-    {

-        LYVERBLOG("+[ril][gimsi]: error num = %d\n",msg.base.e);

-    }

-    else

-    {

-        LYVERBLOG("+[ril][gimsi]: imsi = %s\n",msg.imsi);

-        LYVERBLOG("+[ril][gimsi]: ok!!\n");

-    }

-    if (msg.base.e==-1)

-    {

-        return -1;

-    }

-    return 0;

-}

-int eventSendSms(char ** argv)

-{

-    int32_t token=0;

-    if(argv[0]==NULL||argv[1]==NULL)

-    {

-        LYERRLOG("+[ril][ssm: Please  input telephonyNumber and message,and try again!\n");

-        return -1;

-    }

-    char *telephonyNumber = argv[0];

-    char *msgcont = argv[1];

-    smsResponse msg;

-    msg.smsResp.ackPDU=NULL;

-    //const char *telephonyNumber ="10086";

-    //const char * msgcont = "103";

-    token = lynq_send_sms(telephonyNumber, 0,msgcont, NULL,&msg);

-    //printf("request is %d,token is %x,error is %d,\nmessageRef is %d,ackPDU is %s,errorCode is %d\n",msg.base.request,msg.base.token,msg.base.e,

-        //msg.smsResp.messageRef,msg.smsResp.ackPDU,msg.smsResp.errorCode);

-    LYINFLOG("request is %d,token is %x,error is %d,messageRef is %d,ackPDU is %s,errorCode is %d\n",msg.base.request,msg.base.token,msg.base.e,

-        msg.smsResp.messageRef,msg.smsResp.ackPDU,msg.smsResp.errorCode);

-    if(msg.base.e!=0)

-    {

-        LYVERBLOG("+[ril][ssm]: error num = %d\n",msg.base.e);

-    }

-    else

-    {

-        LYVERBLOG("+[ril][ssm]: ok!!\n");

-    }

-    return 0;

-}

-int eventImsSendSms(char ** argv)

-{

-    int32_t token=0;

-    smsResponse msg;

-    if(argv[0]==NULL||argv[1]==NULL)

-    {

-        LYERRLOG("+[ril][iss]:Please  input telephonyNumber and message,and try again!\n");

-        return -1;

-    }

-    char *telephonyNumber = argv[0];

-    char *msgcont = argv[1];

-    msg.smsResp.ackPDU=NULL;

-    //const char *telephonyNumber ="10086";

-    //const char * msgcont = "103";

-    const char* retryNum ="0";

-    const char *messageRef = "201";

-    token = lynq_Ims_send_sms(telephonyNumber, 0,msgcont,retryNum,messageRef, NULL,&msg);

-    LYINFLOG("request is %d,token is %x,error is %d,messageRef is %d,ackPDU is %s,errorCode is %d\n",msg.base.request,msg.base.token,msg.base.e,

-        msg.smsResp.messageRef,msg.smsResp.ackPDU,msg.smsResp.errorCode);

-    if(msg.base.e!=0)

-    {

-        LYVERBLOG("+[ril][iss]: error num = %d\n",msg.base.e);

-    }

-    else

-    {

-        LYVERBLOG("+[ril][iss]: ok!!\n");

-    }

-    return 0;

-}

-int eventWriteSmsToSim(char ** argv)

-{

-    int32_t token=0;

-    messageStoreInfo msg;

-    if(argv[0]==NULL||argv[1]==NULL||argv[2]==NULL)

-    {

-        LYERRLOG("+[ril][wsts]: Please  input telephonyNumber,message and sms status,and try again!\n");

-        return -1;

-    }

-    const int smsStatus = atoi(argv[0]);

-    const char *recPhonNum = argv[1];

-    const char *msgcont = argv[2];

-    token = lynq_write_sms_to_sim(smsStatus,recPhonNum,0,msgcont,NULL,&msg);

-    LYINFLOG("request is %d,token is %x,error is %d,\nmessage strore index is %d\n",msg.base.request,msg.base.token,msg.base.e,

-        msg.msgStoreIndex);

-    if(msg.base.e!=0)

-    {

-        LYVERBLOG("+[ril][wsts]: error num = %d\n",msg.base.e);

-    }

-    else

-    {

-        LYVERBLOG("+[ril][wsts]: ok!!\n");

-    }

-    return 0;

-}

-int eventReportSmsMemoryStatus(char **argv)

-{

-    lynqBase msg;

-    char output[1024] = {0};

-    if(argv[0]==NULL)

-    {

-        LYERRLOG("+[ril][rsms]: Please  input memory status,0 or 1,and try again!\n");

-        return -1;

-    }

-    int value = atoi(argv[0]);

-    lynq_report_sms_memory_status(value,&msg);

-    //printf("request is %d,token is %x,error is %d,\n",msg.request,msg.token,msg.e);

-    LYINFLOG("request is %d,token is %x,error is %d\n",msg.request,msg.token,msg.e);

-    if(msg.e!=0)

-    {

-        LYVERBLOG("+[ril][rsms]: error num = %d\n",msg.e);

-    }

-    else

-    {

-        LYVERBLOG("+[ril][rsms]: ok!!\n");

-    }

-    return 0;

-}

-int eventDeletSmsOnSim(char **argv)

-{

-    lynqBase msg;

-    if(argv[0]==NULL)

-    {

-        LYERRLOG("+[ril][dsos]: Please  input sms index,and try again!\n");

-        return -1;

-    }

-    int value = atoi(argv[0]);

-    lynq_delet_sms_on_sim(value,&msg);

-    //printf("request is %d,token is %x,error is %d,\n",msg.request,msg.token,msg.e);

-    LYINFLOG("request is %d,token is %x,error is %d\n",msg.request,msg.token,msg.e);

-    if(msg.e!=0)

-    {

-        LYVERBLOG("+[ril][dsos]: error num = %d\n",msg.e);

-    }

-    else

-    {

-        LYVERBLOG("+[ril][dsos]: ok!!\n");

-    }

-    return 0;

-}

-int eventGetSmscAddress(char **argv)

-{

-    smscCbInfo msg;

-    lynq_get_smsc_address(&msg);

-    //printf("request is %d,token is %x,error is %d,smsc address is %s\n",msg.base.request,msg.base.token,msg.base.e,msg.smsc);

-    LYINFLOG("request is %d,token is %x,error is %d,smsc address is %s\n",msg.base.request,msg.base.token,msg.base.e,msg.smsc);

-    if(msg.base.e!=0)

-    {

-        LYVERBLOG("+[ril][gsmsc]: error num = %d\n",msg.base.e);

-    }

-    else

-    {

-        LYVERBLOG("+[ril][gsmsc]: smsc = %s\n",msg.smsc);

-        LYVERBLOG("+[ril][gsmsc]: ok!!\n");

-    }

-    return 0;

-}

-int eventSetSmscAddress(char **argv)

-{

-    lynqBase msg;

-    if(argv[0]==NULL)

-    {

-        LYERRLOG("+[ril][ssmsc]: Please  input smsc address,and try again!\n");

-        return -1;

-    }

-    const char* serviceNumber = argv[0];

-    lynq_set_smsc_address(serviceNumber,&msg);

-    //printf("request is %d,token is %x,error is %d,\n",msg.request,msg.token,msg.e);

-    LYINFLOG("request is %d,token is %x,error is %d\n",msg.request,msg.token,msg.e);

-    if(msg.e!=0)

-    {

-        LYVERBLOG("+[ril][ssmsc]: error num = %d\n",msg.e);

-    }

-    else

-    {

-        LYVERBLOG("+[ril][ssmsc]: ok!!\n");

-    }

-    return 0;

-}

-int evenStoreSmsToMemory(char **argv)

-{

-    lynqBase msg;

-    msg.e = (RIL_Errno)(-1);

-    //printf("argv[2]%d,argv[3]%s,argv[4]%s\n",atoi(argv[2]), argv[3],argv[4]);

-    lynq_store_sms_to_memory(RIL_SOCKET_1,atoi(argv[0]), argv[1],argv[2],&msg);

-    if(msg.e!=0)

-    {

-        LYVERBLOG("+[ril][sstm]: error num = %d\n",msg.e);

-    }

-    else

-    {

-        LYVERBLOG("+[ril][sstm]: ok!!\n");

-    }

-    return 0;

-}

-int eventGetSmsFromMemory(char **argv)

-{

-    lynqBase msg;

-    msg.e = (RIL_Errno)(-1);

-    storeMessageInfo sms;

-    lynq_get_sms_from_memory(atoi(argv[0]),&sms, &msg);

-    if(msg.e!=0)

-    {

-        LYVERBLOG("+[ril][gstfm]: error num = %d\n",msg.e);

-    }

-    else

-    {

-        LYVERBLOG("+[ril][gsfm]: Index = %d,Message = %s,Status = %d,teleNum= %s\n",sms.index,sms.message,sms.status,sms.teleNum);

-        LYVERBLOG("+[ril][gsfm]: ok!!\n");

-    }

-    return 0;

-}

-int eventDeleteMessageFromMemory(char **argv)

-{

-    lynqBase msg;

-    msg.e = (RIL_Errno)(-1);

-    lynq_delete_message_from_memory(atoi(argv[0]), &msg);

-    if(msg.e!=0)

-    {

-        LYVERBLOG("+[ril][dmfm]: error num = %d\n",msg.e);

-    }

-    else

-    {

-        LYVERBLOG("+[ril][dmfm]: ok!!\n");

-    }

-    return 0;

-}

-

-//int callController(int *item, char *value,int command);

-//int networkcontroller(int *item, char *value,int command);

-//int datacontroller(int *item, char *value,int command);

-//int simcontroller(int *item, char *value,int command);

-//int smscontroller(int *item, char *value,int command);

-

-int ril_test(char *api,char *string) {

-    char *argv[MAX_P] = {0};

-    parseParameters(string,argv);

-    RIL_COMMAND *command = find_command(api,api_commands);

-    if(command)

-    {

-        (*(command->func)) (argv);

-    }

-    else

-    {

-        LYERRLOG("Can not find this command from function_test!!!\n");

-    }

-    /*

-    switch (module) {

-        case CALL_API:

-        {

-            callController(menu[1],argv);

-            break;

-        }

-        case NETWORK_API:

-        {

-            networkcontroller(menu[1],argv);

-            break;

-        }

-        case DATA_API:

-        {

-            datacontroller(menu[1],argv);

-            break;

-        }

-        case SMS_API:

-        {

-            smscontroller(menu[1],argv);

-            //RLOGD("test_api,RIL_API");

-            break;

-        }

-        case SIM_API:

-        {

-            simcontroller(menu[1],argv);

-            break;

-        }

-        default:

-            break;

-    }

-    */

-    return 0;

-}

-/*

-int callController(char *api,char **param)

-{

-    char output[1024] = {0};

-    RIL_COMMAND *command = find_command(api,api_commands);

-    (*(command->func)) (param);

-    

-    switch(call_api_choice)

-    {

-        case DAIL:

-        {

-            int num=0;

-            char *argv[2]={0};

-            if(num==parseParam(1, value,argv))

-            {

-                eventDial(argv[1],command);

-            }

-            else

-            {

-                printf("please input inavaliable call number,and try again!\n");

-                emResultNotify(output,command);

-            }

-            

-            //eventDial(item[4],command);

-            //printf("please input inavaliable call number,and try again!\n");

-            //emResultNotify(output,command);

-            

-            break;

-        }

-        case ANSWER_CALL:

-        {

-            eventAnswer(command);

-            break;

-        }

-        case HANGUP_CALL:

-        {

-            int num=0;

-            char *argv[2]={0};

-            if(num==parseParam(1, value,argv))

-            {

-                eventCallHangUp(atoi(&argv[1][0]),command);

-            }

-            else

-            {

-                printf("please input call id,and try again!\n");

-                emResultNotify(output ,command);

-            }

-            break;

-        }

-        case REJECT_CALL:

-        {

-            eventRejectCall(command);

-            break;

-        }

-        case AUTO_ANSWER_CALL:

-        {

-            int num=0;

-            char *argv[2]={0};

-            if(num==parseParam(1, value,argv))

-            {

-                eventAutoAnswer(atoi(&argv[1][0]),command);

-            }

-            else

-            {

-                sprintf(output,"please input auto answer mode value:0 or 1,and try again!\n");

-                emResultNotify(output,command);

-            }

-            break;

-        }

-        case SET_MUTE_STATUS:

-        {

-            int num=0;

-            char *argv[2]={0};

-            if(num==parseParam(1, value,argv))

-            {

-                eventSetMute(atoi(&argv[1][0]),command);

-            }

-            else

-            {

-                sprintf(output,"please input set mute mode:0 or 1,and try again!\n");

-                emResultNotify(output,command);

-            }

-            break;

-        }

-        case GET_MUTE_STATUS:

-        {

-            eventGetMute(command);

-            break;

-        }

-        case SET_DTMF:

-        {

-            int num=0;

-            char *argv[2]={0};

-            if(num==parseParam(1, value,argv))

-            {

-                eventSetDTMF(argv[1][0],command);

-            }

-            else

-            {

-                sprintf(output,"please input DTMF value:0-9,8,#,and try again!\n");

-                emResultNotify(output,command);

-            }

-            break;

-        }

-        case SET_DTMF_V:

-        {

-            int num=0;

-            char *argv[2]={0};

-            if(num==parseParam(1, value,argv))

-            {

-                eventSetDTMFVolume(atoi(&argv[1][0]),command);

-            }

-            else

-            {

-                sprintf(output,"please input volume value,0-36,and try again!\n");

-                emResultNotify(output,command);

-            }

-            break;

-        }

-        case DO_MULTI_CONF:

-        {

-            eventDoMultiConference(command);

-            break;

-        }

-        case OTHER_CALL_HOLD:

-        {

-            int num=0;

-            char *argv[2]={0};

-            if(num==parseParam(1, value,argv))

-            {

-                eventOthercallHold(atoi(&argv[1][0]),command);

-            }

-            else

-            {

-                sprintf(output,"please input call id, and try again!\n");

-                emResultNotify(output,command);

-            }

-            break;

-        }

-        case HANGUP_WAITING_CALL:

-        {

-            eventHangupWatingForCall(command);

-            break;

-        }

-        case HANGUP_FORE_RES_BACK:

-        {

-            eventHangupForegroundResumeBackground(command);

-            break;

-        }

-        case SWITCH_HOLD_AND_ACTIVE_CALL:

-        {

-            eventSwitchWaitOrHoldAndActiveCall(command);

-            break;

-        }

-        case GET_LAST_CALL_FAIL_CAUSE:

-        {

-            eventLastCallFailCause(command);

-            break;

-        }

-        default:

-            break;

-    }

-    return 0;

-}

-int networkcontroller(char *api,char **param)

-{

-    int network_api_choice = item[3];

-    char output[1024] = {0};

-    switch(network_api_choice)

-    {

-        case QUERY_OPERATOR:

-        {

-            eventQueryOperator(command);

-            break;

-        }

-        case QUERY_NETWORK_SELECTION_MODE:

-        {

-            eventQueryNetSelectMode(command);

-            break;

-        }

-        case SET_NETWORK_SELECTION_MODE:

-        {

-            int num=0;

-            char *argv[2]={0};

-            if(num==parseParam(1, value,argv))

-            {

-                eventSetNetSelectMode(atoi(&argv[1][0]),command);

-            }

-            else

-            {

-                sprintf(output,"please input network selection mode 0 or 1, and try again!\n");

-                emResultNotify(output,command);

-            }

-            break;

-        }

-        case QUERY_AVAILABLE_NETWORKS:

-        {

-            eventQueryAvailableNetwork(command);

-            break;

-        }

-        case QUERY_REGISTRATION_STATE:

-        {

-            int num=0;

-            char *argv[2]={0};

-            if(num==parseParam(1, value,argv))

-            {

-                eventQueryRegistrationState(argv[1],command);

-            }

-            else

-            {

-                sprintf(output,"please input type voice,data,or ims, and try again!\n");

-                emResultNotify(output,command);

-            }

-            break;

-        }

-        case GET_PREFERRED_NETWORK_TYPE:

-        {

-            eventQueryPrefferredNetworkType(command);

-            break;

-        }

-        case SET_PREFERRED_NETWORK_TYPE:

-        {

-            int num=0;

-            char *argv[2]={0};

-            if(num==parseParam(1, value,argv))

-            {

-                eventSetPrefferredNetworkType(atoi(&argv[1][0]),command);

-            }

-            else

-            {

-                sprintf(output,"please input preferred network type value , and try again!\n");

-                emResultNotify(output,command);

-            }

-            break;

-        }

-        case GET_CELL_INFO_LIST:

-        {

-            eventQueryCellInfo(command);

-            break;

-        }

-        case SET_UNSOL_CELL_INFO_LIST_RATE:

-        {

-            int num=0;

-            char *argv[2]={0};

-            if(num==parseParam(1, value,argv))

-            {

-                eventSetUnsolCellInfoListrate(atoi(&argv[1][0]),command);

-            }

-            else

-            {

-                sprintf(output,"please input unsolicited cell infomation list rate , and try again!\n");

-                emResultNotify(output,command);

-            }

-            break;

-        }

-        case GET_NEIGHBORING_CELL_IDS:

-        {

-            eventQueryNeighboringCellids(command);

-            break;

-        }

-        case SET_BAND_MODE:

-        {

-            int num=0;

-            char *argv[2]={0};

-            if(num==parseParam(1, value,argv))

-            {

-                eventSetBandMode(atoi(&argv[1][0]),command);

-            }

-            else

-            {

-                sprintf(output,"please input band mode, and try again!\n");

-                emResultNotify(output,command);

-            }

-            break;

-        }

-        case QUERY_AVAILABLE_BAND_MODE:

-        {

-            eventQueryAvailableBandmode(command);

-            break;

-        }

-        case RADIO_POWER:

-        {

-            int num=0;

-            char *argv[2]={0};

-            if(num==parseParam(1, value,argv))

-            {

-                eventRadioOn(atoi(&argv[1][0]),command);

-            }

-            else

-            {

-                sprintf(output,"please input radio power status value 0 or 1, and try again!\n");

-                emResultNotify(output,command);

-            }

-            break;

-        }

-        case VOICE_RADIO_TECH:

-        {

-            eventQueryRadioTech(command);

-            break;

-        }

-        case SIGNAL_STRENGTH:

-        {

-            eventSolicitedSignalStrength(command);

-            break;

-        }

-        case MODEM_POWER:

-        {

-            int num=0;

-            char *argv[2]={0};

-            if(num==parseParam(1, value,argv))

-            {

-                eventModemOn(atoi(&argv[1][0]),command);

-            }

-            else

-            {

-                sprintf(output,"please input modem power status value 0 or 1, and try again!\n");

-                emResultNotify(output,command);

-            }

-            break;

-        }

-        default:

-            break;

-    }

-    return 0;

-}

-int datacontroller(char *api,char **param)

-{

-    int data_api_choice = item[3];

-    char output[1024] = {0};

-    switch(data_api_choice)

-    {

-        case SETUP_DATA_CALL:

-        {

-            eventSetupDataCall(command);

-            break;

-        }

-        case DEACTIVATE_DATA_CALL:

-        {

-            eventDeactiveDataCall(command);

-            break;

-        }

-        case GET_DATA_CALL_LIST:

-        {

-            eventGetDataCalllist(command);

-            break;

-        }

-        default:

-            break;

-    }

-    return 0;

-}

-int simcontroller(char *api,char **param)

-{

-    int sim_api_choice = item[3];

-    char output[1024] = {0};

-    switch(sim_api_choice)

-    {

-        case GET_SIM_STATUS:

-        {

-            eventGetSimStatus(command);

-            break;

-        }

-        case GET_IMSI:

-        {

-            eventGetImsi(command);

-            break;

-        }

-        default:

-            break;

-    }

-    return 0;

-}

-int smscontroller(int *item, char *value,int command)

-{

-    int sms_api_choice = item[3];

-    char output[1024] = {0};

-    switch(sms_api_choice)

-    {

-        case SEND_SMS:

-        {

-            int num=0;

-            char *argv[MAX_P]={0};

-            if(num==parseParam(2, value,argv))

-            {

-                eventSendSms(argv[1], argv[2],command);

-            }

-            else

-            {

-                sprintf(output,"please input phone number and message, and try again!\n");

-                emResultNotify(output,command);

-            }

-            break;

-        }

-        case IMS_SEND_SMS:

-        {

-            int num=0;

-            char *argv[MAX_P]={0};

-            if(num==parseParam(2, value,argv))

-            {

-                eventImsSendSms(argv[1], argv[2],command);

-            }

-            else

-            {

-                sprintf(output,"please input phone number and message, and try again!\n");

-                emResultNotify(output,command);

-            }

-            break;

-        }

-        case WRITE_SMS_TO_SIM:

-        {

-            int num=0;

-            char *argv[MAX_P]={0};

-            if(num==parseParam(3, value,argv))

-            {

-                eventWriteSmsToSim(atoi(&argv[1][0]),argv[2], argv[3],command);

-            }

-            else

-            {

-                sprintf(output,"please input sms status,phone number and message, and try again!\n");

-                emResultNotify(output,command);

-            }

-            break;

-        }

-        case REPORT_SMS_MEMORY_STATUS:

-        {

-            int num=0;

-            char *argv[MAX_P]={0};

-            if(num==parseParam(1, value,argv))

-            {

-                eventReportSmsMemoryStatus(atoi(&argv[1][0]),command);

-            }

-            else

-            {

-                sprintf(output,"please input memory status 0 or 1,and try agin!\n");

-                emResultNotify(output,command);

-            }

-            break;

-        }

-        case DELETE_SMS_ON_SIM:

-        {

-            int num=0;

-            char *argv[MAX_P]={0};

-            if(num==parseParam(1, value,argv))

-            {

-                eventDeletSmsOnSim(atoi(&argv[1][0]),command);

-            }

-            else

-            {

-                sprintf(output,"please input sms index,and try agin!\n");

-                emResultNotify(output,command);

-            }

-            break;

-        }

-        case GET_SMSC_ADDRESS:

-        {

-            eventGetSmscAddress(command);

-            break;

-        }

-        case SET_SMSC_ADDRESS:

-        {

-            int num=0;

-            char *argv[MAX_P]={0};

-            if(num==parseParam(1, value,argv))

-            {

-                eventSetSmscAddress(argv[1],command);

-            }

-            else

-            {

-                sprintf(output,"please input serviceNumber,and try agin!\n");

-                emResultNotify(output,command);

-            }

-            break;

-        }

-    }

-    return 0;

-}

-*/

-

-

diff --git a/src/lynq/packages/apps/lynq-function-test/src/ril_test.h b/src/lynq/packages/apps/lynq-function-test/src/ril_test.h
deleted file mode 100644
index 7b1aa66..0000000
--- a/src/lynq/packages/apps/lynq-function-test/src/ril_test.h
+++ /dev/null
@@ -1,130 +0,0 @@
-/*============================================================================= 

-**     FileName: ril_test.h

-**     Desc: about function test

-**     Author: Warren

-**     Version: V1.0

-**     LastChange: 2021-02-26 

-**     History: 

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

-

-#ifndef __LYNQ_RIL_TEST_H__

-#define __LYNQ_RIL_TEST_H__

-typedef enum {
-   SIM_API  = 0,

-   CALL_API,

-   NETWORK_API,
-   DATA_API,
-   SMS_API,

-}RIL_API_MENU;

-

-typedef enum{
-    DAIL= 0,
-    ANSWER_CALL,
-    HANGUP_CALL,
-    REJECT_CALL,
-    AUTO_ANSWER_CALL,
-    SET_MUTE_STATUS,
-    GET_MUTE_STATUS,
-    SET_DTMF,
-    SET_DTMF_V,
-    DO_MULTI_CONF,
-    OTHER_CALL_HOLD,
-    HANGUP_WAITING_CALL,
-    HANGUP_FORE_RES_BACK,
-    SWITCH_HOLD_AND_ACTIVE_CALL,
-    GET_LAST_CALL_FAIL_CAUSE,
-}RIL_CALL_MENU;
-
-typedef enum
-{
-    QUERY_OPERATOR=0,
-    QUERY_NETWORK_SELECTION_MODE,
-    SET_NETWORK_SELECTION_MODE,
-    QUERY_AVAILABLE_NETWORKS,
-    QUERY_REGISTRATION_STATE,
-    GET_PREFERRED_NETWORK_TYPE,
-    SET_PREFERRED_NETWORK_TYPE,
-    GET_CELL_INFO_LIST,
-    SET_UNSOL_CELL_INFO_LIST_RATE,
-    GET_NEIGHBORING_CELL_IDS  ,
-    SET_BAND_MODE,
-    QUERY_AVAILABLE_BAND_MODE,
-    RADIO_POWER,
-    VOICE_RADIO_TECH,
-    SIGNAL_STRENGTH,
-    MODEM_POWER,
-}RIL_NETWORK_MENU;
-
-typedef enum{
-    SETUP_DATA_CALL=0,
-    DEACTIVATE_DATA_CALL,
-    GET_DATA_CALL_LIST,
-}RIL_DATA_MENU;
-
-typedef enum{
-    GET_SIM_STATUS=0,
-    GET_IMSI,
-}RIL_SIM_MENU;
-
-typedef enum{
-    SEND_SMS=0,
-    IMS_SEND_SMS,
-    WRITE_SMS_TO_SIM,
-    REPORT_SMS_MEMORY_STATUS,
-    DELETE_SMS_ON_SIM,
-    GET_SMSC_ADDRESS,
-    SET_SMSC_ADDRESS,
-}RIL_SMS_MENU;
-int eventDial(char **argv);

-int eventAnswer(char **argv);

-int eventAutoAnswer(char **argv);

-int eventSetMute(char **argv);

-int eventGetMute(char **argv);

-int eventLastCallFailCause(char **argv);

-int eventCallHangUp(char **argv);

-int eventRejectCall(char **argv);

-int eventSetDTMF(char **argv);

-int eventSetDTMFVolume(char **argv);

-int eventDoMultiConference(char **argv);

-int eventOthercallHold(char **argv);

-int eventHangupWatingForCall(char **argv);

-int eventHangupForegroundResumeBackground(char **argv);

-int eventSwitchWaitOrHoldAndActiveCall(char ** argv);

-int eventQueryOperator(char ** argv);

-int eventQueryNetSelectMode(char ** argv);

-int eventSetNetSelectMode(char ** argv);

-int eventQueryAvailableNetwork(char **argv);

-int eventQueryRegistrationState(char ** argv);

-int eventQueryPrefferredNetworkType(char ** argv);

-int eventSetPrefferredNetworkType(char ** argv);

-int eventQueryCellInfo(char ** argv);

-int eventSetUnsolCellInfoListrate(char ** argv);

-int eventQueryNeighboringCellids(char ** argv);

-int eventSetBandMode(char ** argv);

-int eventQueryAvailableBandmode(char ** argv);

-int eventRadioOn(char ** argv);

-int eventQueryRadioTech(char ** argv);

-int eventSolicitedSignalStrength(char ** argv);

-int eventModemOn(char **argv);

-int eventSetupDataCall(char ** argv);

-int eventDeactiveDataCall(char ** argv);

-int eventGetDataCalllist(char ** argv);

-int eventGetSimStatus(char ** argv);

-int eventGetImsi(char ** argv);

-int eventSendSms(char ** argv);

-int eventImsSendSms(char ** argv);

-int eventWriteSmsToSim(char ** argv);

-int eventReportSmsMemoryStatus(char **argv);

-int eventDeletSmsOnSim(char **argv);

-int eventGetSmscAddress(char **argv);

-int eventSetSmscAddress(char **argv);

-int evenStoreSmsToMemory(char **argv);

-int eventGetSmsFromMemory(char **argv);

-int eventDeleteMessageFromMemory(char **argv);

-

-

-int ril_test(char *api,char *string);

-
-
-#endif //__LYNQ_RIL_TEST_H__
-

diff --git a/src/lynq/packages/apps/lynq-function-test/src/usb_commands.h b/src/lynq/packages/apps/lynq-function-test/src/usb_commands.h
deleted file mode 100644
index cd6f381..0000000
--- a/src/lynq/packages/apps/lynq-function-test/src/usb_commands.h
+++ /dev/null
@@ -1,4 +0,0 @@
-{"enable_gadget",enable_gadget, "enable_gadget"},
-{"tether_gadget_on",tether_gadget_on, "tether_gadget_on"},
-{"disable_gadget",disable_gadget, "disable_gadget"},
-{"tether_gadget_off",tether_gadget_off, "tether_gadget_off"},
\ No newline at end of file
diff --git a/src/lynq/packages/apps/lynq-function-test/src/usb_switch.cpp b/src/lynq/packages/apps/lynq-function-test/src/usb_switch.cpp
deleted file mode 100644
index c037ab1..0000000
--- a/src/lynq/packages/apps/lynq-function-test/src/usb_switch.cpp
+++ /dev/null
@@ -1,88 +0,0 @@
-#include "usb_switch.h"

-#define MAX_P 1024

-

-RIL_COMMAND usb_api_commands[] = {

-#include "usb_commands.h"

-};

-

-

-int usb_switch_test(char *api,char *string) {

-    char *argv[MAX_P] = {0};

-    parseParameters(string,argv);

-    RIL_COMMAND *command = find_command(api,usb_api_commands);

-    if(command)

-    {

-        (*(command->func)) (argv);

-    }

-    else

-    {

-        LYERRLOG("Can not find this command from function_test!!!\n");

-    }

-    return 0;

-}

-

-

-int enable_gadget(char **argv){

-    char buff[128]={0};  

-    FILE *cmd = NULL;

-    cmd = popen("connmanctl enable gadget", "r");

-    if (cmd == NULL) {

-        RLOGD("open pipe fail!\n");

-        return 0;

-    }

-    while(fgets(buff,127,cmd)!=NULL)

-    {

-        LYVERBLOG("enable gadget, %s",buff);

-       

-    }

-    pclose(cmd);

-    return 0;

-}

-int tether_gadget_on(char **argv){

-    char buff[128]={0};  

-    FILE *cmd = NULL;

-    cmd = popen("connmanctl tether gadget on", "r");

-    if (cmd == NULL) {

-        RLOGD("open pipe fail!\n");

-        return 0;

-    }

-    while(fgets(buff,127,cmd)!=NULL)

-    {

-        LYVERBLOG("tether gadget on, %s",buff);

-       

-    }

-    pclose(cmd);

-    return 0;

-}

-int disable_gadget(char **argv){

-    char buff[128]={0};  

-    FILE *cmd = NULL;

-    cmd = popen("connmanctl disable gadget", "r");

-    if (cmd == NULL) {

-        RLOGD("open pipe fail!\n");

-        return 0;

-    }

-    while(fgets(buff,127,cmd)!=NULL)

-    {

-        LYVERBLOG("disable gadget , %s",buff);

-       

-    }

-    pclose(cmd);

-    return 0;

-}

-int tether_gadget_off(char **argv){

-    char buff[128]={0};  

-    FILE *cmd = NULL;

-    cmd = popen("connmanctl tether gadget off", "r");

-    if (cmd == NULL) {

-        RLOGD("open pipe fail!\n");

-        return 0;

-    }

-    while(fgets(buff,127,cmd)!=NULL)

-    {

-        LYVERBLOG("tether gadget off, %s",buff);

-       

-    }

-    pclose(cmd);

-    return 0;

-}
\ No newline at end of file
diff --git a/src/lynq/packages/apps/lynq-function-test/src/usb_switch.h b/src/lynq/packages/apps/lynq-function-test/src/usb_switch.h
deleted file mode 100644
index 1021e44..0000000
--- a/src/lynq/packages/apps/lynq-function-test/src/usb_switch.h
+++ /dev/null
@@ -1,17 +0,0 @@
-#ifndef __USB_SWITCH_H__

-#define __USB_SWITCH_H__

-

-#include "function_common.h"

-#include <log/log.h>

-#include <stdio.h>

-#include <string.h>

-#include <stdlib.h>

-

-

-

-int usb_switch_test(char *api,char *string);

-int enable_gadget(char **argv);

-int tether_gadget_on(char **argv);

-int disable_gadget(char **argv);

-int tether_gadget_off(char **argv);

-#endif
\ No newline at end of file