Merge "[Feature][ZXW-151] add T106E-gnss code,GPS chip is HD8122"
diff --git a/allbins/zx297520v3/prj_vehicle/config_dc_4Gb/partition.bin b/allbins/zx297520v3/prj_vehicle/config_dc_4Gb/partition.bin
index 38be3b4..371de96 100755
--- a/allbins/zx297520v3/prj_vehicle/config_dc_4Gb/partition.bin
+++ b/allbins/zx297520v3/prj_vehicle/config_dc_4Gb/partition.bin
Binary files differ
diff --git a/allbins/zx297520v3/prj_vehicle/config_dc_4Gb/partition.ini b/allbins/zx297520v3/prj_vehicle/config_dc_4Gb/partition.ini
index 03e1552..fa377c3 100755
--- a/allbins/zx297520v3/prj_vehicle/config_dc_4Gb/partition.ini
+++ b/allbins/zx297520v3/prj_vehicle/config_dc_4Gb/partition.ini
@@ -69,37 +69,37 @@
 partition_name=caprootfs
 partition_type=nand
 partition_addr=0x05900000
-partition_size=0x02000000
+partition_size=0x02800000
 
 [Partition11]
 partition_name=caprootfs2
 partition_type=nand
-partition_addr=0x07900000
-partition_size=0x02000000
+partition_addr=0x08100000
+partition_size=0x02800000
 
 [Partition12]
 partition_name=capuserdata
 partition_type=nand
-partition_addr=0x09900000
-partition_size=0x04100000
+partition_addr=0x0A900000
+partition_size=0x02800000
 
 [Partition13]
 partition_name=oem
 partition_type=nand
-partition_addr=0x0DA00000
+partition_addr=0x0D100000
 partition_size=0x06400000
 
 [Partition14]
 partition_name=oem2
 partition_type=nand
-partition_addr=0x13E00000
+partition_addr=0x13500000
 partition_size=0x06400000
 
 [Partition15]
 partition_name=oemdata
 partition_type=nand
-partition_addr=0x1A200000
-partition_size=0x07400000
+partition_addr=0x19900000
+partition_size=0x07C00000
 
 [Partition16]
 partition_name=ddr
diff --git a/ap/app/zte_comm/at_ctl/src/atconfig/ps_normal.c b/ap/app/zte_comm/at_ctl/src/atconfig/ps_normal.c
index dec4edf..d2479c9 100755
--- a/ap/app/zte_comm/at_ctl/src/atconfig/ps_normal.c
+++ b/ap/app/zte_comm/at_ctl/src/atconfig/ps_normal.c
@@ -22,6 +22,11 @@
 //bsim

 #include <openssl/aes.h>

 

+//>>>sj.zhang add @2023-10-08 for fix the issue of timezone.

+#define _XOPEN_SOURCE

+extern long timezone;

+//>>>sj.zhang add @2023-10-08 for fix the issue of timezone end.

+

 typedef struct

 {

     unsigned int pubKeyRsaE[32];

@@ -162,7 +167,10 @@
     set_tm.tm_mon = set_tm.tm_mon - 1;

 

     time_tv.tv_sec = mktime(&set_tm);

-    time_tv.tv_sec = time_tv.tv_sec +	time_zone * 3600 / 4;

+//>>>sj.zhang add @2023-10-08 for fix the issue of timezone.

+    tzset();

+    time_tv.tv_sec = time_tv.tv_sec - timezone;

+//>>>sj.zhang add @2023-10-08 for fix the issue of timezone end.

 

 

     if (0 != settimeofday(&time_tv, NULL))

diff --git a/cap/zx297520v3/sources/meta-zxic-custom/conf/distro/vehicle_dc_ref.conf b/cap/zx297520v3/sources/meta-zxic-custom/conf/distro/vehicle_dc_ref.conf
index 2ba0f08..44be59c 100755
--- a/cap/zx297520v3/sources/meta-zxic-custom/conf/distro/vehicle_dc_ref.conf
+++ b/cap/zx297520v3/sources/meta-zxic-custom/conf/distro/vehicle_dc_ref.conf
@@ -187,6 +187,7 @@
         liblynq-qser-network \
         liblynq-qser-gnss \
         liblynq-qser-fota \
+        liblynq-qser-audio \
         libpoweralarm \
         liblynq-systime \
         liblynq-autosuspend \
@@ -275,6 +276,7 @@
         lynq-gpio-demo \
         lynq-irq-demo \
         lynq-gnss-update \
+        lynq-audio-demo \
         "
 
 zxic_app_open += "${@bb.utils.contains('CONFIG_TEL_API_SUPPORT', 'RIL', 'rild', '', d)}"
diff --git a/cap/zx297520v3/sources/meta-zxic-custom/recipes-lynq/liblynq-qser-audio/liblynq-qser-audio.bb b/cap/zx297520v3/sources/meta-zxic-custom/recipes-lynq/liblynq-qser-audio/liblynq-qser-audio.bb
new file mode 100755
index 0000000..59d21db
--- /dev/null
+++ b/cap/zx297520v3/sources/meta-zxic-custom/recipes-lynq/liblynq-qser-audio/liblynq-qser-audio.bb
@@ -0,0 +1,58 @@
+#inherit externalsrc package
+
+DESCRIPTION = "liblynq-qser-audio.so "
+SECTION = "base"
+#LICENSE = "Mobiletek""
+LICENSE = "CLOSED"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=4f60c98fa94e02f659ef5939f67fa8ae"
+DEPENDS += "bootchart  liblynq-log libupi-ab openssl libmedia"
+
+#inherit workonsrc
+WORKONSRC = "${TOPDIR}/../src/lynq/lib/liblynq-qser-audio/"
+
+FILESEXTRAPATHS_prepend :="${TOPDIR}/../src/lynq/lib/:"
+SRC_URI = " \
+          file://liblynq-qser-audio \
+          "
+
+SRC-DIR = "${S}/../liblynq-qser-audio"
+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()
+
+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 () {
+		oe_runmake all -C ${SRC-DIR} ROOT=${STAGING_DIR_HOST} OFLAGS="--sysroot=${STAGING_DIR_HOST} -Os -Wl,--hash-style=gnu"
+}
+
+do_install () {
+    oe_runmake install -C ${SRC-DIR} ROOT=${D}
+	
+    if [ -d "${WORKONSRC}" ] ; then
+        install -d ${D}${includedir}/
+        cp -af ${SRC-DIR}/include/ ${D}${includedir}/
+    fi 
+}
+
+addtask bachclean
+do_bachclean () {
+    oe_runmake clean
+}
diff --git a/cap/zx297520v3/sources/meta-zxic-custom/recipes-lynq/liblynq-qser-gnss/liblynq-qser-gnss.bb b/cap/zx297520v3/sources/meta-zxic-custom/recipes-lynq/liblynq-qser-gnss/liblynq-qser-gnss.bb
index bebad96..687a272 100755
--- a/cap/zx297520v3/sources/meta-zxic-custom/recipes-lynq/liblynq-qser-gnss/liblynq-qser-gnss.bb
+++ b/cap/zx297520v3/sources/meta-zxic-custom/recipes-lynq/liblynq-qser-gnss/liblynq-qser-gnss.bb
@@ -3,7 +3,7 @@
 DESCRIPTION = "liblynq-qser-gnss"

 LICENSE = "CLOSED"

 LIC_FILES_CHKSUM = "file://LICENSE;md5=3f86c7f456a6d0bbeca155e65084eee1"

-DEPENDS += "liblynq-log libxml2"

+DEPENDS += "liblynq-log libxml2 liblynq-uci"

 #inherit workonsrc

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

 FILESEXTRAPATHS_prepend :="${TOPDIR}/../src/lynq/lib/:"

diff --git a/cap/zx297520v3/sources/meta-zxic-custom/recipes-lynq/lynq-audio-demo/files/LICENSE b/cap/zx297520v3/sources/meta-zxic-custom/recipes-lynq/lynq-audio-demo/files/LICENSE
new file mode 100755
index 0000000..cb88533
--- /dev/null
+++ b/cap/zx297520v3/sources/meta-zxic-custom/recipes-lynq/lynq-audio-demo/files/LICENSE
@@ -0,0 +1,31 @@
+Copyright Statement:
+
+This software/firmware and related documentation ("Mobiletek Software") are
+protected under relevant copyright laws. The information contained herein is
+confidential and proprietary to Mobiletek Inc. and/or its licensors. Without
+the prior written permission of Mobiletek inc. and/or its licensors, any
+reproduction, modification, use or disclosure of Mobiletek Software, and
+information contained herein, in whole or in part, shall be strictly
+prohibited.
+
+Mobiletek Inc. (C) 2015. All rights reserved.
+
+BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("Mobiletek SOFTWARE")
+RECEIVED FROM Mobiletek AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
+ON AN "AS-IS" BASIS ONLY. Mobiletek 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 Mobiletek PROVIDE ANY WARRANTY WHATSOEVER WITH
+RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
+INCORPORATED IN, OR SUPPLIED WITH THE Mobiletek 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 Mobiletek
+SOFTWARE. Mobiletek SHALL ALSO NOT BE RESPONSIBLE FOR ANY Mobiletek SOFTWARE
+RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND Mobiletek'S
+ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE Mobiletek SOFTWARE
+RELEASED HEREUNDER WILL BE, AT Mobiletek'S OPTION, TO REVISE OR REPLACE THE
+Mobiletek SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
+CHARGE PAID BY RECEIVER TO Mobiletek FOR SUCH Mobiletek SOFTWARE AT ISSUE.
diff --git a/cap/zx297520v3/sources/meta-zxic-custom/recipes-lynq/lynq-audio-demo/files/lynq-audio-demo.cpp b/cap/zx297520v3/sources/meta-zxic-custom/recipes-lynq/lynq-audio-demo/files/lynq-audio-demo.cpp
new file mode 100755
index 0000000..eb557f6
--- /dev/null
+++ b/cap/zx297520v3/sources/meta-zxic-custom/recipes-lynq/lynq-audio-demo/files/lynq-audio-demo.cpp
@@ -0,0 +1,138 @@
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <errno.h>
+#include <include/lynq-qser-audio.h>
+
+extern sc_audio_handle_t playback_handle;
+
+void player_cmd_proc(char *cmdstr)
+{
+    if (strcmp(cmdstr, "P\n") == 0)
+    {
+        qser_AudPlayer_Pause(playback_handle);
+    }
+    else if (strcmp(cmdstr, "R\n") == 0)
+    {
+        qser_AudPlayer_Resume(playback_handle);
+    }
+    else if (strcmp(cmdstr, "T\n") == 0)
+    {
+        qser_AudPlayer_Stop(playback_handle);
+    }
+    else
+    {
+        printf("Unknown command: %s", cmdstr);
+    }
+}
+
+void capture_cmd_proc(char *cmdstr)
+{
+    if (strcmp(cmdstr, "P\n") == 0)
+    {
+        qser_AudRecorder_Pause();
+    }
+    else if (strcmp(cmdstr, "R\n") == 0)
+    {
+        qser_AudRecorder_Resume();
+    }
+    else if (strcmp(cmdstr, "T\n") == 0)
+    {
+        qser_AudRecorder_Stop();
+    }
+    else
+    {
+        printf("Unknown command: %s", cmdstr);
+    }
+}
+
+int main(int argc, char *argv[])
+{
+    if (argc < 3)
+    {
+        printf("Usage: %s <play|recd> <file>\n", argv[0]);
+        return 1;
+    }
+
+    const char *action = argv[1];
+    const char *file = argv[2];
+
+    int g_audio_owner_id = 0;
+    char player_device[] = "device1";
+    char recorder_device[] = "device2";
+    char cmdstr[256];
+
+    _cb_onPlayer cb_fun = [](int result)
+    {
+        if (result == 0)
+        {
+            printf("Audio recorder opened successfully.\n");
+        }
+        else
+        {
+            printf("Failed to open audio recorder, error code: %d\n", result);
+        }
+    };
+
+    if (strcmp(action, "play") == 0)
+    {
+        int player_open_result = qser_AudPlayer_Open(player_device, cb_fun);
+        if (player_open_result != 0)
+        {
+            printf("Failed to open audio player.\n");
+            return 1;
+        }
+
+        qser_AudPlayer_PlayFrmFile(g_audio_owner_id, file, 0);
+
+        while (1)
+        {
+            printf("Please input a player command (P/R/T/exit) :\n");
+            if (fgets(cmdstr, sizeof(cmdstr), stdin) != NULL)
+            {
+                if (strcmp(cmdstr, "exit\n") == 0)
+                {
+                    qser_AudPlayer_Close(playback_handle);
+                    break;
+                }
+                player_cmd_proc(cmdstr);
+            }
+        }
+
+        qser_AudPlayer_Close(playback_handle);
+    }
+    else if (strcmp(action, "recd") == 0)
+    {
+        int recorder_open_result = qser_AudRecorder_Open(recorder_device, cb_fun);
+        if (recorder_open_result != 0) {
+            printf("Failed to open audio recorder.\n");
+            return 1;
+        }
+
+        qser_AudRecorder_StartRecord(g_audio_owner_id, file, 0);
+
+        while (1)
+        {
+            printf("Please input a player command (P/R/T/exit) :\n");
+            if (fgets(cmdstr, sizeof(cmdstr), stdin) != NULL)
+            {
+                if (strcmp(cmdstr, "exit\n") == 0)
+                {
+                    qser_AudRecorder_Close();
+                    break;
+                }
+                capture_cmd_proc(cmdstr);
+            }
+        }
+        qser_AudRecorder_Close();
+    }
+    else
+    {
+        printf("Unknown action: %s\n", action);
+        return 1;
+    }
+
+    qser_Audio_Deinit();
+
+    return 0;
+}
diff --git a/cap/zx297520v3/sources/meta-zxic-custom/recipes-lynq/lynq-audio-demo/files/makefile b/cap/zx297520v3/sources/meta-zxic-custom/recipes-lynq/lynq-audio-demo/files/makefile
new file mode 100755
index 0000000..c37eeaa
--- /dev/null
+++ b/cap/zx297520v3/sources/meta-zxic-custom/recipes-lynq/lynq-audio-demo/files/makefile
@@ -0,0 +1,51 @@
+SHELL = /bin/sh
+RM = rm -f
+
+LOCAL_CFLAGS := -Wall \
+                -std=gnu++14 \
+                -g -Os \
+                -flto \
+                -fpermissive \
+
+ifeq ($(strip $(TARGET_PLATFORM)), T106)
+LOCAL_CFLAGS += -DBINDER_IPC_32BIT=1 -DHAVE_ENDIAN_H -DHAVE_PTHREADS -DHAVE_SYS_UIO_H -DHAVE_POSIX_FILEMAP -DHAVE_STRLCPY -DHAVE_PRCTL -DHAVE_MEMSET16 -DHAVE_MEMSET32 -DANDROID_SMP=0
+endif
+
+LOCAL_CFLAGS += -Werror=format-security
+
+$(warning ################# rock ROOT: $(ROOT),includedir:$(includedir),)
+
+LOCAL_PATH   = .
+
+LOCAL_C_INCLUDES = \
+  -I. \
+  -I$(LOCAL_PATH)/include/ \
+  -I$(ROOT)$(includedir)/ \
+
+
+LOCAL_LIBS := \
+    -L. \
+    -ldl \
+    -lstdc++ \
+    -lpthread \
+    -llynq-qser-audio \
+
+SOURCES = lynq-audio-demo.cpp
+
+EXECUTABLE = lynq-audio-demo
+
+OBJECTS=$(SOURCES:.cpp=.o)
+
+all: $(EXECUTABLE) 
+
+$(EXECUTABLE): $(OBJECTS)
+	$(CXX) $(OBJECTS) $(LOCAL_LIBS) $(LOCAL_CFLAGS) $(LOCAL_C_INCLUDES) -o $@
+
+%.o : %.cpp
+	$(CXX) $(LOCAL_C_INCLUDES) $(LOCAL_CFLAGS) $(LOCAL_LIBS) -o $@ -c $<
+
+.PHONY: clean
+clean:
+	$(RM) $(OBJECTS) $(EXECUTABLE)
+	$(RM) $(OBJECTS_TOOL) $(EXECUTABLE)
+
diff --git a/cap/zx297520v3/sources/meta-zxic-custom/recipes-lynq/lynq-audio-demo/lynq-audio-demo.bb b/cap/zx297520v3/sources/meta-zxic-custom/recipes-lynq/lynq-audio-demo/lynq-audio-demo.bb
new file mode 100644
index 0000000..2260b19
--- /dev/null
+++ b/cap/zx297520v3/sources/meta-zxic-custom/recipes-lynq/lynq-audio-demo/lynq-audio-demo.bb
@@ -0,0 +1,31 @@
+#inherit externalsrc package
+#inherit externalsrc package systemd
+DESCRIPTION = "lynq-audio-demo"
+LICENSE = "CLOSED"
+LICENSE = "CLOSED"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=b1e07e8d88e26263e71d3a9e2aa9a2ff"
+SRC_URI = "file://lynq-audio-demo.cpp \
+           file://makefile \
+"
+DEPENDS += "liblynq-qser-audio"
+
+SRC-DIR = "${S}/../lynq-audio-demo"
+FILES_${PN} += "${bindir}/"
+TARGET_CC_ARCH += "${LDFLAGS}"
+SYSTEMD_PACKAGES = "${PN}"
+S = "${WORKDIR}"
+#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-audio-demo ${D}${bindir}/
+}
diff --git a/cap/zx297520v3/sources/meta-zxic-custom/recipes-lynq/lynq-qser-network-demo/files/lynq-qser-network-demo.cpp b/cap/zx297520v3/sources/meta-zxic-custom/recipes-lynq/lynq-qser-network-demo/files/lynq-qser-network-demo.cpp
index 8ef97ca..0b1dd7d 100755
--- a/cap/zx297520v3/sources/meta-zxic-custom/recipes-lynq/lynq-qser-network-demo/files/lynq-qser-network-demo.cpp
+++ b/cap/zx297520v3/sources/meta-zxic-custom/recipes-lynq/lynq-qser-network-demo/files/lynq-qser-network-demo.cpp
@@ -21,6 +21,10 @@
 int (*qser_nw_get_reg_status_p)(nw_client_handle_type  h_nw, QSER_NW_REG_STATUS_INFO_T *pt_info);

 int (*qser_nw_add_rx_msg_handler_p)(nw_client_handle_type  h_nw, QSER_NW_RxMsgHandlerFunc_t handlerPtr,void* contextPtr);

 int (*qser_nw_get_signal_strength_p)(nw_client_handle_type h_nw,QSER_NW_SIGNAL_STRENGTH_INFO_T *pt_info);

+int (*qser_nw_set_oos_config_p)(nw_client_handle_type   h_nw, QSER_NW_OOS_CONFIG_INFO_T *pt_info);

+int (*qser_nw_get_oos_config_p)(nw_client_handle_type   h_nw, QSER_NW_OOS_CONFIG_INFO_T *pt_info);

+

+

 

 int getFunc()

 {

@@ -40,6 +44,9 @@
     qser_nw_get_reg_status_p = (int (*)(nw_client_handle_type  h_nw, QSER_NW_REG_STATUS_INFO_T  *pt_info))dlsym(handle_network,"qser_nw_get_reg_status");

     qser_nw_get_signal_strength_p = (int (*)(nw_client_handle_type h_nw, QSER_NW_SIGNAL_STRENGTH_INFO_T *pt_info))dlsym(handle_network,"qser_nw_get_signal_strength");

     qser_nw_add_rx_msg_handler_p = (int (*)(nw_client_handle_type  h_nw, QSER_NW_RxMsgHandlerFunc_t handlerPtr,void* contextPtr))dlsym(handle_network,"qser_nw_add_rx_msg_handler");

+    qser_nw_get_oos_config_p = (int (*)(nw_client_handle_type   h_nw, QSER_NW_OOS_CONFIG_INFO_T *pt_info))dlsym(handle_network,"qser_nw_get_oos_config");

+    qser_nw_set_oos_config_p = (int (*)(nw_client_handle_type   h_nw, QSER_NW_OOS_CONFIG_INFO_T *pt_info))dlsym(handle_network,"qser_nw_set_oos_config");

+

         

     if(qser_nw_client_deinit_p==NULL || qser_nw_client_init_p==NULL || qser_nw_set_config_p ==NULL ||

        qser_nw_get_operator_name_p == NULL || qser_nw_get_reg_status_p ==NULL || qser_nw_add_rx_msg_handler_p==NULL)

@@ -78,7 +85,11 @@
     {3,     "qser_nw_get_reg_status"},        

     {4,     "qser_nw_add_rx_msg_handler"},     

     {5,     "qser_nw_get_signal_strength"},

-    {6,     "qser_nw_client_deinit"},  

+    {6,     "qser_nw_set_oos_config"},

+    {7,     "qser_nw_get_oos_config"},

+    {8,     "qser_nw_client_deinit"},  

+ 

+    

     {-1,    "quit"}

 };

 

@@ -424,7 +435,7 @@
                              

                  break;

              }                 

