基于OHCI的USB主机 ―― UFI命令 USB Mass Storage Class Bulk-Only Transport协议介绍

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
保留

你可能感兴趣的:(命令,主机,usb,OHC,UFI)