9.3 USB设备请求
9.3 USB设备请求
所有的USB设备在设备的缺省控制通道(Default Control Pipe)处对主机的请求发出响应。这些请求是通过使用控制传输来达到的,请求及请求的参数通过Setup包发向设备,由主机负责设置Setup包内的每个域的值。每个Setup包有8个字节。见表8-2。
表8-2 Setup 数据包的格式
偏移量 |
域 |
大小 |
值 |
描述 |
0 |
bmRequestType |
1 |
位图 |
请求特征: D7: 传输方向 0=主机至设备 1=设备至主机 D6..5: 种类 0=标准 1=类 2=厂商 3=保留 D4..0: 接受者 0=设备 1=接口 2=端点 3=其他 4..31=保留 |
1 |
bRequest |
1 |
值 |
具体请求(参见表8-3) |
2 |
wValue |
2 |
值 |
字长域,根据不同的请求含义改变. |
4 |
wIndex |
2 |
索引或偏移 |
字长域,根据不同的请求含义改变.典型用于传送索引或偏移. |
6 |
wLength |
2 |
|
如有数据传送阶段,此为数据字节数. |
9.3.1 bmRequestType域
这个域表明此请求的特性。特别地,这个域表明了第二阶段控制传输方向。如果wLength域被设作0的话,表明没有数据传送阶段,那Direction位就会被忽略。
USB说明定义了一系列所有设备必须支持的标准请求。这些请求被例举在表8-3中。另外,一个设备类可定义更多的请求。设备厂商也可定义设备支持的请求。
请求可被导引到设备,设备接口,或某一个设备端结点(endpoint)上。这个请求域也指定了接收者。当指定的是接口或端结点(endpoint)时,wIndex域指出那个接口或端节点。
9.3.2 bRequest域
这个域标识特别的请求。bmRequestType域的Type啦可修改此域的含义。本说明仅定义Type 字位为0即标准设备请求时bRequest域值的含义。
9.3.3 wValue域
此域用来传送当前请求的参数,随请求不同而变。
9.3.4 wIndex域
Index域用来表明是哪一个接口或端结点,图8-2表明wIndex的格式(当标识端结点时)。Direction位在设为0时表示出结点,设为1时表示是入结点,Endpoint Number是结点号。图8-3表明wIndex用于标识接口时的格式。
D7 |
D6 |
D5 |
D4 |
D3 |
D2 |
D1 |
D0 |
|
方向 |
保留(为0) |
端点号 |
||||||
D16 |
D15 |
D13 |
D12 |
D11 |
D10 |
D9 |
D8 |
|
保留(为0) |
图8-2 所指为端点时wIndex 格式
D7 |
D6 |
D5 |
D4 |
D3 |
D2 |
D1 |
D0 |
|
接口号 |
||||||||
D16 |
D15 |
D13 |
D12 |
D11 |
D10 |
D9 |
D8 |
|
保留(为0) |
图8-3 所指为接口时WIndex 格式
9.3.5 wLength域
这个域表明第二阶段的数据传输长度。传输方向由bmRequstType域的Direction位指出。wLength域为0则表明无数据传输。在输入请求下,设备返回的数据长度不应多于wLength,但可以少于。在输出请求下,wLength指出主机发出的确切数据量。如果主机发送多于wLength的数据,设备做出的响应是无定义的。
9.4 标准设惫请求
这部分描述的所有USB设备都定义的标准设备请求,表8-3将它们列出,而表8-4、8-5分别结出了对应的标准请求码及描述表类型。
不管设备是否被分配了非缺省地址或设备当前是被配置了的,它们都应当对标准请求产生响应。
特性选择符被用来设置特性或使特性生效。比如说某个设备、接口、或结点的远程唤醒功能,特性选择符的值在表8-6中得到了说明。
对于非法请求的处理从前所述。但是非法请求并不会使得控制通道设置Halt特性。如果因为某种原因,设备因为一个错误状态不能通过缺省控制通道来与主机通信,设备必须被reset来清除错误状态并重启缺省通道。
表8-3 标准设备请求
bmRequestType |
bRequest |
wValue |
Windex |
wLength |
Data |
00000000B 00000001B 00000010B |
CLEAR_FEATURE |
特性选择符 |
零 接口号 端点号 |
零 |
无 |
10000000B |
GET_CONFIGURATION |
零 |
零 |
一 |
配置值 |
10000000B |
GET_DESCRIPTOR |
描述表种类和索引 |
零或语言标志 |
描述表长 |
描述表 |
10000001B |
GET_INTERFACE |
零 |
接口号 |
一 |
可选设置 |
10000000B 10000001B 10000010B |
GET_STATUS |
零
|
零 接口号 端点号 |
二 |
设备, 接口 ,或 端点状态 |
00000000B |
SET_ADDRESS |
设备地址 |
零 |
零 |
无 |
00000000B |
SET_CONFIGURATION |
配置值 |
零 |
零 |
无 |
00000000B |
SET_DESCRIPTOR |
描述表种类和索引 |
零或语言标志 |
描述表长 |
描述表 |
00000000B 00000001B 00000010B |
SET_FEATURE |
特性选择符 |
零 接口号 端点号 |
零 |
无 |
00000001B |
SET_INTERFACE |
可选设置 |
接口号 |
零 |
无 |
100000010B |
SYNCH_FRAME |
零 |
端点号 |
二 |
幀号 |
表8-4 标准请求码
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 |
表8-5 描述表种类
描述表种类 |
值 |
DEVICE |
1 |
CONFIGURATION |
2 |
STRING |
3 |
INTERFACE |
4 |
ENDPOINT |
5 |
表8-6 标准特性选择符
特性选择符 |
接受者 |
值 |
DEVICE_REMOTE_WAKEUP |
设备 |
1 |
ENDPOINT_HALT |
端点 |
0 |
9.4.1 清除特性(ClearFeature())
这个请求是被用来清除一个指定的特性。
wValue中的特性选择符的值必须根据接收者来设定适当的值。接收者是设备要用设备特性选择符,是接口就必须用接口特性选择符,是端结点就要用端节点特性描述符。
参照表8-6来看选择符与接收者的对应关系。
一个ClearFeature( )请求所指的特性如果不能被清除,不存在或指的是不存在的接口或结点号,会产生RequestError错误。
如果wLength不为0,设备响应无定义。
缺省状态:当设备处于缺省状态时,对此请求的反应无定义。
地址状态:在设备处于地址状态时这个请求是合法的,但如果该请求指的是接口或是非零号端结点,会引起请求错误。
配置状态:在此状态下,该请求合法。
9.4.2 取得配置(GetConfiguration())
此请求返回当前设备配置值。
如果返回0值表明设备未配置。
如果wValue, wIndex, wLength的值与上面表中不同,设备响应无定义。
缺省状态:该请求响应无定义
地址状态:返回0值
配置状态:非0的 bConfigurationValue值被返回
9.4.3 取得描述符
这个请求返回存 在的描述符。
wValue域的高一字节标识描述表类型,低一字节表示描述表的索引(参见表8-5)。wIndex域标识字串描述表的语言(Language ID)如果是其它语言的话就设为0,wLength表示要返回多少字节。如果描述表长度大于wLength域值,那么只有描述表的初始部分被返回。如果描述表比wLength域值,没发送一个短包来标志传输的结束。一个短包被定义成一个长度短于最大负载长度或一个空(NULL)包。
这个标准请求包括三种描述符:设备、配置、及字串一个配置描述表的设备请求会一次返回配置描述表,所有的接口描述表和所有接口的端节点的描述表。第一个接口描述表紧跟着配置描述表,第一个接口的端节点的描述表随后。如果有其它的接口与端节点,它们的描述表欲跟在第一个接口与端节点描述表之后。与类有关的描述表,和/或厂商定义的描述表跟在标准描述表之后。
所有的设备必须提供一个设备描述表并且至少一个配置描述表,如果一个设备不支持一个请求的描述表,则返回请求错误。
缺省状态:此请求合法。
地址状态:此请求合法。
配置状态:此请求合法。
9.4.4 取得接口设置(GetInterface())
这个请求返回所指接口的选中的可选设置。
有些USB设备的接口配置有互斥的设置。这个请求使得主机决定当前设置。
如果wValue或wLength不依以上的表中设值,设备响应无定义。
如果所指的接口不存在,返回请求错误。
缺省状态:此状态下,设备对该请求响应无定义
地址状态:设备返回请求错误
配置状态:此请求合法
9.4.5 取得状态(GetStatus ( ))
这个请求返回所指接收者的状态。
bmRequestType域的Recipients位段表示出接收者。
如果wValue或wLength不是上表中值,或wIndex在取设备状态请求时非0则设备响应无定义。
缺省状态:设备响应无定义
地址状态:如果所指的是接口或是一个非0号端节点,设备响应返回请求出错。
配置状态:如果所指接口或端节点不存在,返回请求错误。
一个GetStatus()请求返回信息的格式如图8-4。
D7 |
D6 |
D5 |
D4 |
D3 |
D2 |
D1 |
D0 |
保留(为零) |
远程唤醒 |
自给电源 |
|||||
D15 |
D14 |
D13 |
D12 |
D11 |
D10 |
D9 |
D8 |
保留(为零) |
图8-4 GetStatus()发向设备时返回信息
其中Self Powered域表明设备当前是否是自给电源。如果Do为0设备是总线电源式。如果Do被设成1,设备是自给电源式的。此域不应当被SetFeature( )或ClearFeature ( )请求改变。
Remote Wakeup域表明此设备当前是否支持远程唤醒,支持远程唤醒能力的设备缺省值是无效的(disabled),如果D1被Reset成0,远程唤醒能力就被disabled。返之,设成1就是具有该功能,此域可被SetFeature( )和Clear Feature ( )使用DEVICE-REMOTE-WAKEUP特性选择符修改,设备复位时此域被设成0。
一个GetStatus ( )的接口请求返回如图8-5的信息。
D7 |
D6 |
D5 |
D4 |
D3 |
D2 |
D1 |
D0 |
保留(为零) |
|||||||
D15 |
D14 |
D13 |
D12 |
D11 |
D10 |
D9 |
D8 |
保留(为零) |
图8-5 GetStatus()发向接口时返回信息
一个Get Statue( )的端节点请求返回如图8-6所示信息。
D7 |
D6 |
D5 |
D4 |
D3 |
D2 |
D1 |
D0 |
保留(为零) |
停机 |
||||||
D15 |
D14 |
D13 |
D12 |
D11 |
D10 |
D9 |
D8 |
保留(为零) |
图8-6 GetStatus()发向端点时返回信息
Halt特性应当在所有的中断及端结点中实现。如果端节点当前被halted了,那么这个Halt特性就设成1,否则为0。Halt特性可选择性地由Set Feature(ENDPOINT-HALT)请求来设置,一旦被SetFeature( )请求设置,设备的响应就会像这个域由硬件条件设置的一样,如果导止停机(halt)的条件去除了,用Clear Feature (ENDPOINT-HALT)请求清除halt特性会导致端节点再也不会返回STALL信号。对于使用 (Date toggle)的端节点,不管一个端节点的Halt特性是否已被设置,一个Clear Feature (ENDPOINT-HALT)总会导致 (date toggle)被重新初始化成DATAO Halt特性在收到SetConfiguration ( )或Set Interface( )请求后总会被复位成0。
Halt特性不要求也不建议在缺省控制通道实现。然而,设备可设置缺省控制通道的Halt特性来反映一个功能出错的状态。如果这个特性被设了的话,设备将对除Getstatus( ),SetFeature( ),Clear Feature ( )之外的请求返回STALL信号,设备可不对类有关的及厂商定制的请求返回STALL信号。
9.4.6 设置地址(SetAddress ( ))
本请求为设备的将来存取设置地址
wValue指出所要设置成的地址值
像在另处所述,请求实际可分成三个阶段。在第一阶段,Setup包被送至设备,在第二个可有无的阶段,数据在设备与主机之间传送,在第三阶段,状态信息在主机与设备之间传送。数据与状态传送的方向要看是主机发数据给设备还是设备发数据给主机。状态的传送方向总是与数据传送方向是相反的,如果没有数据传输阶段则状态由设备传向主机的。
Setup包传送以后的两个阶段的地址保持与Setup包传送阶段的一致。USB设备只有在Status阶段过后才能改变设备地址。注意,在这方面此请求不同于其它请求。其它请求总是在状态传送阶段之前完成指定操作的。
如果所指的设备地址大于127或wIndex 或wLength非零,设备响应无定义。
设备对SetAddress(0)的响应无定义
缺省状态:如果地址值非0,那设备将进入地址状态,否则地址仍留在缺省态(此非出错状态)
地址状态:如果新地址值为0,进入缺省态,否则仍留在地址状态但使用新地址
配置状态:在此状态下设备对此请求的响应无定义。
9.4.7 设置配置值(SetConfiguration( ))
此请求设置设备配置值
wValue域的低字节指出配置,这个配置值必须为0或与配置描表中的一个配置相配。如果配置值为0,设备置地址状态。wValue的高字节保留。
如果wIndex, wLength或wValue的高字节非0,则设备对之的响应无定义。
缺省状态:设备响应无定义
地址状态:如果所指的配置为0,设备停留在地址状态。如果所指的配置与描述表中的一个值相匹配,那个配置就被选中,设备转到配置有。否则,返回请求错误
配置状态:如果配置值为0,设备进入电址状态。如果配置值非0并与描述表中的一个配置相匹配则设备仍留在配置态,但采用新的配置值,否则返回请求错误。
9.4.8 设置描述表(SetDescriptor ( ))
此请求用于更新或添加新的描述表。
wValue域的高字节指出了描述的类型,低字节指出了描述表索引(参风表8-5)。wIndex域指出了字串描述表的语言标识,对于其它描述表来说它为0。wLength指出从主机传向设备的字节数。
如果设备不支持该请求则设备返回一个请求错误
缺省状态:此状态下设备对该请求反应无定义
地址状态:如果设备支持请求,则为合法
配置状态:如果设备支持请求,则为合法
9.4.9 设置特性(SetFeature ( ))
这个请求被用来设置或使一个特性生效。
wValue域中的特性选择符必须跟接收者相配。
哪个选择符对应什么接收者的定义请参照表8-6
SetFeature ( )请求如果指出一个不存在的特性会使得设备在交换状态阶段返回STALL信号。
如果wLength为非0,设备响应无定义。
如果SetFeature ( )指的是一个不存在的接口或端节点,设备返回一个请求错误。
缺省状态:设备响应无定义。
地址状态:合法、除非请求错误。
配置状态:合法。
9.4.10 设置接口(SetInterface ( ))
此请求让主机为指定的接口选择一个设置。
如有USB设备接口配置中有互斥设置。此请求让主机选择所要的设置。如果设备的接口只支持缺省设置,在状态交换阶段设备返回STALL
如果所指接口或设置不存在,设备返回请求错误。
wLength为0,设备响应无定义
缺省状态:设备响应无定义
地址状态:设备返回请求错误
配置状态:合法
9.4.11 同步帧(SynchFrame ( ))
该请求用来设置或汇报一个结点的同步帧。
如果一个端节点支持同步传输,端节点可能会根据某一特点的模式来以变长方式传送每一帧。主机与端节点必须在什么时候出现重复模式的第一帧出现上达成一致。模式开始帧的序号由设备返回给主机。这个帧序号由模式首帧前的SOF信号传向端节点。设备还可以用此请求来使得帧模式重新开始。在这种情况下,设备应当保存每个SOF中的帧序号并在数据传送阶段返回这些值,并在数据传送阶段的每个 (IN)之后立即开始重新开始这个模式。
这个值仅用于隐式模式的同步数据传输。如果wValue非0或wLength非2,设备响应无定义。
如果所指的端节点不支持此请求,设备返回一个请求错误。
缺省状态:设备响应无定义
地址地址:设备返回请求错误
配置状态:此请求合法
USB开源项目
百合电子工作室曾在2009年推出了一个USB开源项目:Easy USB 51 Programer,此项目以开源的形式展示了USB通信的基础性内容、USB HID设备类固件程序开发及PC端应用程序开发、自定义USB设备类固件程序开发及PC端驱动程...
|
USB产品
EASY USB D12 是原EASY USB 51 PROGRAMER的升级版,是百合电子工作室历时一年精心设计的一款USB学习板/开发板,与老款相比,其实例更丰富,技术文档更详尽,更重要的是此款USB学习板还提供技术支持。......
|