Merge "[Feature][T8TSK-80][TCAM_T800_SW_0266]Switch the NDIS outgoing port through the uai mounting mode" into MR3.0-merge
diff --git a/meta-sdk/meta/meta-lynqSDK-T800/conf/machine/auto2735evb-ivt-main.conf b/meta-sdk/meta/meta-lynqSDK-T800/conf/machine/auto2735evb-ivt-main.conf
index e54616a..1f7f9a1 100755
--- a/meta-sdk/meta/meta-lynqSDK-T800/conf/machine/auto2735evb-ivt-main.conf
+++ b/meta-sdk/meta/meta-lynqSDK-T800/conf/machine/auto2735evb-ivt-main.conf
@@ -33,6 +33,9 @@
 #UART_CFG value:"PLATFORM","GSW"
 MOBILETEK_UART_CFG = "PLATFORM"
 
+#USB_CFG value:"PLATFORM","GSW"
+MOBILETEK_USB_CFG = "PLATFORM"
+
 #ndis_CFG value:"PLATFORM","GSW"
 MOBILETEK_NDIS_CFG = "PLATFORM"
 
diff --git a/meta-sdk/meta/meta-lynqSDK-T800/recipes-core/initial/files/init_usb_gsw b/meta-sdk/meta/meta-lynqSDK-T800/recipes-core/initial/files/init_usb_gsw
new file mode 100755
index 0000000..1fad189
--- /dev/null
+++ b/meta-sdk/meta/meta-lynqSDK-T800/recipes-core/initial/files/init_usb_gsw
@@ -0,0 +1,107 @@
+#!/bin/busybox sh
+
+if [ "$1" == "pre" ]; then
+    echo "=== Initial: USB Configuration Start ===" > /dev/kmsg
+
+    if [ -e "/dev/usb-ffs" ] ; then
+        echo "=== Bypass Pre Configuration ===" > /dev/kmsg
+    else # first boot
+        mkdir -p /dev/usb-ffs
+        mkdir -p /dev/usb-ffs/adb
+        mount none /sys/kernel/config -t configfs
+        mkdir -p /sys/kernel/config/usb_gadget/g1/functions/ffs.adb
+        mkdir -p /sys/kernel/config/usb_gadget/g1/functions/rndis.gs4
+        mkdir -p /sys/kernel/config/usb_gadget/g1/functions/ncm.f0
+        mkdir -p /sys/kernel/config/usb_gadget/g1/functions/ecm.f0
+        mkdir -p /sys/kernel/config/usb_gadget/g1/functions/eem.f0
+        mkdir -p /sys/kernel/config/usb_gadget/g1/functions/mass_storage.usb0
+        mkdir -p /sys/kernel/config/usb_gadget/g1/functions/acm.gs0
+        mkdir -p /sys/kernel/config/usb_gadget/g1/functions/acm.gs1
+        mkdir -p /sys/kernel/config/usb_gadget/g1/functions/acm.gs2
+        mkdir -p /sys/kernel/config/usb_gadget/g1/functions/acm.gs3
+        mkdir -p /sys/kernel/config/usb_gadget/g1/functions/via_modem.gs0
+        mkdir -p /sys/kernel/config/usb_gadget/g1/functions/via_ets.gs0
+        mkdir -p /sys/kernel/config/usb_gadget/g1/functions/via_atc.gs0
+        mount adb /dev/usb-ffs/adb -t functionfs -o uid=2000,gid=2000
+    fi
+
+elif [ "$1" == "post" ];then
+
+    echo "=== Initial: USB Configuration post Start ===" > /dev/kmsg
+
+    while [[ ! "$( findmnt -M /etc/config)" ]]; do
+        echo "=== Initial: USB Configuration Wait config dir mounted ===" > /dev/kmsg
+        sleep 2
+    done
+
+    echo 0x0e8d > /sys/kernel/config/usb_gadget/g1/idVendor
+    echo 0x0223 > /sys/kernel/config/usb_gadget/g1/bcdDevice
+    echo 0x0200 > /sys/kernel/config/usb_gadget/g1/bcdUSB
+    mkdir -p /sys/kernel/config/usb_gadget/g1/strings/0x409
+
+    if [ "$(cat /sys/kernel/config/usb_gadget/g1/strings/0x409/serialnumber)" == "" ]; then
+        if [[ "$(cat /etc/hostname)" == "auto2735evb-ivt-vp1" || "$(cat /etc/hostname)" == "auto2735evb-ivt-vp2" ]]; then
+            echo "MT-96533493F01B518C" > /sys/kernel/config/usb_gadget/g1/strings/0x409/serialnumber
+        else
+            echo 0123456789ABCDEF > /sys/kernel/config/usb_gadget/g1/strings/0x409/serialnumber
+        fi
+    else
+        echo "=== usb serial number exist, keep it ===" > /dev/kmsg
+    fi
+
+    echo MediaTek > /sys/kernel/config/usb_gadget/g1/strings/0x409/manufacturer
+    echo auto2735-ivt > /sys/kernel/config/usb_gadget/g1/strings/0x409/product
+
+    mkdir -p /sys/kernel/config/usb_gadget/g1/configs/b.1
+    mkdir -p /sys/kernel/config/usb_gadget/g1/configs/b.1/strings/0x409
+    echo 500 > /sys/kernel/config/usb_gadget/g1/configs/b.1/MaxPower
+
+    if [ -n "$(cat /proc/boot_mode | grep META)" ] ; then # META mode: META_BOOT_SKIP_PRELOADER
+
+        # ADB + CDC-ACM*2 (META mode)
+        #setprop sys.usb.config adb,meta,elt
+        #################### START ####################
+        sleep 1
+        echo meta_elt_adb > /sys/kernel/config/usb_gadget/g1/configs/b.1/strings/0x409/configuration
+        echo 0x2040 > /sys/kernel/config/usb_gadget/g1/idProduct
+        ln -sf /sys/kernel/config/usb_gadget/g1/functions/mass_storage.usb0 /sys/kernel/config/usb_gadget/g1/configs/b.1/f1
+        ln -sf /sys/kernel/config/usb_gadget/g1/functions/ffs.adb /sys/kernel/config/usb_gadget/g1/configs/b.1/f2
+        ln -sf /sys/kernel/config/usb_gadget/g1/functions/acm.gs0 /sys/kernel/config/usb_gadget/g1/configs/b.1/f3
+        ln -sf /sys/kernel/config/usb_gadget/g1/functions/acm.gs3 /sys/kernel/config/usb_gadget/g1/configs/b.1/f4
+        echo 11201000.usb > /sys/kernel/config/usb_gadget/g1/UDC
+        #################### END ####################
+        sleep 1
+        echo 11201000.usb > /sys/kernel/config/usb_gadget/g1/UDC
+
+    else # Normal mode
+
+        # ADB + CDC-ACM*3 (normal mode)
+        #setprop sys.usb.config adb,acm
+        #################### START ####################
+        sleep 1
+        rndis_enabled=`uci get lynq_uci.lynq_rndis.initiate`
+        if [ "$rndis_enabled" == "1" ]; then
+            echo rndis > /sys/kernel/config/usb_gadget/g1/configs/b.1/strings/0x409/configuration
+            echo 0x2028 > /sys/kernel/config/usb_gadget/g1/idProduct
+            echo 1 > /sys/devices/platform/soc/mt_usb/saving
+            ln -sf /sys/kernel/config/usb_gadget/g1/functions/rndis.gs4 /sys/kernel/config/usb_gadget/g1/configs/b.1/f1        
+        else
+            echo gs1gs3_dual_acm > /sys/kernel/config/usb_gadget/g1/configs/b.1/strings/0x409/configuration
+            echo 0x202f > /sys/kernel/config/usb_gadget/g1/idProduct
+            echo 1 > /sys/devices/platform/soc/mt_usb/saving
+            ln -sf /sys/kernel/config/usb_gadget/g1/functions/ffs.adb /sys/kernel/config/usb_gadget/g1/configs/b.1/f1
+            ln -sf /sys/kernel/config/usb_gadget/g1/functions/acm.gs0 /sys/kernel/config/usb_gadget/g1/configs/b.1/f2
+            ln -sf /sys/kernel/config/usb_gadget/g1/functions/acm.gs1 /sys/kernel/config/usb_gadget/g1/configs/b.1/f3
+            ln -sf /sys/kernel/config/usb_gadget/g1/functions/acm.gs3 /sys/kernel/config/usb_gadget/g1/configs/b.1/f4
+        fi
+        #################### END ####################
+        sleep 1
+        echo 11201000.usb > /sys/kernel/config/usb_gadget/g1/UDC
+    fi
+
+    if [ -e "/proc/bootprof" ] ; then
+        echo usb_active > /proc/bootprof
+    fi
+
+    echo "=== Initial: USB Configuration End ===" > /dev/kmsg
+fi
diff --git a/meta-sdk/meta/meta-lynqSDK-T800/recipes-core/initial/files/usb_switch_gsw b/meta-sdk/meta/meta-lynqSDK-T800/recipes-core/initial/files/usb_switch_gsw
new file mode 100644
index 0000000..68a7929
--- /dev/null
+++ b/meta-sdk/meta/meta-lynqSDK-T800/recipes-core/initial/files/usb_switch_gsw
@@ -0,0 +1,93 @@
+#!/bin/busybox sh
+#
+#	@author Chuanrui Liu
+#	modify: Chengzhi Pei 2020-11-19
+#
+
+echo "=== Initial: USB Switch Start ===" > /dev/kmsg
+
+function funCleanConfig(){
+    echo "clean old configuration"  > /dev/kmsg
+    systemctl stop init_usb
+    killall adbd
+    killall agetty
+    echo none > /sys/kernel/config/usb_gadget/g1/UDC
+    echo 0 > /sys/kernel/config/usb_gadget/g1/bDeviceClass
+    echo 0 > /sys/kernel/config/usb_gadget/g1/bDeviceSubClass
+    echo 0 > /sys/kernel/config/usb_gadget/g1/bDeviceProtocol
+    rm -f /sys/kernel/config/usb_gadget/g1/configs/b.1/f?
+    sleep 1
+    return 0
+}
+
+if [ ! -z $2 ]; then
+    #echo 0123456789ABCDEF > /sys/kernel/config/usb_gadget/g1/strings/0x409/serialnumber
+    echo $2 > /sys/kernel/config/usb_gadget/g1/strings/0x409/serialnumber
+fi
+
+echo $1 > /dev/kmsg
+
+if [ $1 = "adb,vcom,ets,elt" ]; then
+    #### For Normal mode in /usr/share/init/init_usb   of MTK reference board
+    funCleanConfig
+    ########################################
+    adbd &
+    sleep 1
+    echo adb_vcom_ets_elt > /sys/kernel/config/usb_gadget/g1/configs/b.1/strings/0x409/configuration
+    echo 0x202f > /sys/kernel/config/usb_gadget/g1/idProduct
+    ln -sf /sys/kernel/config/usb_gadget/g1/functions/ffs.adb /sys/kernel/config/usb_gadget/g1/configs/b.1/f1
+    ln -sf /sys/kernel/config/usb_gadget/g1/functions/acm.gs0 /sys/kernel/config/usb_gadget/g1/configs/b.1/f2
+    ln -sf /sys/kernel/config/usb_gadget/g1/functions/acm.gs1 /sys/kernel/config/usb_gadget/g1/configs/b.1/f3
+    ln -sf /sys/kernel/config/usb_gadget/g1/functions/acm.gs3 /sys/kernel/config/usb_gadget/g1/configs/b.1/f4
+    echo 11201000.usb > /sys/kernel/config/usb_gadget/g1/UDC
+elif [ $1 = "mass,adb,vcom,elt" ]; then
+    #### For META mode in /usr/share/init/init_usb
+    funCleanConfig
+    ########################################
+    adbd &
+    sleep 1
+    echo mass_adb_vcom_elt > /sys/kernel/config/usb_gadget/g1/configs/b.1/strings/0x409/configuration
+    echo 0x2040 > /sys/kernel/config/usb_gadget/g1/idProduct
+    ln -sf /sys/kernel/config/usb_gadget/g1/functions/mass_storage.usb0 /sys/kernel/config/usb_gadget/g1/configs/b.1/f1
+    ln -sf /sys/kernel/config/usb_gadget/g1/functions/ffs.adb /sys/kernel/config/usb_gadget/g1/configs/b.1/f2
+    ln -sf /sys/kernel/config/usb_gadget/g1/functions/acm.gs0 /sys/kernel/config/usb_gadget/g1/configs/b.1/f3
+    ln -sf /sys/kernel/config/usb_gadget/g1/functions/acm.gs3 /sys/kernel/config/usb_gadget/g1/configs/b.1/f4
+    echo 11201000.usb > /sys/kernel/config/usb_gadget/g1/UDC
+elif [ $1 = "ets" ]; then
+    funCleanConfig
+    ########################################
+    echo ets > /sys/kernel/config/usb_gadget/g1/configs/b.1/strings/0x409/configuration
+    echo 0x2035 > /sys/kernel/config/usb_gadget/g1/idProduct
+    ln -sf /sys/kernel/config/usb_gadget/g1/functions/acm.gs1 /sys/kernel/config/usb_gadget/g1/configs/b.1/f1
+    echo 11201000.usb > /sys/kernel/config/usb_gadget/g1/UDC
+elif [ $1 = "adb,vcom" ]; then
+    funCleanConfig
+    ########################################
+    adbd &
+    sleep 1
+    echo adb_vcom > /sys/kernel/config/usb_gadget/g1/configs/b.1/strings/0x409/configuration
+    echo 0x200e > /sys/kernel/config/usb_gadget/g1/idProduct
+    ln -sf /sys/kernel/config/usb_gadget/g1/functions/ffs.adb /sys/kernel/config/usb_gadget/g1/configs/b.1/f1
+    ln -sf /sys/kernel/config/usb_gadget/g1/functions/acm.gs0 /sys/kernel/config/usb_gadget/g1/configs/b.1/f2
+    echo 11201000.usb > /sys/kernel/config/usb_gadget/g1/UDC
+elif [ $1 = "mass,vcom" ]; then
+    funCleanConfig
+    ########################################
+    echo mass_vcom > /sys/kernel/config/usb_gadget/g1/configs/b.1/strings/0x409/configuration
+    echo 0x200f > /sys/kernel/config/usb_gadget/g1/idProduct
+    ln -sf /sys/kernel/config/usb_gadget/g1/functions/mass_storage.usb0 /sys/kernel/config/usb_gadget/g1/configs/b.1/f1
+    ln -sf /sys/kernel/config/usb_gadget/g1/functions/acm.gs0 /sys/kernel/config/usb_gadget/g1/configs/b.1/f2
+    echo 11201000.usb > /sys/kernel/config/usb_gadget/g1/UDC
+elif [ $1 = "rndis" ]; then
+    funCleanConfig
+    ########################################
+    echo rndis > /sys/kernel/config/usb_gadget/g1/configs/b.1/strings/0x409/configuration
+    echo 0x2006 > /sys/kernel/config/usb_gadget/g1/idProduct
+    ln -sf /sys/kernel/config/usb_gadget/g1/functions/rndis.gs4 /sys/kernel/config/usb_gadget/g1/configs/b.1/f1
+    echo 11201000.usb > /sys/kernel/config/usb_gadget/g1/UDC
+elif [ $1 = "none" ]; then
+    funCleanConfig
+else
+    echo "=== Illegal input ===" > /dev/kmsg
+fi
+echo "=== Initial: USB Switch End ===" > /dev/kmsg
diff --git a/meta-sdk/meta/meta-lynqSDK-T800/recipes-core/initial/init-2735_1.0.0.bb b/meta-sdk/meta/meta-lynqSDK-T800/recipes-core/initial/init-2735_1.0.0.bb
index 7be31d4..e4e29b6 100755
--- a/meta-sdk/meta/meta-lynqSDK-T800/recipes-core/initial/init-2735_1.0.0.bb
+++ b/meta-sdk/meta/meta-lynqSDK-T800/recipes-core/initial/init-2735_1.0.0.bb
@@ -9,7 +9,8 @@
 SRC_URI += "file://init_speech"
 SRC_URI += "${@bb.utils.contains("MOBILETEK_OEMAPP_CFG", "GSW", "file://init_mount_nand_gsw", "", d)}"
 SRC_URI += "${@bb.utils.contains("MOBILETEK_OEMAPP_CFG", "PLATFORM", "file://init_mount_nand", "", d)}"