-             case 6://"qser_nw_client_deinit"

+             case 8://"qser_nw_client_deinit"

              {

                  ret = qser_nw_client_deinit_p(h_nw);

                  printf("qser_nw_client_deinit ret = %d\n", ret);

@@ -475,7 +486,76 @@
                 }

                 break;

              }        

-            

+             case 7 :

+             {

+                QSER_NW_OOS_CONFIG_INFO_T t_info;

+                int type = 0;

+                printf("please input you want query oos config's type (0: fast network scan config; 1: full band network scan config ) : \n");

+                scanf("%d", &type);

+                t_info.type = type;

+                ret = qser_nw_get_oos_config_p(h_nw, &t_info);  

+                printf("qser_nw_get_oos_config, ret=%d\n", ret);

+                if(ret==0)

+                {         

+                    if(t_info.type == QSER_NW_OOS_CFG_TYPE_FULL_BAND_SCAN)

+                    {

+                        printf("qser_nw_get_oos_config         t_min = %d\n"

+                               "                               t_step = %d\n"

+                               "                               t_num = %d\n"

+                               "                               t_max = %d\n",

+                              t_info.u.full_band_scan_info.t_min, t_info.u.full_band_scan_info.t_step,                             

+                              t_info.u.full_band_scan_info.t_num, t_info.u.full_band_scan_info.t_max);

+                    }     

+                    else if(t_info.type == QSER_NW_OOS_CFG_TYPE_FAST_SCAN)

+                    {

+                        printf("qser_nw_get_oos_config         enable = %d\n"

+                               "                               time_interval = %d\n",

+                              t_info.u.fast_can_info.enable, t_info.u.fast_can_info.time_interval); 

+                    }

+                    else

+                    {

+                        printf("qser_nw_get_oos_config tyep is %d, ret is ok",t_info.type);

+                    }

+    

+                }

+                break;

+             }         

+             case 6 :

+             {

+                QSER_NW_OOS_CONFIG_INFO_T t_info;

+                int type = 0;

+                printf("please input you want set oos config's type (0: fast network scan config; 1: full band network scan config ) : \n");

+                scanf("%d", &type);

+                t_info.type = type;

+                if(t_info.type == QSER_NW_OOS_CFG_TYPE_FULL_BAND_SCAN)

+                {

+                      printf("please input  t_min: \n");

+                      scanf("%d", &(t_info.u.full_band_scan_info.t_min));

+                      printf("please input t_step: \n");

+                      scanf("%d", &(t_info.u.full_band_scan_info.t_step));

+                      printf("please input  t_num: \n");

+                      scanf("%d", &(t_info.u.full_band_scan_info.t_num));

+                      printf("please input t_max: \n");

+                      scanf("%d", &(t_info.u.full_band_scan_info.t_max));

+                      ret = qser_nw_set_oos_config_p(h_nw, &t_info);  

+                      printf("qser_nw_get_oos_config, ret=%d\n", ret);                      

+                }

+                else if(t_info.type==QSER_NW_OOS_CFG_TYPE_FAST_SCAN)

+                {

+                      printf("please input  enable: \n");

+                      scanf("%d", &(t_info.u.fast_can_info.enable));

+                      printf("please input time_interval: \n");

+                      scanf("%d", &(t_info.u.fast_can_info.time_interval));                      

+                      ret = qser_nw_set_oos_config_p(h_nw, &t_info);  

+                      printf("qser_nw_get_oos_config, ret=%d\n", ret);                    

+                }

+                else 

+                {

+                       ret = qser_nw_set_oos_config_p(h_nw, &t_info);  

+                       printf("qser_nw_get_oos_config, ret=%d\n", ret);            

+                }                

+                break;

+             }         

              default:

              {

                  show_group_help(&t_nw_test);

diff --git a/cap/zx297520v3/sources/meta-zxic-custom/recipes-lynq/lynq-qser-network-demo/files/lynq_qser_network.h b/cap/zx297520v3/sources/meta-zxic-custom/recipes-lynq/lynq-qser-network-demo/files/lynq_qser_network.h
index b65e428..4083e13 100755
--- a/cap/zx297520v3/sources/meta-zxic-custom/recipes-lynq/lynq-qser-network-demo/files/lynq_qser_network.h
+++ b/cap/zx297520v3/sources/meta-zxic-custom/recipes-lynq/lynq-qser-network-demo/files/lynq_qser_network.h
@@ -35,6 +35,37 @@
     E_QSER_NW_ROAM_STATE_TYPE_T   roaming_pref;       /**<   Roaming preference.*/
 }QSER_NW_CONFIG_INFO_T;
 
