#!/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/f1
    rm -f /sys/kernel/config/usb_gadget/g1/configs/b.1/f2
    rm -f /sys/kernel/config/usb_gadget/g1/configs/b.1/f3
    rm -f /sys/kernel/config/usb_gadget/g1/configs/b.1/f4
    rm -f /sys/kernel/config/usb_gadget/g1/configs/b.1/f5
    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,acm" ]; then
    funCleanConfig
    ########################################
    adbd &
    sleep 1
    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
    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 = "rndis,adb,acm" ]; then
    funCleanConfig
    ########################################
    adbd &
    sleep 1
    echo rndis_adb_acm > /sys/kernel/config/usb_gadget/g1/configs/b.1/strings/0x409/configuration
    echo 0x2028 > /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
    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.gs1 /sys/kernel/config/usb_gadget/g1/configs/b.1/f4
    echo 11201000.usb > /sys/kernel/config/usb_gadget/g1/UDC
elif [ $1 = "ecm,adb,acm" ]; then
    funCleanConfig
    ########################################
    adbd &
    sleep 1
    echo rndis_adb_acm > /sys/kernel/config/usb_gadget/g1/configs/b.1/strings/0x409/configuration
    echo 0x2028 > /sys/kernel/config/usb_gadget/g1/idProduct
    ln -sf /sys/kernel/config/usb_gadget/g1/functions/ecm.f0 /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.gs1 /sys/kernel/config/usb_gadget/g1/configs/b.1/f4
    echo 11201000.usb > /sys/kernel/config/usb_gadget/g1/UDC
elif [ $1 = "ncm,adb,acm" ]; then
    funCleanConfig
    ########################################
    adbd &
    sleep 1
    echo rndis_adb_acm > /sys/kernel/config/usb_gadget/g1/configs/b.1/strings/0x409/configuration
    echo 0x2028 > /sys/kernel/config/usb_gadget/g1/idProduct
    ln -sf /sys/kernel/config/usb_gadget/g1/functions/ncm.f0 /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.gs1 /sys/kernel/config/usb_gadget/g1/configs/b.1/f4
    echo 11201000.usb > /sys/kernel/config/usb_gadget/g1/UDC
elif [ $1 = "rndis,acm" ]; then
    funCleanConfig
    ########################################
    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
    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
    echo 11201000.usb > /sys/kernel/config/usb_gadget/g1/UDC
elif [ $1 = "meta" ]; then
    funCleanConfig
    ########################################
    echo acm > /sys/kernel/config/usb_gadget/g1/configs/b.1/strings/0x409/configuration
    echo 0x2007 > /sys/kernel/config/usb_gadget/g1/idProduct
    echo 0x02 > /sys/class/android_usb/android0/bDeviceClass
    ln -sf /sys/kernel/config/usb_gadget/g1/functions/acm.gs0 /sys/kernel/config/usb_gadget/g1/configs/b.1/f1
    echo 11201000.usb > /sys/kernel/config/usb_gadget/g1/UDC
elif [ $1 = "adb,meta" ]; then
    funCleanConfig
    ########################################
    adbd &
    sleep 1
    echo adb_acm > /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 = "adb,meta,elt" ]; then
    funCleanConfig
    ########################################
    adbd &
    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.gs1 /sys/kernel/config/usb_gadget/g1/configs/b.1/f4
    echo 11201000.usb > /sys/kernel/config/usb_gadget/g1/UDC
elif [ $1 = "c2k,adb" ]; then
    funCleanConfig
    ########################################
    adbd &
    sleep 1
    echo c2k_adb > /sys/kernel/config/usb_gadget/g1/configs/b.1/strings/0x409/configuration
    echo 0x2034 > /sys/kernel/config/usb_gadget/g1/idProduct
    ln -sf /sys/kernel/config/usb_gadget/g1/functions/via_modem.gs0 /sys/kernel/config/usb_gadget/g1/configs/b.1/f1
    ln -sf /sys/kernel/config/usb_gadget/g1/functions/via_ets.gs0 /sys/kernel/config/usb_gadget/g1/configs/b.1/f2
    ln -sf /sys/kernel/config/usb_gadget/g1/functions/via_atc.gs0 /sys/kernel/config/usb_gadget/g1/configs/b.1/f3
    ln -sf /sys/kernel/config/usb_gadget/g1/functions/ffs.adb /sys/kernel/config/usb_gadget/g1/configs/b.1/f4
    ln -sf /sys/kernel/config/usb_gadget/g1/functions/acm.gs3 /sys/kernel/config/usb_gadget/g1/configs/b.1/f5
    echo 11201000.usb > /sys/kernel/config/usb_gadget/g1/UDC
    echo 1 > /sys/class/usb_rawbulk/data/enable
elif [ $1 = "adb,bt" ]; then
    funCleanConfig
    ########################################
    adbd &
    sleep 1
    echo adb_acm > /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.gs2 /sys/kernel/config/usb_gadget/g1/configs/b.1/f2
    echo 11201000.usb > /sys/kernel/config/usb_gadget/g1/UDC
elif [ $1 = "ecm,acm" ]; then
    funCleanConfig
    ########################################
    echo ecm_acm > /sys/kernel/config/usb_gadget/g1/configs/b.1/strings/0x409/configuration
    echo 0x7102 > /sys/kernel/config/usb_gadget/g1/idProduct
    ln -sf /sys/kernel/config/usb_gadget/g1/functions/ecm.f0 /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 = "adb" ]; then
    funCleanConfig
    ########################################
    adbd &
    sleep 1
    echo adb > /sys/kernel/config/usb_gadget/g1/configs/b.1/strings/0x409/configuration
    echo 0x201c > /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
    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