-SRC_URI += "file://usb_switch"
+SRC_URI += "${@bb.utils.contains("MOBILETEK_USB_CFG", "PLATFORM", "file://usb_switch", "", d)}"
+SRC_URI += "${@bb.utils.contains("MOBILETEK_USB_CFG", "GSW", "file://usb_switch_gsw", "", d)}"
 SRC_URI += "file://init_network.service"
 SRC_URI += "file://init_mount.service"
 SRC_URI += "file://nvram_daemon.service"
@@ -23,7 +24,8 @@
 SRC_URI += "${@bb.utils.contains('BUILD_TYPE', 'user', ' ', ' file://init_atci', d)}"
 SRC_URI += "${@bb.utils.contains('BUILD_TYPE', 'user', ' ', ' file://init_atci.service', d)}"
 SRC_URI += "file://agps.service"
-SRC_URI += "file://init_usb"
+SRC_URI += "${@bb.utils.contains("MOBILETEK_USB_CFG", "PLATFORM", "file://init_usb", "", d)}"
+SRC_URI += "${@bb.utils.contains("MOBILETEK_USB_CFG", "GSW", "file://init_usb_gsw", "", d)}"
 SRC_URI += "file://init_usb.service"
 SRC_URI += "file://smp.sh"
 SRC_URI += "${@bb.utils.contains("MOBILETEK_OEMAPP_CFG", "GSW", "file://smp.rules", "", d)}"
