目录
目录
前言
DTS配置的参考
内核配置的参考
USB Subsystem内核配置
USB Phy内核配置
USB Host Core驱动内核配置
USB EHCI驱动内核配置
芯片平台USB Host Controller驱动内核配置
USB Host MSC相关内核配置
文件系统相关内核配置
验证测试的参考
U盘或USB读卡器的验证测试
USB移动硬盘的验证测试
USB移动光盘驱动器的验证测试
总结
前言
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配置的参考
/* 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内核配置
CONFIG_USB_SUPPORT=y CONFIG_USB_ARCH_HAS_HCD=yUSB Phy内核配置
CONFIG_USB_PHY=y CONFIG_USB_NX_PHY=yUSB Host Core驱动内核配置
CONFIG_USB_COMMON=y CONFIG_USB=y CONFIG_USB_ANNOUNCE_NEW_DEVICES=y CONFIG_USB_DEFAULT_PERSIST=yUSB EHCI驱动内核配置
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驱动内核配置
CONFIG_USB_XXX=y CONFIG_USB_XXX_HOST=y CONFIG_USB_XXX_DEBUG=yUSB Host MSC相关内核配置
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文件系统相关内核配置
# 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读卡器的验证测试
1. 编译并烧录固件后,正常开机,接入USB大容量存储设备(比如U盘),查看该设备是否已经被挂载,例如:
# 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)2. 若需要格式化USB大容量存储设备,可以执行如下命令:
# 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:用于指定卷标,用于标识和描述存储介质。
3. 若需要手动挂载USB大容量存储设备,可以执行如下命令:
# 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)4. 查看`/mnt/usb`目录的文件。例如:
# ls -l /mnt/usb total 05. 拷贝一个文件到`/mnt/usb`目录并列出文件。例如:
# 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 shadow6. 测试拔插USB大容量存储设备(比如U盘)。例如:
# 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 shadowUSB移动硬盘的验证测试
1. 烧录固件后,正常开机,接入USB移动硬盘,查看是否生成对应的设备。
# 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/sda52. 若需要手动挂载USB移动硬盘设备,可以执行如下命令:
# 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)3. 查看`/mnt/usb`目录的文件。例如:
# 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_FILEUSB移动光盘驱动器的验证测试
1. 烧录固件后,正常开机,接入USB移动光盘驱动器,查看是否生成对应的设备。
# ls -l /dev/sr* brw------- 1 root root 11, 0 Jan 1 23:10 /dev/sr02. 弹出光驱托盘并放置测试用的光盘,弹出光驱托盘命令如下:
# eject -s /dev/sr03. 若需要手动挂载USB移动光盘驱动器设备,可以执行如下命令:
# 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)4. 查看`/mnt/usb`目录的文件。例如:
# 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命令传输和文件系统解析三个核心环节。