一、 概述
本文将针对 USB 的 Mass Storage 类的基础知识进行介绍,主要包括 Mass Storage 类的基本框架、标准描述符、Bulk-Only传输方式以及常用的 SCSI 命令等几个方面。
二、 Mass Storage 基本框架
如下图所示为 Mass Storage USB 设备类的基本框架,从图中可以看出,USB Mass Storage 类的协议是通过发送 SCSI 命令来实现跟存储介质的数据交换,MSC 设备接收主机的 SCSI 命令后执行相应的操作,如果需要执行内存的读写则调用对应的内存读写驱动对内存进行访问,对于不同的存储介质存在不同的数据交换协议。
图 2.1 Mass Storage 基本框架
三、 Mass Storage 标准描述符
每个 USB 设备都包括有设备描述符、配置描述符、接口描述符、端点描述符等,用来描述 USB 设备的信息,Mass Storage 类的标准描述符如下所示:
- 设备描述符
图 3.1 Mass Storage 设备描述符
- 配置描述符
图 3.2 Mass Storage 配置描述符
- 接口描述符
图 3.3 Mass Storage 接口描述符
- 端点描述符
图 3.4 Mass Storage 端点描述符
四、Bulk-Only 传输协议(BBB 协议)
USB Mass Storage 类的传输协议主要包括以下几种,如下图所示,CBI 传输协议目前只用于 Full Speed 的软盘设备,该传输协议使用了三种端点进行数据交互,分别是 Control 端点、Bulk 端点、Interrupt 端点。Bulk-Only 协议是 CBI 协议的替代品,相比 CBI协议, Bulk-Only 协议只需要 Bulk 端点即可实现命令、数据、状态的传输,更加节省资源。
图 4.1 Mass Storage 传输协议
Bulk-Only 协议中规定了两个特殊 USB 类请求,分别是 Bulk-Only Mass Storage Reset 和 Get Max LUN。前者的作用是使 MSC设备复位到命令状态的请求,后者则是用于获取 MSC 设备最大逻辑单元数。
Bulk-Only Mass Storage Reset 类请求是通知 MSC 设备接下来的批量传输端点输出数据为 CBW (Command Block Wrapper) 命令块。Bulk-Only Mass Storage Reset 类请求的格式如下所示。
图 4.2 Bulk-Only Mass Storage Reset 类请求格式
Get Max LUN 类请求是主机请求 MSC 设备的最大逻辑单元数(LUN),该请求的格式如下图所示。
图 4.3 Get Max LUN 类请求格式
下图为 Bulk-Only 传输的 数据/命令/状态 三者间的传输流程。
图 4.4 Bulk-Only 数据/命令/状态 传输流程
Bulk-Only 协议中规定命令的传输使用 CBW 的数据格式,该数据格式定义如下:
图 4.5 CBW 数据格式
关于 CBW 数据格式中各字段的定义如下:
字段 |
大小 |
说明 |
dCBWSignature |
4 字节 |
CBW 的签名,用于验证该数据包是否是 CBW |
dCBWTag |
4 字节 |
CBW 标签,设备接收到 CBW 包后回复的 CSW 包中的 bCSWTag 应跟该标签一致 |
dCBWDataTransferLength |
4 字节 |
主机期望通过 Bulk-In/Bulk-Out 端点传输的数据大小,如果该值为 0 则说明 CBW 和 CSW之间没有数据的传输 |
bmCBWFlags |
1 字节 |
该域用来标识数据的传输方向,Bit 7 为 1 时传输方向为 Device->Host,相反为 Host->Device |
bCBWLUN |
4 位 |
该域为该 CBW 的目标逻辑单元 |
bCBWCBLength |
4 位 |
该域标识 CBWCB 域的长度,单位为字节 |
CBWCB |
最大 16 字节 |
命令块的内容 |
表 4.1 CBW 各字段描述
Bulk-Only 协议中规定状态的传输使用 CSW 的数据格式,该数据格式定义如下:
图 4.6 CSW 数据格式
关于 CSW 数据格式中各字段的定义如下:
字段 |
大小 |
说明 |
bCSWSignature |
4 字节 |
CSW 的签名,用于验证该数据包是否是 CSW |
bCSWTag |
4 字节 |
CSW 标签,该域的值跟之前所接收的 CBW 中的 bCBWTag 对应 |
bCSWDataResidue |
4 字节 |
该字段表示 CBW 期待传输的数据大小跟实际传输的数据大小之间的差值 |
bCSWStatus |
1 字节 |
该字段指示命令的执行状态,具体状态的定义如下 |
表 4.2 CSW 各字段描述
图 4.7 命令执行的状态描述
五、常见 SCSI 命令
SCSI 命令通常使用 6 字节的命令描述块和 10 字节的命令描述块两种,具体如下图所示:
图 5.1 SCSI 6 字节命令描述块
图 5.2 SCSI 10 字节命令描述块
如下表所示为常见的 SCSI 命令介绍。
SCSI 命令名称 |
命令代码 |
描述 |
Test Unit Ready |
0x00 |
查询设备是否准备好 |
Request Sense |
0x03 |
主机请求设备返回执行结果、获取状态信息 |
Inquiry |
0x12 |
获取设备信息 |
Mode Sense(6) |
0x1A |
向主机传输参数,采用 6 字节命令块 |
Mode Sense(10) |
0x5A |
向主机传输参数,采用 10 字节命令块 |
Read Capacity(10) |
0x25 |
读取设备容量 |
Read(10) |
0x28 |
读取设备的数据 |
Write(10) |
0x2A |
向设备写入数据 |
Read Format Capacity |
0x23 |
查询当前容量及可用空间 |
Mode Select(6) |
0x15 |
允许主机对外部设备设置参数,采用 6 字节命令块 |
Mode Select(10) |
0x55 |
允许主机对外部设备设置参数,采用 10 字节命令块 |
Prevent/Allow Medium Removal |
0x1E |
禁止/允许存储介质移动 |
Start/Stop Unit |
0x1B |
启动/停止存储单元电源 |
Report LUNs |
0xA0 |
索取设备的 LUN 数量和 LUN 清单 |
Verify |
0x2F |
在存储中验证数据 |
表 5.1 常见的 SCSI 命令
六、参考资料
- 《Mass Storage Bulk Only 1.0》, https://www.usb.org/document-library/mass-storage-bulk-only-10
- 《Mass Storage UFI Command Specification》, https://www.usb.org/document-library/mass-storage-ufi-command-specification-10
- 《Mass Storage Class Specification Overview》, https://www.usb.org/document-library/mass-storage-class-specification-overview-14
评论