+/** Configures the OOS (out of service)  settings that define the MCM network interface. */
+#define QSER_NW_OOS_CFG_TYPE_FAST_SCAN          0x00    /**<  fast net scan */
+#define QSER_NW_OOS_CFG_TYPE_FULL_BAND_SCAN     0x01    /**<  full band scan */
+
+typedef struct 
+{
+    /*    Configuration parameters for MCM network fast network scan when OOS (out of service)*/
+    char                        enable;
+    uint16_t                    time_interval;
+}QSER_NW_OOS_CONFIG_FAST_SCAN_INFO_T;
+
+typedef struct 
+{
+    /*    Configuration parameters for MCM network full band network scan when OOS (out of service)*/
+    int t_min;
+    int t_step;
+    int t_num;
+    int t_max;
+}QSER_NW_OOS_CONFIG_FULL_BAND_SCAN_INFO_T;
+
+
+typedef struct 
+{    
+    char                        type;  /**<   QSER_NW_OOS_CFG_TYPE_xxxx.*/
+    union {
+    QSER_NW_OOS_CONFIG_FAST_SCAN_INFO_T  fast_can_info;       // 00
+    QSER_NW_OOS_CONFIG_FULL_BAND_SCAN_INFO_T full_band_scan_info;     // 01   
+  } u;
+}QSER_NW_OOS_CONFIG_INFO_T;
+
+
 
 //defined for QSER_NW_EventRegister
 #define     NW_IND_VOICE_REG_EVENT_IND_FLAG               (1 << 0)    /**< msg format : QSER_NW_VOICE_REG_EVENT_IND_T */
@@ -346,6 +377,18 @@
     QSER_NW_CONFIG_INFO_T     *pt_info 
 );
 
+int qser_nw_set_oos_config
+(
+    nw_client_handle_type       h_nw,
+    QSER_NW_OOS_CONFIG_INFO_T     *pt_info 
+);
+
+int qser_nw_get_oos_config
+(
+    nw_client_handle_type       h_nw,
+    QSER_NW_OOS_CONFIG_INFO_T     *pt_info 
+);
+
 int qser_nw_event_register
 (
     nw_client_handle_type       h_nw,
diff --git a/cap/zx297520v3/sources/meta-zxic/recipes-kernel/linux/files/zx297520v3/linux-5_10-vehicle_dc_ref-normal-defconfig b/cap/zx297520v3/sources/meta-zxic/recipes-kernel/linux/files/zx297520v3/linux-5_10-vehicle_dc_ref-normal-defconfig
index b4b886e..6c84688 100755
--- a/cap/zx297520v3/sources/meta-zxic/recipes-kernel/linux/files/zx297520v3/linux-5_10-vehicle_dc_ref-normal-defconfig
+++ b/cap/zx297520v3/sources/meta-zxic/recipes-kernel/linux/files/zx297520v3/linux-5_10-vehicle_dc_ref-normal-defconfig
@@ -1975,24 +1975,22 @@
 # CONFIG_SND_SOC_ZX29_TI3100 is not set
 #dongyu@modify for codec start
 # CONFIG_SND_SOC_ZX29_NAU8810 is not set
-# CONFIG_SND_SOC_ZX29_TI3104 is not set
+CONFIG_SND_SOC_ZX29_TI3104=y
 # CONFIG_SND_SOC_ZX29_ES8374 is not set
 # CONFIG_SND_SOC_ZX29_ES8312 is not set
 # CONFIG_SND_SOC_ZX29_AK4940 is not set
 # CONFIG_SND_SOC_ZX29_MAX9867 is not set
 # CONFIG_SND_SOC_ZX29_ES8311 is not set
-CONFIG_SND_SOC_ZX29_ES8311=y
 CONFIG_SND_SOC_ZX_VOICE=y
 CONFIG_SND_SOC_ZX297520V3=y
 CONFIG_SND_SOC_ZX_I2S=y
 CONFIG_SND_SOC_ZX_PCM=y
 # CONFIG_SND_SOC_ZX_TDM is not set
 # CONFIG_SND_SOC_TLV320AIC31XX is not set
-CONFIG_SND_SOC_NAU8810=y
-# CONFIG_SND_SOC_TLV320AIC3X is not set
+# CONFIG_SND_SOC_NAU8810 is not set
+CONFIG_SND_SOC_TLV320AIC3X=y
 # CONFIG_SND_SOC_MAX9867 is not set
 # CONFIG_SND_SOC_ES8311 is not set
-CONFIG_SND_SOC_ES8311=y
 #dongyu@modify for codec end
 CONFIG_SND_EXTRA_CTRL=y
 CONFIG_USE_TOP_I2S0=y
diff --git a/cap/zx297520v3/src/lynq/lib/liblynq-network/include/lynq_network/lynq_network.h b/cap/zx297520v3/src/lynq/lib/liblynq-network/include/lynq_network/lynq_network.h
index 462df68..e878e6b 100755
--- a/cap/zx297520v3/src/lynq/lib/liblynq-network/include/lynq_network/lynq_network.h
+++ b/cap/zx297520v3/src/lynq/lib/liblynq-network/include/lynq_network/lynq_network.h
@@ -7,6 +7,7 @@
 #define CELLINFO_MAX_NUM  10

 #define LY_RECOVER_TIMER_INTERVAL 128

 #define MAX_CELLINFO_ITEM_NUMBER 32

+#define MAX_OOS_CFG_ITEM_NUMBER 32

 /*T800 platform support gsm,wcdma lte,nr */

 typedef struct{

     int gw_sig_valid; /*1 valid,1 invalid*/

@@ -134,6 +135,10 @@
 */

 int lynq_oos_deep_sleep_recover_timer_interval(int recovery_threshold,int fullband_timer,int sniffer_timer,int inactive_mode);

 #endif

+#if (defined MOBILETEK_TARGET_PLATFORM_T106) || (defined MODEM_GEN97)

+int lynq_set_oos_net_scan_cfg(int config_list[MAX_OOS_CFG_ITEM_NUMBER], int valid_num);

+int lynq_get_oos_net_scan_cfg(int config_list[MAX_OOS_CFG_ITEM_NUMBER], int* valid_num);

+#endif

 void lynq_set_test_mode(const int test_mode);

 #ifdef __cplusplus

 }

diff --git a/cap/zx297520v3/src/lynq/lib/liblynq-network/lynq_network.cpp b/cap/zx297520v3/src/lynq/lib/liblynq-network/lynq_network.cpp
index dc16ae4..6a1b35b 100755
--- a/cap/zx297520v3/src/lynq/lib/liblynq-network/lynq_network.cpp
+++ b/cap/zx297520v3/src/lynq/lib/liblynq-network/lynq_network.cpp
@@ -25,6 +25,8 @@
 /*in CR AUTO00207414, in modem, 23G detach need 10s, 5g ims detach need 5s, so set length to 12s */

 #define WAIT_TIME_LENGTH_FOR_SET_PREFFERRED_NETWORK_TYPE (12) 

 

+#define MAX_AT_INT_RSP_NUM  32

+

 

 using ::android::Parcel;

 

@@ -1240,42 +1242,6 @@
     return RESULT_OK;                

 }

 

-int lynq_radio_on(const lynq_network_radio_on_type type)

-{     

-    if(g_module_init_flag != MODULE_RUNNING)

-    {

-        LYERRLOG("%s module state %d error",__func__,g_module_init_flag);

-        return LYNQ_E_CONFLICT;

-    }

-    if (type != NETWORK_RADIO_ON_TYPE_CFUN_0  && type != NETWORK_RADIO_ON_TYPE_NORMAL_MODE && type!=NETWORK_RADIO_ON_TYPE_FLIGHT_MODE)

-    {

-        LYERRLOG("%s parameter %d error",__func__,type);  

-        return LYNQ_E_PARAMETER_ANONALY;

-    }     

-    

-    Parcel* p=NULL;      

-    int ret;

-

-    if(type==NETWORK_RADIO_ON_TYPE_CFUN_0)

-    {

-        ret=lynq_send_common_request(p,g_wait_time,RIL_REQUEST_OEM_HOOK_RAW,1,"%s","AT+CFUN=0");

-    }

-    else 

-    {

-        ret=lynq_send_common_request(p,65,RIL_REQUEST_RADIO_POWER,1,"%d",(type==NETWORK_RADIO_ON_TYPE_NORMAL_MODE));

-    }

-

-    if(ret!=RESULT_OK)

-    {

-        LYERRLOG("%s call lynq_send_common_request failure, ret is %d",__func__,ret);

-        return ret;  

-    }       

-

-    LYINFLOG("%s set %d suc",__func__,type);  

-    delete p;

-    return RESULT_OK;  

-}

-

 const char * lynq_get_raw_data(Parcel* &p, int* data_len) 

 {

     int32_t len;

@@ -1305,6 +1271,136 @@
     return data;

 }

 

+int GetIntArrayInRespString(Parcel* &p, const char* tagString, int int_array_in_resp[MAX_AT_INT_RSP_NUM], int* valid_num)

+{

+    int bfind=false;

+    const char* data;

+    int data_len;

+    char* data_str;

+    char* start;

+    int length;

+    int i;

+    int num_start;

+    int ret=RESULT_OK;

+    int pos = p->dataPosition();

+    data = lynq_get_raw_data(p,&data_len);

+    p->setDataPosition(pos);

+    if(data==NULL || data_len == 0)

+    {

+        LYERRLOG("%s lynq_get_raw_data NULL or data_len is 0",__func__);          

+        return LYNQ_E_INNER_ERROR; 

+    }

+    data_str = (char*) calloc(1,data_len+1);

+    if (NULL == data_str) 

+    {

+        LYERRLOG("%s alloc mem error, data_len is %d",__func__,data_len+1);              

+        return LYNQ_E_MALLOC_ERROR;

+    }

+    memmove(data_str, data, data_len);     

+    data_str[data_len]='\0';           

+    LYINFLOG("%s return string is %s",__func__,data_str);  

+    start = strstr(data_str,tagString);

+    int local_valid_num=0;

+    if(start!=NULL)

+    {

+         start=start+strlen(tagString);

+         length=strlen(start);

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

+         {

+             if((!bfind) && (start[i] >= '0') && (start[i] <= '9'))

+             {

+                 bfind=true;  

+                 num_start=i;

+             }

+             else if(bfind && ((start[i] < '0') || (start[i] > '9')))

+             {

+                start[i]='\0';

+                int_array_in_resp[local_valid_num]=atoi(start+num_start);

+                local_valid_num++;

+                bfind=false;                

+             }             

+         }                

+    }           

+    else

+    {

+         LYERRLOG("%s  can't find tag string",__func__,tagString);         

+         ret=LYNQ_E_INNER_ERROR; 

+    }

+

+    if(local_valid_num ==0)

+    {

+         LYERRLOG("%s  can't find integer",__func__);                 

+    }

+    *valid_num = local_valid_num; 

+    LYINFLOG("%s ret is %d valid num is %d ",__func__,ret,*valid_num);  

+    free(data_str);

+    return ret;

+}

+

+int get_ret_code_for_hook(Parcel* &p)

+{

+    int ret;

+    int int_array_in_resp[MAX_AT_INT_RSP_NUM];

+    int valid_num;

+    

+    ret=GetIntArrayInRespString(p,"OK",int_array_in_resp,&valid_num);

+    

+    if(ret!=RESULT_OK)    

+    {

+        ret=GetIntArrayInRespString(p,"ERROR",int_array_in_resp,&valid_num);

+        if(ret==RESULT_OK && valid_num > 0)

+        {

+            ret=int_array_in_resp[0];

+        }

+        else

+        {

+            ret=LYNQ_E_INNER_ERROR;

+        }

+    }

+    return ret;

+}

+

+int lynq_radio_on(const lynq_network_radio_on_type type)