@@ -123,9 +125,19 @@
     fi
     install -d ${D}${datadir}/init
     install -m 0755 init_network ${D}${datadir}/init/init_network
-    install -m 0755 usb_switch ${D}${datadir}/init/usb_switch
+    if [ "${MOBILETEK_USB_CFG}" = "PLATFORM" ]; then
+        install -m 0755 usb_switch ${D}${datadir}/init/usb_switch
+    fi
+    if [ "${MOBILETEK_USB_CFG}" = "GSW" ]; then
+        install -m 0755 usb_switch_gsw ${D}${datadir}/init/usb_switch
+    fi
     install -m 0755 init_speech ${D}${datadir}/init/init_speech
-    install -m 0755 init_usb ${D}${datadir}/init/init_usb
+    if [ "${MOBILETEK_USB_CFG}" = "PLATFORM" ]; then
+        install -m 0755 init_usb ${D}${datadir}/init/init_usb
+    fi
+    if [ "${MOBILETEK_USB_CFG}" = "GSW" ]; then
+        install -m 0755 init_usb_gsw ${D}${datadir}/init/init_usb
+    fi
     install -m 0755 smp.sh ${D}${datadir}/init/smp.sh
 #xf.li 2022.11.17 modify for userdata recover start
     install -m 0755 lynq_data_recover ${D}${datadir}/init/lynq_data_recover
