USB 3.0规范中译本第9章 设备框架

原文地址 https://www.cnblogs.com/coryxie/p/3956414.html

本文为CoryXie原创译文,转载及有任何问题请联系cory.xie#gmail.com。

设备框架可以被分成三层:

  • 最底层是总线接口层,传送和接收包。
  • 中间层处理在总线接口和设备的各种端点之间路由数据。如同USB 2.0,端点时最终的数据消费者或提供者。它可以被想作是数据源或者目的。端点的特性在端点描述符中描述,例如,端点的传输类型,最大负载(MaxPacketSize),以及一次可以接收或者发送的包个数(Burst Size)。
  • 最上层是由串行总线设备提供的功能性,例如,鼠标或者视频摄像头接口。

本章描述设备的中间层的通用属性以及操作。这些属性和操作被设备的功能特定的部分用来通过总线接口并最终于之间进行通信。

9.1 USB设备状态 【USB Device States】

一个设备具有几个可能的状态。有些状态对于USB和主机是可见的,而其他的则在设备内部。本节描述那些状态。

9.1.1 可见的设备状态【Visible Device States】

本节描述外部可见的设备状态(见图9-1)。表9-1总结了这些可见的设备状态。

注意:设备执行一个复位操作作为对上游面端口上的复位信号的响应。当复位信号以及完成,设备就被复位。复位信号依赖于链路状态。参考7.3节的细节。

注意USB 3.0集线器有两个独立的状态图,一个是对于9-2显示的SuperSpeed部分,另一个是对可以在USB 2.0的图9-1中找到的非SuperSpeed部分。

表 9-1. 可见的SuperSpeed 设备状态 【Visible SuperSpeed Device States】

 

Attached

Powered

Default

Address

Configured

Suspended【注1】

State

No

--

--

--

--

--

设备没有连接到USB。其他的属性不重要。

Yes

No

--

--

--

--

设备连接到USB但是没有被上电。其他的属性不重要。

Yes

Yes

No

--

--

--

设备连接到USB并且被上电,而其上游链路还没有成功完成训练。

Yes

Yes

Yes

No

--

--

设备连接到USB并且被上电,并且已经被复位,但是还没有被设定一个唯一的地址。设备在默认的地址上响应。

Yes

Yes

Yes

Yes

No

--

设备连接到USB并且被上电,并且已经被复位,并且已经被设定了一个唯一的地址。设备还没有被配置。

Yes

Yes

Yes

Yes

Yes

No

设备连接到USB并且被上电,并且已经被复位,并且有一个唯一的地址,已经被配置。主机现在可以使用设备提供的功能。

Yes

Yes

Yes

--

--

Yes

设备,在最小程度上,处于默认状态(连接在USB上,已经被上电,并且其上游链路已经成功被训练),并且其上游链路已经被其上游链路伙伴设置到U3。它可能也具有一个唯一的地址,并且为了使用而被配置。然而,由于设备是被挂起的,主机不能使用设备的功能。

 

9.1.1.1 Attached

设备可以被连接到USB,或从USB上断开。设备在从USB上断开后的状态没有在本规范中定义。本规范只包括设备一旦被连接后的必要的操作和属性。

9.1.1.2 Powered

设备可以从外部电源以及/或者从他们所连接着的USB上获得电源。外部供电的设备被称为自供电设备。尽管自供电设备可能已经在他们被连接到USB之前就已经被加电,他们还是不被认为是处于Powered状态,直到他们被连接到USB,并且VBUS已经被应用于该设备。

一个设备可同时支持自供电和总线供电的配置。有些设备配置支持任何任何两种电源之一。其他设备配置可能仅当该设备是自供电时才可用。设备通过配置描述符报告电源能力。当前电源作为设备状态的一部分被报告。设备可能会在任何时候改变他们的电源,例如,从自供电到总线供电。如果配置有能力同时支持两种电源模式,对该配置被报告的最大电源是该设备在任何模式下设备将从Vbus汲取的最大值。该装置应遵守这个最大值,而无论它的模式如何。如果配置只支持一个电源模式而设备的电源发生了变化,设备将失去其当前的配置及地址,并返回到Powered状态。如果在超高速模式运行的设备是自供电的,并且其目前的配置要求超过150毫安,那么如果该设备切换到总线供电,它应该返回到Powered状态。使用Vbus为集线器控制器供电的自供电集线器被允许保持在Configured状态,如果本地电源被丢失。请注意,超高速设备在非SuperSpeed操作时抽取的最大电源制约于在USB 2.0规范规定的限制。

集线器端口应被供电,以侦测端口状态的变化,包括连接和断开。总线供电集线器不提供任何下游的电源,直至它们被配置,在这一点上,他们将提供他们的配置和电源允许的电源。一个设备应能从最初应用电源后,在规定的时间内可以被寻址(参见第7章)。当连接到一个端口被检测到之后,主机可以复位端口,这也将复位连接到端口的设备。

9.1.1.3 Default

当操作在SuperSpeed模式,在设备已经被上电之后,它不应该响应任何总线事务,直到链路被成功训练。之后设备可以在默认地址上被寻址。

一个可以在SuperSpeed操作的设备判定它是否可以在SuperSpeed操作,作为连接过程的一部分(参见第10章的Device Connection State Diagram中更多的细节)。

当在只有USB 2.0电气环境中,一个USB 3.0设备应成功复位为被支持的USB 2.0速度的其中一个。该设备复位成功后,该设备也应成功地应付设备和配置描述符请求, 根据USB 2.0规范的要求返回适当的信息。在USB 2.0模式下运行时,该设备可能,也可能无法支持其预期的功能。

9.1.1.4 Address

当最初上电或在该设备已被复位时,所有设备使用默认的地址。每个设备复位后被主机指派一个唯一的地址。当设备被挂起时,设备保持其被分配的地址。

不论是否当前已经分配了一个唯一地址或使用的是默认地址,设备都在默认管道上响应请求。

9.1.1.5 Configured

在设备的功能可以被使用之前,设备应该被配置。从设备的角度,配置包括正确地处理具有非0的配置值的SetConfiguration()请求。配置一个设备或者改变一个替换的设置,将导致与在被影响到的接口中的所有的端点的状态和配置值被设置到他们的默认值。这包括复位被影响到的接口中任何的端点的序列号到0。在进入被配置状态的最初入口处,设备应该默认进入全功能的D0状态。

9.1.1.6 Suspended

为了节省功耗,器件自动进入挂起状态(挂起,默认,地址,或配置之一),当观察到其上游的链路正被驱动到U3的状态(参考第7.1.4.2.4节)。当挂起时,该设备保持任何内部的地位,包括它的地址和配置。

连接的设备应准备随时从Default, Address, 或者Configured进入挂起。当所连接的集线器端口被设置进入U3时,一个设备应该进入挂起状态。这被称为选择性挂起。

当观察到其上行端口上的唤醒信号时,设备退出挂起模式(参考第7.4.9节)。设备也可能通过驱动恢复信号(参考第7.4.9节)和发送功能唤醒通知(参阅第8.5.6节)在其上游链路来表示远程唤醒,请求主机退出挂起模式或选择性挂起。设备发送远程唤醒信号的能力是可选的。如果一个设备可支持远程唤醒能力,设备应支持主机启用和禁用此功能。当设备复位,远程唤醒应被禁用。请参阅第9.2.5节获取更多信息。

9.1.2 总线枚举 【Bus Enumeration】

当一个设备连接到或从USB删除时,主机使用一个称为总线枚举的过程来识别和管理必要的设备状态变化。当一个设备连接到一个供电的端口时,主机会采取以下行动:

1. 该设备现在所连接到的集线器通过在其状态改变管道上的一个回复来通知主机这一连接事件(参考第10.11.1节)。在这一时间点上,该设备已被复位,并且处在默认(Default)状态,和它所连接的端口是被使能的,并准备在默认的控制管道上响应控制传输请求。

2. 主机通过查询集线器,判定变化的确切性质。

3. 一旦主机知道了新设备已经连接在哪个端口上,主机接着可能再次复位设备(如果它希望如此的话),但并不是必须这样做。

4. 如果主机复位端口,集线器对该端口执行必要的复位处理(参考第10.3.1.6节)。当复位完成后,该端口将回到使能状态。

5. 设备现在处在默认(Default)状态,可以从Vbus抽取不超过150毫安的电流。它所有的寄存器和状态都已被重置,并在默认地址上回应请求。

6. 主机分配一个唯一的地址给设备,将设备迁移到地址(Address)状态。

7. 在该设备收到一个唯一的地址之前,其默认的控制管道仍然可以通过其默认地址访问。主机读取设备描述符,以确定此设备的默认管道实际可以使用的最大数据负载大小。

8. 主机应设置等时时延(isochronous delay),来通知设备从主机发送一个数据包,到被设备接收到的时间延迟。

9. 主机应使用Set SEL请求通知设备系统退出时延(system exit latency)。

10. 主机通过从零到n-1读取每个配置(其中n是配置数量),来从设备读取配置信息。这个过程可能需要数毫秒才可完成。

