Skip to content
Zhenlin Wang edited this page Sep 15, 2025 · 2 revisions

Launch script

#!/usr/bin/env bash
set -e

export TERM="xterm-256color"
cd /root

USB_ATTRIBUTE=0x409
USB_GROUP=sdbd
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}
USB_FUNCTIONS_CNT=1

configfs_init() {
	mkdir -p /dev/usb-ffs
	mount -t configfs none ${CONFIGFS_DIR}

	mkdir -p ${USB_CONFIGFS_DIR}
	echo 0x27d9 > ${USB_CONFIGFS_DIR}/idVendor
	echo 0x16c0 > ${USB_CONFIGFS_DIR}/idProduct
	echo 0x0310 > ${USB_CONFIGFS_DIR}/bcdDevice
	echo 0x0200 > ${USB_CONFIGFS_DIR}/bcdUSB

	mkdir -p ${USB_STRINGS_DIR}
	echo "Openbfdev" > ${USB_STRINGS_DIR}/manufacturer
	echo "SDBD" > ${USB_STRINGS_DIR}/product
	echo "0123456789ABCDEF" >${USB_STRINGS_DIR}/serialnumber

	mkdir -p ${USB_CONFIGS_DIR}
	mkdir -p ${USB_CONFIGS_DIR}/strings/${USB_ATTRIBUTE}

	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
}

syslink_function() {
	ln -s ${USB_FUNCTIONS_DIR}/$1 ${USB_CONFIGS_DIR}/f${USB_FUNCTIONS_CNT}
	let USB_FUNCTIONS_CNT=USB_FUNCTIONS_CNT+1
}

# initialize usb configfs
test -d ${USB_CONFIGFS_DIR} || configfs_init

mkdir -p ${USB_FUNCTIONS_DIR}/ffs.adb
syslink_function ffs.adb
mkdir /dev/usb-ffs/adb
mount -t functionfs adb /dev/usb-ffs/adb
sdbd -dsp /run/sdbd.pid

# start usb gadget
UDC=$(ls /sys/class/udc/ | awk '{print $1}')

cat << EOF > /run/usbd.sh
#!/usr/bin/env sh
while true; do
	if [ "#\$(cat ${USB_CONFIGFS_DIR}/UDC)" == "#$UDC" ]; then
		sleep 1
		continue
	fi
	echo $UDC > ${USB_CONFIGFS_DIR}/UDC
	sleep 0.2
done
EOF

chmod +x /run/usbd.sh
nohup /run/usbd.sh >/dev/null 2>&1 &
Clone this wiki locally