diff --git a/meta/meta-mediatek-mt2735/conf/machine/auto2735evb-ivt-main.conf b/meta/meta-mediatek-mt2735/conf/machine/auto2735evb-ivt-main.conf
index fcea836..2cd277c 100755
--- a/meta/meta-mediatek-mt2735/conf/machine/auto2735evb-ivt-main.conf
+++ b/meta/meta-mediatek-mt2735/conf/machine/auto2735evb-ivt-main.conf
@@ -49,6 +49,9 @@
 #UART_CFG value:"PLATFORM","GSW"
 MOBILETEK_UART_CFG = "PLATFORM"
 
+#USB_CFG value:"PLATFORM","GSW"
+MOBILETEK_USB_CFG = "PLATFORM"
+
 #ndis_CFG value:"PLATFORM","GSW"
 MOBILETEK_NDIS_CFG = "PLATFORM"
 
@@ -77,4 +80,4 @@
 MOBILETEK_BUSYBOX_CFG = "PLATFORM"
 
 #OPENSSH_CFG value:"PLATFORM","GSW"
-MOBILETEK_OPENSSH_CFG = "PLATFORM"
\ No newline at end of file
+MOBILETEK_OPENSSH_CFG = "PLATFORM"
diff --git a/meta/meta-mediatek-mt2735/recipes-core/initial/files/init_usb_gsw b/meta/meta-mediatek-mt2735/recipes-core/initial/files/init_usb_gsw
new file mode 100755
index 0000000..1fad189
--- /dev/null
+++ b/meta/meta-mediatek-mt2735/recipes-core/initial/files/init_usb_gsw
@@ -0,0 +1,107 @@
+#!/bin/busybox sh
+
+if [ "$1" == "pre" ]; then
+    echo "=== Initial: USB Configuration Start ===" > /dev/kmsg
+
+    if [ -e "/dev/usb-ffs" ] ; then
+        echo "=== Bypass Pre Configuration ===" > /dev/kmsg
+    else # first boot
+        mkdir -p /dev/usb-ffs
+        mkdir -p /dev/usb-ffs/adb
+        mount none /sys/kernel/config -t configfs
+        mkdir -p /sys/kernel/config/usb_gadget/g1/functions/ffs.adb
+        mkdir -p /sys/kernel/config/usb_gadget/g1/functions/rndis.gs4
+        mkdir -p /sys/kernel/config/usb_gadget/g1/functions/ncm.f0
+        mkdir -p /sys/kernel/config/usb_gadget/g1/functions/ecm.f0
+        mkdir -p /sys/kernel/config/usb_gadget/g1/functions/eem.f0
+        mkdir -p /sys/kernel/config/usb_gadget/g1/functions/mass_storage.usb0
+        mkdir -p /sys/kernel/config/usb_gadget/g1/functions/acm.gs0
+        mkdir -p /sys/kernel/config/usb_gadget/g1/functions/acm.gs1
+        mkdir -p /sys/kernel/config/usb_gadget/g1/functions/acm.gs2
+        mkdir -p /sys/kernel/config/usb_gadget/g1/functions/acm.gs3
+        mkdir -p /sys/kernel/config/usb_gadget/g1/functions/via_modem.gs0
+        mkdir -p /sys/kernel/config/usb_gadget/g1/functions/via_ets.gs0
+        mkdir -p /sys/kernel/config/usb_gadget/g1/functions/via_atc.gs0
+        mount adb /dev/usb-ffs/adb -t functionfs -o uid=2000,gid=2000
+    fi
+
+elif [ "$1" == "post" ];then
+
+    echo "=== Initial: USB Configuration post Start ===" > /dev/kmsg
+
+    while [[ ! "$( findmnt -M /etc/config)" ]]; do
+        echo "=== Initial: USB Configuration Wait config dir mounted ===" > /dev/kmsg
+        sleep 2
+    done
+
+    echo 0x0e8d > /sys/kernel/config/usb_gadget/g1/idVendor
+    echo 0x0223 > /sys/kernel/config/usb_gadget/g1/bcdDevice
+    echo 0x0200 > /sys/kernel/config/usb_gadget/g1/bcdUSB
+    mkdir -p /sys/kernel/config/usb_gadget/g1/strings/0x409
+
+    if [ "$(cat /sys/kernel/config/usb_gadget/g1/strings/0x409/serialnumber)" == "" ]; then
+        if [[ "$(cat /etc/hostname)" == "auto2735evb-ivt-vp1" || "$(cat /etc/hostname)" == "auto2735evb-ivt-vp2" ]]; then
+            echo "MT-96533493F01B518C" > /sys/kernel/config/usb_gadget/g1/strings/0x409/serialnumber
+        else
+            echo 0123456789ABCDEF > /sys/kernel/config/usb_gadget/g1/strings/0x409/serialnumber
+        fi
+    else
+        echo "=== usb serial number exist, keep it ===" > /dev/kmsg
+    fi
+
+    echo MediaTek > /sys/kernel/config/usb_gadget/g1/strings/0x409/manufacturer
+    echo auto2735-ivt > /sys/kernel/config/usb_gadget/g1/strings/0x409/product
+
+    mkdir -p /sys/kernel/config/usb_gadget/g1/configs/b.1
+    mkdir -p /sys/kernel/config/usb_gadget/g1/configs/b.1/strings/0x409
+    echo 500 > /sys/kernel/config/usb_gadget/g1/configs/b.1/MaxPower
+
+    if [ -n "$(cat /proc/boot_mode | grep META)" ] ; then # META mode: META_BOOT_SKIP_PRELOADER
+
+        # ADB + CDC-ACM*2 (META mode)
+        #setprop sys.usb.config adb,meta,elt
+        #################### START ####################
+        sleep 1
+        echo meta_elt_adb > /sys/kernel/config/usb_gadget/g1/configs/b.1/strings/0x409/configuration
+        echo 0x2040 > /sys/kernel/config/usb_gadget/g1/idProduct
+        ln -sf /sys/kernel/config/usb_gadget/g1/functions/mass_storage.usb0 /sys/kernel/config/usb_gadget/g1/configs/b.1/f1
+        ln -sf /sys/kernel/config/usb_gadget/g1/functions/ffs.adb /sys/kernel/config/usb_gadget/g1/configs/b.1/f2
+        ln -sf /sys/kernel/config/usb_gadget/g1/functions/acm.gs0 /sys/kernel/config/usb_gadget/g1/configs/b.1/f3
+        ln -sf /sys/kernel/config/usb_gadget/g1/functions/acm.gs3 /sys/kernel/config/usb_gadget/g1/configs/b.1/f4
+        echo 11201000.usb > /sys/kernel/config/usb_gadget/g1/UDC
+        #################### END ####################
+        sleep 1
+        echo 11201000.usb > /sys/kernel/config/usb_gadget/g1/UDC
+
+    else # Normal mode
+
+        # ADB + CDC-ACM*3 (normal mode)
+        #setprop sys.usb.config adb,acm
+        #################### START ####################
+        sleep 1
+        rndis_enabled=`uci get lynq_uci.lynq_rndis.initiate`
+        if [ "$rndis_enabled" == "1" ]; then
+            echo rndis > /sys/kernel/config/usb_gadget/g1/configs/b.1/strings/0x409/configuration
+            echo 0x2028 > /sys/kernel/config/usb_gadget/g1/idProduct
+            echo 1 > /sys/devices/platform/soc/mt_usb/saving
+            ln -sf /sys/kernel/config/usb_gadget/g1/functions/rndis.gs4 /sys/kernel/config/usb_gadget/g1/configs/b.1/f1        
+        else
+            echo gs1gs3_dual_acm > /sys/kernel/config/usb_gadget/g1/configs/b.1/strings/0x409/configuration
+            echo 0x202f > /sys/kernel/config/usb_gadget/g1/idProduct
+            echo 1 > /sys/devices/platform/soc/mt_usb/saving
+            ln -sf /sys/kernel/config/usb_gadget/g1/functions/ffs.adb /sys/kernel/config/usb_gadget/g1/configs/b.1/f1
+            ln -sf /sys/kernel/config/usb_gadget/g1/functions/acm.gs0 /sys/kernel/config/usb_gadget/g1/configs/b.1/f2
+            ln -sf /sys/kernel/config/usb_gadget/g1/functions/acm.gs1 /sys/kernel/config/usb_gadget/g1/configs/b.1/f3
+            ln -sf /sys/kernel/config/usb_gadget/g1/functions/acm.gs3 /sys/kernel/config/usb_gadget/g1/configs/b.1/f4
+        fi
+        #################### END ####################
+        sleep 1
+        echo 11201000.usb > /sys/kernel/config/usb_gadget/g1/UDC
+    fi
+
+    if [ -e "/proc/bootprof" ] ; then
+        echo usb_active > /proc/bootprof
+    fi
+
+    echo "=== Initial: USB Configuration End ===" > /dev/kmsg
+fi
diff --git a/meta/meta-mediatek-mt2735/recipes-core/initial/files/usb_switch_gsw b/meta/meta-mediatek-mt2735/recipes-core/initial/files/usb_switch_gsw
new file mode 100644
index 0000000..68a7929
--- /dev/null
+++ b/meta/meta-mediatek-mt2735/recipes-core/initial/files/usb_switch_gsw
@@ -0,0 +1,93 @@
+#!/bin/busybox sh
+#
+#	@author Chuanrui Liu
+#	modify: Chengzhi Pei 2020-11-19
+#
+
+echo "=== Initial: USB Switch Start ===" > /dev/kmsg
+
+function funCleanConfig(){
+    echo "clean old configuration"  > /dev/kmsg
+    systemctl stop init_usb
+    killall adbd
+    killall agetty
+    echo none > /sys/kernel/config/usb_gadget/g1/UDC
+    echo 0 > /sys/kernel/config/usb_gadget/g1/bDeviceClass
+    echo 0 > /sys/kernel/config/usb_gadget/g1/bDeviceSubClass
+    echo 0 > /sys/kernel/config/usb_gadget/g1/bDeviceProtocol
+    rm -f /sys/kernel/config/usb_gadget/g1/configs/b.1/f?
+    sleep 1
+    return 0
+}
+
+if [ ! -z $2 ]; then
+    #echo 0123456789ABCDEF > /sys/kernel/config/usb_gadget/g1/strings/0x409/serialnumber
+    echo $2 > /sys/kernel/config/usb_gadget/g1/strings/0x409/serialnumber
+fi
+
+echo $1 > /dev/kmsg
+
+if [ $1 = "adb,vcom,ets,elt" ]; then
+    #### For Normal mode in /usr/share/init/init_usb   of MTK reference board
+    funCleanConfig
+    ########################################
+    adbd &
+    sleep 1
+    echo adb_vcom_ets_elt > /sys/kernel/config/usb_gadget/g1/configs/b.1/strings/0x409/configuration
+    echo 0x202f > /sys/kernel/config/usb_gadget/g1/idProduct
+    ln -sf /sys/kernel/config/usb_gadget/g1/functions/ffs.adb /sys/kernel/config/usb_gadget/g1/configs/b.1/f1
+    ln -sf /sys/kernel/config/usb_gadget/g1/functions/acm.gs0 /sys/kernel/config/usb_gadget/g1/configs/b.1/f2
+    ln -sf /sys/kernel/config/usb_gadget/g1/functions/acm.gs1 /sys/kernel/config/usb_gadget/g1/configs/b.1/f3
+    ln -sf /sys/kernel/config/usb_gadget/g1/functions/acm.gs3 /sys/kernel/config/usb_gadget/g1/configs/b.1/f4
+    echo 11201000.usb > /sys/kernel/config/usb_gadget/g1/UDC
+elif [ $1 = "mass,adb,vcom,elt" ]; then
+    #### For META mode in /usr/share/init/init_usb
+    funCleanConfig
+    ########################################
+    adbd &
+    sleep 1
+    echo mass_adb_vcom_elt > /sys/kernel/config/usb_gadget/g1/configs/b.1/strings/0x409/configuration
+    echo 0x2040 > /sys/kernel/config/usb_gadget/g1/idProduct
+    ln -sf /sys/kernel/config/usb_gadget/g1/functions/mass_storage.usb0 /sys/kernel/config/usb_gadget/g1/configs/b.1/f1
+    ln -sf /sys/kernel/config/usb_gadget/g1/functions/ffs.adb /sys/kernel/config/usb_gadget/g1/configs/b.1/f2
+    ln -sf /sys/kernel/config/usb_gadget/g1/functions/acm.gs0 /sys/kernel/config/usb_gadget/g1/configs/b.1/f3
+    ln -sf /sys/kernel/config/usb_gadget/g1/functions/acm.gs3 /sys/kernel/config/usb_gadget/g1/configs/b.1/f4
+    echo 11201000.usb > /sys/kernel/config/usb_gadget/g1/UDC
+elif [ $1 = "ets" ]; then
+    funCleanConfig
+    ########################################
+    echo ets > /sys/kernel/config/usb_gadget/g1/configs/b.1/strings/0x409/configuration
+    echo 0x2035 > /sys/kernel/config/usb_gadget/g1/idProduct
+    ln -sf /sys/kernel/config/usb_gadget/g1/functions/acm.gs1 /sys/kernel/config/usb_gadget/g1/configs/b.1/f1
+    echo 11201000.usb > /sys/kernel/config/usb_gadget/g1/UDC
+elif [ $1 = "adb,vcom" ]; then
+    funCleanConfig
+    ########################################
+    adbd &
+    sleep 1
+    echo adb_vcom > /sys/kernel/config/usb_gadget/g1/configs/b.1/strings/0x409/configuration
+    echo 0x200e > /sys/kernel/config/usb_gadget/g1/idProduct
+    ln -sf /sys/kernel/config/usb_gadget/g1/functions/ffs.adb /sys/kernel/config/usb_gadget/g1/configs/b.1/f1
+    ln -sf /sys/kernel/config/usb_gadget/g1/functions/acm.gs0 /sys/kernel/config/usb_gadget/g1/configs/b.1/f2
+    echo 11201000.usb > /sys/kernel/config/usb_gadget/g1/UDC
+elif [ $1 = "mass,vcom" ]; then
+    funCleanConfig
+    ########################################
+    echo mass_vcom > /sys/kernel/config/usb_gadget/g1/configs/b.1/strings/0x409/configuration
+    echo 0x200f > /sys/kernel/config/usb_gadget/g1/idProduct
+    ln -sf /sys/kernel/config/usb_gadget/g1/functions/mass_storage.usb0 /sys/kernel/config/usb_gadget/g1/configs/b.1/f1
+    ln -sf /sys/kernel/config/usb_gadget/g1/functions/acm.gs0 /sys/kernel/config/usb_gadget/g1/configs/b.1/f2
+    echo 11201000.usb > /sys/kernel/config/usb_gadget/g1/UDC
+elif [ $1 = "rndis" ]; then
+    funCleanConfig
+    ########################################
+    echo rndis > /sys/kernel/config/usb_gadget/g1/configs/b.1/strings/0x409/configuration
+    echo 0x2006 > /sys/kernel/config/usb_gadget/g1/idProduct
+    ln -sf /sys/kernel/config/usb_gadget/g1/functions/rndis.gs4 /sys/kernel/config/usb_gadget/g1/configs/b.1/f1
+    echo 11201000.usb > /sys/kernel/config/usb_gadget/g1/UDC
+elif [ $1 = "none" ]; then
+    funCleanConfig
+else
+    echo "=== Illegal input ===" > /dev/kmsg
+fi
+echo "=== Initial: USB Switch End ===" > /dev/kmsg
diff --git a/meta/meta-mediatek-mt2735/recipes-core/initial/init-2735_1.0.0.bb b/meta/meta-mediatek-mt2735/recipes-core/initial/init-2735_1.0.0.bb
index b993b88..25b963f 100755
--- a/meta/meta-mediatek-mt2735/recipes-core/initial/init-2735_1.0.0.bb
+++ b/meta/meta-mediatek-mt2735/recipes-core/initial/init-2735_1.0.0.bb
@@ -9,7 +9,8 @@
 SRC_URI += "file://init_speech"
 SRC_URI += "${@bb.utils.contains("MOBILETEK_OEMAPP_CFG", "GSW", "file://init_mount_nand_gsw", "", d)}"
 SRC_URI += "${@bb.utils.contains("MOBILETEK_OEMAPP_CFG", "PLATFORM", "file://init_mount_nand", "", d)}"
