You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Buildroot系统启动时配置configFS实现USB大容量存储自动识别及教程咨询

解决Buildroot开机直接识别为USB大容量存储的方案

核心思路

要避免主机触发新USB设备提示,关键是在系统启动早期、udev枚举USB设备前就完成USB Gadget的配置与激活,而非等系统启动后再通过脚本执行。以下是具体实现步骤:

1. 调整内核配置(Buildroot中配置)

进入Buildroot的make menuconfig,确保以下内核选项设为内置(Built-in,选y),而非模块(Module,选m):

  • Kernel Configuration > Device Drivers > USB support > USB Gadget Support
    • USB Gadget Support (CONFIG_USB_GADGET=y)
    • USB Gadget precomposed configurations > Mass Storage Gadget (CONFIG_USB_GADGET_STORAGE=y)
  • Kernel Configuration > Device Drivers > USB support > USB Gadget Support > USB ConfigFS
    • USB ConfigFS (CONFIG_USB_CONFIGFS=y)
    • USB ConfigFS Mass Storage (CONFIG_USB_CONFIGFS_MASS_STORAGE=y)

内置配置能让内核启动时直接加载相关驱动,避免模块加载带来的延迟。

2. 早期初始化USB Gadget

创建初始化脚本,放入Buildroot的rootfs overlay中,确保在udev启动前执行:

2.1 编写初始化脚本

创建usb-gadget-setup.sh,内容如下:

#!/bin/sh

# 挂载ConfigFS(若未自动挂载)
if [ ! -d /sys/kernel/config/usb_gadget ]; then
    mount -t configfs none /sys/kernel/config
fi

# 创建Gadget实例
GADGET_DIR="/sys/kernel/config/usb_gadget/my_usb_drive"
mkdir -p $GADGET_DIR
cd $GADGET_DIR

# 配置设备ID
echo 0x1d6b > idVendor    # Linux Foundation 厂商ID
echo 0x0104 > idProduct   # 大容量存储设备产品ID
echo 0x0200 > bcdUSB      # USB 2.0版本
echo 0x0100 > bcdDevice   # 设备版本

# 配置字符串描述符
mkdir -p strings/0x409
echo "Embedded Device" > strings/0x409/manufacturer
echo "USB Mass Storage" > strings/0x409/product
echo "SN12345678" > strings/0x409/serialnumber

# 创建配置项
mkdir -p configs/c.1/strings/0x409
echo "Default Config" > configs/c.1/strings/0x409/configuration
echo 500 > configs/c.1/MaxPower  # 最大功耗500mA

# 添加大容量存储功能
mkdir -p functions/mass_storage.0
echo /dev/mmcblk0p1 > functions/mass_storage.0/lun.0/file  # 替换为你的存储设备路径
echo 1 > functions/mass_storage.0/lun.0/removable          # 模拟可移除U盘
echo "Portable Drive" > functions/mass_storage.0/lun.0/inquiry_string

# 绑定功能到配置
ln -s functions/mass_storage.0 configs/c.1/

# 绑定到USB控制器(替换为你的UDC设备,可通过ls /sys/class/udc/查看)
echo ci_hdrc.0 > UDC

2.2 配置Buildroot加载脚本

  • 将脚本放入Buildroot的board/<your-board>/rootfs-overlay/usr/bin/目录,设置可执行权限:chmod +x usb-gadget-setup.sh
  • 若使用SysVinit,创建board/<your-board>/rootfs-overlay/etc/init.d/S01_usb-gadget,内容为:
    #!/bin/sh
    #
    # Start USB Gadget
    
    case "$1" in
        start)
            echo "Starting USB Mass Storage Gadget..."
            /usr/bin/usb-gadget-setup.sh
            ;;
        stop)
            echo "Stopping USB Mass Storage Gadget..."
            echo "" > /sys/kernel/config/usb_gadget/my_usb_drive/UDC
            ;;
        restart)
            $0 stop
            $0 start
            ;;
        *)
            echo "Usage: $0 {start|stop|restart}"
            exit 1
            ;;
    esac
    exit 0
    
    设置权限:chmod +x S01_usb-gadget
  • 若使用Systemd,创建board/<your-board>/rootfs-overlay/etc/systemd/system/usb-gadget.service:
    [Unit]
    Description=USB Mass Storage Gadget Setup
    DefaultDependencies=no
    Before=sysinit.target udevd.service
    After=sysfs.target
    
    [Service]
    Type=oneshot
    ExecStart=/usr/bin/usb-gadget-setup.sh
    RemainAfterExit=yes
    
    [Install]
    WantedBy=multi-user.target
    
    然后在Buildroot中启用该服务:make menuconfig > System configuration > Systemd services to enable > usb-gadget.service

