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


相关推荐
xiaoye-duck33 分钟前
《Linux网络编程》UDP Socket 编程实战:从 Echo 回显、通用字典服务到套接字封装全流程
linux·网络·udp
孙克旭_1 小时前
Docker 镜像构建|Vue+SpringBoot+Go 多语言项目 Dockerfile 案例
linux·运维·vue.js·spring boot·docker·dockerfile
life码农2 小时前
Linux截取Nginx指定时间段日志的三种方法(grep/awk/sed)
linux·nginx
Dawn-bit2 小时前
Linux网络进阶:TCP三次握手和四次挥手与TCP连接状态
linux·服务器·网络·tcp/ip·云计算·智能路由器
NJCloud3 小时前
MooseFS 分布式存储部署与高可用架构实践
linux·运维·分布式·架构
mounter6253 小时前
将 RDMA 引入容器:Soft-RoCE (RXE) 网络命名空间支持深度解析
linux·linux kernel·kernel·rdma·net namespace
奈斯先生Vector3 小时前
从 127.0.0.1:3080 到插件运行时:DeepSeek Harness 远程开发与版本治理实战
linux·运维·人工智能·ubuntu·aigc
wuminyu4 小时前
JDK21中虚拟线程和FFM协同实现高并发源码剖析
java·linux·c语言·jvm·c++
Android系统攻城狮4 小时前
Linux PipeWire深度解析之pw_stream_new调用流程与实战(七十八)
linux·运维·服务器·音频进阶·pipewire音频实战进阶
换个号退隐江湖i5 小时前
LLM 调试日志刷屏怎么办?用 tee 边看边存
linux