USB Mass Storage Class Bulk-Only Transport
Microsoft
公司至
Windows98
后,
USB
主机
都支持
Bulk
-
Only
标准,所以现在的大容量存储类设备几乎都采用或支持
Bulk-Only
标准。
Bulk-Only
传输规范是系统通过默认管道(地
址
0
、端点
0
)进行枚举后,仅仅使用批量(
Bulk
)端点传送数据
/
命令
/
状态,批量传输方式不受时间限制并能保证数据的完整性。在取得的端点描述符中包含了
Bulk-In
和
Bulk-Out
端点,在
Bulk
数据收发的时候一定要从相应的端点进行。
其中有三种类型的数据在
USB
主机和设备之间传送,即
CBW
、
CSW
和普通数据。
CBW
(
Command Block Wrapper
,命令块包)是从
USB
主机发送到设备的命令包,它由
31
个字节构成,其中包含的命令遵从接口描述表中的
bInterfaceSubClass
域所指定的命令集,一般采用
SCSI
传输命令集。
USB
设备从
CBW
中取出并执行相应命令,向主机传送指定数据及发出反映当前命令执行状态的
CSW
(
Command Status Wrapper
,状态包),它由
13
个字节构成,主机根据
CSW
来判断此次操作是否正确,从而决定是继续传送数据还是进行数据传输的错误校验。事实上错误校验一直伴随着整个数据的处理过程中。
命令块数据包(CBW)
CBW
应该从数据包的边界开始,在正好传输了
31
个字节后作为短包结束。所有后续数据和
CSW
都应该从新数据包的边界开始,
CBW
的说明如下表:
位
字节
|
7
|
6
|
5
|
4
|
3
|
2
|
1
|
0
|
0-3
|
d
C
B
W
S
ignature
|
|||||||
4-7
|
d
C
B
W
T
a
g
|
|||||||
8-11(08h - 0Bh)
|
d
C
B
W
Da
taTransferLength
|
|||||||
12(0Ch)
|
bm
C
B
W
F
lags
|
|||||||
13(0Dh)
|
R
eserved
(0)
|
b
C
B
W
LUN
|
||||||
14(0Eh)
|
R
eserved
(0)
|
b
C
B
W
C
B
Length
|
||||||
15-30(0Fh - 1Eh)
|
C
B
WCB
|
dCBWSignature
:帮助指明该数据报为
CBW
的信号标记。这个字段的值为
0x43425355
(小端),表示这是一个
CBW
。
dCBWTag
:主机发送的命令块标签。设备应在相关
CBW
的
dCSWTag
字段中将这个字段的内容返回给主机。
dCSWTag
将
CSW
与对应的
CBW
联系起来。
dCBWDataTransferLength
:主机要求在执行
CBW
命令期间,在批量输入或批量输出端点传输数据字节数。如果该字段为
0
,则设备和主机不应该在
CBW
和相关的
CSW
中间传输数据,设备应该忽略
bmCBWFlags
中方向位的值。注意,这个字段指明的是跟在
CBW
之后数据包的长度。
bmCBWFlags
:本字段的位定义如下:
位
7
:方向。
0 =
从主机到设备的
DataOut
,
1 =
从设备到主机的
DataIn
;
位
6
:废弃的,主机应该将该位设置为
0
;
位
5-0
:保留,主机应该将该位设置为
0
;
bCBWLUN
:命令块发送的设备逻辑单元号(
LUN
)。对于支持多个
LUN
的设备,主机应该将该字段设置为命令块寻址的
LUN
。否则应该设置为
0
。对于
U
盘主机系统来说,因为
U
盘都不支持多个
LUN
,因此该字段应该设置为
0
。
CBWCB
:设备将执行的命令块,对于
U
盘主机系统来说,就是将执行的
UFI
命令块。
命令状态包(CSW)
CSW
应从包的边界开始,在传输了
13
个字节以后结束,
CSW
的说明如下表:
位
字节
|
7
|
6
|
5
|
4
|
3
|
2
|
1
|
0
|
0-3
|
dCSWSignature
|
|||||||
4-7
|
dCSWTag
|
|||||||
8-11(08h - 0Bh)
|
dCSWDataResidue
|
|||||||
12(0Ch)
|
bCSWStatus
|
dCSWSignature
:帮助指明该数据包为
CSW
的信号标记,这个字段的值为
0x53425355
(小端),表示这是一个
CSW
。
dCSWTag
:设备应将这个字段设置为接收到的相应
CBW
的
dCBWTag
字段值。
dCSTDataResidue
:对于
DataOut
,设备应在这个字段报告
dCBWDataTransferLength
字段规定的要求数量与设备实际处理的数据量之差。对于
DataIn
,设备应在这个字段报告
dCBWDataTransferLength
字段规定的要求数量与设备实际发送的数据量之差。
dCSWResidue
的值不会超过
dCBWDataTransferLength
发送的值。
bCSWStatus
:表示命令执行是否成功。
0 =
执行成功,非
0
表示失败,如下表:
值
|
描述
|
00h
|
命令通过(运行良好)
|
01h
|
命令失败
|
02h
|
状态错误
|
03 - 04h
|
保留(废弃)
|
05 - FFh
|
保留
|
本文转自 tywali 51CTO博客,原文链接:http://blog.51cto.com/lancelot/292104,如需转载请自行联系原作者