+{     

+    if(g_module_init_flag != MODULE_RUNNING)

+    {

+        LYERRLOG("%s module state %d error",__func__,g_module_init_flag);

+        return LYNQ_E_CONFLICT;

+    }

+    if (type != NETWORK_RADIO_ON_TYPE_CFUN_0  && type != NETWORK_RADIO_ON_TYPE_NORMAL_MODE && type!=NETWORK_RADIO_ON_TYPE_FLIGHT_MODE)

+    {

+        LYERRLOG("%s parameter %d error",__func__,type);  

+        return LYNQ_E_PARAMETER_ANONALY;

+    }     

+    

+    Parcel* p=NULL;      

+    int ret;

+

+    if(type==NETWORK_RADIO_ON_TYPE_CFUN_0)

+    {

+        ret=lynq_send_common_request(p,g_wait_time,RIL_REQUEST_OEM_HOOK_RAW,1,"%s","AT+CFUN=0");

+    }

+    else 

+    {

+        ret=lynq_send_common_request(p,65,RIL_REQUEST_RADIO_POWER,1,"%d",(type==NETWORK_RADIO_ON_TYPE_NORMAL_MODE));

+    }

+

+    if(ret!=RESULT_OK)

+    {

+        LYERRLOG("%s call lynq_send_common_request failure, ret is %d",__func__,ret);

+        return ret;  

+    }   

+

+    if(type==NETWORK_RADIO_ON_TYPE_CFUN_0)

+    {

+        ret=get_ret_code_for_hook(p);    

+    }    

+

+    LYINFLOG("%s set %d ret is %d",__func__,type,ret);  

+    delete p;

+    return RESULT_OK;  

+}

+

 int lynq_query_radio_state(int *radio_state)

 {

     if(g_module_init_flag != MODULE_RUNNING)

@@ -1324,66 +1420,33 @@
     {

         LYERRLOG("%s call lynq_send_common_request failure, ret is %d",__func__,ret);

         return ret;  

-    }           

+    }         

 

-    int bfind=false;

-    const char* data;

-    int data_len;

-    char* data_str;

-    char* start;

-    int length;

-    int i;

-    int num_start;

-    data = lynq_get_raw_data(p,&data_len);

-    if(data==NULL || data_len == 0)

+    int int_array_in_resp[MAX_AT_INT_RSP_NUM];

+    int valid_num;

+

+    ret=GetIntArrayInRespString(p,"CFUN",int_array_in_resp,&valid_num);

+

+    if(ret==RESULT_OK && valid_num > 0)

     {

-        LYERRLOG("%s lynq_get_raw_data NULL or data_len is 0",__func__);    

-        delete p;

-        return LYNQ_E_INNER_ERROR; 

+        *radio_state=int_array_in_resp[0];

     }

-    data_str = (char*) calloc(1,data_len+1);

-    if (NULL == data_str) 

+    else 

     {

-         LYERRLOG("%s alloc mem error, data_len is %d",__func__,data_len+1);         

-         delete p;

-         return LYNQ_E_MALLOC_ERROR;

+        ret=GetIntArrayInRespString(p,"ERROR",int_array_in_resp,&valid_num);

+        if(ret==RESULT_OK && valid_num > 0)

+        {

+            ret=int_array_in_resp[0];

+        }

+        else

+        {

+            ret=LYNQ_E_INNER_ERROR;

+        }

     }

-    memmove(data_str, data, data_len);     

-    data_str[data_len]='\0';           

-    LYINFLOG("%s return string is %s",__func__,data_str);  

-    start = strstr(data_str,"CFUN");

-    if(start!=NULL)

-    {

-         start=start+4;

-         length=strlen(start);

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

-         {

-             if((!bfind) && (start[i] >= '0') && (start[i] <= '9'))

-             {

-                 bfind=true;  

-                 num_start=i;

-             }

-             else if(bfind && ((start[i] < '0') || (start[i] > '9')))

-             {

-                start[i]='\0';

-                break;

-             }

-         }

-         if(bfind)

-         {                    

-             (*radio_state) = atoi(start+num_start);

-             LYINFLOG("%s, radio state is %s %d",__func__,start+num_start,*radio_state);  

-             free(data_str);

-             delete p;

-             return RESULT_OK;                         

-         }

-    }             

-    LYERRLOG("%s return string %s no cfun or no digit",__func__,data_str);  

-    free(data_str);

+    

     delete p;

-    return LYNQ_E_INNER_ERROR;              

-}

-

+    return ret;                

+} 

 int lynq_query_radio_tech(int* radioTech)

 {

     if(g_module_init_flag != MODULE_RUNNING)

@@ -1734,7 +1797,151 @@
     return RESULT_OK;   

 }

 

-#ifdef MODEM_GEN97

+#ifdef MOBILETEK_TARGET_PLATFORM_T106

+

+int lynq_set_oos_net_scan_cfg_fast(int t_fast_scan_enable,  int t_fast_scan_interval)

+{

+    if(! (

+               (t_fast_scan_enable==0) ||

+               (t_fast_scan_enable == 1 &&  

+                t_fast_scan_interval > 0 && t_fast_scan_interval <= 65535 )

+             )    )    

+        {

+            LYERRLOG("%s paramter %d %d error!",__func__, t_fast_scan_enable, t_fast_scan_interval);

+            return LYNQ_E_PARAMETER_ANONALY;

+        }

+    

+    Parcel* p=NULL;

+    int ret=lynq_send_common_request(p,g_wait_time,RIL_REQUEST_OEM_HOOK_RAW,1,"%s,%d,%d","AT+ZSET=\"FAST_FREQ_SCAN\"",t_fast_scan_enable,t_fast_scan_interval);

+

+    if(ret!=RESULT_OK)

+    {

+        LYERRLOG("%s call lynq_send_common_request failure, ret is %d",__func__,ret);

+        return ret;  

+    }  

+

+    ret=get_ret_code_for_hook(p);    

+

+    LYINFLOG("%s %d %d ret is %d",__func__,t_fast_scan_enable,t_fast_scan_interval,ret);     

+    delete p;

+    return ret;  

+}

+

+int lynq_get_oos_net_scan_cfg_fast(int* t_fast_scan_enable,  int* t_fast_scan_interval)

+{    

+    Parcel* p=NULL;

+    int ret=lynq_send_common_request(p,g_wait_time,RIL_REQUEST_OEM_HOOK_RAW,1,"%s","AT+ZSET=\"FAST_FREQ_SCAN\"");

+

+    if(ret!=RESULT_OK)

+    {

+        LYERRLOG("%s call lynq_send_common_request failure, ret is %d",__func__,ret);

+        return ret;  

+    }       

+    

+    int int_array_in_resp[MAX_AT_INT_RSP_NUM];

+    int valid_num;

+

+    ret=GetIntArrayInRespString(p,"FAST_FREQ_SCAN",int_array_in_resp,&valid_num);

+

+    if(ret==RESULT_OK && valid_num > 1)

+    {

+        *t_fast_scan_enable = int_array_in_resp[0];

+        *t_fast_scan_interval = int_array_in_resp[1];        

+    }

+    else 

+    {

+        ret=GetIntArrayInRespString(p,"ERROR",int_array_in_resp,&valid_num);

+        if(ret==RESULT_OK && valid_num > 0)

+        {

+            ret=int_array_in_resp[0];

+        }

+        else

+        {

+            ret=LYNQ_E_INNER_ERROR;

+        }

+    }

+    

+    delete p;

+    return ret;                

+}

+

+

+int lynq_set_oos_net_scan_cfg_full_band(int t_full_band_min, int t_full_band_step, int t_full_band_num, int t_full_band_max)

+{      

+    if(! (

+           (t_full_band_min==0 && t_full_band_step ==0  && t_full_band_num ==0 && t_full_band_max ==0) ||

+           (t_full_band_min > 0 && t_full_band_min <= 65535 && 

+            t_full_band_step > 0 && t_full_band_step <= 65535 && 

+            t_full_band_num > 0 && t_full_band_num <= 65535 && 

+            t_full_band_max > 0 && t_full_band_max <= 65535 )

+         )    )  

+    {

+        LYERRLOG("%s paramter  %d %d %d %d error!",__func__, t_full_band_min, t_full_band_step, t_full_band_num, t_full_band_max);

+        return LYNQ_E_PARAMETER_ANONALY;

+    }

+

+    Parcel* p=NULL;

+    int ret=lynq_send_common_request(p,g_wait_time,RIL_REQUEST_OEM_HOOK_RAW,1,"%s,%d,%d,%d,%d","AT+ZSET=\"FREQ_SCAN\"",t_full_band_min,t_full_band_step,t_full_band_num,t_full_band_max);

+

+    if(ret!=RESULT_OK)

+    {

+        LYERRLOG("%s call lynq_send_common_request failure, ret is %d",__func__,ret);

+        return ret;  

+    }     

+

+    ret=get_ret_code_for_hook(p);    

+

+    LYINFLOG("%s %d %d %d %d ret is %d",__func__,t_full_band_min,t_full_band_step,t_full_band_num,t_full_band_max,ret);     

+    delete p;

+    return ret;      

+}

+

+int lynq_get_oos_net_scan_cfg_full_band(int* t_full_band_min, int* t_full_band_step, int* t_full_band_num, int* t_full_band_max)

+{    

+    Parcel* p=NULL;

+    int ret=lynq_send_common_request(p,g_wait_time,RIL_REQUEST_OEM_HOOK_RAW,1,"%s","AT+ZSET=\"FREQ_SCAN\"");

+

+    if(ret!=RESULT_OK)

+    {

+        LYERRLOG("%s call lynq_send_common_request failure, ret is %d",__func__,ret);

+        return ret;  

+    }       

+    

+    int int_array_in_resp[MAX_AT_INT_RSP_NUM];

+    int valid_num;

+

+    ret=GetIntArrayInRespString(p,"FREQ_SCAN",int_array_in_resp,&valid_num);

+

+    if(ret==RESULT_OK && valid_num > 1)

+    {

+        *t_full_band_min = int_array_in_resp[0];

+        *t_full_band_step = int_array_in_resp[1];

+        *t_full_band_num = int_array_in_resp[2];

+        *t_full_band_max = int_array_in_resp[3];        

+    }

+    else 

+    {

+        ret=GetIntArrayInRespString(p,"ERROR",int_array_in_resp,&valid_num);

+        if(ret==RESULT_OK && valid_num > 0)

+        {

+            ret=int_array_in_resp[0];

+        }

+        else

+        {

+            ret=LYNQ_E_INNER_ERROR;

+        }

+    }

+

+    LYINFLOG("%s ret is %d",__func__,ret);  

+    delete p;

+    return ret;                

+}

+

+

+#define OOS_NET_SCAN_CFG_TYPE_FAST 0

+#define OOS_NET_SCAN_CFG_TYPE_FULL_BAND 1

+

