linuxOS_AP05/buildroot/package/rockchip/thunderboot/S50tb_usbdevice
2025-06-02 13:59:07 +08:00

224 lines
4.5 KiB
Bash

#!/bin/sh
#
# setup configfs for adbd, usb mass storage and MTP....
# For kernel v4.4/v4.19 usb configfs without udev
#
# Load default env variables from profiles
RNDIS_EN=off
ADB_EN=off
MTP_EN=off
RNDIS_ADDR=192.168.1.100
USB_ATTRIBUTE=0x409
USB_GROUP=rockchip
USB_SKELETON=b.1
CONFIGFS_DIR=/sys/kernel/config
USB_CONFIGFS_DIR=${CONFIGFS_DIR}/usb_gadget/${USB_GROUP}
USB_STRINGS_DIR=${USB_CONFIGFS_DIR}/strings/${USB_ATTRIBUTE}
USB_FUNCTIONS_DIR=${USB_CONFIGFS_DIR}/functions
USB_CONFIGS_DIR=${USB_CONFIGFS_DIR}/configs/${USB_SKELETON}
syslink_function()
{
ln -s ${USB_FUNCTIONS_DIR}/$1 ${USB_CONFIGS_DIR}/f${USB_FUNCTIONS_CNT}
let USB_FUNCTIONS_CNT=USB_FUNCTIONS_CNT+1
}
bind_functions()
{
USB_FUNCTIONS_CNT=1
test $MTP_EN = on && syslink_function mtp.gs0
test $RNDIS_EN = on && syslink_function rndis.gs0
test $ADB_EN = on && syslink_function ffs.adb
echo ${CONFIG_STRING} > ${USB_CONFIGS_DIR}/strings/${USB_ATTRIBUTE}/configuration
}
function_init()
{
test $RNDIS_EN = on && mkdir ${USB_FUNCTIONS_DIR}/rndis.gs0
test $MTP_EN = on && mkdir ${USB_FUNCTIONS_DIR}/mtp.gs0
if [ $ADB_EN = on ];then
mkdir ${USB_FUNCTIONS_DIR}/ffs.adb
mkdir /dev/usb-ffs/adb -m 0770
mount -o uid=2000,gid=2000 -t functionfs adb /dev/usb-ffs/adb
fi
}
configfs_init()
{
insmod /usr/lib/modules/phy-rockchip-naneng-usb2.ko
insmod /usr/lib/modules/dwc3-of-simple.ko
insmod /usr/lib/modules/dwc3.ko
insmod /usr/lib/modules/dwc3-rockchip-inno.ko
sleep 1
mkdir /dev/usb-ffs
mount -t configfs none ${CONFIGFS_DIR}
mkdir ${USB_CONFIGFS_DIR} -m 0770
echo 0x2207 > ${USB_CONFIGFS_DIR}/idVendor
echo 0x0310 > ${USB_CONFIGFS_DIR}/bcdDevice
echo 0x0200 > ${USB_CONFIGFS_DIR}/bcdUSB
mkdir ${USB_STRINGS_DIR} -m 0770
SERIAL=`cat /proc/cpuinfo | grep Serial | awk '{print $3}'`
if [ -z $SERIAL ];then
SERIAL=0123456789ABCDEF
fi
echo $SERIAL > ${USB_STRINGS_DIR}/serialnumber
echo "rockchip" > ${USB_STRINGS_DIR}/manufacturer
echo "rk3xxx" > ${USB_STRINGS_DIR}/product
function_init
mkdir ${USB_CONFIGS_DIR} -m 0770
mkdir ${USB_CONFIGS_DIR}/strings/${USB_ATTRIBUTE} -m 0770
echo 0x1 > ${USB_CONFIGFS_DIR}/os_desc/b_vendor_code
echo "MSFT100" > ${USB_CONFIGFS_DIR}/os_desc/qw_sign
echo 500 > ${USB_CONFIGS_DIR}/MaxPower
ln -s ${USB_CONFIGS_DIR} ${USB_CONFIGFS_DIR}/os_desc/b.1
}
make_config_string()
{
tmp=$CONFIG_STRING
if [ -n "$CONFIG_STRING" ]; then
CONFIG_STRING=${tmp}_${1}
else
CONFIG_STRING=$1
fi
}
parameter_init()
{
while read line
do
case "$line" in
usb_adb_en)
ADB_EN=on
make_config_string adb
;;
usb_rndis_en)
RNDIS_EN=on
make_config_string rndis
;;
usb_mtp_en)
MTP_EN=on
make_config_string mtp
;;
esac
done < $USB_CONFIG_FILE
case "$CONFIG_STRING" in
mtp)
PID=0x0001
;;
adb)
PID=0x0006
;;
mtp_adb | adb_mtp)
PID=0x0011
;;
*)
PID=0x0019
esac
}
use_os_desc()
{
if [ $MTP_EN = on ];then
echo "MTP" > ${USB_FUNCTIONS_DIR}/mtp.gs0/os_desc/interface.MTP/compatible_id
echo 1 > ${USB_CONFIGFS_DIR}/os_desc/use
fi
}
pre_run_binary()
{
if [ $ADB_EN = on ];then
# insmod /vendor/lib/modules/rfkill.ko
# insmod /vendor/lib/modules/cfg80211.ko
ifconfig lo up
start-stop-daemon --start --quiet --background --exec /usr/bin/adbd
sleep 1
fi
}
run_binary()
{
if [ $RNDIS_EN = on ];then
ifconfig usb0 $RNDIS_ADDR
ifconfig usb0 up
fi
if [ $MTP_EN = on ];then
start-stop-daemon --start --quiet --background --exec /usr/bin/mtp-server
fi
}
program_kill()
{
P_PID=`ps | grep $1 | grep -v grep | awk '{print $1}'`
test -z ${P_PID} || kill -9 ${P_PID}
}
usb_device_stop()
{
echo "none" > ${USB_CONFIGFS_DIR}/UDC
program_kill adbd
program_kill mtp-server
ls ${USB_CONFIGS_DIR} | grep f[0-9] | xargs -I {} rm ${USB_CONFIGS_DIR}/{}
}
case "$1" in
start)
{
DIR=$(cd `dirname $0`; pwd)
if [ ! -e "$DIR/.usb_config" ]; then
echo "$0: Cannot find .usb_config"
exit 0
fi
if [ -e /tmp/.usb_config ]; then
USB_CONFIG_FILE=/tmp/.usb_config
else
USB_CONFIG_FILE=$DIR/.usb_config
cp $DIR/.usb_config /tmp/.usb_config
fi
parameter_init
if [ -z $CONFIG_STRING ];then
echo "$0: no functions be selected"
exit 0
fi
test -d ${USB_CONFIGFS_DIR} || configfs_init
use_os_desc
echo $PID > ${USB_CONFIGFS_DIR}/idProduct
bind_functions
pre_run_binary
UDC=`ls /sys/class/udc/| awk '{print $1}'`
echo $UDC > ${USB_CONFIGFS_DIR}/UDC
run_binary
}&
;;
stop)
usb_device_stop
;;
restart)
usb_device_stop
sleep 1
$0 start
;;
*)
echo "Usage: $0 {start|stop|restart}"
exit 1
;;
esac
exit 0