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 SupportUSB 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 ConfigFSUSB 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 0chmod +x S01_usb-gadget - 若使用Systemd,创建
board/<your-board>/rootfs-overlay/etc/systemd/system/usb-gadget.service:
然后在Buildroot中启用该服务:[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.targetmake 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
相关产品推荐
相关产品推荐