+#elif defined(MODEM_GEN97) 

 /**@brief parse at response,return error code,and the response

 * @param response [IN] <response>:original at response,This parameter must be a character array.

 

@@ -1959,7 +2166,98 @@
  

 }

 

-DEFINE_LYNQ_LIB_LOG(LYNQ_NETWORK)

+#endif

+

+#if (defined MOBILETEK_TARGET_PLATFORM_T106) || (defined MODEM_GEN97)

+

+int lynq_set_oos_net_scan_cfg(int config_list[MAX_OOS_CFG_ITEM_NUMBER], int valid_num)

+{

+    if(g_module_init_flag != MODULE_RUNNING)

+    {

+        LYERRLOG("%s module state %d error",__func__,g_module_init_flag);

+        return LYNQ_E_CONFLICT;

+    }

+

+#ifdef MOBILETEK_TARGET_PLATFORM_T106

+    if(valid_num < 1)

+    {

+        LYERRLOG("%s paramter valid_num  %d error!",__func__,valid_num);

+        return LYNQ_E_PARAMETER_ANONALY;

+    }

+

+    if(config_list[0] == OOS_NET_SCAN_CFG_TYPE_FAST)  

+    {

+        if(valid_num <3 )

+        {            

+            LYERRLOG("%s paramter valid_num %d error!",__func__, valid_num);

+            return LYNQ_E_PARAMETER_ANONALY;

+        }        

+        return lynq_set_oos_net_scan_cfg_fast(config_list[1],config_list[2]);

+    }        

+    else if (config_list[0] == OOS_NET_SCAN_CFG_TYPE_FULL_BAND)

+    {

+        if(valid_num <5 )

+        {

+            

+            LYERRLOG("%s paramter valid_num %d error!",__func__, valid_num);

+            return LYNQ_E_PARAMETER_ANONALY;

+        }        

+        return lynq_set_oos_net_scan_cfg_full_band(config_list[1],config_list[2],config_list[3],config_list[4]);

+    }

+    else 

+    {

+        LYERRLOG("%s paramter type %d error!",__func__, config_list[0]);

+        return LYNQ_E_PARAMETER_ANONALY;

+    }     

+

+#else

+    if(valid_num < 4)

+    {

+        LYERRLOG("%s paramter valid_num  %d error!",__func__,valid_num);

+        return LYNQ_E_PARAMETER_ANONALY;

+    }

+    return lynq_oos_deep_sleep_recover_timer_interval(config_list[0],config_list[1],config_list[2],config_list[3]);   

+#endif    

+}

+

+

+int lynq_get_oos_net_scan_cfg(int config_list[MAX_OOS_CFG_ITEM_NUMBER], int* valid_num)

+{

+    if(g_module_init_flag != MODULE_RUNNING)

+    {

+        LYERRLOG("%s module state %d error",__func__,g_module_init_flag);

+        return LYNQ_E_CONFLICT;

+    }

+

+#ifdef MOBILETEK_TARGET_PLATFORM_T106   

+

+    if(NULL == valid_num || NULL == config_list)

+    {

+          LYERRLOG("%s there is parameter is NULL",__func__);  

+          return LYNQ_E_PARAMETER_ANONALY;

+    }      

+      

+

+    if(config_list[0] == OOS_NET_SCAN_CFG_TYPE_FAST)  

+    {

+        *valid_num=2;

+        return lynq_get_oos_net_scan_cfg_fast(&(config_list[0]),&(config_list[1]));

+    }        

+    else if (config_list[0] == OOS_NET_SCAN_CFG_TYPE_FULL_BAND)

+    {

+         *valid_num=4;

+         return lynq_get_oos_net_scan_cfg_full_band(&(config_list[0]),&(config_list[1]),&(config_list[2]),&(config_list[3]));

+    }

+    else 

+    {

+        LYERRLOG("%s paramter type %d error!",__func__, config_list[0]);

+        return LYNQ_E_PARAMETER_ANONALY;

+    }           

+#else    

+    return LYNQ_E_PARAMETER_ANONALY;

+#endif    

+}

 

 #endif

 

+DEFINE_LYNQ_LIB_LOG(LYNQ_NETWORK)

diff --git a/cap/zx297520v3/src/lynq/lib/liblynq-network/makefile b/cap/zx297520v3/src/lynq/lib/liblynq-network/makefile
index cf6f538..5505037 100755
--- a/cap/zx297520v3/src/lynq/lib/liblynq-network/makefile
+++ b/cap/zx297520v3/src/lynq/lib/liblynq-network/makefile
@@ -15,6 +15,9 @@
 LOCAL_CFLAGS += -DBINDER_IPC_32BIT=1 -DHAVE_ENDIAN_H -DHAVE_PTHREADS -DHAVE_SYS_UIO_H -DHAVE_POSIX_FILEMAP -DHAVE_STRLCPY -DHAVE_PRCTL -DHAVE_MEMSET16 -DHAVE_MEMSET32 -DANDROID_SMP=0
 endif
 
+ifeq ($(strip $(TARGET_PLATFORM)), T106)
+    LOCAL_CFLAGS += -DMOBILETEK_TARGET_PLATFORM_T106
+endif
 $(warning ################# lynq network demo ROOT: $(ROOT),includedir:$(includedir))
 LOCAL_PATH   = .
 
diff --git a/cap/zx297520v3/src/lynq/lib/liblynq-qser-audio/LICENSE b/cap/zx297520v3/src/lynq/lib/liblynq-qser-audio/LICENSE
new file mode 100644
index 0000000..605b7ea
--- /dev/null
+++ b/cap/zx297520v3/src/lynq/lib/liblynq-qser-audio/LICENSE
@@ -0,0 +1,31 @@
+Copyright Statement:
+
+This software/firmware and related documentation ("MobileTek Software") are
+protected under relevant copyright laws. The information contained herein is
+confidential and proprietary to MobileTek Inc. and/or its licensors. Without
+the prior written permission of MobileTek inc. and/or its licensors, any
+reproduction, modification, use or disclosure of MobileTek Software, and
+information contained herein, in whole or in part, shall be strictly
+prohibited.
+
+MobileTek Inc. (C) 2015. All rights reserved.
+
+BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MobileTek SOFTWARE")
+RECEIVED FROM MobileTek AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
+ON AN "AS-IS" BASIS ONLY. MobileTek 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 MobileTek PROVIDE ANY WARRANTY WHATSOEVER WITH
+RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
+INCORPORATED IN, OR SUPPLIED WITH THE MobileTek 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 MobileTek
+SOFTWARE. MobileTek SHALL ALSO NOT BE RESPONSIBLE FOR ANY MobileTek SOFTWARE
+RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MobileTek'S
+ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MobileTek SOFTWARE
+RELEASED HEREUNDER WILL BE, AT MobileTek'S OPTION, TO REVISE OR REPLACE THE
+MobileTek SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
+CHARGE PAID BY RECEIVER TO MobileTek FOR SUCH MobileTek SOFTWARE AT ISSUE.
diff --git a/cap/zx297520v3/src/lynq/lib/liblynq-qser-audio/include/lynq-qser-audio.h b/cap/zx297520v3/src/lynq/lib/liblynq-qser-audio/include/lynq-qser-audio.h
new file mode 100644
index 0000000..cc37b2e
--- /dev/null
+++ b/cap/zx297520v3/src/lynq/lib/liblynq-qser-audio/include/lynq-qser-audio.h
@@ -0,0 +1,45 @@
+/*******************************************************
+* 
+* @brief: Add audio api
+* @details:  add liblynq-qser-audio api
+* @author:   yu.dong
+* @date:     2023.9.28
+* @version:  V1.0
+* @copyright:Copyright (c) MobileTek
+*
+*********************************************/
+#ifndef LYNQ_QSER_AUDIO
+#define LYNQ_QSER_AUDIO
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include "sc_audio.h"
+
+sc_audio_handle_t playback_handle = SC_AUDIO_INVALID_HANDLE;
+sc_audio_handle_t capture_handle = SC_AUDIO_INVALID_HANDLE;
+
+typedef void (*_cb_onPlayer)(int);
+
+int qser_AudPlayer_Open(char* device, _cb_onPlayer cb_fun);
+int qser_AudPlayer_PlayFrmFile(int hdl, const char *fd, int offset);
+int qser_AudPlayer_Pause(int hdl);
+int qser_AudPlayer_Resume(int hdl);
+void qser_AudPlayer_Stop(int hdl);
+void qser_AudPlayer_Close(int hdl);
+
+int qser_AudRecorder_Open(char* device, _cb_onPlayer cb_fun);
+int qser_AudRecorder_StartRecord(int hdl, const char *fd, int offset);
+int qser_AudRecorder_Pause(void);
+int qser_AudRecorder_Resume(void);
+void qser_AudRecorder_Stop(void);
+void qser_AudRecorder_Close(void);
+
+void qser_Audio_Deinit(void);
+
+#ifdef __cplusplus
+}
+#endif
+#endif
+
diff --git a/cap/zx297520v3/src/lynq/lib/liblynq-qser-audio/lynq-qser-audio.cpp b/cap/zx297520v3/src/lynq/lib/liblynq-qser-audio/lynq-qser-audio.cpp
new file mode 100644
index 0000000..70b4e43
--- /dev/null
+++ b/cap/zx297520v3/src/lynq/lib/liblynq-qser-audio/lynq-qser-audio.cpp
@@ -0,0 +1,546 @@
+#include <stdint.h>
+#include <stdio.h>
+#include <string.h>
+
+#include "liblog/lynq_deflog.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include "sc_audio.h"
+#include "lynq-qser-audio.h"
+
+#define AUDIO_INIT_MAX_TRY_CNT 100
+
+#define SC_AUDIO_BE_DAI_MIN -1
+#define SC_AUDIO_STREAM_FORMAT_INVALID 0
+
+/********************************************************************
+* @brief: _cb_onPlayer, typedef for a callback function that is called
+          when an audio operation is performed
+* @param int [IN]: The result of the audio operation, 0 if successful, non-zero if failed
+* @return : void
+* @todo: NA
+* @see: NA
+* @warning: NA
+*********************************************************************/
+typedef void (*_cb_onPlayer)(int);
+
+/********************************************************************
+* @brief: playback_state_cb, callback function that is called when the audio playback state changes
+* @param handle [IN]: sc_audio_handle_t, the handle of the audio device
+* @param params [IN]: void*, parameters for the callback function
+* @param state [IN]: sc_audio_playback_state_e, the current state of audio playback
+* @return : int, 0 if successful, non-zero if failed
+* @todo: NA
+* @see: NA
+* @warning: NA
+*********************************************************************/
+int playback_state_cb (sc_audio_handle_t handle, void *params, sc_audio_playback_state_e state)
+{
+    LYINFLOG("playback_state_cb handle:0x%lx state:%d\n", handle, state);
+    return 0;
+}
+
+/********************************************************************
+* @brief: capture_state_cb, callback function that is called when the audio capture state changes
+* @param handle [IN]: sc_audio_handle_t, the handle of the audio device
+* @param params [IN]: void*, parameters for the callback function
+* @param state [IN]: sc_audio_capture_state_e, the current state of audio capture
+* @return : int, 0 if successful, non-zero if failed
+* @todo: NA
+* @see: NA
+* @warning: NA
+*********************************************************************/
+int capture_state_cb (sc_audio_handle_t handle, void *params, sc_audio_capture_state_e state)
+{
+    LYINFLOG("capture_state_cb handle:0x%lx state:%d\n", handle, state);
+
+    return 0;
+}
+
+/********************************************************************
+* @brief: get_device_enum, function to convert a device string to its corresponding enum
+* @param device [IN]: const char*, the name of the device
+* @return : sc_audio_fe_pcm_dev_e, the enum corresponding to the device name
+* @todo: NA
+* @see: NA
+* @warning: NA
+*********************************************************************/
+sc_audio_fe_pcm_dev_e get_device_enum(const char* device)
+{
+    if (strcmp(device, "device1") == 0)
+    {
+        return SC_AUDIO_FE_PCM_DEV_MULTIMEDIA1;
+    }
+    else if (strcmp(device, "device2") == 0)
+    {
+        return SC_AUDIO_FE_PCM_DEV_MULTIMEDIA2;
+    }
+    else
+    {
+        return SC_AUDIO_INVALID_HANDLE;
+    }
+}
+
+/********************************************************************
+* @brief: qser_AudPlayer_Open, open the audio device for playback
+* @param device [IN]: char* device, the audio device to be opened for playback
+* @param cb_fun [IN]: _cb_onPlayer, callback function to be called when the audio device is opened
+* @return : int, 0 if successful, non-zero if failed
+* @todo: NA
+* @see: NA
+* @warning: NA
+*********************************************************************/
+int qser_AudPlayer_Open(char* device, _cb_onPlayer cb_fun)
+{
+    int ret = SC_ERR_SUCCESS;
+    int retry_cnt = 0;
+    int audio_is_init = 0;
+
+    sc_audio_fe_pcm_dev_e device_enum = get_device_enum(device); // Convert device string to enum
+
+    while (AUDIO_INIT_MAX_TRY_CNT > retry_cnt)
+    {
+        ret = sc_audio_init();
+        if (SC_ERR_NOT_READY == ret)
+        {
+            LYINFLOG("audio service is not ready, try again, try count = %d\n", (retry_cnt + 1));
+            usleep(200 * 1000);
+            retry_cnt++;
+        }
+        else if (SC_ERR_SUCCESS == ret)
+        {
+            LYINFLOG("Success to initialize audio service\n");
+            audio_is_init = 1;
+            break;
+        }
+        else
+        {
+            LYINFLOG("Failed to initialize audio service, ret = %d\n", ret);
+            break;
+        }
+    }
+    if (1 != audio_is_init)
+    {
+        LYINFLOG("Failed to initialize audio service\n");
+        if (cb_fun != NULL)
+        {
+            cb_fun(-1);
+        }
+        return -1;
+    }
+
+    sc_audio_handle_t device_handle = sc_audio_playback_open(device_enum, SC_AUDIO_FE_PCM_DEV_MIN, SC_AUDIO_OWNER_ID_PLAYER);
+    if (SC_AUDIO_INVALID_HANDLE == device_handle)
+    {
+        LYINFLOG("Failed to open device: %s\n", device);
+        if (cb_fun != NULL)
+        {
+            cb_fun(-1);
+        }
+        return -1;
+    }
+
+    if (cb_fun != NULL)
+    {
+        cb_fun(0);
+    }
+    return 0;
+}
+
+/********************************************************************
+* @brief: qser_AudPlayer_PlayFrmFile, play audio from file
+* @param hdl [IN]: int, handle for the audio device or stream
+* @param fd [IN]: const char*, file descriptor of the audio file
+* @param offset [IN]: int, offset in the audio file
+* @return : success 0, failed -1
+* @todo: NA
+* @see: NA
+* @warning: NA
+*********************************************************************/
+int qser_AudPlayer_PlayFrmFile(int hdl, const char *fd, int offset)
+{
+    int error_line;
+    sc_audio_pcm_config_t pcm_config;
+    int ret = 0;
+    sc_audio_owner_id owner_id = hdl;
+
+    if(NULL== fd || 0 == strlen(fd))
+    {
+        error_line = __LINE__;
+        goto exit;
+    }
+
+    playback_handle = sc_audio_playback_open(SC_AUDIO_FE_PCM_DEV_MULTIMEDIA2,SC_AUDIO_FE_PCM_DEV_MIN,owner_id);
+    if (SC_AUDIO_INVALID_HANDLE == playback_handle)
+    {
+        error_line = __LINE__;
+        goto exit;
+    }
+
+    if(strlen(fd))
+    {
+        ret = sc_audio_playback_file_prepare(playback_handle, fd, NULL, playback_state_cb, NULL);
+        if (SC_ERR_SUCCESS != ret)
+        {
+            error_line = __LINE__;
+            goto exit;
+        }
+    }
+
+    ret = sc_audio_playback_play(playback_handle);
+    if (SC_ERR_SUCCESS != ret)
+    {
+        error_line = __LINE__;
+        goto exit;
+    }
+
+    return 0;
+exit:
+    LYINFLOG("qser_AudPlayer_PlayFrmFile error_line=%d\n",error_line);
+    return -1;
+}
+
+/********************************************************************
+* @brief: qser_AudPlayer_Pause, pause the audio playback
+* @param hdl [IN]: int, handle for the audio device or stream
+* @return : success 0, failed -1
+* @todo: NA
+* @see: NA
+* @warning: NA
+*********************************************************************/
+int qser_AudPlayer_Pause(int hdl)
+{
+    if (SC_AUDIO_INVALID_HANDLE == playback_handle)
+    {
+        LYINFLOG("qser_AudPlayer_Pause handle is invalid.\n");
+        return -1;
+    }
+    if( sc_audio_playback_pause(playback_handle))
+    {
+	LYINFLOG("qser_AudPlayer_Pause sc_audio_playback_pause fail.\n");
+        return -1;
+    }
+    return 0;
+}
+
+/********************************************************************
+* @brief: qser_AudPlayer_Resume, resume the audio playback
+* @param hdl [IN]: int, handle for the audio device or stream
+* @return : success 0, failed -1
+* @todo: NA
+* @see: NA
+* @warning: NA
+*********************************************************************/
+int qser_AudPlayer_Resume(int hdl)
+{
+    if (SC_AUDIO_INVALID_HANDLE == playback_handle)
+    {
+        LYINFLOG("qser_AudPlayer_Resume handle is invalid.\n");
+        return -1;
+    }
+    if( sc_audio_playback_resume(playback_handle))
+    {
+        LYINFLOG("qser_AudPlayer_Resume sc_audio_playback_resume fail.\n");
+        return -1;
+   }
+    return 0;
+}
+
+/********************************************************************
+* @brief: qser_AudPlayer_Stop, stop the audio playback
+* @param hdl [IN]: int, handle for the audio device or stream
+* @return : void
+* @todo: NA
+* @see: NA
+* @warning: NA
+*********************************************************************/
+void qser_AudPlayer_Stop(int hdl)
+{
+    if (SC_AUDIO_INVALID_HANDLE == playback_handle)
+    {
+	LYINFLOG("qser_AudPlayer_Stop handle is invalid.\n");
+	return;
+    }
+
+    if( sc_audio_playback_stop(playback_handle))
+    {
+        LYINFLOG("qser_AudPlayer_Stop sc_audio_playback_stop fail.\n");
+        return;
+    }
+}
+
+/********************************************************************
+* @brief: qser_AudPlayer_Close, close the audio playback
+* @param hdl [IN]: int, handle for the audio device or stream
+* @return : void
+* @todo: NA
+* @see: NA
+* @warning: NA
+*********************************************************************/
+void qser_AudPlayer_Close(int hdl)
+{
+    if (SC_AUDIO_INVALID_HANDLE == playback_handle)
+    {
+        LYINFLOG("qser_AudPlayer_Close handle is invalid.\n");
+        return;
+    }
+    if( sc_audio_playback_stop(playback_handle))
+    {
+        LYINFLOG("qser_AudPlayer_Close sc_audio_playback_stop fail.\n");
+        return;
+    }
+    if( sc_audio_playback_close(playback_handle))
+    {
+        LYINFLOG("qser_AudPlayer_Close sc_audio_playback_close fail.\n");
+        return;
+    }
+
+    playback_handle = SC_AUDIO_INVALID_HANDLE;
+}
+
+/********************************************************************
+* @brief: qser_AudRecorder_Open, open the audio device for recording
+* @param device [IN]: char* device, the audio device to be opened for recording
+* @param cb_fun [IN]: _cb_onPlayer, callback function to be called when the audio device is opened
+* @return : int, 0 if successful, non-zero if failed
+* @todo: NA
+* @see: NA
+* @warning: NA
+*********************************************************************/
+int qser_AudRecorder_Open(char* device, _cb_onPlayer cb_fun)
+{
+    int ret = SC_ERR_SUCCESS;
+    int retry_cnt = 0;
+    int audio_is_init = 0;
+
+    sc_audio_fe_pcm_dev_e device_enum = get_device_enum(device); // Convert device string to enum
+
+    while (AUDIO_INIT_MAX_TRY_CNT > retry_cnt)
+    {
+        ret = sc_audio_init();
+        if (SC_ERR_NOT_READY == ret)
+        {
+            LYINFLOG("audio service is not ready, try again, try count = %d\n", (retry_cnt + 1));
+            usleep(200 * 1000);
+            retry_cnt++;
+        }
+        else if (SC_ERR_SUCCESS == ret)
+        {
+            LYINFLOG("Success to initialize audio service\n");
+            audio_is_init = 1;
+            break;
+        }
+        else
+        {
+            LYINFLOG("Failed to initialize audio service, ret = %d\n", ret);
+            break;
+        }
+    }
+    if (1 != audio_is_init)
+    {
+        LYINFLOG("Failed to initialize audio service\n");
+        if (cb_fun != NULL)
+        {
+            cb_fun(-1);
+        }
+        return -1;
+    }
+
+    sc_audio_handle_t device_handle = sc_audio_playback_open(device_enum, SC_AUDIO_FE_PCM_DEV_MIN, SC_AUDIO_OWNER_ID_PLAYER);
+    if (SC_AUDIO_INVALID_HANDLE == device_handle)
+    {
+        LYINFLOG("Failed to open device: %s\n", device);
+        if (cb_fun != NULL)
+        {
+            cb_fun(-1);
+        }
+        return -1;
+    }
+
+    if (cb_fun != NULL)
+    {
+        cb_fun(0);
+    }
+    return 0;
+}
+
+/********************************************************************
+* @brief: qser_AudRecorder_StartRecord, play a file with capture
+* @param hdl [IN]: int, handle for the audio device or stream
+* @param fd [IN]: const char*, file descriptor of the audio file
+* @param offset [IN]: int, offset in the audio file
+* @return : int, 0 if successful, -1 if failed
+* @todo: NA
+* @see: NA
+* @warning: NA
+*********************************************************************/
+int qser_AudRecorder_StartRecord(int hdl, const char *fd, int offset)
+{
+    int error_line;
+    sc_audio_pcm_config_t pcm_config;
+    int ret = 0;
+    sc_audio_owner_id owner_id = hdl;
+
+    if(NULL== fd || 0 == strlen(fd))
+    {
+        error_line = __LINE__;
+        goto exit;
+    }
+
+    capture_handle = sc_audio_capture_open(SC_AUDIO_FE_PCM_DEV_MULTIMEDIA1,SC_AUDIO_BE_DAI_MIN);
+    if (SC_AUDIO_INVALID_HANDLE == capture_handle)
+    {
+        error_line = __LINE__;
+        goto exit;
+    }
+
+    memset(&pcm_config, 0, sizeof(sc_audio_pcm_config_t));
+
+    ret = sc_audio_capture_file_prepare(capture_handle, fd, SC_AUDIO_STREAM_FORMAT_INVALID, NULL, capture_state_cb, NULL);
+    if (SC_ERR_SUCCESS != ret)
+    {
+        error_line = __LINE__;
+        goto exit;
+    }
+
+    ret = sc_audio_capture_record(capture_handle);
+    if (SC_ERR_SUCCESS != ret)
+    {
+        error_line = __LINE__;
+        goto exit;
+    }
+
+    return 0;
+exit:
+    LYINFLOG("qser_AudRecorder_StartRecord error_line=%d\n",error_line);
+    return -1;
+}
+
+/********************************************************************
+* @brief: qser_AudRecorder_Pause, pause the audio capture
+* @return : int, 0 if successful, -1 if failed
+* @todo: NA
+* @see: NA
+* @warning: NA
+*********************************************************************/
+int qser_AudRecorder_Pause(void)
+{
+    if (SC_AUDIO_INVALID_HANDLE == capture_handle)
+    {
+        LYINFLOG("qser_AudRecorder_Pause capture_handle is invalid.\n");
+        return -1;
+    }
+    if( sc_audio_capture_pause(capture_handle))
+    {
+	LYINFLOG("qser_AudRecorder_Pause sc_audio_capture_pause fail.\n");
+	return -1;
+    }
+    return 0;
+}
+
+/********************************************************************
+* @brief: qser_AudRecorder_Resume, resume the audio capture
+* @return : int, 0 if successful, -1 if failed
+* @todo: NA
+* @see: NA
+* @warning: NA
+*********************************************************************/
+int qser_AudRecorder_Resume(void)
+{
+    if (SC_AUDIO_INVALID_HANDLE == capture_handle)
+    {
+        LYINFLOG("qser_AudRecorder_Resume capture_handle is invalid.\n");
+        return -1;
+    }
+    if( sc_audio_capture_resume(capture_handle))
+    {
+        LYINFLOG("qser_AudRecorder_Resume sc_audio_capture_resume fail.\n");
+        return -1;
+    }
+    return 0;
+}
+
+/********************************************************************
+* @brief: qser_AudRecorder_Stop, stop the audio capture
+* @return : void
+* @todo: NA
+* @see: NA
+* @warning: NA
+*********************************************************************/
+void qser_AudRecorder_Stop(void)
+{
+    if (SC_AUDIO_INVALID_HANDLE == capture_handle)
+    {
+        LYINFLOG("qser_AudRecorder_Stop capture_handle is invalid.\n");
+        return;
+    }
+    if( sc_audio_capture_stop(capture_handle))
+    {
+        LYINFLOG("qser_AudRecorder_Stop sc_audio_capture_stop fail.\n");
+        return;
+    }
+}
+
+/********************************************************************
+* @brief: qser_AudRecorder_Close, close the audio capture
+* @return : void
+* @todo: NA
+* @see: NA
+* @warning: NA
+*********************************************************************/
+void qser_AudRecorder_Close(void)
+{
+    if (SC_AUDIO_INVALID_HANDLE == capture_handle)
+    {
+        LYINFLOG("qser_AudRecorder_Close capture_handle is invalid.\n");
+        return;
+    }
+    if( sc_audio_capture_stop(capture_handle))
+    {
+        LYINFLOG("qser_AudRecorder_Close sc_audio_capture_stop fail.\n");
+        return;
+    }
+    if( sc_audio_capture_close(capture_handle))
+    {
+        LYINFLOG("qser_AudRecorder_Close sc_audio_capture_close fail.\n");
+        return;
+    }
+
+    capture_handle = SC_AUDIO_INVALID_HANDLE;
+}
+
+/********************************************************************
+* @brief: qser_Audio_Deinit, deinitialize the audio system, stop and close any active playback or capture,
+          and uninitialize the audio system
+* @return : void
+* @todo: NA
+* @see: NA
+* @warning: NA
+*********************************************************************/
+void qser_Audio_Deinit(void)
+{
+    if(SC_AUDIO_INVALID_HANDLE != playback_handle)
+    {
+        sc_audio_playback_stop(playback_handle);
+        sc_audio_playback_close(playback_handle);
+        playback_handle = SC_AUDIO_INVALID_HANDLE;
+    }
+
+    if(SC_AUDIO_INVALID_HANDLE != capture_handle)
+    {
+        sc_audio_capture_stop(capture_handle);
+        sc_audio_capture_close(capture_handle);
+        capture_handle = SC_AUDIO_INVALID_HANDLE;
+    }
+
+    sc_audio_uninit();
+}
+
+DEFINE_LYNQ_LIB_LOG(LYNQ_AUDIO)
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/cap/zx297520v3/src/lynq/lib/liblynq-qser-audio/makefile b/cap/zx297520v3/src/lynq/lib/liblynq-qser-audio/makefile
new file mode 100644
index 0000000..cef3517
--- /dev/null
+++ b/cap/zx297520v3/src/lynq/lib/liblynq-qser-audio/makefile
@@ -0,0 +1,48 @@
+SHELL = /bin/sh

