174 lines
5.2 KiB
Bash
174 lines
5.2 KiB
Bash
#!/bin/bash
|
|
|
|
# The IP address shared by all USB network interfaces created by this script.
|
|
net_ip=192.168.42.120
|
|
# The associated netmask.
|
|
net_mask=255.255.0.0
|
|
|
|
enable_vcom=0
|
|
enable_rndis=0
|
|
enable_bulk=1
|
|
|
|
startup_bulk_dir=$(dirname "$0")
|
|
startup_bulk_exe=/SDCard/USB_BULK/startup_bulk
|
|
|
|
#if [ ! -d /sys/kernel/config/usb_gadget ]; then
|
|
# if ! $(grep -q dtoverlay=dwc2 /boot/config.txt) ; then
|
|
# echo -e "\n\n\n## customized\n# for op-sdk enable USB device RNDIS\n[all]\ndtoverlay=dwc2" >> /boot/config.txt
|
|
# init 6
|
|
# fi
|
|
#
|
|
# if ! $(grep -q modules-load=dwc2 /boot/cmdline.txt) ; then
|
|
# sed -i 's/rootwait /&modules-load=dwc2 /' /boot/cmdline.txt
|
|
# init 6
|
|
# fi
|
|
#
|
|
# if ! $(grep -q libcomposite /etc/modules) ; then
|
|
# echo -e "\n\n\n## customized\n# for op-sdk enable USB device RNDIS\nlibcomposite" >> /etc/modules
|
|
# init 6
|
|
# fi
|
|
#
|
|
# exit 1
|
|
#fi
|
|
|
|
# 卸载 g_mass_storage
|
|
if lsmod | grep -q g_mass_storage; then
|
|
echo "Unloading g_mass_storage module..."
|
|
modprobe -r g_mass_storage || { echo "WARNING: Failed to unload g_mass_storage. This might cause issues."; }
|
|
sleep 1
|
|
fi
|
|
|
|
# 卸载 g_ether
|
|
if lsmod | grep -q g_ether; then
|
|
echo "Unloading g_ether module..."
|
|
modprobe -r g_ether || { echo "WARNING: Failed to unload g_ether. This might cause issues."; }
|
|
sleep 1
|
|
fi
|
|
rmmod g_mass_storage
|
|
sleep 1
|
|
rm -rf /sys/kernel/config/usb_gadget/pi4
|
|
if [ ! -d /sys/kernel/config/usb_gadget/pi4 ]; then
|
|
echo "Creating USB Gadget configuration..."
|
|
mkdir -p /sys/kernel/config/usb_gadget/pi4
|
|
cd /sys/kernel/config/usb_gadget/pi4
|
|
echo 0x2ca3 > idVendor # Linux Foundation
|
|
echo 0xF001 > idProduct # Multifunction Composite Gadget
|
|
|
|
if [ ${enable_vcom} -eq 1 ]; then
|
|
echo 0xF002 > idProduct # Multifunction Composite Gadget
|
|
fi
|
|
|
|
if [ ${enable_rndis} -eq 1 ]; then
|
|
echo 0xF003 > idProduct # Multifunction Composite Gadget
|
|
fi
|
|
|
|
if [ ${enable_bulk} -eq 1 ]; then
|
|
echo 0xF001 > idProduct # Multifunction Composite Gadget
|
|
fi
|
|
|
|
echo 0x0001 > bcdDevice # v1.0.0
|
|
echo 0x0200 > bcdUSB # USB2
|
|
|
|
echo 0xEF > bDeviceClass
|
|
echo 0x02 > bDeviceSubClass
|
|
echo 0x01 > bDeviceProtocol
|
|
|
|
mkdir -p strings/0x409
|
|
echo "psdk-rpi4b" > strings/0x409/serialnumber
|
|
echo "raspberry" > strings/0x409/manufacturer
|
|
echo "PI4" > strings/0x409/product
|
|
|
|
cfg=configs/c.1
|
|
|
|
mkdir -p "${cfg}"
|
|
echo 0x80 > ${cfg}/bmAttributes
|
|
echo 250 > ${cfg}/MaxPower
|
|
|
|
cfg_str=""
|
|
|
|
if [ ${enable_rndis} -eq 1 ]; then
|
|
cfg_str="${cfg_str}+RNDIS"
|
|
func=functions/rndis.usb0
|
|
mkdir -p "${func}"
|
|
ln -sf "${func}" "${cfg}"
|
|
|
|
# Informs Windows that this device is compatible with the built-in RNDIS
|
|
# driver. This allows automatic driver installation without any need for
|
|
# a .inf file or manual driver selection.
|
|
echo 1 > os_desc/use
|
|
echo 0xcd > os_desc/b_vendor_code
|
|
echo MSFT100 > os_desc/qw_sign
|
|
echo RNDIS > "${func}/os_desc/interface.rndis/compatible_id"
|
|
echo 5162001 > "${func}/os_desc/interface.rndis/sub_compatible_id"
|
|
|
|
ln -sf "${cfg}" os_desc
|
|
fi
|
|
|
|
if [ ${enable_vcom} -eq 1 ]; then
|
|
cfg_str="${cfg_str}+ACM0"
|
|
func=functions/acm.gs0
|
|
mkdir -p "${func}"
|
|
ln -sf "${func}" "${cfg}"
|
|
fi
|
|
|
|
if [ ${enable_bulk} -eq 1 ]; then
|
|
mkdir -p /dev/usb-ffs
|
|
|
|
cfg_str="${cfg_str}+BULK1"
|
|
mkdir -p /dev/usb-ffs/bulk1
|
|
func=functions/ffs.bulk1
|
|
mkdir -p "${func}"
|
|
ln -sf "${func}" "${cfg}"
|
|
mount -o mode=0777,uid=2000,gid=2000 -t functionfs bulk1 /dev/usb-ffs/bulk1
|
|
|
|
cfg_str="${cfg_str}+BULK2"
|
|
mkdir -p /dev/usb-ffs/bulk2
|
|
func=functions/ffs.bulk2
|
|
mkdir -p "${func}"
|
|
ln -sf "${func}" "${cfg}"
|
|
mount -o mode=0777,uid=2000,gid=2000 -t functionfs bulk2 /dev/usb-ffs/bulk2
|
|
|
|
cfg_str="${cfg_str}+BULK3"
|
|
mkdir -p /dev/usb-ffs/bulk3
|
|
func=functions/ffs.bulk3
|
|
mkdir -p "${func}"
|
|
ln -sf "${func}" "${cfg}"
|
|
mount -o mode=0777,uid=2000,gid=2000 -t functionfs bulk3 /dev/usb-ffs/bulk3
|
|
fi
|
|
|
|
mkdir -p "${cfg}/strings/0x409"
|
|
echo "${cfg_str:1}" > "${cfg}/strings/0x409/configuration"
|
|
# cd -
|
|
|
|
fi
|
|
|
|
if [ ${enable_bulk} -eq 1 ]; then
|
|
if [ ! -f ${startup_bulk_exe} ]; then
|
|
cd ${startup_bulk_dir}
|
|
make && ( $? != 0 ) && ( exit 1 )
|
|
cp startup_bulk ${startup_bulk_exe}
|
|
make clean
|
|
cd -
|
|
fi
|
|
|
|
${startup_bulk_exe} /dev/usb-ffs/bulk1 &
|
|
sleep 1
|
|
${startup_bulk_exe} /dev/usb-ffs/bulk2 &
|
|
sleep 1
|
|
${startup_bulk_exe} /dev/usb-ffs/bulk3 &
|
|
sleep 1
|
|
fi
|
|
|
|
udevadm settle -t 5 || :
|
|
ls /sys/class/udc > UDC
|
|
|
|
if [ ${enable_rndis} -eq 1 ]; then
|
|
/sbin/brctl addbr pi4br0
|
|
/sbin/ifconfig pi4br0 ${net_ip} netmask ${net_mask} up
|
|
|
|
/sbin/brctl addif pi4br0 usb0
|
|
/sbin/ifconfig usb0 down
|
|
/sbin/ifconfig usb0 up
|
|
fi
|
|
exit 0
|