Hello team,
I installed Raspberry Pi OS 64-bit Desktop via Raspberry Pi Imager on my Raspberry Pi 4B, and the USB Bulk function works properly after I execute raspi-usb-device-start.sh. However, the same USB Bulk feature fails to run on Ubuntu 22.04 LTS Desktop for Raspberry Pi.
After checking relevant documents, I found that the usb_f_ffs (FunctionFS) kernel module is missing on Ubuntu. This causes an error when executing my script raspi-usb-device-start.sh:Could you please advise how to fix this issue? Looking forward to your reply.
This is my raspi-usb-device-start.sh:
I installed Raspberry Pi OS 64-bit Desktop via Raspberry Pi Imager on my Raspberry Pi 4B, and the USB Bulk function works properly after I execute raspi-usb-device-start.sh. However, the same USB Bulk feature fails to run on Ubuntu 22.04 LTS Desktop for Raspberry Pi.
After checking relevant documents, I found that the usb_f_ffs (FunctionFS) kernel module is missing on Ubuntu. This causes an error when executing my script raspi-usb-device-start.sh:
Code:
unable to open ep0Unable to prepare ffs: -2This is my raspi-usb-device-start.sh:
Code:
#!/bin/bashecho "========================================"echo "= DJI PSDK USB Bulk 启动脚本="echo "========================================"# 【添加:启动前强制清理,防止锁死】echo -e "\n[1/10] 清理旧 USB 占用..."pkill -f startup_bulk 2>/dev/nullecho "" > /sys/kernel/config/usb_gadget/pi4/UDC 2>/dev/nullrm -rf /sys/kernel/config/usb_gadget/pi4 2>/dev/nullumount /dev/usb-ffs/bulk1 2>/dev/nullumount /dev/usb-ffs/bulk2 2>/dev/nullumount /dev/usb-ffs/bulk3 2>/dev/nullsleep 1echo "[1/10] 清理完成"# The IP address shared by all USB network interfaces created by this script. if u want to ping [DJI Mavic 3E] , you must set net_ip = 192.168.90.*. Because [Mavic 3E]`s ip is fixed as: 192.168.90.1net_ip=192.168.90.2# The associated netmask.net_mask=255.255.0.0enable_vcom=0enable_rndis=0enable_bulk=1startup_bulk_dir=$(dirname "$0")startup_bulk_exe=${startup_bulk_dir}/startup_bulkecho -e "\n[2/10] 配置信息:"echo " 脚本目录:$startup_bulk_dir"echo " 启动程序:$startup_bulk_exe"echo " 本机IP:$net_ip"echo " 启用Bulk:$enable_bulk"echo " 启用RNDIS:$enable_rndis"echo " 启用VCOM:$enable_vcom"echo -e "\n[3/10] 检查 USB Gadget 驱动..."if [ ! -d /sys/kernel/config/usb_gadget ]; then echo " 错误:/sys/kernel/config/usb_gadget 不存在!驱动未启用" if ! $(grep -q dtoverlay=dwc2 /boot/firmware/config.txt) ; then echo -e "\n## customized\n# for op-sdk enable USB device RNDIS\n[all]\ndtoverlay=dwc2" >> /boot/firmware/config.txt init 6 fi if ! $(grep -q modules-load=dwc2 /boot/firmware/cmdline.txt) ; then sed -i 's/rootwait /&modules-load=dwc2 /' /boot/firmware/cmdline.txt init 6 fi if ! $(grep -q libcomposite /etc/modules) ; then echo -e "\n## customized\n# for op-sdk enable USB device RNDIS\nlibcomposite" >> /etc/modules init 6 fi exit 1fiecho " 驱动正常"echo -e "\n[4/10] 卸载冲突驱动 g_ether..."modprobe g_ether 2>/dev/nullrmmod g_ether 2>/dev/nullsleep 1echo " 驱动卸载完成"#写入gadget配置文件echo -e "\n[5/10] 创建 USB Gadget 配置..."if [ ! -d /sys/kernel/config/usb_gadget/pi4 ]; then 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 echo " 挂载 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 echo " 挂载 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 -fiecho " USB Gadget 配置完成"echo -e "\n[6/10] 启动 Bulk 传输程序..."if [ ${enable_bulk} -eq 1 ]; then echo " 启动 Bulk1 ..." ${startup_bulk_exe} /dev/usb-ffs/bulk1 & sleep 1 echo " 启动 Bulk2 ..." ${startup_bulk_exe} /dev/usb-ffs/bulk2 & sleep 1 #${startup_bulk_exe} /dev/usb-ffs/bulk3 & #sleep 1fiecho " Bulk 程序启动完成"echo -e "\n[7/10] 等待 USB 设备就绪..."udevadm settle -t 5 || :echo " 就绪"echo -e "\n[8/10] 绑定 UDC(激活USB设备)..."ls /sys/class/udc > /sys/kernel/config/usb_gadget/pi4/UDCecho " UDC 绑定完成!设备已上线"echo -e "\n[9/10] 配置 RNDIS 网络..."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 echo " RNDIS 网络配置完成"else echo " RNDIS 未启用,跳过"fiecho -e "\n========================================"echo "✅ 脚本执行完成!USB Bulk 已启动"echo "========================================"exit 0Statistics: Posted by zhenghong — Sun Jun 14, 2026 4:25 am