这样脚本会在udev启动前执行,主机开机时直接识别设备,不会触发新设备提示。


ConfigFS USB Gadget 使用教程

1. 基础概念

ConfigFS是内核提供的虚拟文件系统,用于运行时配置内核子系统。USB Gadget通过ConfigFS可灵活定义USB设备的功能、描述符等,无需修改内核代码。

2. 基本操作流程

2.1 挂载ConfigFS

首先挂载ConfigFS,可添加到/etc/fstab实现开机自动挂载:

# 临时挂载
mount -t configfs none /sys/kernel/config

# 永久挂载(添加到/etc/fstab)
echo "none /sys/kernel/config configfs defaults 0 0" >> /etc/fstab

2.2 创建Gadget实例

进入ConfigFS的USB Gadget目录,创建自定义名称的gadget目录:

mkdir -p /sys/kernel/config/usb_gadget/my_gadget
cd /sys/kernel/config/usb_gadget/my_gadget

2.3 配置设备基本参数

设置USB设备的核心标识:

echo 0x1d6b > idVendor    # 厂商ID(可自定义,需符合USB-IF规范)
echo 0x0104 > idProduct   # 产品ID(大容量存储设备常用0x0104)
echo 0x0200 > bcdUSB      # USB版本(0x0200=USB2.0,0x0300=USB3.0)
echo 0x0100 > bcdDevice   # 设备硬件版本

2.4 设置字符串描述符

配置主机识别设备时显示的文本信息:

mkdir -p strings/0x409  # 0x409对应英文编码,可添加其他语言
echo "My Company" > strings/0x409/manufacturer
echo "Custom USB Drive" > strings/0x409/product
echo "SN000001" > strings/0x409/serialnumber

2.5 创建配置项

定义设备的配置参数(如功耗):

mkdir -p configs/c.1/strings/0x409
echo "Standard Config" > configs/c.1/strings/0x409/configuration
echo 500 > configs/c.1/MaxPower  # 最大功耗,单位mA(USB2.0最大500mA)

2.6 添加USB功能

以大容量存储为例,创建功能节点并配置:

mkdir -p functions/mass_storage.0
# 指定共享的块设备(SD卡分区、虚拟磁盘文件均可)
echo /dev/mmcblk0p1 > functions/mass_storage.0/lun.0/file
# 设置为可移除设备(模拟U盘,主机可安全弹出)
echo 1 > functions/mass_storage.0/lun.0/removable
# 设置主机查询时返回的字符串
echo "My USB Drive" > functions/mass_storage.0/lun.0/inquiry_string

2.7 绑定功能到配置

通过符号链接将功能关联到配置项:

ln -s functions/mass_storage.0 configs/c.1/

2.8 激活Gadget

将Gadget绑定到USB控制器,完成设备激活:

# 查看可用的USB控制器:ls /sys/class/udc/
echo ci_hdrc.0 > UDC

2.9 停用Gadget

如需关闭设备,取消绑定即可:

echo "" > UDC

3. 常见问题

  • 权限错误:操作ConfigFS需root权限,确保脚本以root执行。
  • 控制器路径错误:执行ls /sys/class/udc/查看可用的UDC设备,替换脚本中的对应名称。
  • 存储设备不可用:确保指定的块设备存在,且未被挂载(大容量存储直接访问块设备,无需挂载)。

内容的提问来源于stack exchange,提问作者lucky-star

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 07:34:57