目录
[USB Subsystem内核配置](#USB Subsystem内核配置)
[USB Phy内核配置](#USB Phy内核配置)
[USB Host Core驱动内核配置](#USB Host Core驱动内核配置)
[USB EHCI驱动内核配置](#USB EHCI驱动内核配置)
[芯片平台USB Host Controller驱动内核配置](#芯片平台USB Host Controller驱动内核配置)
[USB Host MSC相关内核配置](#USB Host MSC相关内核配置)
前言
USB MSC(USB大容量存储设备类)是基于通用串行总线(USB)的存储设备传输协议,用于计算机与移动设备间的标准化文件交互,属于计算机存储设备领域。该协议通过硬件接口适配多种存储介质,包括U盘、移动硬盘、读卡器及集成SD卡的设备,允许操作系统直接读写数据并支持任意文件系统格式化。
其核心采用批量传输模式(Bulk-Only Transport),通过端点配置实现命令、数据、状态三阶段交互架构。Windows自2000版本原生支持,Mac OS与Linux内核2.4以上版本均内置驱动,Android系统也通过该协议实现存储设备识别。历史应用中,安卓4.0前默认采用MSC模式,后因兼容性调整为与MTP共存,实测传输速率较MTP提升约12%。

USB HOST MSC是主控做HOST端,USB HOST接口接入USB大容量存储设备(USB Mass Storage Device Class,也称为USB MSC或UMS)。
我们常见的USB大容量存储设备有:U盘、USB读卡器、USB移动硬盘和USB移动光盘驱动器等。
DTS配置的参考
bash
/* usb20 host controller */
usb_1: usb1@YYYYYYYY {
compatible = "xxx,xxx-usb";
reg = <0xYYYYYYYY 0xYYY>;
interrupts = <GIC_SPI INT_USB20_HOST IRQ_TYPE_LEVEL_HIGH>;
clocks = <&ahbX_gate 9>, <&ahbX_reset 9>;
clock-names = "usb_gate", "usb_reset";
xxx,usbphy = <&usbphy_1>;
dr_mode = "host"; /* 配置成了USB host模式 */
...
内核配置的参考
USB Subsystem内核配置
bash
CONFIG_USB_SUPPORT=y
CONFIG_USB_ARCH_HAS_HCD=y
USB Phy内核配置
bash
CONFIG_USB_PHY=y
CONFIG_USB_NX_PHY=y
USB Host Core驱动内核配置
bash
CONFIG_USB_COMMON=y
CONFIG_USB=y
CONFIG_USB_ANNOUNCE_NEW_DEVICES=y
CONFIG_USB_DEFAULT_PERSIST=y
USB EHCI驱动内核配置
bash
CONFIG_USB_EHCI_HCD=y
CONFIG_USB_EHCI_ROOT_HUB_TT=y
CONFIG_USB_EHCI_TT_NEWSCHED=y
CONFIG_USB_EHCI_HCD_PLATFORM=y
芯片平台USB Host Controller驱动内核配置
bash
CONFIG_USB_XXX=y
CONFIG_USB_XXX_HOST=y
CONFIG_USB_XXX_DEBUG=y
USB Host MSC相关内核配置
bash
CONFIG_MSDOS_PARTITION #多分区支持
CONFIG_SCSI=y
CONFIG_BLK_DEV_SD=y #支持U盘、USB读卡器和USB移动硬盘等
CONFIG_BLK_DEV_SR=y #支持USB移动光盘驱动器
CONFIG_USB_STORAGE=y
CONFIG_USB_STORAGE_DEBUG=y
文件系统相关内核配置
bash
# USB移动光盘驱动器的配置
CONFIG_ISO9660_FS=y
CONFIG_JOLIET=y
CONFIG_ZISOFS=y
CONFIG_UDF_FS=y
# 小于2TB的U盘和USB读卡器的文件系统配置
CONFIG_MSDOS_FS=y
CONFIG_VFAT_FS=y
CONFIG_FAT_FALLOCATE=y
# USB移动硬盘的文件系统配置
CONFIG_NTFS_FS=y
CONFIG_NTFS_DEBUG=y
CONFIG_NTFS_RW=y
验证测试的参考
U盘或USB读卡器的验证测试
- 编译并烧录固件后,正常开机,接入USB大容量存储设备(比如U盘),查看该设备是否已经被挂载,例如:
bash
# mount | grep "sda"
/dev/sda on /mnt/usb type vfat (rw,relatime,fmask=0000,dmask=0000,allow_utime=0022,codepage=936,iocharset=utf8,shortname=mixed,errors=remount-ro)
- 若需要格式化USB大容量存储设备,可以执行如下命令:
bash
# umount /mnt/usb (若该设备已经被挂载则需要先卸载)
# mkfs.vfat -F 32 -n U-DISK /dev/sda
mkfs.fat 4.1 (2023-05-25)
其中:
- -F:用于指定FAT类型,可以使用-F FAT12、-F FAT16、-F FAT32来指定所创建的FAT文件系统的类型。默认情况下,mkfs.vfat将根据设备的大小来选择FAT类型;
- -n:用于指定卷标,用于标识和描述存储介质。
- 若需要手动挂载USB大容量存储设备,可以执行如下命令:
bash
# mount -t vfat -o iocharset=utf8,codepage=936 /dev/sda /mnt/usb
# mount | grep "sda" (查看该设备是否已经被挂载)
/dev/sda on /mnt/usb type vfat (rw,relatime,fmask=0022,dmask=0022,codepage=936,iocharset=utf8,shortname=mixed,errors=remount-ro)
- 查看`/mnt/usb`目录的文件。例如:
bash
# ls -l /mnt/usb
total 0
- 拷贝一个文件到`/mnt/usb`目录并列出文件。例如:
bash
# cp -rvf /etc/shadow /mnt/usb/
'/etc/shadow' -> '/mnt/usb/shadow'
# ls -l /mnt/usb
total 16
-rwxrwxrwx 1 root root 164 Jun 14 00:35 shadow
- 测试拔插USB大容量存储设备(比如U盘)。例如:
bash
# sda umount usb disk ok
sda usb insert
/dev/sda
start to mount sda usb device
mount sda usb device ok
# ls -l /mnt/usb
total 0
-rwxrwxrwx 1 root root 0 Jun 14 00:35 shadow
USB移动硬盘的验证测试
- 烧录固件后,正常开机,接入USB移动硬盘,查看是否生成对应的设备。
bash
# ls -l /dev/sda*
brw------- 1 root root 8, 0 Jan 1 23:02 /dev/sda
brw------- 1 root root 8, 1 Jan 1 23:02 /dev/sda1
brw------- 1 root root 8, 2 Jan 1 23:02 /dev/sda2
brw------- 1 root root 8, 5 Jan 1 23:02 /dev/sda5
- 若需要手动挂载USB移动硬盘设备,可以执行如下命令:
bash
# mount -t ntfs /dev/sda1 /mnt/usb
# mount | grep "sda"
/dev/sda1 on /mnt/usb type ntfs (rw,relatime,uid=0,gid=0,fmask=0177,dmask=077,nls=iso8859-1,errors=continue,mft_zone_multiplier=1)
- 查看`/mnt/usb`目录的文件。例如:
bash
# ls -l /mnt/usb
total 16
drwx------ 1 root root 4096 Jul 11 2024 $RECYCLE.BIN
drwx------ 1 root root 4096 Apr 15 2025 System Volume Information
drwx------ 1 root root 8192 Aug 24 2025 TEST
drwx------ 1 root root 0 Apr 15 2025 found.000
drwx------ 1 root root 0 Apr 13 2025 TEST_FILE
USB移动光盘驱动器的验证测试
- 烧录固件后,正常开机,接入USB移动光盘驱动器,查看是否生成对应的设备。
bash
# ls -l /dev/sr*
brw------- 1 root root 11, 0 Jan 1 23:10 /dev/sr0
- 弹出光驱托盘并放置测试用的光盘,弹出光驱托盘命令如下:
bash
# eject -s /dev/sr0
- 若需要手动挂载USB移动光盘驱动器设备,可以执行如下命令:
bash
# mount -t iso9660 /dev/sr0 /mnt/usb
# mount | grep "/dev/sr"
/dev/sr0 on /mnt/usb type iso9660 (ro,relatime,norock,check=r,map=n,blocksize=2048)
- 查看`/mnt/usb`目录的文件。例如:
bash
# ls -l /mnt/usb
total 161
dr-xr-xr-x 1 root root 2048 Jul 16 2012 AUDIO
-r-xr-xr-x 1 root root 156160 Jul 19 2012 VIDEO
dr-xr-xr-x 1 root root 2048 Jul 19 2012 Android
dr-xr-xr-x 1 root root 2048 May 24 2012 PPT
dr-xr-xr-x 1 root root 2048 Jul 19 2012 TMP
总结
在Linux系统中,USB Mass Storage(USB大容量存储)设备通常指的是通过USB接口连接的外部硬盘、USB闪存驱动器或其他存储设备,这些设备可以被用作文件存储、数据备份、数据传输等。而主控端识别USB MSC设备中的文件,本质上是通过多层协议协作实现的,涉及USB枚举、SCSI命令传输和文件系统解析三个核心环节。