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命令传输和文件系统解析三个核心环节。


相关推荐
楼田莉子4 分钟前
Linux学习之磁盘与Ext系列文件
linux·运维·服务器·c语言·学习
陌上花开缓缓归以6 分钟前
linux 怎么模拟系统panic重启
linux·运维·服务器
KL's pig/猪头/爱心/猪头33 分钟前
写一个rv1106的led驱动3-功能函数编写
linux·驱动开发·rv1106
月白风清江有声1 小时前
vscode使用git
linux·运维·服务器
zl_dfq1 小时前
Linux 之 【文件】(ext2文件系统、目录、软硬链接)
linux
物理与数学1 小时前
Linux 内核 LRU 页面置换算法
linux·linux内核
小白同学_C3 小时前
Lab1-Xv6 and Unix utilities 配置环境的搭建以及前言 && MIT6.1810操作系统工程【持续更新】
linux·c/c++·操作系统os
haluhalu.3 小时前
深入理解Linux线程机制:线程概念,内存管理
java·linux·运维
乙酸氧铍3 小时前
【imx6ul 学习笔记】Docker 运行百问网 imx6ul_qemu
linux·docker·arm·qemu·imx6ul
不会C++的雾3 小时前
Linux操作系统(2)
linux·数据库·mysql