linux的usb storage,原生系统默认是没有的,需要自己配置。那就需要配置usb的gadget功能。在kernel的config开关中需要保证
这些开关打开
CONFIG_USB=y
CONFIG_USB_EHCI_HCD=y
CONFIG_USB_EHCI_MXC=y
CONFIG_USB_STORAGE=y
CONFIG_USB_CHIPIDEA=y
CONFIG_USB_CHIPIDEA_UDC=y
CONFIG_USB_CHIPIDEA_HOST=y
CONFIG_NOP_USB_XCEIV=y
CONFIG_USB_MXS_PHY=y
CONFIG_USB_GADGET=y
CONFIG_USB_MASS_STORAGE=y
顺便说一下gadget,Gadget 框架提出了一套标准API, 在底层, USB 设备控制器 (USB Device Controller, UDC) 驱动则实现这一套 API, 不同的 UDC (通常是 SOC 的一部分) 需要不同的驱动, 甚至基于同样的 UDC 的不同板子也需要进行代码修改。这一层我们可以称之为平台相关层。
有了gadget功能,我们就可以将我们的主板配置为U盘,鼠标,键盘等usb接口功能了。
? Gadget Zero, 类似于 dummyhcd, 该驱动用于测试 udc 驱动。它会帮助您通过 USB-IF 测试。
? Ethernet over USB, 该驱动模拟以太网网口,它支持多种运行方式:
? CDC Ethernet: usb 规范规定的 CommunicationsDevice Class “Ethernet Model” protocol。
? CDC Subset: 对硬件要求最低的一种方式,主要是 Linux 主机支持该方式。
? RNDIS: 微软公司对 CDCEthernet 的变种实现。
? File-backed Storage Gadget最常见的 U 盘功能实现。
? Serial Gadget 实现,包括:
? Generic Serial 实现(只需要Bulk-in/Bulk-out端点+ep0)
? CDC ACM 规范实现。
? Gadget Filesystem, 将 GadgetAPI 接口暴露给应用层,以便在应用层实现user modedriver。
? MIDI: 暴露ALSA接口,提供 recording 以及 playback 功能。
添加完上述开关之后,需要配置一些属性了,包括VID PID等信息,以及空间配置,这个可以通过如下的shell脚本打包实现:
#!/bin/sh
#set -xv
set -e
mount -t configfs none /sys/kernel/config/
cd /sys/kernel/config/usb_gadget/
mkdir g2
cd g2/echo "0xABCD" >idVendor
echo "0x1017" >idProduct
cat idVendor
cat idProduct
mkdir strings/0x409/
echo "012345678ABCDEF" >strings/0x409/serialnumber
echo "Dragon" >strings/0x409/manufacturer
echo "DragonMSC" >strings/0x409/productmkdir functions/mass_storage.usb0
echo /dev/mmcblk1p1 >functions/mass_storage.usb0/lun.0/filemkdir configs/c.1
mkdir configs/c.1/strings/0x409/echo "abc" > configs/c.1/strings/0x409/configuration
cat configs/c.1/strings/0x409/configuration
ln -s functions/mass_storage.usb0/ configs/c.1/ls /sys/class/udc/
echo ci_hdrc.0 >UDCecho !!!!!!!!!!!!!!!!!!
echo !!!!!OK!!!!!!!!!!!
echo !!!!!!!!!!!!!!!!!!