Quantcast
Channel: Raspberry Pi Forums
Viewing all articles
Browse latest Browse all 7747

Ubuntu • Ubuntu 22.04 LTS For Pi , open usb bulk failed

$
0
0
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:

Code:

unable to open ep0Unable to prepare ffs: -2
Could you please advise how to fix this issue? Looking forward to your reply.

This 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 0

Statistics: Posted by zhenghong — Sun Jun 14, 2026 4:25 am



Viewing all articles
Browse latest Browse all 7747

Latest Images

Trending Articles



Latest Images