Linux USB HOST EXTERNAL STORAGE

目录

目录

前言

DTS配置的参考

内核配置的参考

[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相关内核配置)

文件系统相关内核配置

验证测试的参考

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配置的参考

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读卡器的验证测试

  1. 编译并烧录固件后,正常开机,接入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)
  1. 若需要格式化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:用于指定卷标,用于标识和描述存储介质。
  1. 若需要手动挂载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)
  1. 查看`/mnt/usb`目录的文件。例如:
bash 复制代码
# ls -l /mnt/usb
  total 0
  1. 拷贝一个文件到`/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
  1. 测试拔插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移动硬盘的验证测试

  1. 烧录固件后,正常开机,接入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
  1. 若需要手动挂载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)
  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移动光盘驱动器的验证测试

  1. 烧录固件后,正常开机,接入USB移动光盘驱动器,查看是否生成对应的设备。
bash 复制代码
# ls -l /dev/sr*
  brw-------  1 root  root  11,  0 Jan  1 23:10 /dev/sr0
  1. 弹出光驱托盘并放置测试用的光盘,弹出光驱托盘命令如下:
bash 复制代码
# eject -s /dev/sr0
  1. 若需要手动挂载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)
  1. 查看`/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命令传输和文件系统解析三个核心环节。


相关推荐
驱动开发0072 小时前
Windows_Hello_Configuration_Analysis Windows Hello 配置过程分析 setup包分析
windows·驱动开发·云计算·计算机外设·usb重定向
食咗未2 小时前
Linux USB HOST HID
linux·驱动开发·人机交互
Xの哲學2 小时前
Linux SLAB分配器深度解剖
linux·服务器·网络·算法·边缘计算
齐鲁大虾3 小时前
UOS(统信操作系统)如何更新CUPS(通用Unix打印系统)
linux·服务器·chrome·unix
虾..4 小时前
Linux 简单日志程序
linux·运维·算法
huoxingwen5 小时前
Ubuntu 22.04 上 VMware Workstation 点击虚拟机窗口就消失的解决历程
linux·运维·ubuntu
姚青&5 小时前
Linux 常用命令之基本命令
linux·运维·服务器
一路往蓝-Anbo5 小时前
【第05期】数据的微观世界 (五) —— 浮点数 vs 定点数:MCU的数学课
linux·stm32·单片机·嵌入式硬件·物联网
G_H_S_3_5 小时前
【网络运维】企业级监控平台Zabbix:部署与实践指南
linux·运维·网络·zabbix