Merge "[Feature][L803-1][USB]Not connected to VBUS, supports hot-swap, uses enumerations. // Only Configure:No, Affected branch:T800M_M.2, Affected module:USB, Is it affected on both ZXIC and MTK:only MTK, Self-test:Yes, Doc Update:No." into MR3.0-merge
diff --git a/meta-sdk/meta/meta-lynqSDK-T800/recipes-core/initial/files/init_usb_M.2 b/meta-sdk/meta/meta-lynqSDK-T800/recipes-core/initial/files/init_usb_M.2
new file mode 100644
index 0000000..6905aba
--- /dev/null
+++ b/meta-sdk/meta/meta-lynqSDK-T800/recipes-core/initial/files/init_usb_M.2
@@ -0,0 +1,119 @@
+#!/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
+        #dongyu@2023.8.9 Not connected to VBUS, supports hot-swap, uses enumerations start
+        echo "Initial: Force on USB" > /dev/kmsg
+        echo 3 > /sys/devices/platform/11201000.usb/cmode
+        #dongyu@2023.8.9 Not connected to VBUS, supports hot-swap, uses enumerations end
+        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_status=$(uci get lynq_uci.rndis.status)
+        echo "====rndis status:$rndis_status====" > /dev/kmsg
+        if [ "$rndis_status" == "1" ]; then
+
+            echo rndis_acm > /sys/kernel/config/usb_gadget/g1/configs/b.1/strings/0x409/configuration
+            echo 0x7102 > /sys/kernel/config/usb_gadget/g1/idProduct
+            echo 0x0001 > /sys/kernel/config/usb_gadget/g1/bcdDevice
+            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
+            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
+
+        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/init-2735_1.0.0.bb b/meta-sdk/meta/meta-lynqSDK-T800/recipes-core/initial/init-2735_1.0.0.bb
index e4e29b6..34a12ac 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
@@ -26,6 +26,7 @@
 SRC_URI += "file://agps.service"
 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 += "${@bb.utils.contains("MOBILETEK_USB_CFG", "M.2", "file://init_usb_M.2", "", 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)}"
@@ -138,6 +139,9 @@
     if [ "${MOBILETEK_USB_CFG}" = "GSW" ]; then
         install -m 0755 init_usb_gsw ${D}${datadir}/init/init_usb
     fi
+    if [ "${MOBILETEK_USB_CFG}" = "M.2" ]; then
+        install -m 0755 init_usb_M.2 ${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-core/initial/files/init_usb_M.2 b/meta/meta-mediatek-mt2735/recipes-core/initial/files/init_usb_M.2
new file mode 100644
index 0000000..6905aba
--- /dev/null
+++ b/meta/meta-mediatek-mt2735/recipes-core/initial/files/init_usb_M.2
@@ -0,0 +1,119 @@
+#!/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
+        #dongyu@2023.8.9 Not connected to VBUS, supports hot-swap, uses enumerations start
+        echo "Initial: Force on USB" > /dev/kmsg
+        echo 3 > /sys/devices/platform/11201000.usb/cmode
+        #dongyu@2023.8.9 Not connected to VBUS, supports hot-swap, uses enumerations end
+        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_status=$(uci get lynq_uci.rndis.status)
+        echo "====rndis status:$rndis_status====" > /dev/kmsg
+        if [ "$rndis_status" == "1" ]; then
+
+            echo rndis_acm > /sys/kernel/config/usb_gadget/g1/configs/b.1/strings/0x409/configuration
+            echo 0x7102 > /sys/kernel/config/usb_gadget/g1/idProduct
+            echo 0x0001 > /sys/kernel/config/usb_gadget/g1/bcdDevice
+            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
+            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
+
+        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/init-2735_1.0.0.bb b/meta/meta-mediatek-mt2735/recipes-core/initial/init-2735_1.0.0.bb
index 8d87332..53dbb6f 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
@@ -30,6 +30,7 @@
 SRC_URI += "file://agps.service"
 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 += "${@bb.utils.contains("MOBILETEK_USB_CFG", "M.2", "file://init_usb_M.2", "", d)}"
 SRC_URI += "file://init_usb.service"
 SRC_URI += "file://smp.sh"
 #xf.li 2022.11.17 modify for userdata recover start
@@ -127,6 +128,9 @@
     if [ "${MOBILETEK_USB_CFG}" = "GSW" ]; then
         install -m 0755 init_usb_gsw ${D}${datadir}/init/init_usb
     fi
+    if [ "${MOBILETEK_USB_CFG}" = "M.2" ]; then
+        install -m 0755 init_usb_M.2 ${D}${datadir}/init/init_usb
+    fi
 #xf.li@20230530 add for wom rndis start
     if [ "${MOBILETEK_RNDIS_CFG}" = "WOM" ]; then
         install -m 0755 lynq_data_recover_wom ${D}${datadir}/init/lynq_data_recover