11. 根据配置信息,以及设备将如何被使用,主机分配一个配置值给设备。设备目前在配置(Configured)状态,并且所有在这个配置的端点已处于他们所被描述的特征下。该设备现在可以抽取所选的配置的描述符所描述的Vbus电量。 从设备的角度来看,现在已经可以使用了。

当设备被断开,集线器再次发送通知到主机。断开一个设备也禁用了其之前所连接的端口,并且将端口迁移到断开连接(Disconnected)状态(参阅第10.3.1.2节)。一旦接到断开通知,主机将更新其本地拓扑信息。

9.2 通用设备操作 【Generic Device Operations】

所有设备都支持一套共同的操作。本节描述了这些操作。

9.2.1 动态连接与移除 【Dynamic Attachment and Removal】

设备可能被在任何时间连接或断开。集线器提供了连接点或者说下游端口,并且负责报告端口状态的任何变化。

一旦检测到一次设备连接,集线器就复位并使能集线器的下行端口,这同时也具有复位设备的效果。复位设备具有以下特点:

  • 它的USB地址被设置为0(默认的USB地址)
  • 它没有被配置(not configured)
  • 它没有被挂起(not suspended)

当设备从一个集线器端口移除,集线器禁用该设备所连接的端口,该端口迁移进入DSPORT.Disconnected状态(参考第10.3.1.2节),并通知主机这一移除事件。

9.2.2 指定地址【Address Assignment】

当设备连上(attached)时,主机负责指定一个唯一的地址给设备。在指定地址之前,主机可以明确地复位设备;但是,注意到在主机被通知设备被连上(attached)之前,设备暗含地在连接过程(connection process)中被复位(implicitly gets reset)。

9.2.3 Configuration

USB设备在其功能【function(s)】被使用以前,必须被配置。由主机负责配置设备。主机典型地会从USB设备获取配置信息后,以便确定此设备有哪些能力。

作为配置过程的一部分,主机会设置设备的配置值,并且,如果必要的话会选择接口恰当的备选设置(alternate settings)。

在单个配置中,一个设备可以支持多个接口。一个接口是一组端结点集合,它们代表了设备向主机提供的单一的特性或功能。用来与这组相关端点通信的协议,以及接口内各端点的目的,可以作为一个设备类或者特定于厂商的(vendor-specific)定义的一部分来指定。

另外,一个配置中的接口可能有备选设置。这些备选设置可能重定义相关端点的数目或特性。如果是这样的话,设备必须支持GetInterface()请求,来报告指定的接口的当前所用的备选设置(alternate setting),以及SetInterface()请求来选择指定的接口的备选设置(alternate setting)。

在每个设备配置内,每个接口描述符可能包括用来标识接口号的及备选设置的字段。接口被从0到配置所支持的能同时使用的接口数目少1进行编号。备选设置的编号也从0开始到特定的接口的备选设置的数目少1进行编号。当设备被初始化配置后,缺省设置是备选设置0。

为了支持自适应的可以管理一组相关设备的设备驱动程序,设备与接口描述符中包含了类(Class),子类(Sub class),及协议(Protocol)字段。这些字段用来标识一个设备提供的功能【function(s)】,及用于与设备上的功能【function(s)】通信的协议。一个类代码(class code)被分配给一组设备,并被作为USB类规范(USB Class Specification)的一部分而被特性化(characterized)。一个类的设备可进一步被划分成子类(subclasses),并且在一个类或子类中,一个协议代码(protocol code)可定义主机软件是怎样与设备通信的。

注意:类、子类、与协议值必须与本规范协调一致,但在本规范范围之外。

9.2.4 数据传输 【Data Transfer】

数据可能以四种方式在USB设备端点与主机之间传送。参见第4章中四种传送方式的定义。在不同设置下,一个端点号可以被用于不同的传输类型。但一旦设置选定(包括一个接口的默认设置),一个设备端点只使用一种数据传输方法,直到一个不同的可选设置被选择。

9.2.5 电源管理 【Power Management】

设备的电源管理包括下面几个章节所描述的问题。

9.2.5.1 电源预算 【Power Budgeting】

USB总线电源是一个有限的资源。在设备枚举阶段,主机评估设备的电源需求。如果一个特定配置的电源需求量超过可供给设备的电量,则主机软件不应该选择该配置。

设备应将其从VBUS上消耗的电源需求量限制在一个单位以下,直到被配置。当操作在SuperSpeed模式,150 mA等于一个单位负载。挂起的设备,不论其是否被配置,都应该将其总线电源消耗限制在USB 2.0规范的挂起模式电源需求之内。根据接到设备的端口电源负载能力,工作在超高速模式的超高速设备在被配置以后,可从Vbus汲取达6个单位的电量。当操作在超高速模式时,超高速设备汲取的电流,对于低电源设备增长到150 mA,而高电源设备是900 mA。

设备电源管理由挂起(suspend)和功能挂起(function suspend)组成。挂起(Suspend)是指全设备范围的状态,当它的上游链路被设置为U3时进入。功能挂起(Function suspend)是指一个设备之内的单个功能的状态。挂起具有多于一个功能的设备效果上也挂起了设备的所有功能。

请注意,将设备的所有功能挂起,并不会挂起设备。只有当它的上游链路被置于U3时,一个设备才会挂起。

9.2.5.2 改变设备的挂起状态 【Changing Device Suspend State】

设备挂起的进入和退出,本质上是作为挂起入口和退出过程的一部分(请参阅第10.8节)。应保留的最小一组设备状态信息列出如下:

  • 端口状态改变(下游端口)
  • 设备地址
  • 设备配置值
  • 功能挂起和功能远程唤醒使能状态

一些附加的设备状态信息也可以在挂起过程中被保持。

设备应该在驱动恢复(resume)信号后,发送一个功能唤醒通知(Function Wake Notification)(参阅第7.4.9节)。自发送上一个功能唤醒通知(Function Wake Notification)之后,如果超过tNotification(参考第8.13节)设备没有被访问,则设备应再次发送功能唤醒通知(Function Wake Notification),直到它被访问。

设备类可能需要额外的信息在被挂起之后被保持,超出本规范确定的之外,也超出了本规范的范围。在挂起时,设备也可以选择性地从电路中移除不必要的电路中的电源。

9.2.5.3 功能挂起 【Function Suspend】

功能可以独立于复合设备内其他功能被置于功能挂起状态。一个设备可被转换到设备挂起状态,无论设备内的任何功能的功能挂起状态如何。在设备挂起期间,功能挂起状态被保持,并且贯穿设备挂起的进入和退出过程。

9.2.5.4 改变功能挂起状态 【Changing Function Suspend State】

功能被使用FUNCTION_SUSPEND特性选择子(见表9-6)置于功能挂起。FUNCTION_SUSPEND特性选择子还控制是否该功能可以启动远程唤醒功能。一个功能是否能够启动一个功能远程唤醒(Function Remote Wake),可由对该功能的第一个接口使用Get Status命令查询得到的状态来判定(参考第9.4.5节)。

远程唤醒(即从一个设备挂起状态唤醒),当设备内的任何一个功能被使能功能远程唤醒时(注意 "功能远程唤醒" 和 "远程唤醒" 的区别)。DEVICE_REMOTE_WAKEUP特性选择子将被忽略并且不被超高速设备使用。

