USB海量存储类单批量传输1规范概述1.1概述该规范适合于已经熟悉USB1.0、USB1.1规范和大致了解USB海量存储类(MassStorageClass)规范的读者。这个规范描述了单批量(Bulk-Only)传输方式,该传输方式即是仅使用批量传输端点(不使用中断、控制传输端点)对命令、数据、状态进行传输。缺省管道仅用来请求批量端点上的STALL停止的状态和执行类特定请求命令。该规范不需要使用中断端点。该规范支持逻辑单元共享设备特性。尽管这种特性提供了对类似海量存储设备共享USB接口描述符的支持,但它并不是为实现桥接设备的功能而设计的。2术语和缩写2.1协定没有特别强调的数为十进制数………………………………1,17,23十六进制数后紧跟“h”…………………………………….1Fh,FCh,38h二进制数后紧跟“b”………………………………………..011b,101b,01110010b斜体字是USB协议或是该规范定义的术语………………bRequese,dCSWTag2.2定义CommandBlockWrapper(CBW)一个包含一个命令块和一些附加信息的封包。CommandStatusWrapper(CSW)一个包含一个命令块状态的封包。Data-In代表一个从设备到主机的输入传输。Data-Out代表一个从主机到设备的输出传输。DeviceRequest主机通过缺省管道对设备的请求。PhaseError设备返回的一个错误信息,该信息指明如果不对设备进行复位操作,那么对后面CBWs处理的结果将会不确定。Processed被设备接收和内在控制的数据不再需要主机干涉。Relevant设备发送到主机的重要数据的数量。ResetRecovery主机为设备准备的为以后的CBWs进行错误恢复的程序。ThinDiagonal主机和设备完全认同在哪里进行数据传输的情况。见第六章-《主机/设备数据传输》附加的关于错误情况和“thindiagonal”信息。3功能特性3.1Bulk-OnlyMassStorage复位(类特定请求命令)该请求用于复位MassStorage设备及其接口。该类特定请求命令使设备处于准备就绪状态,以接收下一次主机发出的CBW。主机将通过缺省管道发送请求给设备。设备保存该批传输的toggle位和端点STALL停止状态除非该Bulk-OnlyMassStorage复位。该设备将NAK设备请求状态阶段直到Bulk-OnlyMassStorage复位完成。为了产生Bulk-OnlyMassStorage复位,主机将在缺省管道上产生设备请求:·bmRequestType:类、接口、主机到设备·bRequest字段设置为255(FFh)·wValue字段设置为0·wIndex字段设置为接口号·wLength字段设置为0表3.1Bulk-OnlyMassStorage复位bmRequestTypebRequestwValuewIndexwLengthData00100001b11111111b0000hInterface0000hnone3.2GetMaxLUN(类特定请求命令)该设备可能实现若干个逻辑单元共享设备功能特性。主机使用bCBWLUN来指定该设备的哪个逻辑单元来接收主机发出的命令。“取得最大逻辑单元数(GetMaxLUN)”设备请求用来确定设备所拥有的逻辑单元的数量。“设备逻辑单元数(LogicalUnitNumbers)”应该按从LUN0开始到最大LUN15(Fh)来定序。为了产生GetMaxLUN设备请求,主机将在缺省管道上产生设备请求:·bmRequestType:类、接口、设备到主机·bRequest字段设置为254(Feh)·wIndex字段设置为0·wIndex字段设置为接口号·wLength字段设置为1表3.2GetMaxLUNbmRequestTypebRequestwValuewIndexwLengthData10100001b11111110b0000hInterface0001h1byte设备将返回1字节用于描述设备所包含逻辑单元数的数据。例如,如果设备包含4个逻辑单元,则LUNs应该被连续从0到3进行编号,返回值为3。若设备没有LUN,则返回值为0。主机不能针对不存在的逻辑单元发送“命令块封包(CBW)”。不支持多LUNs的设备将STALL该命令。3.3主机/设备包传输顺序主机在输出传输(Data-Out)前先发出CBW,设备在主机发出CBW后进行输入传输(Data-In),然后发出CSW。主机可能在发出CBW前请求输入(Data-In)或CSW。3.4命令顺序主机不会传输CBW给设备直到主机接收到任何一个CBW的CSW。如果主机产生两个连续的CBWs而没有一个介于其间的CSW或者复位,则设备对第二个CBW的响应是不确定的。3.5Bi-Directional命令协议该规范不提供在单一命令中进行bi-directional数据传输。4标准描述符设备支持以下的标准USB描述符:·设备(Device).每个USB设备有一个设备描述符。·配置(Configuration).每个USB设备有一个默认的配置描述符,它至少支持一个接口。·接口(Interface).设备支持至少一个接口,在这里知道诸如Bulk-Only数据接口。有的设备可能支持额外的接口,以此来提供其它的能力。·端点(Endpoint).除了各种USB设备都需要的缺省管道外,设备还支持以下端点:§批量输入(Bulk-In)端点§批量输出(Bulk-Out)端点有些设备可能会支持额外的端点,以此来提供其它的能力。主机对选中的接口使用先前提到的Bulk-In和Bulk-Out端点。·字符串(String).设备支持一个唯一的序列号。详见4.1.1-《序列号》。该规范定义没有class-specific描述符。这部分余下的章节描述了标准的USB设备、配置、接口、端点和字符串描述符。如果想了解更多的关于标准描述符的信息,参见USB规范的章节9,《USB设备架构》。4.1设备描述符(DeviceDescriptor)每个USB设备只有一个设备描述符。设备类码和设备子类码是在接口描述符(InterfaceDescriptor)而不是在设备描述符中给定的。表4.1设备描述符OffsetFieldSizeValueDescription0bLength字节12h该描述符的字节数1bDescriptorType字节01h设备描述符类型2bcdUSB字xxxxhUSB版本号4bDeviceClass字节00hUSB分配的设备类代码5bDeviceSubClass字节00hUSB分配的之类代码6bDeviceProtocol字节00hUSB分配的设备协议代码7bMaxPacketSize0字节xxh端点0的最大包的大小8idVendor字xxxxh厂商编号10idProduct字xxxxh产品编号12bcdDevice字xxxxh设备出厂编号14iManufacturer字节xxh描述厂商字符串的索引15iProduct字节xxh描述产品字符串的索引16iSerialNumber字节xxh描述设备序列号字符串的索引17bNumConfigurations字节xxh可能的配置数量注:该表的信息摘自USB规范1.1的表9-7。4.1.1序列号(SerialNumber)iSerialNumber字段被设置为包含序列号的字符串描述符(stringdescriptor)的索引值。序列号包含至少12个合法阿拉伯数字,它是以UNICODE方式编码的。针对每个USB设备的idVerdor和idProduct对,序列号中最后12个阿拉伯数字是唯一的。通过连接16位的idVendor、16位的idProduct和由iSerialNumber字段索引的最后12个字符所代表的值,主机可能产生一个通用的唯一的标识。iSerialNumber是字符串描述符的索引,并不包含字符串本身。下面是一个字符串描述符(Stringdescriptor)的示例。4.3接口描述符设备最少支持一个接口,例如Bulk-Only数据接口。Bulk-Only数据接口使用了3个端点。复合的massstorage设备可能支持而外的接口,以此来提供诸如音频、视频等其它的功能特性。该规范没有定义这类接口。接口可能支持多种可供选择使用的设置。主机检查每一个选择设置来寻找bInterfaceProtoocol和bInterfaceSubClass以提供最佳的支持。表4.5Bulk-Only数据接口描述符OffsetFieldSizeValueDescription0bLength字节09h接口描述符的字节数大小1bDescriptorType字节04h接口描述符类型编号2bInterfaceNumber字节0xh接口的编号3bAlternateSetting字节xxh备用的接口描述符编号4bNumEndpoints字节xxh该接口使用的端点数,不包括端点05bInterfaceClass字节08h接口类型6bInterfaceSubClass字节0xh接口子类类型码7bInterfaceProtocol字节50h接口遵循的协议8iInterface字节xxh描述该接口的字符串索引值注:该表的信息摘自USB规范1.1的表9-9。4.4端点描述符(EndpointDescriptors)设备支持至少3个端点:控制、Bulk-In、Bulk-Out.每一个USB设备都定义了控制端点(Endpoint0)。这就是缺省端点,它不需要描述符。4.4.1Bulk-In端点Bulk-In端点用于从设备传输数据和状态到主机。表4.6Bulk-In端点描述符OffsetFieldSizeValueDescription0bLength字节07h端点描述符的字节数大小1bDescriptorType字节05h端点描述符类型编号2bEndpointAdress字节8xh该端点在USB设备上的地址。该地址编码如下:BitDescription3..0端点号6..4保留,设置为070=In3bmAttributes字节02h这是一个Bulk端点4wMaxPacketSize字00xxh最大封包大小。应该为8,16,32或64字节(08h,10h,20h,40h)6bInterval字节00h在Bulk端点中不使用4.4.2Bulk-Out端点表4.7Bulk-Out端点描述符OffsetFieldSizeValueDescription0bLength字节07h端点描述符的字节数大小1bDescriptorType字节05h端点描述符类型编号2bEndpointAdress字节0?h该端点在USB设备上的地址。该地址编码如下:BitDescription3..0端点号6..4保留,设置为070=Out3bmAttributes字节02h这是一个Bulk端点4wMaxPacketSize字00xxh最大封包大小。应该为8,16,32或64字节(08h,10h,20h,40h)6bInterval字节00h在Bulk端点中不使用5命令/数据/状态协议图1展示了命令、Data-In、Data-Out传输的流程,接下来的部分定义了命令和状态的传输。图2展示状态传输的细节。紧接着的部分概括了主机/从机通信的各种条件、可能的错误、恢复机制。图1命令/数据/状态流5.1命令块封包(CommandBlockWrapper,简写为CBW)表5.1命令块封包(CommandBlockWrapper)bitByte765432100-3dCBWSignature4-7dCBWTag8-11(08h-0Bh)dCBWDataTransferLength12(0Ch)bmCBWFlags13(0Dh)Reserved(0)bCBWLUN14(0Eh)Reserved(0)bCBWCBLength15-30(0Fh-1Eh)CBWCBdCBWSignature:该