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
|
dCBWSignature
| |||||||
4-7
|
dCBWTag
| |||||||
8-11(08h
- 0Bh)
|
dCBWDataTransferLength
| |||||||
12(0Ch)
|
bmCBWFlags
| |||||||
13(0Dh)
|
Reserved (0)
|
bCBWLUN
| ||||||
14(0Eh)
|
Reserved (0)
|
bCBWCBLength
| ||||||
15-30(0Fh
- 1Eh)
|
CBWCB
|
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
|
保留
|
转载于:https://blog.51cto.com/lancelot/292104