+RM = rm -f

+

+LOCAL_CFLAGS := -Wall \

+                -std=gnu++14 \

+                -g -Os \

+                -flto \

+                -fPIC \

+                -fpermissive \

+

+LOCAL_PATH   = .

+

+LOCAL_C_INCLUDES = \

+  -I. \

+  -I$(LOCAL_PATH)/include \

+  -I$(LOCAL_PATH)/ \

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

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

+

+LOCAL_LIBS := \

+    -L. \

+    -ldl \

+    -lstdc++ \

+    -llynq-log \

+    -lmedia \

+

+SOURCES = lynq-qser-audio.cpp

+LIBRARY = liblynq-qser-audio.so

+

+OBJECTS=$(SOURCES:.cpp=.o)

+

+all: $(LIBRARY)

+

+$(LIBRARY): $(OBJECTS)

+	$(CXX) -shared -o $@ $(OBJECTS) $(LOCAL_LIBS) $(LOCAL_CFLAGS) $(LOCAL_C_INCLUDES)

+

+%.o : %.cpp

+	$(CXX) $(LOCAL_C_INCLUDES) $(LOCAL_CFLAGS) $(LOCAL_LIBS) -fPIC -c $<

+

+install:

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

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

+	mkdir -p $(ROOT)$(includedir)/$(NAME)/sdk