-SRC_URI += "file://usb_switch"
+SRC_URI += "${@bb.utils.contains("MOBILETEK_USB_CFG", "PLATFORM", "file://usb_switch", "", d)}"
+SRC_URI += "${@bb.utils.contains("MOBILETEK_USB_CFG", "GSW", "file://usb_switch_gsw", "", d)}"
 SRC_URI += "file://init_network.service"
 SRC_URI += "file://init_mount.service"
 SRC_URI += "file://nvram_daemon.service"
@@ -23,7 +24,8 @@
 SRC_URI += "${@bb.utils.contains('BUILD_TYPE', 'user', ' ', ' file://init_atci', d)}"
 SRC_URI += "${@bb.utils.contains('BUILD_TYPE', 'user', ' ', ' file://init_atci.service', d)}"
 SRC_URI += "file://agps.service"
-SRC_URI += "file://init_usb"
+SRC_URI += "${@bb.utils.contains("MOBILETEK_USB_CFG", "PLATFORM", "file://init_usb", "", d)}"
+SRC_URI += "${@bb.utils.contains("MOBILETEK_USB_CFG", "GSW", "file://init_usb_gsw", "", d)}"
 SRC_URI += "file://init_usb.service"
 SRC_URI += "file://smp.sh"
 #xf.li 2022.11.17 modify for userdata recover start
