且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

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

更新时间:2022-01-23 11:36:32

USB Mass Storage Class Bulk-Only Transport

Microsoft公司至Windows98后,USB主机 都支持BulkOnly标准,所以现在的大容量存储类设备几乎都采用或支持Bulk-Only标准。

 

Bulk-Only传输规范是系统通过默认管道(地 0、端点0)进行枚举后,仅仅使用批量(Bulk)端点传送数据/命令/状态,批量传输方式不受时间限制并能保证数据的完整性。在取得的端点描述符中包含了Bulk-InBulk-Out端点,在Bulk数据收发的时候一定要从相应的端点进行。

 

其中有三种类型的数据在USB主机和设备之间传送,即CBWCSW 和普通数据。CBWCommand Block Wrapper,命令块包)是从USB主机发送到设备的命令包,它由31个字节构成,其中包含的命令遵从接口描述表中的 bInterfaceSubClass域所指定的命令集,一般采用SCSI 传输命令集。USB设备从CBW 中取出并执行相应命令,向主机传送指定数据及发出反映当前命令执行状态的CSWCommand 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:主机发送的命令块标签。设备应在相关CBWdCSWTag字段中将这个字段的内容返回给主机。dCSWTagCSW与对应的CBW联系起来。

 

dCBWDataTransferLength:主机要求在执行CBW命令期间,在批量输入或批量输出端点传输数据字节数。如果该字段为0,则设备和主机不应该在CBW和相关的CSW中间传输数据,设备应该忽略bmCBWFlags中方向位的值。注意,这个字段指明的是跟在CBW之后数据包的长度。

 

bmCBWFlags:本字段的位定义如下:
7:方向。0 = 从主机到设备的DataOut1 = 从设备到主机的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:设备应将这个字段设置为接收到的相应CBWdCBWTag字段值。

 

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,如需转载请自行联系原作者