+

+clean:

+	$(RM) $(OBJECTS) $(LIBRARY)

+

+

diff --git a/cap/zx297520v3/src/lynq/lib/liblynq-qser-gnss/makefile b/cap/zx297520v3/src/lynq/lib/liblynq-qser-gnss/makefile
index b18390b..c59a62e 100755
--- a/cap/zx297520v3/src/lynq/lib/liblynq-qser-gnss/makefile
+++ b/cap/zx297520v3/src/lynq/lib/liblynq-qser-gnss/makefile
@@ -32,6 +32,7 @@
     -lpthread \

     -llynq-log \

     -lxml2 \

+    -llynq-uci \

 

 

 SOURCES = $(wildcard *.c wildcard *.h src/*.cpp)

diff --git a/cap/zx297520v3/src/lynq/lib/liblynq-qser-gnss/src/lynq_qser_gnss.cpp b/cap/zx297520v3/src/lynq/lib/liblynq-qser-gnss/src/lynq_qser_gnss.cpp
index 250d609..8884a7a 100755
--- a/cap/zx297520v3/src/lynq/lib/liblynq-qser-gnss/src/lynq_qser_gnss.cpp
+++ b/cap/zx297520v3/src/lynq/lib/liblynq-qser-gnss/src/lynq_qser_gnss.cpp
@@ -34,6 +34,7 @@
 #include "mbtk_gnss_internal.h"
 #include "ringbuffer.h"
 #include "lynq_qser_gnss.h"
+#include "include/lynq_uci.h"
 DEFINE_LYNQ_LIB_LOG(LYNQ_QSER_GNSS)
 #ifdef __cplusplus
 extern "C" {
@@ -41,6 +42,8 @@
 
 int ret;
 LYNQ_INJECT_TIME_INTO_T time_test;
+int g_gnss_sync_enable_flag = 0;
+int g_gnss_sync_done = 0;
 
 int qser_Gnss_Init(uint32_t *h_gnss)
 {
@@ -132,6 +135,12 @@
 int qser_Gnss_Start(uint32_t h_gnss)
 {
     struct mbtk_gnss_handle_t *gnss_handle = (struct mbtk_gnss_handle_t *)h_gnss;
+
+    char gnss_sync_enable[24] = "";
+    lynq_get_value("lynq_uci", "lynq_sync_time", "lynq_gnss_sync_time_enable" , gnss_sync_enable);
+    g_gnss_sync_enable_flag = atoi(gnss_sync_enable);
+    g_gnss_sync_done = 0;
+
     lynq_open_gps(1);
     ALOGE("GNSS_VALUE: %d\n",gpio21_value);
     if(gpio21_value == 1)
diff --git a/cap/zx297520v3/src/lynq/lib/liblynq-qser-gnss/src/mbtk_gnss.cpp b/cap/zx297520v3/src/lynq/lib/liblynq-qser-gnss/src/mbtk_gnss.cpp
index b7054f1..e7dba8f 100755
--- a/cap/zx297520v3/src/lynq/lib/liblynq-qser-gnss/src/mbtk_gnss.cpp
+++ b/cap/zx297520v3/src/lynq/lib/liblynq-qser-gnss/src/mbtk_gnss.cpp
@@ -25,6 +25,35 @@
 extern "C" {
 #endif
 
+#define _XOPEN_SOURCE
+#define NMEA_RMC "RMC"
+extern long timezone;
+extern int g_gnss_sync_enable_flag;
+extern int g_gnss_sync_done;
+static inline int update_system_time(time_t timestamp)
+{
+    struct timeval tv;
+    int ret = gettimeofday(&tv, NULL);
+    if (ret == -1) {
+        perror("gettimeofday");
+        return -1;
+    }
+    if (tv.tv_sec == timestamp)
+    {
+        return 0;
+    }
+    printf("Now: %ld\n", tv.tv_sec);
+    tv.tv_sec = timestamp;
+    tv.tv_usec = 0;
+
+    ret = settimeofday(&tv, NULL);
+    if (ret == -1) {
+        perror("settimeofday");
+        return -1;
+    }
+
+    return 0;
+}
 
 struct mbtk_gnss_handle_t
 {
@@ -180,14 +209,17 @@
     memcpy(tmp_char, &time[6], 2);
     tmp_time->tm_mday = atoi(tmp_char);
     memcpy(tmp_char, &time[8], 2);
-    tmp_time->tm_mon = atoi(tmp_char);
+    tmp_time->tm_mon = atoi(tmp_char) - 1;
     memcpy(tmp_char, &time[10], 2);
     tmp_time->tm_year = 100 + atoi(tmp_char);
 
     time_t _t = mktime(tmp_time);//按当地时区解析tmp_time
-    // gnss_log("timestamp: %ld\n",_t);
-    free(tmp_time);
+    //gnss_log("timestamp: %ld\n",_t);
+    tzset();
+    _t = _t - timezone;
+    //gnss_log("timestamp: %ld\n",_t);
 
+    free(tmp_time);
     return _t;
 }
 /**
@@ -451,7 +483,17 @@
         handle->gnss_handler_func((uint32)handle, E_MT_LOC_MSG_ID_LOCATION_INFO, &mopen_location_info, NULL);
         memset(&mopen_location_info, 0, sizeof(mopen_location_info));
     }
-
+    //set system time.
+    if (g_gnss_sync_enable_flag == 1 && g_gnss_sync_done == 0)
+    {
+        if( strncmp(data+3,NMEA_RMC,strlen(NMEA_RMC)) == 0 && data[17] == 'A')
+        {
+            if (update_system_time(nmea_info.timestamp) == 0)
+            {
+                g_gnss_sync_done = 1;
+            }
+        }
+    }
     return;
 }
 
diff --git a/cap/zx297520v3/src/lynq/lib/liblynq-qser-network/include/lynq_qser_network.h b/cap/zx297520v3/src/lynq/lib/liblynq-qser-network/include/lynq_qser_network.h
index b65e428..0e571fa 100755
--- a/cap/zx297520v3/src/lynq/lib/liblynq-qser-network/include/lynq_qser_network.h
+++ b/cap/zx297520v3/src/lynq/lib/liblynq-qser-network/include/lynq_qser_network.h
@@ -35,6 +35,35 @@
     E_QSER_NW_ROAM_STATE_TYPE_T   roaming_pref;       /**<   Roaming preference.*/
 }QSER_NW_CONFIG_INFO_T;
 
+/** Configures the OOS (out of service)  settings that define the MCM network interface. */
+#define QSER_NW_OOS_CFG_TYPE_FAST_SCAN          0x00    /**<  fast net scan */
+#define QSER_NW_OOS_CFG_TYPE_FULL_BAND_SCAN     0x01    /**<  full band scan */
+
+typedef struct 
+{
+    /*    Configuration parameters for MCM network fast network scan when OOS (out of service)*/
+    char                        enable;
+    uint16_t                    time_interval;
+}QSER_NW_OOS_CONFIG_FAST_SCAN_INFO_T;
+
+typedef struct 
+{
+    /*    Configuration parameters for MCM network full band network scan when OOS (out of service)*/
+    int t_min;
+    int t_step;
+    int t_num;
+    int t_max;
+}QSER_NW_OOS_CONFIG_FULL_BAND_SCAN_INFO_T;
+
+
+typedef struct 
+{    
+    char                        type;  /**<   QSER_NW_OOS_CFG_TYPE_xxxx.*/
+    union {
+    QSER_NW_OOS_CONFIG_FAST_SCAN_INFO_T  fast_can_info;       // 00
+    QSER_NW_OOS_CONFIG_FULL_BAND_SCAN_INFO_T full_band_scan_info;     // 01   
+  } u;
+}QSER_NW_OOS_CONFIG_INFO_T;
 
 //defined for QSER_NW_EventRegister
 #define     NW_IND_VOICE_REG_EVENT_IND_FLAG               (1 << 0)    /**< msg format : QSER_NW_VOICE_REG_EVENT_IND_T */
@@ -346,6 +375,18 @@
     QSER_NW_CONFIG_INFO_T     *pt_info 
 );
 
+int qser_nw_set_oos_config
+(
+    nw_client_handle_type       h_nw,
+    QSER_NW_OOS_CONFIG_INFO_T     *pt_info 
+);
+
+int qser_nw_get_oos_config
+(
+    nw_client_handle_type       h_nw,
+    QSER_NW_OOS_CONFIG_INFO_T     *pt_info 
+);
+
 int qser_nw_event_register
 (
     nw_client_handle_type       h_nw,
diff --git a/cap/zx297520v3/src/lynq/lib/liblynq-qser-network/lynq_qser_network.cpp b/cap/zx297520v3/src/lynq/lib/liblynq-qser-network/lynq_qser_network.cpp
index 0a32515..b1539a7 100755
--- a/cap/zx297520v3/src/lynq/lib/liblynq-qser-network/lynq_qser_network.cpp
+++ b/cap/zx297520v3/src/lynq/lib/liblynq-qser-network/lynq_qser_network.cpp
@@ -273,6 +273,101 @@
     return RESULT_OK;
 }
 
+int qser_nw_set_oos_config(    nw_client_handle_type       h_nw,QSER_NW_OOS_CONFIG_INFO_T     *pt_info
+)
+{
+    if(NULL == pt_info)
+     {
+         LYERRLOG("invalid client parameters incoming");
+         return RESULT_ERROR;
+     }
+     
+     if(h_nw != g_ph_hw || h_nw == INVALID_CLIENT_HANDLE)
+     {
+         LYERRLOG("h_nw not right %d %d",h_nw,g_ph_hw);
+         return RESULT_ERROR;
+     }    
+
+     int config_list[MAX_OOS_CFG_ITEM_NUMBER];
+     int valid_num;
+
+     if(pt_info->type==QSER_NW_OOS_CFG_TYPE_FAST_SCAN)
+     {
+         config_list[0]=QSER_NW_OOS_CFG_TYPE_FAST_SCAN;
+         config_list[1]=pt_info->u.fast_can_info.enable;
+         config_list[2]=pt_info->u.fast_can_info.time_interval;
+         return lynq_set_oos_net_scan_cfg(config_list, 3);
+     }
+     else if(pt_info->type==QSER_NW_OOS_CFG_TYPE_FULL_BAND_SCAN)
+     {
+         config_list[0]=QSER_NW_OOS_CFG_TYPE_FULL_BAND_SCAN;
+         config_list[1]=pt_info->u.full_band_scan_info.t_min;
+         config_list[2]=pt_info->u.full_band_scan_info.t_step;
+         config_list[3]=pt_info->u.full_band_scan_info.t_num;
+         config_list[4]=pt_info->u.full_band_scan_info.t_max;
+         return lynq_set_oos_net_scan_cfg(config_list, 5);
+     }
+     else
+     {
+        LYERRLOG("invalid client parameters %d incoming", pt_info->type);
+        return RESULT_ERROR;
+     }     
+}
+
+int qser_nw_get_oos_config(    nw_client_handle_type   h_nw, QSER_NW_OOS_CONFIG_INFO_T *pt_info)
+{
+    if(NULL == pt_info)
+    {
+        LYERRLOG("invalid client parameters incoming");
+        return RESULT_ERROR;
+    }
+    
+    if(h_nw != g_ph_hw || h_nw == INVALID_CLIENT_HANDLE)
+    {
+        LYERRLOG("h_nw not right %d %d",h_nw,g_ph_hw);
+        return RESULT_ERROR;
+    }  
+
+    int config_list[MAX_OOS_CFG_ITEM_NUMBER];
+    int valid_num;
+    int ret;
+
+    if(pt_info->type==QSER_NW_OOS_CFG_TYPE_FAST_SCAN)
+    {
+        config_list[0]=QSER_NW_OOS_CFG_TYPE_FAST_SCAN;        
+        ret=lynq_get_oos_net_scan_cfg(config_list, &valid_num);
+        if(ret==RESULT_OK || valid_num > 1)
+        {
+            pt_info->u.fast_can_info.enable=config_list[0];
+            pt_info->u.fast_can_info.time_interval=config_list[1];
+            return RESULT_OK;
+        }
+        LYERRLOG("type %d invalid return value %d %d",pt_info->type,ret,valid_num);
+        return RESULT_ERROR;         
+     }
+     else if(pt_info->type==QSER_NW_OOS_CFG_TYPE_FULL_BAND_SCAN)
+     {
+         config_list[0]=QSER_NW_OOS_CFG_TYPE_FULL_BAND_SCAN;        
+         ret=lynq_get_oos_net_scan_cfg(config_list, &valid_num);
+         if(ret==RESULT_OK || valid_num > 3)
+         {
+             pt_info->u.full_band_scan_info.t_min=config_list[0];
+             pt_info->u.full_band_scan_info.t_step=config_list[1];            
+             pt_info->u.full_band_scan_info.t_num=config_list[2];
+             pt_info->u.full_band_scan_info.t_max=config_list[3];
+             return RESULT_OK;
+         }
+         LYERRLOG("type %d invalid return value %d %d",pt_info->type,ret,valid_num);
+         return RESULT_ERROR;        
+     }
+     else
+     {
+        LYERRLOG("invalid client parameters %d incoming", pt_info->type);
+        return RESULT_ERROR;
+     }     
+    
+}
+
 /*To Do*/
 int qser_nw_event_register(nw_client_handle_type h_nw,uint32_t bitmask)
 {
diff --git a/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/arch/arm/boot/dts/zx297520v3-pinctrl.dtsi b/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/arch/arm/boot/dts/zx297520v3-pinctrl.dtsi
index 3da6c4e..f9f558d 100755
--- a/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/arch/arm/boot/dts/zx297520v3-pinctrl.dtsi
+++ b/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/arch/arm/boot/dts/zx297520v3-pinctrl.dtsi
@@ -346,7 +346,7 @@
 	};
 
 	sc_ext_int10: sc_ext_int10 {
-		pins = "EXT_INT10";
+		pins = "GPIO129";   /*jb.qi add for EXT_INIT10 success*/
 		function = "EXT_INT10";
 		bias-disable;
 	};