@@ -108,9 +110,19 @@
 do_install_append() {
     install -d ${D}${datadir}/init
     install -m 0755 init_network ${D}${datadir}/init/init_network
-    install -m 0755 usb_switch ${D}${datadir}/init/usb_switch
+    if [ "${MOBILETEK_USB_CFG}" = "PLATFORM" ]; then
+        install -m 0755 usb_switch ${D}${datadir}/init/usb_switch
+    fi
+    if [ "${MOBILETEK_USB_CFG}" = "GSW" ]; then
+        install -m 0755 usb_switch_gsw ${D}${datadir}/init/usb_switch
+    fi
     install -m 0755 init_speech ${D}${datadir}/init/init_speech
-    install -m 0755 init_usb ${D}${datadir}/init/init_usb
+    if [ "${MOBILETEK_USB_CFG}" = "PLATFORM" ]; then
+        install -m 0755 init_usb ${D}${datadir}/init/init_usb
+    fi
+    if [ "${MOBILETEK_USB_CFG}" = "GSW" ]; then
+        install -m 0755 init_usb_gsw ${D}${datadir}/init/init_usb
+    fi
     install -m 0755 smp.sh ${D}${datadir}/init/smp.sh
 #xf.li 2022.11.17 modify for userdata recover start
     install -m 0755 lynq_data_recover ${D}${datadir}/init/lynq_data_recover
diff --git a/meta/meta-mediatek-mt2735/recipes-lynq/packagegroups/packagegroup-lync-mt2735.bb b/meta/meta-mediatek-mt2735/recipes-lynq/packagegroups/packagegroup-lync-mt2735.bb
index eba2ab7..2f72c2a 100755
--- a/meta/meta-mediatek-mt2735/recipes-lynq/packagegroups/packagegroup-lync-mt2735.bb
+++ b/meta/meta-mediatek-mt2735/recipes-lynq/packagegroups/packagegroup-lync-mt2735.bb
@@ -61,6 +61,6 @@
 "
 
 RDEPENDS_packagegroup-lync-mt2735 += "\
-        ${@bb.utils.contains('MOBILETEK_UART_CFG', 'GSW', ' lynq-ndis-uevent', '', d)} \
+        ${@bb.utils.contains('MOBILETEK_USB_CFG', 'GSW', ' lynq-ndis-uevent', '', d)} \
 "