USB Mass Storage协议分析
目录
简介
USB Mass storage Device协议即海量存储设备协议适用于硬盘,U盘等大容量存储设备。协议使用的接口端点有BulkIn、BulkOut和Interrupt端点。该设备类又包含6个独立的子类以及3种传输协议。
| bInterfaceSubClass | 命令集 | 描述 |
|---|---|---|
| 01h | RBC | 通常,FlashDevice使用RBC,事实上所有大容量存储设备都可使用RBC |
| 02h | SFF-8020i,MMC-2(ATAPI) | 适用硬盘,C/DVD |
| 03h | QIC-157 | 适用磁盘 |
| 04h | UFI | 适用软盘 |
| 05h | SFF-8070i | 适用移动存储设备 |
| 06h | SCSI | 目前绝大多数USB Mass Storage设备都使用SCSI指令集 |
| bInterfaceProtocol | 协议实现 | 描述 |
| 00h | Control/Bulk/Interrupt protocol(含命令完成中断) | USB海量存储类CBI传输,只适用于全速 |
| 01h | Control/Bulk/Interrupt protocol(不含命令完成中断) | USB海量存储类CBI传输,只适用于全速 |
| 50h | Bulk-Only传输 | Bulk-Only传输 |
本文仅介绍SCSI子类下Bulk-Only的传输协议,我们手中的U盘就是遵循SCSI协议的。要知道U盘不仅仅是USB设备,它还是一种存储设备,类似硬盘,USB协议本身没有定义对存储设备操作的指令,所以需要通过SCSI来完成读写等操作。关于此类设备的描述符不再赘述,需要注意的是在interface描述符中:
- bInterfaceClass = 0x08
- bInterfaceSubClass = 0x06
- bInterfaceProtocol = 0x50
指令、数据和状态协议
CBW指令格式
CBW(Command Block Wrapper)的长度为31个字节,具体定义如下图:

- dCBWSignature:CBW的标识,固定值:43425355h (little endian)。
- dCBWTag:主机发送的一个命令块标识,设备需要原样作为dCSWTag(CSW中的一部分)再发送给Host;主要用于关联CSW到对应的CBW。
- dCBWDataTransferLength:本次CBW命令要求在命令与回应之间传输的字节数。如果为0,则不传输数据。
- bmCBWFlags:反映数据传输的方向,0x00 表示来自Host,0x80 表示发至Host;
- bCBWLUN:对于有多个LUN逻辑单元的设备,用来选择具体目标。如果没有多个LUN,则写0。
- bCBWCBLength:命令的长度,范围在0~16.
- CBWCB:传输的具体命令,符合bInterfaceSubClass.中定义的命令规范,此处是SCSI指令集
CSW(Command Status Wrapper)状态格式
CSW的长度为13个字节,是对应CBW指令的状态返回,它指示了上一条指令执行是否成功,具体定义如下:

- dCSWSignature:CSW的标识,固定值:53425355h (little endian)
- dCSWTag:设置这个标识和CBW中的dCBWTag一致,参照上面关于dCBWTag的解释
- dCSWDataResidue:还需要传送的数据,此数据根据dCBWDataTransferLength-本次已经传送的数据得到
- bCSWStatus:指示命令的执行状态。如果命令正确执行,bCSWStatus 返回0 ,不正确返回1,phase错返回2(当HOST收到此错误时需要对Device复位)
SCSI命令集
SCSI(Small Computer System Interface)的指令集有很多,参考http://en.wikipedia.org/wiki/SCSI_command ,其中USB Mass Storage主要用到的指令有:
- 04H Format Unit:格式化存储设备
- 12H Inquiry:获取设备信息
- 55H Mode Select:HOST用来设置外设参数
- 5AH Mode Sense:返回参数
- 28H/A8H Read(10)/Read(12):从设备读取数据
- 25H Read Capacity:读取设备容量
- 23H Read Format Capacity:读取当前设备容量和可格式化的容量
- 1EH Prevent/Allow Medium Removal:写保护
- 03H Request Sense:获取状态信息
- 2BH Seek(10):为设备分配地址
- 1DH Send Diagnostic:硬件复位并执行诊断
- 00H Test Unit Ready:查询设备是否ready
- 2AH/AA Write(10)/Write(12):写数据到存储设备
- 2EH Write and Verify:写数据到存储设备并校验
Format Unit
|
Bit Byte |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
|
0 |
04H |
|||||||
|
1 |
LUN |
FmtData |
CmpList |
Defect List Format |
||||
|
2 |
Vendor-specific |
|||||||
|
3 |
Interleave (MSB) |
|||||||
|
4 |
Interleave (LSB) |
|||||||
|
5—6 |
保留 |
|||||||
|
7 |
Parameter List Length (MSB) |
|||||||
|
8 |
Parameter List Length (LSB) |
|||||||
- Interleave:默认为0,对于USB-FDU此值为1
- Parameter List Length:参数列表长度,典型值为12bytes,Host发出Format命令后紧接着发参数
Parameter List
|
Bit Byte |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
|
0 |
Reserved |
|||||||
|
1 |
FOV |
Extend(0) |
DCRT(1) |
SingleTrack |
Reserved |
Immediate |
Side |
|
|
2 |
Defect List Length (MSB) (0) |
|||||||
|
3 |
Defect List Length (LSB) (8) |
|||||||
|
4—7 |
MSB Number of Blocks |
|||||||
|
8 |
Reserved |
|||||||
|
9—11 |
MSB Block Length |
|||||||
- FOV:当DCRT或Immediate置1时,此位也须置1
- DCRT:置1表示无需对盘符进行认证,须置1
- SingleTrack:置1表示只对指定Format Unit命令指定的Track格式化
- Immediate:置1时,device必须立刻返回状态信息,不支持UFI设备
- Side:对SingleTrack有效,置1从顶部开始格式化,置0从底部开始格式化
注意:Number of Block和Block Length的值要与Read Format Capacity的返回相匹配
Inquiry
|
Bit Byte |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
|
0 |
12H |
|||||||
|
1 |
LUN |
Reserved |
EVPD(0) |
|||||
|
2 |
Page Code |
|||||||
|
3 |
Reserved |
|||||||
|
4 |
MSB Allocation Length |
|||||||
|
5—11 |
Reserved |
|||||||
- Page Code:需要查询的页码,对于UFI设备仅支持00H
- Allocation Length:定义了需要查询和返回的最大字节数
标准INQUIRY返回数据
|
Bit Byte |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
|
0 |
Reserved |
Peripheral Device Type |
||||||
|
1 |
RMB |
Reserved |
||||||
|
2 |
ISO Version(00h) |
ECMA Version(00h) |
ANSI Version (00h) |
|||||
|
3 |
Reserved |
Response Data Format |
||||||
|
4 |
Additional Length (31) |
|||||||
|
5—7 |
Reserved |
|||||||
|
8—15 |
Vendor Information |
|||||||
|
16—31 |
Product Identification |
|||||||
|
32—35 |
Product Revision Level |
|||||||
- Peripheral Device Type:标识当前连接逻辑单元的类型,00H为直接存储设备,05H为光盘
- RMB(Removable Media Bit):置1表示是可移除设备
- Response Data Format:UFI设备置1
- Additional Length:参数长度,UFI设备此值为1FH
MODE SELECT
|
Bit Byte |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
|||
|
0 |
55H |
||||||||||
|
1 |
LUN |
PF |
Reserved |
SP |
|||||||
|
2—6 |
Reserved |
||||||||||
|
7—8 |
MSB Parameter List Length |
||||||||||
|
9—11 |
Reserved |
||||||||||
- PF:UFI设备置1
- SP(Save Pages):UFI设备不支持
- Parameter List Length:参数长度
MODE SENSE
|
Bit Byte |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
|
0 |
5AH |
|||||||
|
1 |
LUN |
Reserved |
DBD |
Reserved |
||||
|
2 |
PC |
Page Code |
||||||
|
3—6 |
Reserved |
|||||||
|
7—8 |
MSB Parameter List Length |
|||||||
|
9—11 |
Reserved |
|||||||
- DBD - Disable Block Descriptors - if "1" then the target must not return any block descriptors
- PC - Page control -
- 00 - return current values
- 01 - return changeable values
- 10 - return default values
- 11 - return saved values
- Page Code - 参考 SCSI mode pages
PREVENT-ALLOW MEDIUM REMOVAL
Bit
Byte
7
6
5
4
3
2
1
0
0
1EH
1
LUN
Reserved
2-3
Reserved
4
Reserved
Prevent
5-11
Reserved
Prevent:置1表示禁止移除设备
READ(10)
Bit
Byte
7
6
5
4
3
2
1
0
0
28H
1
LUN
DPO(0)
FUA(0)
Reserved
RelAdr(0)
2-5
Logical Block Address
6
Reserved
7—8
MSB Transfer Length
9—11
Reserved
READ(12) A8H的Transfer Length为32位,从6-9字节
READ CAPACITY
Bit
Byte
7
6
5
4
3
2
1
0
0
25H
1
LUN
Reserved
RelAdr(0)
2-5
Logical Block Address(0)
6-7
Reserved
8
Reserved
PMI(0)
9—11
Reserved
此命令返回8个字节,0-3表示最后一个逻辑块的地址,4-7表示每个逻辑块的长度
READ FORMAT CAPACITIES
Bit
Byte
7
6
5
4
3
2
1
0
0
23H
1
LUN
Reserved
2-6
Reserved
7-8
Allocation Length
9-11
Reserved
Allocation Length:定义了HOST能够接收的最大格式化数据长度
REQUEST SENSE
Bit
Byte
7
6
5
4
3
2
1
0
0
03H
1
LUN
Reserved
2-3
Reserved
4
Allocation Length
5-11
Reserved
Allocation Length:定义了HOST能够接收的最大格式化数据长度
HOST每发送完一个命令,device都会通过REQUEST SENSE返回该条指令的执行结果,sense data的长度为18字节。
标准sense data
Bit Byte
7
6
5
4
3
2
1
0
0
Valid
Error Code (70h)
1
Reserved
2
Reserved
Sense Key
3-6
Information
7
Additional Sense Length (0AH)
8-11
Reserved
12
Additional Sense Code (Mandatory)
13
Additional Sense Code Qualifier (Mandatory)
14-17
Reserved
Valid:表示Information域是否有效
Information:表示出错的逻辑块地址
SEEK
Bit
Byte
7
6
5
4
3
2
1
0
0
2BH
1
LUN
Reserved
2-5
Logical Block Address
6-11
Reserved
SEND DIAGNOSTIC
Bit
Byte
7
6
5
4
3
2
1
0
0
1DH
1
LUN
PF
Reserved
SelfTest
DefOfl
UnitOfl
2-11
Reserved
SelfTest:置1表示执行默认的自检,置0表示执行特殊的自检
TEST UNIT READY
Bit
Byte
7
6
5
4
3
2
1
0
0
00H
1
LUN
Reserved
2-11
Reserved
VERIFY
Bit
Byte
7
6
5
4
3
2
1
0
0
2FH
1
LUN
DPO(0)
Reserved
ByteChk(0)
RelAdr(0)
2-5
Logical Block Address
6
Reserved
7-8
Verification Length
9-11
Reserved
Logical Block Address:验证的起始地址
Verification Length:验证数据的长度
WRITE(10)
Bit
Byte
7
6
5
4
3
2
1
0
0
2AH
1
LUN
DPO(0)
FUA(0)
Reserved
RelAdr(0)
2-5
Logical Block Address
6
Reserved
7-8
Transfer Length
9-11
Reserved
WRITE(12) AAH的Transfer Length为32位,从6-9字节
WRITE AND VERIFY
Bit
Byte
7
6
5
4
3
2
1
0
0
2EH
1
LUN
DPO(0)
Reserved
ByteChk
(0)
RelAdr(0)
2-5
Logical Block Address
6
Reserved
7-8
Transfer Length
9-11
Reserved
USB Mass Storage协议分析的更多相关文章
- USB mass storage协议
这一节主要把在实现“linux模拟U盘功能”过程中的一些调试过程记录下来,并加以解析. 一.背景知识 1.USB Mass Storage类规范概述 USB 组织在univers ...
- USB Mass Storage大容量存储的基本知识
http://www.crifan.com/files/doc/docbook/usb_disk_driver/release/htmls/ch02_msc_basic.html 目录 2.1. US ...
- USB Mass Storage大容量存储 The Thirteen Class章节的理解
http://blog.csdn.net/xgbing/article/details/7002558 USB Mass Storage 6.7 The Thirteen Class章节的理解 Cas ...
- USB Mass Storage学习笔记-STM32+FLASH实现U盘
一.内容概述 采用STM32内部自带USB控制器外加大页NAND FLASH K9F1G08U0A实现一个128M的U盘. 1.STM32的USB控制器 STM32F103的MCU自带USB从控制器 ...
- usb mass storage之旅
前面总结了usb hid keyboard,现在总结usb mass storage,在枚举阶段没什么好总结的,hid和mass storage差不多,都是同样的枚举过程,但是在他们的配置描述符.接口 ...
- 实现Linux下的U盘(USB Mass Storage)驱动
如何实现Linux下的U盘(USB Mass Storage)驱动 版本:v0.7 How to Write Linux USB MSC (Mass Storage Class) Driver Cri ...
- 如何实现Linux下的U盘(USB Mass Storage)驱动
如何实现Linux下的U盘(USB Mass Storage)驱动 版本:v0.7 How to Write Linux USB MSC (Mass Storage Class) Driver Cri ...
- Android USB Connections Explained: MTP, PTP, and USB Mass Storage
Android USB Connections Explained: MTP, PTP, and USB Mass Storage Older Android devices support USB ...
- usb mass storage device
Problem adding USB host device to KVM Windows guest machine. Status: CLOSED CURRENTRELEASE Aliases ...
随机推荐
- 自己动手写PHP MVC框架
自己动手写PHP MVC框架 来自:yuansir-web.com / yuansir@live.cn 代码下载: https://github.com/yuansir/tiny-php-framew ...
- MFC DestroyWindow窗口对象和窗口句柄的销毁
考虑单窗口情况: 假设自己通过new创建了一个窗口对象pWnd,然后pWnd->Create.则销毁窗口的调用次序: 1. 手工调用pWnd->DestroyWindow(): 2. De ...
- 【LeetCode练习题】Minimum Depth of Binary Tree
Minimum Depth of Binary Tree Given a binary tree, find its minimum depth. The minimum depth is the n ...
- SoftLayer®凭借Flex Images™消融物理与虚拟服务器之间的界线
网摘文档留存,日后有用; 达拉斯--(美国商业资讯)--随着SoftLayer Flex Images的推出,物理与虚拟IT资源之间的界线正在变得模糊.Flex Images让用户能够捕捉.复制并存储 ...
- js跳转页面代码用法
一:window.location.href='https://www.baidu.com'; 需要加上http或者https,否则会查找项目内htm打开. 二:window.history.bac ...
- MSSQL 镜像
1.设置数据库CollectionDB 为完整备份模式服务端: USE master ALTER DATABASE CollectionGuest SET RECOVERY FULL GO 镜相端: ...
- 熬之滴水穿石:Spring--精简的J2EE(5)
47--Spring的MVC 在Spring的框架中也存在MVC这样的模式,在Spring下有2个这样的控制器一个叫Controller, ...
- SQLServer查询逻辑读最高的语句
select top 25 p.name as [SP Name], deps.total_logical_reads as [TotalLogicalReads], deps.total_logic ...
- Javascript中正则表达式的全局匹配模式
先看一道JavaScript题目,据说是国内某知名互联网企业的JavaScript笔试题,如果对正则的全局匹配模式不了解的话可能会对下面的输出结果感到疑惑. var str = "123#a ...
- 有关docker新版的icc、iptables的一个巨坑
之前玩过docker的icc=false.iptables=true 按照这两个参数配置之后,想指定两个特定的容器通讯,直接用--link即可. 但最近我在下载了1.12新版的docker,这个不奏效 ...