diff --git a/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/arch/arm/boot/dts/zx297520v3-vehicle_dc_ref.dts b/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/arch/arm/boot/dts/zx297520v3-vehicle_dc_ref.dts
index f2fef72..da48fcc 100755
--- a/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/arch/arm/boot/dts/zx297520v3-vehicle_dc_ref.dts
+++ b/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/arch/arm/boot/dts/zx297520v3-vehicle_dc_ref.dts
@@ -130,14 +130,14 @@
 //	status = "okay";
 };
 &codec_ti3104 {
-//	status = "okay";
+	status = "okay";
 };	
 &zx29_ti3104 {
 	pinctrl-0 = <&i2s0_pins>;
-//	status = "okay";
+	status = "okay";
 };
 &codec_nau8810 {
-	status = "okay";
+//	status = "okay";
 };	
 &zx29_nau8810 {
 	pinctrl-0 = <&i2s0_pins>;
@@ -155,11 +155,11 @@
 //	status = "okay";
 };
 &codec_es8311 {
-	status = "okay";
+//	status = "okay";
 };	
 &zx29_es8311 {
 	pinctrl-0 = <&i2s0_pins>;
-	status = "okay";
+//	status = "okay";
 };
 &gmac {
     port-nums = <1>;
diff --git a/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/arch/arm/boot/dts/zx297520v3.dtsi b/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/arch/arm/boot/dts/zx297520v3.dtsi
index 24faec9..29f581a 100755
--- a/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/arch/arm/boot/dts/zx297520v3.dtsi
+++ b/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/arch/arm/boot/dts/zx297520v3.dtsi
@@ -488,13 +488,13 @@
 			codec_ti3104: ti3104@18 {         
 				compatible = "ti,tlv320aic3104";
 				reg = <0x18>;		
-				reset-gpios = <&bgpio 122 GPIO_ACTIVE_HIGH>;/*RST*/
+				reset-gpios = <&bgpio 119 GPIO_ACTIVE_HIGH>;/*RST*/
 				ai3x-micbias-vg = <MICBIAS_2_0V>;
 
-				clocks = <&clkc CLKOUT1_CLK>;
+				clocks = <&clkc CLKOUT2_CLK>;
 				clock-names = "clk_out";			
 				pinctrl-names = "clk_out","reset_gpio122";			
-				pinctrl-0 = <&clk1_func_pins>;
+				pinctrl-0 = <&clk2_func_pins>;
 				pinctrl-1 = <&codec_reset_pins>;
 				status = "disabled";
 			};
@@ -596,13 +596,13 @@
 
 			/* interrupts:  */		
 			interrupts = <GIC_SPI SD1_INT IRQ_TYPE_LEVEL_HIGH>,
-						<GIC_SPI SD1_DATA1_INT IRQ_TYPE_LEVEL_HIGH>,
-						<GIC_SPI EX4_INT IRQ_TYPE_LEVEL_HIGH>;
+						<GIC_SPI SD1_DATA1_INT IRQ_TYPE_LEVEL_HIGH>/*,
+						<GIC_SPI EX4_INT IRQ_TYPE_LEVEL_HIGH>*/; //jb.qi change for irq 4 fail
 			clocks = <&clkc SD1_WCLK>, <&clkc SD1_HCLK>, <&clkc SD1_CDET>;
 			clock-names = "ciu", "biu","mmc_cdet";	
 
 			//cd-gpios = <&bgpio 51 GPIO_ACTIVE_LOW>;
-			gpios = <&bgpio 51 GPIO_ACTIVE_LOW>,<&bgpio 85 GPIO_ACTIVE_LOW>;//cd ,emmc en
+			gpios = /*<&bgpio 51 GPIO_ACTIVE_LOW>,*/<&bgpio 85 GPIO_ACTIVE_LOW>;//jb.qi add for irq 4 fail
 			pinctrl-names = "mmc_pins" ,"mmc_cd_int","mmc_cd_gpio","mmc_vcc_en";
 			pinctrl-0 = <&sd1_sd1>;
 			pinctrl-1 = <&sd1_cd_int>;
diff --git a/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/sound/soc/codecs/tlv320aic3x.c b/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/sound/soc/codecs/tlv320aic3x.c
index 4f01cbc..09ef085 100755
--- a/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/sound/soc/codecs/tlv320aic3x.c
+++ b/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/sound/soc/codecs/tlv320aic3x.c
@@ -1018,6 +1018,15 @@
 	struct aic3x_priv *info = dev_get_drvdata(dev);
 	struct device_node *np = dev->of_node;
 
+        #if 1
+        unsigned tmp;
+        void __iomem 	*reg_base;
+        reg_base = ioremap(0x13B000+0x94 ,4);
+        tmp  = ioread32(reg_base);
+        tmp |= (1<<0)|(1<<2);
+        iowrite32(tmp,reg_base);
+        #endif
+
 	dev_info(dev, "%s:start!\n", __func__);
 
 	if(dev == NULL){
@@ -1059,7 +1068,7 @@
 	
 	clk = of_clk_get_by_name(np, "clk_out");	
 	if (IS_ERR(clk)) {
-		dev_err(dev, "Could not get clk_out\n");
+		dev_err(dev, "Could not get clk_out0\n");
 		ret = PTR_ERR(clk);
 		goto err_put_pinctrl;
 	}			
@@ -1203,7 +1212,7 @@
 		regmap_read(info->regmap, AIC3X_PAGE_SELECT, &pre_page);
 	
 		regmap_write(info->regmap, AIC3X_PAGE_SELECT, 0);
-		for (i = regmin; i < regmax; i++) {
+		for (i = regmin; i <= regmax; i++) {
 	
 			//val = snd_soc_component_read(info->component, i); 	
 			regmap_read(info->regmap, i, &val);
@@ -1260,6 +1269,7 @@
 		if( ret == 0)
 		{
 			dev_info(dev, "reg_read start\n");
+			/*
 			if(param1 > 1){
 				dev_err(dev, "reg_read param invalidate fail,param1=%d \n",param1);
 				return -1;		
@@ -1268,10 +1278,14 @@
 			if(param2 > regmax){
 				dev_err(dev, "reg_read param invalidate fail,param2=%d \n",param2);
 				return -1;		
-			}	
-	
+			}
+		        */
 
-			
+                        if(param1 < 0 || param1 > 109){
+				dev_err(dev, "reg_read param invalidate fail,param1=%d \n",param1);
+				return -1;
+			}
+
 			regmap_read(info->regmap, AIC3X_PAGE_SELECT, &pre_page);
 			
 			regmap_write(info->regmap, AIC3X_PAGE_SELECT, regpage);
@@ -1295,6 +1309,8 @@
 			//u32 offset = param1;
 			//u32 mask = param2;
 			dev_info(dev, "reg_write start\n");  
+
+			/*
 			if(param1 > 1){
 				dev_err(dev, "reg_write param invalidate fail,param1=%d \n",param1);
 				return -1;		
@@ -1303,9 +1319,14 @@
 			if(param2 > regmax){
 				dev_err(dev, "reg_write param invalidate fail,param1=%d \n",param1);
 				return -1;		
-			}	
+			}
+			*/
 
-			
+			if(param1 < 0 || param1 > 109){
+				dev_err(dev, "reg_write param invalidate fail,param1=%d \n",param1);
+				return -1;
+			}
+
 			regmap_read(info->regmap, AIC3X_PAGE_SELECT, &pre_page);
 			
 			regmap_write(info->regmap, AIC3X_PAGE_SELECT, regpage);
@@ -1846,13 +1867,15 @@
 	.name = "tlv320aic3x-hifi",
 	.playback = {
 		.stream_name = "Playback",
-		.channels_min = 2,
+		//.channels_min = 2,
+		.channels_min = 1,
 		.channels_max = 2,
 		.rates = AIC3X_RATES,
 		.formats = AIC3X_FORMATS,},
 	.capture = {
 		.stream_name = "Capture",
-		.channels_min = 2,
+		//.channels_min = 2,
+		.channels_min = 1,
 		.channels_max = 2,
 		.rates = AIC3X_RATES,
 		.formats = AIC3X_FORMATS,},
diff --git a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/at_ctl/src/atconfig/ps_normal.c b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/at_ctl/src/atconfig/ps_normal.c
index caac23e..83a78d5 100755
--- a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/at_ctl/src/atconfig/ps_normal.c
+++ b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/at_ctl/src/atconfig/ps_normal.c
@@ -22,6 +22,11 @@
 //bsim

 #include <openssl/aes.h>

 

+//>>>sj.zhang add @2023-10-08 for fix the issue of timezone.

+#define _XOPEN_SOURCE

+extern long timezone;

+//>>>sj.zhang add @2023-10-08 for fix the issue of timezone end.

+

 typedef struct

 {

 	unsigned int pubKeyRsaE[32];

@@ -115,13 +120,13 @@
 	void *p[5] = {&timeinfo.time_zone,&timeinfo.sav_time,temp1,temp2,timeinfo.univer_time};

 	int time_zone = 0;

 	

-	//>>>sj.zhang add @2023-08-10 for systime NITZ sync enable/disenable.

+//>>>sj.zhang add @2023-08-10 for systime NITZ sync enable/disenable.

 	if(0 != system("uci get lynq_uci.lynq_sync_time.lynq_modem_sync_time_enable | grep -E \'^1$\'"))

 	{

 		at_print(AT_ERR,"zmmi_auto_act: nitz disenabled. \n");

 		return AT_END;

 	}

-	//>>>sj.zhang add @2023-08-10 end.

+//>>>sj.zhang add @2023-08-10 end.

 

     sc_cfg_get("sntp_time_set_mode", mode, sizeof(mode));

 	if(strcmp(mode, "manual") == 0)

@@ -158,7 +163,10 @@
 	set_tm.tm_mon = set_tm.tm_mon - 1;	

 

 	time_tv.tv_sec = mktime(&set_tm);

-	time_tv.tv_sec = time_tv.tv_sec +	time_zone * 3600 /4;

+//>>>sj.zhang add @2023-10-08 for fix the issue of timezone.

+	tzset();

+	time_tv.tv_sec = time_tv.tv_sec - timezone;

+//>>>sj.zhang add @2023-10-08 for fix the issue of timezone end.

 		

 	

 	if (0 != settimeofday(&time_tv,NULL))