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


相关推荐
凡人叶枫5 小时前
C++中输入、输出和文件操作详解(Linux实战版)| 从基础到项目落地,避坑指南
linux·服务器·c语言·开发语言·c++
wdfk_prog5 小时前
[Linux]学习笔记系列 -- [drivers][input]serio
linux·笔记·学习
春日见5 小时前
车辆动力学:前后轮车轴
java·开发语言·驱动开发·docker·计算机外设
xuhe25 小时前
[全流程详细教程]Docker部署ClawBot, 使用GLM4.7, 接入TG Bot实现私人助理. 解决Docker Openclaw Permission Denied问题
linux·docker·ai·github·tldr
Lsir10110_6 小时前
【Linux】进程信号(下半)
linux·运维·服务器
酉鬼女又兒6 小时前
零基础入门Linux指南:每天一个Linux命令_pwd
linux·运维·服务器
云飞云共享云桌面6 小时前
高性能图形工作站的资源如何共享给10个SolidWorks研发设计用
linux·运维·服务器·前端·网络·数据库·人工智能
zl_dfq6 小时前
Linux 之 【多线程】(pthread_xxx、轻量级进程、原生线程库、线程ID、__thread、线程栈、线程与信号、线程与程序替换)
linux
choke2336 小时前
Python 基础语法精讲:数据类型、运算符与输入输出
java·linux·服务器
AZ996ZA6 小时前
自学linux的第二十一天【DHCP 服务从入门到实战】
linux·运维·服务器·php