如果其被使能了功能远程唤醒,一个功能可以发送功能唤醒通知(Function Wake Notification)到主机,表明它想从功能挂起退出。这适用于单一功能设备以及多个功能【(即复合(composite)】设备。如果链路处在非U0状态,则该设备在发送远程唤醒消息之前必须将链路过渡到U0。如果远程唤醒事件发生在多个功能上,各功能须发送一个功能远程唤醒通知(Function Wake Notification)。自发送最后一个功能远程唤醒通知(Function Wake Notification)之后,如果超过tNotification(参考第8.13)该功能还没有被访问,该功能将再次发送功能远程唤醒通知(Function Wake Notification),直到它被访问。

当设备内的所有功能都在功能挂起并且PORT_U2_TIMEOUT字段(参考第10.14.2.9节)被编程到0xFF,该设备应在链路无活动10ms之后发起U2。

9.2.6 请求的处理 【Request Processing】

除SetAddress()请求以外(见9.4.6节),在设备接收到Setup Packet以后,设备就可以开始处理请求。在允许状态(Status)阶段成功完成以前,设备被期望"完成"对请求的处理。有些请求会发起需要许多毫秒才能完成的操作。像这样的请求,该设备类应定义一个方法,而不是状态阶段(Status Stage)的完成来表示该操作已经完成。像这样的操作有:依赖于连接到该端口上的链路的状态不同,集线器端口的复位可能需要多个毫秒来完成。SetPortFeature(PORT_RESET)(参考10.14.2.9节)请求本身当复位在端口上启动时就"完成"了。当端口状态改变并表明此端口已经使能时,就会有信号表明复位操作已经完成。这种技术可以防止当主机知道某一个请求费时较长的情况下,还一直轮询此请求是否已完成。

9.2.6.1 请求处理的时序 【Request Processing Timing】

所有的设备应当及时处理请求。USB给定一个5秒的时间上限来进行命令处理。这个限制并不是对所有情况都适用的。这些限制在接下来的部分给予描述。应当说明的是,下面的限制目的在包括很宽范围的实现。如果所有设备都采用最大的允许时限来进行请求处理的话,用户使用经验将是很难受的。因此,具体实现应当尽可能快地完成请求的处理。

9.2.6.2 复位/恢复的恢复时间 【Reset/Resume Recovery Time】

成功复位或恢复以后端口之后,USB系统软件允许立即访问连接到端口的设备,并期望将响应数据传输。

9.2.6.3 设置地址处理 【Set Address Processing】

在reset或resume以后,当设备收到SetAddress()请求,设备必须能在50ms内完成请求的处理,并成功完成请求的状态阶段。对于SetAddress()的情况,当设备发出一个ACK事务包(ACK Transaction Packet)作为对状态阶段的状态事务包(STATUS Transaction Packet)的响应时,状态阶段就成功完成了。

在成功完成状态阶段后,设备必须能在新地址上接受Setup包。并且,必须确保设备不对旧地址的事务产生响应(当然,除非新旧地址是一样的)。

9.2.6.4 标准设备请求 【Standard Device Requests】

对于不需传送数据的标准设备请求,个设备必须在收到请求的50ms以内结束对请求的处理并成功完成状态阶段。此限制适用于针对设备,接口或端点的请求。

对于需要数据到主机的数据阶段传输的标准设备请求,设备必须在收到请求的500ms以内返回第一个数据包。接下来的数据包,如果有的话,必须在前一个数据包成功传送起的500ms以内开始发送。设备必须在最后一个数据包返回以后的50ms以内成功完成状态阶段。

对于需要数据阶段传输到设备的标准设备请求,5秒的限制就起作用了。这意味着设备必须能在主机以设备最大能接受的速率发送数据包的情况下接收所有的数据包并且完成状态阶段。主机引入的数据包之间的时延,也算入设备完成请求所允许的时间。

9.2.6.5 类特定的请求 【Class-specific Requests】

除非在类文档中特别说明(exempted),所有的类特定的请求必须满足标准请求的时间限制。如果一个类文档提供特例(exemption),特例只能基于request-by-request的方式进行。

类文档可能要求设备反应得比这节所指定的还要快。可要求更快的标准以及类特定的请求。

9.2.6.6 依赖于速度的描述符 【Speed Dependent Descriptors】

有能力操作在超高速的设备须能在USB 2.0的定义的一个速度上操作。作为连接处理的一部分,设备总是知道其操作的速度(参阅第10.5节有关连接过程更详尽的说明)。设备完成复位序列后工作在单一的速度上。特别是,在正常操作过程中没有速度切换。然而,具有超高速能力的设备可能有些配置是依赖与速度的。也就是说,它可能有一些配置,只可能在超高速时操作,或一些只可能在高速时操作。具有超高速能力的设备应支持报告他们能够运行的速度。请注意,USB 3.0集线器是唯一获准同时工作在的USB 2.0和超高速的设备。

具有超高速能力的设备使用对当前运行速度有效的描述符信息响应。例如,当一个设备的配置描述符被请求时,只返回当前运行速度的(例如,高速)。当运作在超高速模式时,设备应通过其BOS描述符报告其他可以操作的速度(请参阅第9.6.2节)。 请注意,当以USB 2.0的速度运行时,除了使用BOS描述符报告其他被设备支持的速度外,设备应使用在USB 2.0规范定义标准机制报告其支持的其他USB 2.0的速度。设备描述bcdUSB字段值至少为0210H的设备,应当支持GetDescriptor (BOS Descriptor)请求。

注意:除非主机明确发起相应的GetDescriptor请求,否则这些描述符不会被获取。

9.2.7 请求错误 【Request Error】

如果一设备收到一个请求,它或是在设备中无定义,或是不适用于当前设置,或是数值不对,这时就会产生一个请求错误(Request Error)。设备在下一个数据(Data)阶段或状态阶段(Status stage)返回一个表明错误的STALL 事务包(STALL Transaction Packet)。最好在下一个数据(Data)阶段返回,这样可减少不必要的总线活动。

9.3 USB设备请求 【USB Device Requests】

所有的设备在设备的默认控制管道(Default Control Pipe)上对主机的请求做出响应。这些请求是通过使用控制传输来达到的。请求及请求的参数通过Setup包发给设备。主机负责建立Setup包内的每个字段的值,列出在表9-2中。每个Setup包有8个字节。

表9-2. Setup包数据格式

偏移量

大小

描述

0

bmRequestType

1

位图

请求特征:

D7: 传输方向 (Data transfer direction)

0=主机至设备

1=设备至主机

D6..5: 种类 (Type)

0=标准

1=类

2=厂商

3=保留

D4..0: 接受者 (Recipient)

0=设备

1=接口

2=端点

3=其他

4..31=保留

1

bRequest

1

特定于请求 (参见表9-3)

2

wValue

2

字长字段,根据不同的请求含义改变。

4

wIndex

2

索引或偏移

字长字段,根据不同的请求含义改变。典型地用于传递索引或偏移。

6

wLength

2

计数

如有数据传送阶段,此为数据字节数。

9.3.1 bmRequestType

这个位图字段表明此请求的特性。特别地,这个字段表明了控制传输第二阶段的方向。如果wLength字段是0的话,表明没有数据阶段,那么Direction位就会被忽略。

USB 3.0说明定义了一系列所有设备必须支持的标准请求。这些请求被例举在表9-3中。另外,一个设备类可定义更多的请求。设备厂商也可定义设备支持的请求。

请求可被指定到设备,设备接口,或某一个设备端点上。这个字段也指定了接收者。当指定的是接口时,wIndex字段指出那个接口。当指定的是端点时,wIndex字段指出那个端点。

9.3.2 bRequest

这个字段标识特定的请求。bmRequestType字段的Type字位可修正此字段的含义。本规范仅定义Type字位为0即标准设备请求时bRequest字段值的含义(参见表9-3)。

9.3.3 wValue

这个字段的内容,根据不同的请求而不同。此字段用来传送当前请求的参数,特定于请求。

9.3.4 wIndex

这个字段的内容,根据不同的请求而不同。此字段用来传送参数到设备,特定于请求。

wIndex字段经常被用来指定一个接口或端点,图9-3显示了当被用来标识端点时wIndex的格式。

Direction位在设为0时,连同指定Endpoint Number端点号,表示输出端点,设为1时表示是输入端点。对于控制管道的情况,请求应该将Direction位设置为0,但设备可以接受任一Direction位的值。

图9-4表明wIndex用于标识接口时的格式。

9.3.5 wLength

这个字段表明控制传输第二阶段的数据传输长度。传输方向(host-to-device or device-to-host)由bmRequstType字段的Direction位指出。wLength字段为0则表明无数据传输。

在输入请求下,设备返回的数据长度绝不应多于wLength,但可以少于。在输出请求下,wLength总是指出主机要发出的确切数据量。如果主机发送多于或者少于wLength指定的数据,设备做出的响应是未定义的。

9.4 标准设备请求 【Standard Device Requests】

这一节描述为所有USB设备定义的标准设备请求。表9-3列出了这些标准设备请求,而表9-4、9-5分别结出了对应的标准请求码及描述符类型。

即使设备还没有被分配地址,或设备还没有被配置,它们都应当对标准请求做出响应。

表9-3. 标准设备请求 【Standard Device Requests】

bmRequestType

bRequest

wValue

wIndex

wLength

数据

00000000B 00000001B 00000010B

CLEAR_FEATURE

特性选择子

0

Interface

Endpoint

0

无数据

10000000B

GET_CONFIGURATION

0

0

1

配置值

10000000B

GET_DESCRIPTOR

描述符类型和

描述符索引

0 或 Language ID

描述符长度

描述符

10000001B

GET_INTERFACE

0

Interface

1

备用接口

10000000B 10000001B 10000010B

GET_STATUS

0

0

Interface

Endpoint

2

设备,接口或端点状态

00000000B

SET_ADDRESS

设备地址

0

0

无数据

00000000B

SET_CONFIGURATION

配置值

0

0

无数据

00000000B

SET_DESCRIPTOR

描述符类型和

描述符索引

0 或 Language ID

描述符长度

描述符

00000000B 00000001B 00000010B

SET_FEATURE

特性选择子

Zero Interface Endpoint

挂起(Suspend) 选项

0

无数据

00000001B

SET_INTERFACE

备用设置

Interface

0

无数据

00000000B

SET_ISOCH_DELAY

Delay in ns

0

0

无数据

00000000B

SET_SEL

0

0

6

退出时延值(Exit

Latency

Values

10000010B

SYNCH_FRAME

0

Endpoint

2

帧号

 

表 9-4. 标准请求代码 【Standard Request Codes】

 

bRequest

Value

GET_STATUS

0

CLEAR_FEATURE

1

保留将来用

2

SET_FEATURE

3

保留将来用

4

SET_ADDRESS

5

GET_DESCRIPTOR

6

SET_DESCRIPTOR

7

GET_CONFIGURATION

8

SET_CONFIGURATION

9

GET_INTERFACE

10

SET_INTERFACE

11

SYNCH_FRAME

12

SET_SEL

48

SET_ISOCH_DELAY

49

 

表 9-5. 描述符类型 【Descriptor Types】

 

Descriptor Types

Value

DEVICE

1

CONFIGURATION

2

STRING

3

INTERFACE

4

ENDPOINT

5

Reserved

6

Reserved

7

INTERFACE_POWER 【注1】

8

OTG

9

DEBUG

10

INTERFACE_ASSOCIATION

11

BOS

15

DEVICE CAPABILITY

16

SUPERSPEED_USB_ENDPOINT_COMPANION

48

 

【注1: INTERFACE_POWER 定义在当前版本的USB Interface Power Management Specification中】

特性选择子被使用来使能或设置如功能远程唤醒的特性,特定于一个设备,接口或端点。在表9-6给出特性选择子的值。

Feature Selector

Recipient

Value

ENDPOINT_HALT

Endpoint

0

FUNCTION_SUSPEND

Interface

0

U1_ENABLE

Device

48

U2_ENABLE

Device

49

LTM_ENABLE

Device

50

如果不受支持或无效的请求被发到设备,设备通过在请求的数据或状态阶段返回一个STALL事务包(STALL Transaction Packet)响应。如果设备检测到Setup阶段的错误,设备首选的应该在较早的数据或状态阶段返回一个STALL事务包(STALL Transaction Packet)。接收到一个不受支持或无效的请求后,不会导致控制管道上Halt特定被设置。如果,由于某种原因,设备成无法通过它的默认控制管道通信(由于错误情形),设备应复位来清除该情形并重新启动默认控制管道。

9.4.1 Clear Feature

这个请求是被用来清除或者禁用一个指定的特性。

wValue中的特性选择子的值必须根据接收者来设定适当的值。接收者是设备就只能用设备特性选择子,是接口就就只能用接口特性选择子,是端点就只能用端点特性描述子。

参照表9-6来看特性选择子与接收者定义的对应关系。

一个ClearFeature( )请求所指的特性如果不能被清除,不存在,或指的是不存在的接口或端点,会导致设备具有Request Error错误的响应。

如果wLength不为0,设备响应无定义。

缺省状态:当设备处于缺省状态时接收到此请求,对此请求的反应无定义。

地址状态:在设备处于地址(Address)状态时这个请求是合法的,但如果该请求指的是接口或是默认控制端点,会引起设备响应请求错误。

配置状态:在此Configured状态下,该请求合法。

注:仅当该设备是在配置状态时,设备才应处理Clear Feature(U1_Enable 或 U2_Enable 或 LTM_Enable)。

9.4.2 Get Configuration

此请求返回当前设备配置值。

如果返回值为0,表明设备未被配置。

如果wValue, wIndex, wLength的值与上面表中所指定的不同,设备响应行为无定义。

默认状态:当设备处于默认状态时收到这个请求,该请求响应行为无定义。

地址状态:应该返回0值。

配置状态:非0的当前配置值bConfigurationValue值应该被返回。

9.4.3 Get Descriptor

这个请求返回指定的描述符,如果存在的话。

wValue字段的高字节标识描述符类型(参考表9-5),低字节表示描述符的索引。当有几个相同类型的描述符在设备内被实现时,描述符索引用来选择一个特定的描述符(只对于配置(configuration)和字符串(string)描述符)。例如,一个设备可以实现几个配置描述符。对于其他的标准描述符,可以通过一个GetDescriptor()请求被获取,则描述符索引应该使用0。被用来作为描述符索引的值的范围是从0到由设备所实现的那种类型的描述符(排除字符串描述符在外)的个数少1。

wIndex字段标识字串描述符的语言ID(Language ID),或者如果是其它描述符的话就设为0。wLength指定要返回多少字节。如果描述符长度大于wLength字段值,那么只有描述符的初始部分被返回。如果描述符比wLength字段值少,当进一步数据被请求时,设备就发送一个短包来标志控制传输的结束。

这个标准请求支持四种描述符:设备、配置、BOS(Binary device Object Store),及字符串。正如9.2.6.6节所做注意到的,操作在SuperSpeed模式的设备通过BOS描述符报告它支持的其他速度,而且不应该支持device_qualifier和other_speed_configuration描述符。一个单个配置描述符请求会一次返回配置描述符,所有的接口描述符,所有接口的端点描述符以及端点伴侣描述符(当操作在SuperSpeed模式)。第一个接口描述符紧跟着配置描述符。第一个接口的端点描述符紧跟第一个接口描述符。此外,超高速设备应该返回该接口内的每个端点的端点伴侣描述符(Endpoint Companion descriptors),以返回对于支持超高速的设备的端点能力,这些信息已经不能被容纳在现有的端点描述符大小内。如果有其它的接口,它们的接口描述符,端点描述符,以及端点伴侣描述符(当操作在SuperSpeed模式)紧跟在第一个接口的端点描述符或端点伴侣描述符(当操作在SuperSpeed模式)之后。

此规范还定义了灵活而可扩展的框架,用来描述以及增添设备级别的能力到该组USB标准规范内。BOS描述符(参考9.6.2)定义了一个根描述符,类似于配置描述符,并作为基准描述符来访问一族相关的描述符。主机可以读取BOS描述符并且从wTotalLength字段了解到设备层级描述符组的完整大小,或者它可以读入该组包含设备能力的完整BOS描述符。主机没有办法读取单个的设备能力描述符。完整的组只能通过使用GetDescriptor()请求以及被报告的wTotalLength字段读取BOS描述符来进行访问。

类特定的和/或厂商特定的描述符跟在他们所扩展或修饰的标准描述符之后。

所有的设备必须提供一个设备描述符并且至少一个配置描述符。如果一个设备不支持一个请求的描述符,则返回请求错误(Request Error)。

默认状态:当该设备在默认状态时,这是一个有效的请求。

地址状态:当该设备在地址状态时,这是一个有效的请求。

配置状态:当该设备在配置状态时,这是一个有效的请求。

9.4.4 Get Interface

这个请求返回所指定接口所选中的可选设置(alternate setting)。

有些设备的配置具有包含有互斥设置的接口。这个请求允许主机判定当前所选的可选设置。

如果wValue或wLength没有按照以上的表中所指定的设值,设备响应行为无定义。

如果所指的接口不存在,返回请求错误。

默认状态:当设备在默认状态下接收到这个请求,设备对该请求响应行为无定义。

地址状态:设备返回请求错误(Request Error)。

配置状态:当该设备在配置状态时,这是一个有效的请求。

9.4.5 Get Status

这个请求返回所指接收者的状态。

bmRequestType字段的Recipient位段指定预定的接收者。所返回的数据是指定的接受者当前的状态。如果接收者是端点,那么wIndex的低字节用来识别其所询问状态的端点。

如果wValue或wLength不是上表中所指定的值,或者如果在获取设备状态请求时wIndex非0,则设备响应行为无定义。

如果指定了一个不存在的接口或者端点,那么设备用请求错误(Request Error)来响应。

默认状态:当设备在默认状态下接收到这个请求,设备对该请求响应行为无定义。

地址状态:如果所指定的是接口,或者是默认的控制端点之外的端点,设备返回请求错误(Request Error)响应。

配置状态:如果指定了一个不存在的接口或者端点,那么设备用请求错误(Request Error)来响应。

一个对设备的GetStatus()请求返回信息的格式如图9-5。

Self Powered字段表示设备当前是否是自供电状态(self-powered)。如果D0为复位为0,则设备是总线供电的。如果D0被设成1,则设备是自供电的。此Self Powered字段不能被SetFeature()或ClearFeature()请求所改变。

Remote Wakeup字段是保留的,必须由SuperSpeed设备设置为0。SuperSpeed设备使用Function Remote Wake enable/disable字段来指示他们是否被使能远程唤醒(Remote Wake)功能。

U1 Enable字段指示设备是否当前被使能可以发起U1 entry。如果D2被设为0,则设备被禁止了发起U1 entry;否则,它就被使能了发起U1 entry。U1 Enable字段可以被SetFeature()和ClearFeature()请求使用U1_ENABLE特性选择子进行修改。当设备被复位时,该字段被复位为0.

U2 Enable字段指示设备是否当前被使能可以发起U2 entry。如果D2被设为0,则设备被禁止了发起U2 entry;否则,它就被使能了发起U2 entry。U2 Enable字段可以被SetFeature()和ClearFeature()请求使用U2_ENABLE特性选择子进行修改。当设备被复位时,该字段被复位为0.

LTM Enable字段指示设备是否当前被使能可以发送延迟忍耐消息(Latency Tolerance Messages)。如果D4被设为0,则设备被禁止了发送延迟忍耐消息(Latency Tolerance Messages);否则,它就被使能了发送延迟忍耐消息(Latency Tolerance Messages)。LTM Enable字段可以被SetFeature()和ClearFeature()请求使用LTM_ENABLE特性选择子进行修改。当设备被复位时,该字段被复位为0.

一个到功能的第一个接口的GetStatus()请求返回如图9-6的信息。

Function Remote Wake Capable字段指示是否功能支持远程唤醒。Function Remote Wakeup字段指示功能当前是否被使能了请求远程唤醒。对于支持远程唤醒的功能,默认该模式是被禁用的。如果D1被复位为0,则功能发起远程唤醒信号的能力是被禁用的。如果D1被设置为1,这则功能发起远程唤醒信号的能力是被使能的。Function Remote Wakeup字段可以被SetFeature()请求使用FUNCTION_SUSPEND特性选择子进行修改。当功能被复位时,Function Remote Wakeup字段被复位为0.

到一个功能的其他接口的GetStatus()请求应该返回全0.

一个到端点的GetStatus()请求返回如图9-7的信息。

Halt特性被要求在所有的中断及批量端点类型中实现。如果端节点当前被halted了,那么这个Halt特性就设置成1,否则Halt特性就被设置为0。Halt特性可选择性地由SetFeature(ENDPOINT_HALT )请求来设置。一旦被SetFeature()请求设置,端点表现出相同的stall响应行为,就像这个字段由硬件条件设置的一样。如果导止停机(halt)的条件被移除了,用ClearFeature(ENDPOINT_HALT )请求清除Halt特性会导致端点不再返回STALL事务包(STALL Transaction Packet)。不论是否端点将Halt特性设置,一个ClearFeature(ENDPOINT_HALT)请求总可以导致数据序列被重新初始化到0;并且,如果流(Streams)被使能,则流状态机(Stream State Machine)应该被重新初始化到Disabled状态。Halt特性在收到SetConfiguration() 或 SetInterface()请求后总会被复位成0,即使所请求的配置或者接口与当前的配置或接口相同。

超高速设备不支持在控制端点的functional stall,因此不需要在任何控制端点上实现Halt特性。

9.4.6 Set Address

本请求为所有的后续设备访问的设置设备地址

wValue指出所有的后续访问所需要的设备地址。

在初始Setup包后的状态(Status)阶段使用与Setup包相同的设备地址。 设备不会更改其设备地址,直到状态(Status)阶段成功完成后才。请注意,这是这一请求并所有其他请求的差异之处。 对于所有其他的要求,所指定的操作应在状态阶段完成之前完成。

如果所指定的设备地址大于127,或wIndex 或wLength非零,设备响应行为无定义。

默认状态:如果所指定的地址值非0,那么设备应进入地址状态,否则,地址仍留在默认状态(这不是错误情形)。

地址状态:如果所指定的地址值为0,那么设备应进入默认状态,否则,设备仍留在地址状态,但使用新指定的地址。

配置状态:当该设备在配置状态时接收到这个请求,设备对此请求的响应无定义。

9.4.7 Set Configuration

此请求设置设备配置值。

wValue字段的低字节指定想要的配置。这个配置值必须为0,或与配置描述符中的一个配置相匹配。如果配置值为0,设备被设置为地址状态。wValue的高字节被保留。

默认状态:当设备在默认状态下接收到这个请求,设备对该请求响应行为无定义。

地址状态:如果所指定的配置值为0,则设备停留在地址状态。如果所指定的配置与描述符中的一个值相匹配,那个配置就被选中,设备进入配置状态。否则,设备返回请求错误(Request Error)。

配置状态:如果所指定的配置值为0,设备进入地址状态。如果所指定的配置与描述符中的一个值相匹配,那个配置就被选中,设备进入配置状态。否则,设备返回请求错误(Request Error)。

9.4.8 Set Descriptor

此请求是可选的,可以被用于更新现有的描述符,或添加新的描述符。

wValue字段的高字节指出了描述的类型(参见表9-5),低字节指出了描述符索引。当有几个相同类型的描述符在设备内被实现时,描述符索引用来选择一个特定的描述符(只对于配置(configuration)和字符串(string)描述符)。例如,一个设备可以实现几个配置描述符。对于其他的标准描述符,可以通过一个SetDescriptor()请求被设置,则描述符索引应该使用0。被用来作为描述符索引的值的范围是从0到由设备所实现的那种类型的描述符(排除字符串描述符在外)的个数少1。

wIndex字段标识字串描述符的语言ID(Language ID),或者如果是其它描述符的话就设为0。wLength指定从主机传向设备的字节数。

唯一允许的描述符类型的值是设备,配置和字符串描述符类型。 如果这个请求不被支持,设备会用请求错误(Request Error)响应。

默认状态:当设备在默认状态下接收到这个请求,设备对该请求响应行为无定义。

地址状态:如果被支持的话,当设备在地址状态时接收到这个请求,则为有效。

配置状态:如果被支持的话,当设备在配置状态时接收到这个请求,则为有效。

9.4.9 Set Feature

这个请求被用来设置或使能一个特定的特性。

wValue中的特性选择子的值必须根据接收者来设定适当的值。接收者是设备就只能用设备特性选择子,是接口就只能用接口特性选择子,是端点就只能用端点特性描述子。如果接收者是端点,则wIndex低字节用来识别该端点。

参照表9-6来看特性选择子与接收者定义的对应关系。

FUNCTION_SUSPEND特性只被定义为以接口为接收者。wIndex低字节应该被设为该个功能的第一个接口。

U1/U2_ENABLE特性只被定义为以接口为接收者。wIndex低字节应该被设为0。设置U1/U2_ENABLE特性允许设备分别发起U1/U2 entry。设备只应该在被配置(Configured)的SuperSpeed状态才应该支持U1/U2ENABLE特性。如果主机发起的U1系统退出时延(U1 System Exit Latency)的时间加上一个总线间隔(Bus Interval)的时间大于设备中任何周期端点的服务间隔的话,系统软件就必须不使能设备发起U1。此外,如果主机发起的U2系统退出时延(U2 System Exit Latency)的时间加上一个总线间隔(Bus Interval)的时间大于设备中任何周期端点的服务间隔的话,系统软件就必须不使能设备发起U2。

LTM_ENABLE特性只被定义为以设备为接收者。wIndex低字节应该被设为0。设置LTM_ENABLE特性允许设备发送延迟忍耐消息(Latency Tolerance Messages)。设备只应该在被配置(Configured)的SuperSpeed状态,并且支持LTM能力时,才应该支持LTM_ENABLE特性。

若SetFeature()引用了一个不能被设置的特性,或者不存在的特性,会导致在状态(Status)阶段返回一个STALL事务包(STALL Transaction Packet)。

如果特性选择子是FUNCTION_SUSPEND,那么wIndex的高字节被用来指定挂起(Suspend)选项。SetFeature (FUNCTION_SUSPEND…)的接收者应该是功能的第一个接口;并且bmRequestType应该被设为1。FUNCTION_SUSPEND挂起选项的有效编码在表9-7中列出。

表 9-7. Suspend 选项

比特

描述

0

值 意义

0 正常操作状态(默认)

1 低功耗挂起状态

1

值 意义

0 功能远程唤醒被禁用(默认)

1 功能远程唤醒被使能

2-7

保留

如果wLength不为0,设备响应行为无定义。

如果一个端点或者接口被指定但是不存在,那么设备用请求错误(Request Error)响应。

缺省状态:当设备处于缺省状态时接收到此请求,对此请求的反应无定义。

地址状态:如果该请求指的是接口,或是默认控制端点以外的端点,设备会响应请求错误(Request Error)。如果设备接收到SetFeature(U1/U2 Enable 或者 LTM Enable 或者 FUNCTION_SUSPEND)请求,那么设备会响应请求错误(Request Error)。

配置状态:在此Configured状态下,该请求合法。

9.4.10 Set Interface

此请求允许主机为指定的接口选择一个可选设置。

有些设备的配置具有包含有互斥设置的接口。这个请求允许主机选择想要的可选设置。如果设备的接口只支持默认设置,在状态阶段设备可以返回STALL事务包(STALL Transaction Packet)。该请求不能用来改变一组被配置的接口(SetConfiguration()请求应该被使用来完成该目的)。

如果所指的接口或者可选设置不存在,那么设备会返回请求错误(Request Error)。

如果wLength非0,那么设备对该请求响应行为无定义。

默认状态:当设备在默认状态下接收到这个请求,设备对该请求响应行为无定义。

地址状态:设备返回请求错误(Request Error)。

配置状态:当该设备在配置状态时,这是一个有效的请求。

9.4.11 Set Isochronous Delay

这一请求通知设备,从一个主机发送一个数据包的时间,到该包被设备收到,所需的被延迟时间。

wValue字段指定一个从0到65535 ns的时延。该时延代表从主机开始传送包的第一个分帧符号(framing symbol)开始,到设备接收到包的第一个分帧符号为止的时间。

如果wIndexwLength非0,则设备的响应行为无定义。

默认状态:当该设备在默认状态时,这是一个有效的请求。

地址状态:当该设备在地址状态时,这是一个有效的请求。

配置状态:当该设备在配置状态时,这是一个有效的请求。

9.4.12 Set SEL

该请求设置在设备和主机根端口之间的所有链路的U1和U2 System Exit Latency以及U1 或 U2 exit latency。

时延值在控制传输的数据阶段按照如下的格式发送给设备:

Offset

Name

Meaning

0

U1SEL

Time in μs for U1 System Exit Latency

1

U1PEL

Time in μs for U1 Device to Host Exit Latency

2

U2SEL

Time in μs for U2 System Exit Latency

4

U2PEL

Time in μs for U2 Device to Host Exit Latency

 

附录C的图C-2显示了设备可能经历的总共时延。时延的组件包括如下:

  • t1: 当转换由设备发起时,将到主机路径上的所有链路都转换到U0所需要的时间。
  • t2: ERDY从设备开始,遍历各级互连(interconnect hierarchy)到达主机所需要的时间。
  • t3: 主机消耗(consume)ERDY并对该请求传送一个响应所需要的时间。
  • t4: 响应遍历各级互连(interconnect hierarchy)从主机到达设备所需要的时间。

U1SEL和U2SEL的值代表在最坏的情况下,当由设备启动的转换将设备和主机之间的链路从U1或U2分别转换到U0,总的往返路径时延。这是t1到t4的时间总和。 U1PEL和U2PEL的值代表在最坏的情况下,当由设备启动的转换将设备和主机之间的链路从U1或U2分别转换到U0,设备到主机的时延。这一次只包括t1。 欲了解更多信息,请参阅第C.1.5.1节。

如果wIndexwValue没被设置成0,或者wLength不是6,则设备的响应行为无定义。

默认状态:当设备处于缺省状态时接收到此请求,对此请求的反应无定义。

地址状态:当该设备在地址状态时,这是一个有效的请求。

配置状态:当该设备在配置状态时,这是一个有效的请求。

9.4.13 Synch Frame

该请求用来设置然后报告一个端点的同步帧(synchronization frame)。

如果一个端点支持等时传输,端点可能会根据某一特定的模式(pattern)来要求每一帧的传送大小改变。主机与端点必须在哪一帧开始出现重复模式(repeating pattern)方面达成一致。模式开始帧的编号由设备返回给主机。

如果超高速设备支持Synch Frame请求,它应该在内部将自己同步到第0个微帧(microframe),并且要具有一个对经典帧的概念(notion)。只有帧号被用来进行同步并由设备端点报告(也就是说,没有微帧(microframe)号)。端点必须同步到第0号微帧。

这个值仅用于隐式模式同步(implicit pattern synchronization)的等时数据传输。如果wValue非0,或wLength非2,那么设备响应无定义。

如果所指定的端点不支持此请求,设备返回一个请求错误(Request Error)。

默认状态:当设备处于缺省状态时接收到此请求,对此请求的反应无定义。

地址状态:设备应该返回一个请求错误(Request Error)。

配置状态:当该设备在配置状态时,这是一个有效的请求。

9.5 描述符 【Descriptors】

设备通过描述符来报告他们的属性。描述符是已经有定义的格式的数据结构。每一个描述符以一个字节宽的字段打头,包括本描述符的总长度;紧跟其后是一个字节宽的字段,识别描述符类型。

使用描述符允许单个配置的特性的存储变得简明,因为每个配置可以重复使用其它配置的有相同特性的部分或全部描述符。用这种方法,描述符用一个类似关系数据库来记录单独的数据记录。

在适当的地方,描述符包括了指向字串描述符的引用,以人能读懂的格式描述该描述符。字串描述符是可选的,但描述符中的引用字段是不可或缺的。如果一个设备不支持字串描述符,该字符串引用字段应该被复位为0,来指示没有字符串描述符可用。

如果描述符中的长度字段值少于本规范定义的值,此描述符无效,应该被主机拒绝。如果返回的描述符中的长度值大于本规范定义的值,则过长部分当被忽略,但下一个描述符的位置由返回的长度而不是期望的长度来定位。

设备可以以两种方式返回类或厂商特定的描述符:

1.如果类或厂商特定的描述符使用与标准描述符相同的格式(即,以长度字节打头,紧跟着类型字节),则它们应该与标准描述符交叉(interleaved)返回在由GetDescriptor(Configuration)请求返回的配置信息内。在这种情况下,类或厂商特定的描述符应该跟在他们所修改或扩展的描述之后。

2. 如果类或厂商特定的描述符是独立于配置信息的,或者使用非标准格式,则一个指定了类或厂商特定的描述符类型及索引的GetDescriptor()请求可被使用,从设备获取该描述符。类或厂商规范会定义获取这些描述符的正确途径。

9.6 标准USB描述符定义 【Standard USB Descriptor Definitions】

本标准中有关标准描述符的定义只能被本标准的校订版本修改或扩展。

9.6.1 Device

设备描述符描述了设备的总体信息。这包括适用于设备及设备所有的配置的全局信息。一个设备只能有一个设备描述符。

具有SuperSpeed能力的设备具有版本号3.0 (0300H)。bcdUSB字段包含BCD版本号。bcdUSB字段的值具有格式0xJJMN,代表版本JJ.M.N(JJ-主版本号,M-副版本号,N-子副版本号),例如,版本2.1.3由值0x0213代表,而3.0由值0x0300代表。

bNumConfigurations字段表示在当前运行速度的配置数量。其他的工作速度中的配置不包括在计数中。如果该设备对于特定的速度有特定的配置,bNumConfigurations字段只反映一个单一速度的配置数,而不是两个速度的配置总数。

如果设备操作在SuperSpeed,bMaxPacketSize0字段应该被设为09H(参见表9-8),指示512字节的最大包大小。SuperSpeed对于默认控制管道(端点0)不允许其他的最大包大小。

所有的设备都有默认控制管道。默认控制管道的最大包长在设备描述符中描述。特定于一个配置与其接口的端点定义在配置描述符中。配置和它的接口不包括默认控制管道的端点描述符。除最大包长外,默认控制管道的特性由本规范定义,并且对所有的SuperSpeed设备都一样。

bNumberConfiguration s字段表明此设备支持的配置数。表9-7为标准设备描述符。

表9-8. 标准设备描述符 【Standard Device Descriptor】

Offset

Field

Size

Value

Description

0

bLength

1

Number

此描述符的字节数

1

bDescriptorType

1

Constant

DEVICE 描述符类型

2

bcdUSB

2

BCD

BCD码格式的USB规范发行版本号(例如,2.10 就是210H)。这个字段表示本设备以及其描述符兼容的USB规范发行版本号。

4

bDeviceClass

1

Class

类代码(Class code)(由USB-IF分配)。

如果此字段的值被复位为0,则一个配置内每个接口指定它自己的类信息,并且各个接口各自独立工作。

如果此字段的值被设置为1~FEH之间,则设备在不同的接口上支持不同的类,并且这些接口可能不能独立工作。这个值指定了这些接口集体的类定义。

如果此字段设为FFH,则此设备的类由厂商定义。

5

bDeviceSubClass

1

SubClass

Subclass code (assigned by the USB-IF). These codes are qualified by the value of the bDeviceClass field.

If the bDeviceClass field is reset to zero, this field shall also be reset to zero.

If the bDeviceClass field is not set to FFH, all values are reserved for assignment by the USB-IF.

子类代码(Subclass code)(由USB-IF分配)。

这些代码值的具体含义由bDeviceClass 字段所限定。

如果bDeviceClass字段被复位为零,此字段也须复位为零

如果bDeviceClass字段没被设置为FFH,此字段的所有值被保留由来USB-IF分配。

6

bDeviceProtocol

1

Protocol

协议代码(Protocol code)(由USB-IF分配)。

这些代码的值由bDeviceClass 和 bDeviceSubClass 的值限定。

如果设备支持设备基础上的类特定的协议,此代码用以识别设备类规范定义的协议值。

如果此字段的值被复位为零,则此设备不在设备基础上支持设备类特定的协议。然而,它可能在接口基础上支持设备类特定的协议。

如果此字段的值被设置为FFH,此设备在设备基础上使用厂商定义的协议。

7

bMaxPacketSize0

1

Number

端点0的最大包大小。bMaxPacketSize0值被用来作为如2^bMaxPacketSize0的指数;例如,一个bMaxPacketSize0为4意味着最大包大小为16(2^4->16)

当操作在SuperSpeed时,09H是唯一该字段的有效值。

8

idVendor

2

ID

厂商标志(Vendor ID)(由USB-IF分配)

10

idProduct

2

ID

产品标志(Product ID)(由制造商分配)

12

bcdDevice

2

BCD

设备发行版本号(以BCD 码格式)

14

iManufacturer

1

Index

描述厂商信息的字串的索引。

15

iProduct

1

Index

描述产品信息的字串的索引。

16

iSerialNumber

1

Index

描述设备序列号信息的字符串的索引。

17

bNumConfigurations

1

Number

可能的配置数

 

9.6.2 二进制设备对象存储(BOS)描述符 【Binary Device Object Store (BOS)】

本节定义描述和增加设备级能力的一个灵活和可扩展的框架到这组USB标准规范。如上所述,存在着一个设备描述符,但所有的设备级能力扩展都使用下面的框架来进行定义。BOS描述符定义了一个根描述符,类似于配置描述符,可被用于访问相关描述符族的基准描述符。主机可以读取描述为BOS描述符,从wTotalLength字段了解设备的描述符集的完整大小,也可以读取关于设备能力的整个BOS描述符集。主机使用GetDescriptor()请求访问此描述符。GetDescriptor()请求的描述符类型设置为BOS(见表9-9)。主机没有方法可以读取设备的单个能力描述符。要访问整个BOS描述符集只能通过GetDescriptor()请求读取BOS描述符并且使用报告的wTotalLength字段作为读取长度才能实现。

表 9-9. BOS 描述符

单个的特定于技术的或通用的设备层级的能力可通过设备能力描述符(Device Capability descriptors)来报告。设备能力描述符的格式定义于表9-10。设备能力描述符具有一个通用的头,包括一个子类型字段(bDevCapabilityType),用来定义该描述符剩余部分的布局(layout)。bDevCapabilityType的代码定义于表9-11。

表 9-10. 设备能力描述符的格式【Format of a Device Capability Descriptor】

设备能力描述符总是作为BOS信息的一部分在GetDescriptor(BOS)请求中返回。设备能力不能直接通过GetDescriptor() 或 SetDescriptor()请求访问。

表 9-11. 设备能力类型代码【Device Capability Type Codes】

下面章节定义一个SuperSpeed 设备应该返回的USB_30设备能力以及USB 2.0扩展描述符(USB 2.0 Extension Descriptor)。

9.6.2.2 超高速USB设备能力 【SuperSpeed USB Device Capability】

本节定义必要的设备层级的能力描述符,应该被所有的超高速设备实现。本能力描述符不能直接通过GetDescriptor() 或 SetDescriptor()请求访问。

表 9-13. 超高速设备能力描述符【SuperSpeed Device Capabilities Descriptor】

9.6.2.3 Container ID

本节定义设备层级的Container ID描述符,这应该被所有USB 3.0集线器实现,对于其它设备则是可选的。如果在一个模式下这个描述符被提供了,那么当在其他模式下工作时也应该提供。这个描述符可能被主机在任何操作模式下使用来识别唯一的设备实例。如果一个设备还可以通过其他技术连接到主机,也应该以该技术特定的方式通过该技术提供在本描述符内相同的Container ID值。本能力描述符不能直接通过GetDescriptor() 或 SetDescriptor()请求访问。

表 9-14. Container ID 描述符

9.6.3 Configuration

配置描述符描述特定于设备配置的信息。描述符包括一个bConfigurationValue字段,当在SetConfiguration()请求被用作参数时,会促使设备使用所指定的配置。

此描述符给出了此配置下提供的接口个数。每个接口可能会独立操作。比如,一个视频类(Video Class)设备可能配置有两个接口,每个都提供在主机端的64-MBps的有独立数据源(sources)与数据接收者(sinks)的双向通道。在另一个配置下视频类(Video Class)可能表现为单个接口,将两个通道合成一个128-MBps的双向通道。

当主机请求配置描述符时,所有相关接口,端点,以及端点伴侣描述符都被返回(参考第9.4.3节)。

一个设备有一个或多个配置描述符。每个配置有一个或多个接口,而每个接口又有0个或多个端点。在一个配置下,一个端点不会在接口之间共享,除非端点被同一个接口的不同可选设置使用。端点可以在不同配置的接口之间共享,而无此限制。

一旦配置好后,设备可支持对配置的有限调整。如果一个接口有备选设置,在配置好后可选择不同设置。表9-15显示了标准配置描述符。

表 9-15. 标准配置描述符【Standard Configuration Descriptor】

9.6.4 接口联合描述符 【Interface Association】

接口联合描述符(Interface Association Descriptor)用来描述联合在一个功能中的两个或者多个的接口。一个"联合"包括两个或者多个接口以及它们的可选设置接口。设备必须对设备的每个需要使用一个以上接口的功能使用一个接口联合描述符。接口联合描述符总是作为配置描述符的一部分在GetDescriptor(Configuration)请求中返回。接口联合描述符不能直接通过GetDescriptor() 或 SetDescriptor()请求访问。接口联合描述符必须定位在它所联合的一组接口的接口描述符(包括所有的可选设置)之前。一组联合的接口中所有的接口号必须连续。表9-15显示了标准的接口联合描述符。接口联合描述符包括功能类(class),子类(subclass),协议(protocol)字段。这些字段的值可以与所联合的接口中的任何一个接口的(class),子类(subclass),协议(protocol)字段相同。首选的实现是,对于已经存在的设备类,使用所联合的一组接口中的第一个接口的(class),子类(subclass),协议(protocol)字段。

Table 9-16. Standard Interface Association Descriptor

注意:由于这个特别的特性没有包还在以前版本的USB规范中,有一个问题,即对于已经存在的支持USB的操作系统实现将如何支持使用了这个描述符的设备。强烈建议使用接口联合描述符的设备实现在设备描述符中使用多接口功能类(Multi-interface Function Class)代码。这就允许简单并且容易识别这些设备,并且允许在某些操作系统上,可以安装一个驱动程序升级来解析并枚举包含接口联合描述符的配置。多接口功能类(Multi-interface Function Class)文档见http://www.usb.org/developers/docs.

9.6.5 Interface

接口描述符描述在一个配置内的特定接口。一个配置提供一个或多个接口,每个都有0个或多个端点。当一个配置支持不止一个接口时,端点描述符紧跟在接口描述符后,在GetConfiguration()请求的数据中被返回。如本章前面所述,SuperSpeed设备应该返回该接口的每个端点的端点伴侣描述符(Endpoint Companion descriptors),返回更多的关于其端点能力的信息。在配置信息内,端点伴侣描述符应该紧跟在他所关联的端点的端点描述符之后。接口描述符总是作为配置描述符的一部分被返回。接口描述符不可直接用GetDescriptor() 或 SetDescriptor()访问。

一个接口可能包含备选设置,以使得端点或它们的特性在设备配置好以后还能改变。接口的默认设置总是可选设置0。SetInterface()请求用来选择一个可选设置或者返回默认设置【译注:怎么返回呢?】;GetInterface()用来返回选择了的可选设置。

可选接口设置使得部分的设备配置能在其它接口保持操作的情况下被改变。如果一个配置对于它的一个或多个接口有备选设置,每一个设置都包括一个单独的接口描述符以及其相关的端点和端点伴侣描述符(当报告其SuperSpeed配置时)。

如果一个设备配置支持具有两个可选设置的单个接口,配置描述符后应紧跟着bInterfaceNumberbAlternateSetting字段皆为0的一个设置的接口描述符及相关的端点和端点伴侣描述符(当报告其SuperSpeed配置时);之后紧跟另一个设置的接口描述符及相关的端点和端点伴侣描述符。第二个接口描述符的bInterfaceNumber字段也应为0,但bAlternateSetting字段应设为1。

如果一个接口仅使用默认控制管道(Default Control Pipe),则接口描述符后就不跟随端点描述符。在这种情况下bNumEndpoints字段应被设置成0。

一个接口描述符绝不将默认控制管道(Default Control Pipe)计算在端点个数之内。表9-17显示了标准接口描述符。

表 9-17. 标准接口描述符


9.6.6 Endpoint

每个接口使用的端点都有自己的描述符。此描述符包含被主机用来决定每个端点的带宽需求的信息。端点描述符总是作为配置描述符的一部分在GetDescriptor(Configuration)请求中返回的。端点描述符不可直接用GetDescriptor() 或 SetDescriptor()访问。端点0绝对没有描述符。表9-18显示了标准端点描述符。

表 9-18. 标准端点描述符

Offset

Field

Size

Value

Description

0

bLength

1

数字

此描述符的字节数

1

bDescriptorType

1

常量

ENDPOINT 描述符类

2

bEndpointAddress

1

端点

此描述符所描述的端点的地址。此地址的编码如下:

Bit 3..0 : 端点号。

Bit 6..4 : 保留,复位为零

Bit 7 : 方向,对控制端点忽略。

0:OUT端点

1:IN端点

3

bmAttributes

1

位图

此字段的值描述端点在bConfigurationValue字段所指的配置下端点的特性。

Bits 1..0: Transfer Type

00 = Control

01 = Isochronous

10 = Bulk

11 = Interrupt

如果是中断端点, bits 5..2 定义如下:

Bits 3..2: 保留

Bits 5..4: 用法类型

00 = Periodic

01 = Notification

10 = Reserved

11 = Reserved

如果是等时端点,他们定义如下:

Bits 3..2: Synchronization Type

00 = No Synchronization

01 = Asynchronous

10 = Adaptive

11 = Synchronous

Bits 5..4: Usage Type

00 = Data endpoint

01 = Feedback endpoint

10 = Implicit feedback Data endpoint

11 = Reserved

如果不是同步或中断端点,5 .. 2位是保留并 应设置为零。 所有其他位被保留,并应复位为零。保留位应被忽略的主机。

4

wMaxPacketSize

2

数字

当前配置下此端点能够接收或发送的最大数据包的大小。

对于这个字段只有两个合法值。对于控制端点本字段应设置为512。对于批量类型端点这一字段应设置1024。

对于中断和等时端点,如果此端点定义了bMaxBurst大于零的值,这个字段应设置为1024。 如果在bMaxBurst字段值设置为零,那么这一字段对于等时端点可以是从0到1024的任何值,而对于中断端点可以是1到1024间的任何值。

6

bInterval

1

数字

服务该端点进行数据传输的间隔,以125-μs为单位进行表达。

对于超高速等时端点和中断端点,这个值应该在1到16范围内。bInterval值用来作为2^(bInterval-1)值的指数。例如,bInterval意味着周期为8(2^(4-1) → 2^3 → 8)

对于超高速批量或者控制端点,这个字段被保留并应设置为零。

 

bmAttributes字段提供端点的传输类型【Transfer Type (bits 1..0)】以及同步类型【Synchronization Type (bits 3..2)】等信息。对于中断端点,用法类型【Usage Type bits (bits 5..4)】指示端点是否用于不频繁的通知从而可以忍受可变延迟【(bits 5..4 = 01b)】,或者它定期地以连续服务间隔传输数据或依赖于固定的延时【(bits 5..4 = 00b)】。例如,集线器中断端点会制定它是一个通知类型,而鼠标会制定一个周期类型。对于有时候工作在通知类型,而其他时候工作在周期模式的端点,那么这个字段应该被设置为周期性的【Periodic (bits 5..4 = 00b)】。这些值可能被软件用来判定使用恰当的电源管理设置。参见附录C中关于这个值会如何影响电源管理的细节。此外,对于等时端点,用法字段【Usage Type bit (bits 5..4)】指示是否这是一个用于常规数据传输的端点【(bits 5..4 = 00b)】;是否被用来给一个或者多个数据端点传递明确的反馈信息【(bits 5..4 = 01b)】,或是否它是一个数据端点同时也作为给一个或者多个数据端点的隐含的反馈端点【(bits 5..4=10b)】。

如果端点被用来作为明确的反馈端点【(bits 5..4 = 01b)】,那么传输类型(Transfer Type)应该被设为等时【(bits 1..0 = 01b)】而同步类型(Synchronization Type)应该被设为无同步【No Synchronization (bits 3..2 = 00b)】。

反馈端点(显式或隐式)需要与一个(或多个)它所提供反馈服务的等时数据端点相关联。该相关性基于端点号匹配。反馈端点总是与它所服务的数据端点有相反的方向。如果多个数据端点需要由同一反馈端点提供服务,数据端点应按照升序——但不一定连续——给端点编号。第一个数据端点和反馈端点应具有相同的端点号(以及相反的方向)。这将确保数据端点可以通过查找具有端点号等于或小于自己的端点号的第一个反馈端点,唯一地标识它的反馈端点。

示例:考虑极端情形,需要有5组输出(OUT)的异步等时端点,同时需要4组输入(IN)的自适应等时端点。每一组都需要单独的反馈端点,并且各组由如图9-19所示所组成。

表 9-19. 示例反馈端点编号【Example of Feedback Endpoint Numbers】

端点编号可以交织在一起,如图9-8所示。

对于高速批量和控制OUT端点, bInterval字段只用于兼容性目的;主机控制器不要求根据这个字段的值而改变其行为。

9.6.7 超高速端点伴侣描述符 【SuperSpeed Endpoint Companion】

在接口中描述的每个超高速端点都紧跟着一个超高速端点伴侣描述符(Endpoint Companion descriptor)。这个描述符包含只给超高速端点定义的附加端点特性。这个描述符总是作为配置描述符信息的一部分在GetDescriptor(Configuration)请求中返回,不能被GetDescriptor() 或 SetDescriptor()请求直接访问。默认的控制管道(Default Control Pipe)不具有端点伴侣描述符。在配置信息中,端点伴侣描述符应该紧跟在它所关联的端点描述符后面。

表 9-20. 超高速端点伴侣描述符 【SuperSpeed Endpoint Companion Descriptor】

Offset

Field

Size

Value

Description

0

bLength

1

Number

这个描述符以字节计的大小

1

bDescriptorType

1

Constant

SUPERSPEED_USB_ENDPOINT_COMPANION

描述符类型

2

bMaxBurst

1

Number

端点在一次突发中可以发送或接收的数据包的最大数量。有效值为从0到15。值为0表示端点只能突发一次一个包,而15值表示端点可以突发一次最多16个包。对于控制类型的端点,这个字段应设置为0。

3

bmAttributes

1

Bitmap

如果这是个批量端点:

比特位 描述

4:0 MaxStreams。这个端点支持的流的最大数量。有效值是从0到16,其中值为0表示端点没有定义流。对于值1至16,所支持的流等于2^MaxStream。

7:5 保留。这些位是保留,并应设置为零。

如果这是个控制或中断端点:

比特位 描述

7:0 保留。这些位是保留,并应设置为零。

如果这是个等时端点:

比特位 描述

1:0 Mult。基于零的值,决定服务时间间隔内,这端点支持的包的最大数量。包的最大数量 = bMaxBurst x (Mult + 1) 。这个字段可设置的最大值是2.

7:2 保留。这些位是保留,并应设置为零。

4

wBytesPerInterval

2

Number

此端点每一个服务间隔将传输的字节总数。此字段只对周期端点有效。 对于等时端点,此值用于保留在调度中的总线时间,为每125微秒的帧数据有效载荷所需。管道可在持续时间的基础上(on an ongoing basis),实际使用不到保留的带宽。如有必要,设备通过正常的非USB定义的机制报告实际使用的带宽。

 

9.6.8 String

字串描述符是可选的。如前所述,如果一个设备不支持字串描述符,所有在其它描述符(设备, 配置, 以及接口)中有关字串描述符的引用都必须复位为0。

字符串描述符使用UNICODE UTF16LE编码,在The Unicode Standard,Worldwide Character Encoding, Version 5.0, The Unicode Consortium, Addison-Wesley Publishing Company, Reading, Massachusetts (http://www.unicode.org)中定义。设备中的字符串可支持多个语言。当请求字符串描述符时,请求者用一个16位的由USB-IF定义的语言标识(LANGID)指出语言。当前已经定义的USB LANGIDs可以在http://www.usb.org/developers/docs 上找到。所有语言的0号字符串索引返回一个字符串描述符,该字符串描述符为2字节的LANGID数组,表示设备支持的语言编码。表9-21显示了该LANGID编码数组。设备可忽略所有的字符串描述符。忽略了字符串描述符的设备后就不能返回LANGID编码。

LANGID编码数组不是以NULL结尾的。该数组的大小(以字节计)是通过将该描述符的第一个字节减去2而得到的(即bLength-2)。

表 9-21. 字符串描述符0,指定了设备支持的语言

Offset

Field

Size

Value

Description

0

bLength

1

N+2

这个描述符以字节计的大小

1

bDescriptorType

1

Constant

STRING 描述符类型

2

wLANGID[0]

2

Number

LANGID code zero

...

...

...

...

...

N

wLANGID[x]

2

Number

LANGID code x

 

UNICODE字符串描述符(如表9-22所示)不是以NULL结尾的。该字符串的长度(以字节计)是通过将该描述符的第一个字节减去2而得到的(即bLength-2)。

表 9-22. UNICODE字符串描述符

Offset

Field

Size

Value

Description

0

bLength

1

Number

这个描述符以字节计的大小

1

bDescriptorType

1

Constant

STRING Descriptor Type

2

bString

N

Number

UNICODE encoded string

 

9.7 设备类定义 【Device Class Definitions】

所有设备应支持本章定义的请求和描述符。大多数的设备都提供了额外的请求以及描述符(可能地),以支持设备特定的扩展。此外,设备可能提供扩展的对于一组设备常见的服务。为了定义一类设备,应提供以下信息,以完全定义确定的设备类的表象(appearance)和行为(behavior)。

9.7.1 描述符 【Descriptors】

如果类要求任何特定的标准描述符定义,类的定义应包括这些要求,作为这一类定义的一部分。此外,如果类定义了一个标准扩展了的描述符集,他们也应充分定义在类的定义中。任何扩展的描述符定义应遵循的标准描述符中所使用的方法,例如,所有描述应当以一个长度字段开始。

9.7.2 接口 【Interface(s)】

当一类的设备被标准化时,设备使用的接口应包括在设备类的定义中。设备可能进一步以私有的特性来扩展类定义,只要他们符合类的基础定义。

9.7.3 请求 【Requests】

所有特定于类的请求应被定义。

 

 

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值