全部博文(610)
分类:
2012-04-17 10:44:48
原文地址:USB设备结构(二) 作者:三点水兽
3 USB设备请求
所有的USB设备在设备的缺省控制通道(Default Control Pipe)处对主机的请求发出响应。这些请求是通过使用控制传输来达到的,请求及请求的参数通过Setup包发向设备,由主机负责设置Setup包内的每个域的值。每个Setup包有8个字节。见表1-2。
偏移量 |
域 |
大小 |
值 |
描述 |
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 |
|
如有数据传送阶段,此为数据字节数. |
表1-2 . Setup 数据包的格式
3.1 bmRequestType域
这个域表明此请求的特性。特别地,这个域表明了第二阶段控制传输方向。如果wLength域被设作0的话,表明没有数据传送阶段,那Direction位就会被忽略。
USB说明定义了一系列所有设备必须支持的标准请求。这些请求被例举在表8-3中。另外,一个设备类可定义更多的请求。设备厂商也可定义设备支持的请求。
请求可被导引到设备,设备接口,或某一个设备端结点(endpoint)上。这个请求域也指定了接收者。当指定的是接口或端结点(endpoint)时,wIndex域指出那个接口或端节点。
3.2 bRequest域
这个域标识特别的请求。bmRequestType域的Type啦可修改此域的含义。本说明仅定义Type 字位为0即标准设备请求时bRequest域值的含义。
3.3 wValue域
此域用来传送当前请求的参数,随请求不同而变。
3.4 wIndex域
wIndex域用来表明是哪一个接口或端结点,图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) | ||||||||
图1-2. 所指为端点时wIndex 格式
D7 |
D6 |
D5 |
D4 |
D3 |
D2 |
D1 |
D0 | |
接口号 | ||||||||
D16 |
D15 |
D13 |
D12 |
D11 |
D10 |
D9 |
D8 | |
保留(为0) | ||||||||
图1-3. 所指为接口时WIndex 格式
3.5 wLength域
这个域表明第二阶段的数据传输长度。传输方向由bmRequstType域的Direction位指出。wLength域为0则表明无数据传输。在输入请求下,设备返回的数据长度不应多于wLength,但可以少于。在输出请求下,wLength指出主机发出的确切数据量。如果主机发送多于wLength的数据,设备做出的响应是无定义的。
4 标准设惫请求
这部分描述的所有USB设备都定义的标准设备请求,表8-3将它们列出,而表8-4、8-5分别结出了对应的标准请求码及描述表类型。
不管设备是否被分配了非缺省地址或设备当前是被配置了的,它们都应当对标准请求产生响应。
特性选择符被用来设置特性或使特性生效。比如说某个设备、接口、或结点的远程唤醒功能,特性选择符的值在表1-6中得到了说明。
对于非法请求的处理从前所述。但是非法请求并不会使得控制通道设置Halt特性。如果因为某种原因,设备因为一个错误状态不能通过缺省控制通道来与主机通信,设备必须被reset来清除错误状态并重启缺省通道。
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 |
零 |
端点号 |
二 |
幀号 |
表1-3 标准设备请求
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 |
表1-4 标准请求码
描述表种类 |
值 |
DEVICE |
1 |
CONFIGURATION |
2 |
STRING |
3 |
INTERFACE |
4 |
ENDPOINT |
5
|
表1-5 描述表种类
特性选择符 |
接受者 |
值 |
DEVICE_REMOTE_WAKEUP |
设备 |
1 |
ENDPOINT_HALT |
端点 |
0 |
表1-6 标准特性选择符
5 描述表
USB设备通过描述表来反映他们的属性。描述表是有定义好的格式的数据结构,每一个描述表以一个字节打头表明本描述表的长度,紧跟其后是一个字节的描述表类信息。
使用描述表使得单个配置的特性存储变得简明,因为每个配置可能会重复使用其它有相同特性的配置描述表的部分或全部,用这种方法,描述表用一个关系数据库来表绘一个个的单独数据记录。
在适当的地方,描述表包括了指向字串描述表的引用。字串描述表提供了人能读懂的信息。字串描述表可有可无,但描述表中的字串指引域是不可少的。如果一个设备不支持字串描述表,该域就为0。
如果描述表值中的长度域值少于本说明的定义,此描述表非法,不能被主机接受。如果返回的描述表中的长义值大于本说明定义,则过长部分当被忽略,但下一个描述表的位置由返回长度而不是实际长度来决定。
设备可以两种方式返回类相关的或厂商定义的描述表。
1.如果这两种描述表的格式与标准格式相同(以长度字节打头,紧跟着类型字节)则它们可由GetDescriptor(Configuration)请求与标准描述一同返回。在这种情况下,类相关或厂商定义的描述表一般跟在被修改的或被扩展的描述之后。
2. 如果这两种描述表使用的非标准格式。指定类相关的或厂商定义的描述表及索引的GetDescriptor( )请求可从设备返回这两种描述表。类或厂商说明会指出正确取出这两种描述表的途径。
6 标准描述表的定义
6.1 设备
设备描述表给出了USB设备的一般信息。这包括对设备及所有设备配置起全程作用的信息。一个USB设备只能有一个设备描述表。
所有的USB设备都有缺省控制通道。缺省控制通道的最大包长在设备描述表中得到了说明。一个配置的端节点与接口定义在配置描述表中,一个配置和它的接口不包括节点描述表。除最大包长外,缺少通道的特性由本说明定义,并且对所有的USB设备都一样。
bNumberConfiguration s域表明此设备支持的配置数。表1-7为标准设备描述表。
偏移量 |
域 |
大小 |
值 |
描述 |
0 |
bLength |
1 |
数字 |
此描述表的字节数 |
1 |
bDecriptorType |
1 |
常量 |
描述表种类为设备 |
2 |
bcdUSB |
2 |
BCD码 |
此设备与描述表兼容的USB设备说明版本号(BCD 码) |
4 |
bDeviceClass |
1 |
类 |
设备类码 如果此域的值为0则一个设置下每个接口指出它自己的类,并个接口各自独立工作。 如果此域的值处于1~FEH之间,则设备在不同的接口上支持不同的类。并这些接口可能不能独立工作。此值指出了,这些接口集体的类定义。 如果此域设为FFH,则此设备的类由厂商定义。 |
5 |
bDeviceSubClass |
1 |
子类 |
子类码 这些码值的具体含义根据bDeviceClass 域来看。 如bDeviceClass 域为零,此域也须为零 如bDeviceClass 域为FFH,此域的所有值保留。 |
6 |
bDevicePortocol |
1 |
协议 |
协议码 这些码的值视bDeviceClass 和 bDeviceSubClass 的值而定。 如果设备支持设备基础上的类相关的协议,此码标志了设备类说明上的值。 如果此域的值为零,则此设备不在设备基础上支持设备类相关的协议。然而,它可能在接口基础上支持设备类相关的协议。 如果此域的值为FFH,此设备使用厂商定义的协议。 |
7 |
bMaxPacketSize0 |
1 |
数字 |
端点0的最大包大小(仅8,16,32,64 为合法值) |
8 |
idVendor |
2 |
ID |
厂商标志(由USB标准付值) |
10 |
idProduct |
2 |
ID |
产品标志(由厂商付值) |
12 |
bcdDevice |
2 |
BCD 码 |
设备发行号(BCD 码) |
14 |
iManufacturer |
1 |
索引 |
描述厂商信息的字串的索引。 |
15 |
iProduct |
1 |
索引 |
描述产品信息的字串的索引。 |
16 |
iSerialNumber |
1 |
索引 |
描述设备序列号信息的字串的索引。 |
17 |
bNumConfigurations |
1 |
数字 |
可能的设置数 |
6.2 配置
配置描述表给出了一设备配置的信息,描述表包括一个b Configuration Value域,在SetConfiguration( )请时被用作参数来设置所需配置。
此描述表给出了此配置下的接口数,每个接口可能独立操作。比如,一个ISDN设备可能配置有两个接口,每个都提供64KB/S的有独立数据源与数据接收者的双向通道在另一个配置下ISDN可能表现为单个接口,将两个通道合成一个128KB/S的双向通道。
当主机发出请求要得配置描述表时,所有相关接口与端节点的描述表都被返回。
一个USB设备有一个或多个配置。每个配置只有一个或多个接口。而每个接口又有0个或多个端节点。在一个配置下,一个端节点不会在接口之间共享,除非端节点被同一个接口的不同设置使用。在不同配置端节点,可无此限制。
一个配置好后,设备可支持对配置的有限调整,如果一个接口有备选设置,在配置好后可选择不同设置。表1-8是标准配置描述表。
偏移量 |
域 |
大小 |
值 |
描述 |
0 |
bLength |
1 |
数字 |
此描述表的字节数。 |
1 |
bDescriptorType |
1 |
常量 |
配置描述表类型 |
2 |
wTotalLength |
2 |
数字 |
此配置信息的总长(包括配置,接口,端点和设备类及厂商定义的描述表) |
4 |
bNumInterfaces |
1 |
数字 |
此配置所支持的接口个数 |
5 |
bCongfigurationValue |
1 |
数字 |
在SetConfiguration()请求中用作参数来选定此配置。 |
6 |
iConfiguration |
1 |
索引 |
描述此配置的字串描述表索引 |
7 |
bmAttributes |
1 |
位图 |
配置特性: D7: 保留(设为一) D6: 自给电源 D5: 远程唤醒 D4..0:保留(设为一) 一个既用总线电源又有自给电源的设备会在MaxPower域指出需要从总线取的电量。并设置D6为一。运行时期的实际电源模式可由GetStatus(DEVICE) 请求得到。 |
8 |
MaxPower |
1 |
mA |
在此配置下的总线电源耗费量。以 2mA 为一个单位。 |
表1-8 标准配置描述表
6.3 接口
此描述表在一个配置内给出一个接口的信息。如果一个配置支持不止一个接口,端节点的描述表会跟在接口描述表后被返回,接口描述表总是作为配置描述表的一部分被返回。接口描述不可直接用Set Description ( )和Get Descriptor ( )存取。
一个接口可能包含备选设置,以使得端节点或他们的特性在设备配置好以后能改变。一个接口的缺省设置总是可选设置。SetInterface ( )与GetInterface ( )用来选择与返回选择了的接口设置。
可选的接口设置使得部分的设备配置能在其它接口进行操作的情况下改变。如果一个配置对于它的一个或多个接口有备选设置,每一设置包括一个独立接口描述表和相关结点。
如果一个设备配置支持单个接口,并此接口有两个可选设置,配置描述表返回以后会紧跟着返回bInterfaceNumber与bAlternateSetting域皆为0的第一个设置的接口描述表及相关的结点描述表,而随之后是另一个设置接口描述表与结点描述表。第二个接口描述表的bInterfaceNumber域也应为0,但bAlternate Setting域应为1。
如果一个接口仅使用节点0,则接口描述表以后就不再返回节点描述表,并且此接口表示的是一个请求接口,它使用连在节点0上的缺省通道。在这种情况下bNumberEndpoints域应被设置成0。一个接口描述表的节点个数不把结点0计在内。表1-9是标准节口描述表。
偏移量 |
域 |
大小 |
值 |
说明 |
0 |
bLength |
1 |
数字 |
此表的字节数 |
1 |
bDescriptorType |
1 |
常量 |
接口描述表类 |
2 |
bInterfaceNumber |
1 |
数字 |
接口号,当前配置支持的接口数组索引(从零开始) |
3 |
bAlternateSetting |
1 |
数字 |
可选设置的索引值。 |
4 |
bNumEndpoints |
1 |
数字 |
此接口用的端点数量,如果是零则说明此接口只用缺省控制管道。 |
5 |
bInterfaceClass |
1 |
类 |
类值 零值为将来的标准保留。 如果此域的值设为FFH,则此接口类由厂商说明。 所有其它的值由USB 说明保留。 |
6 |
bInterfaceSubClass |
1 |
子类 |
子类码 这些值的定义视bInterfaceClass域而定。 如果bInterfaceClass域的值为零则此域的值必须为零。 bInterfaceClass域不为FFH则所有值由USB 所保留。 |
7 |
bInterfaceProtocol |
1 |
协议 |
协议码:bInterfaceClass 和bInterfaceSubClass 域的值而定.如果一个接口支持设备类相关的请求此域的值指出了设备类说明中所定义的协议.
|
8 |
iInterface |
1 |
索引 |
描述此接口的字串描述表的索引值。 |
表1-9 标准接口描述表
6.4 节点
每个接口使用的结点都有自己的描述表,此描述表被主机用来决定每个节点的带宽需求。每个结点的描述表总是作为配置描述的一部分返回的,结点0无描述表。1-10为标准节点描述表。
偏移量 |
域 |
大小 |
值 |
说明 |
0 |
bLength |
1 |
数字 |
此描述表的字节数 |
1 |
bDescriptorType |
1 |
常量 |
端点描述表类 |
2 |
bEndpointAddress |
1 |
端点 |
此描述表所描述的端点的地址。此地址的编码如下: Bit 3..0 : 端点号. Bit 6..4 : 保留,为零 Bit 7: 方向,如果控制端点则略。 0:出端点 1:入端点 |
3 |
bmAttributes |
1 |
位图 |
此域的值描述的是在bConfigurationValue域所指的配置下端点的特性。 Bit 1..0 :传送类型 00=控制传送 01=同步传送 10=批传送 11=中断传送 所有其它的位都保留。
|
4 |
wMaxPacketSize |
2 |
数字 |
当前配置下此端点能够接收或发送的最大数据包的大小。 对与同步传送此值用于为每幀的数据净负荷预留时间。而通道可能在实际运行时不需要预留的带宽。实际带宽可由设备通过一种非USB定义的机制汇报给主机. 对于中断传送,批传送,控制传送.端点可能发送较小的数据包。并且在结束传送后既有可能间隙时间来重启,也有可能不需要这段时间。 |
6 |
bInterval |
1 |
数字 |
轮寻数据传送端点的时间间隙。 此域的值对于批传送的端点及控制传送的端点忽略。对于同步传送的端点此域必需为1。对于中断传送的端点此域值的范围为1到255。 |
表1-10 标准端点描述表
6.5 字串
字串描述表是可有可无的。如前所述,如果一个设备无字串描述表,所有其它描述表中有关字串描述表的索引都必须为0。
字串描述表使用的是UNICODE编码,则《Unicode标准世界范围的字符编码》1.0版,第一和第二卷定义,字串描述表支持多语言编码。当请求字串描述表时,请求者用一个6位的语言标识指出语言,此语言ID由微软Windows定义(《开发Windows 95及Windows NT的国际化软件》,Nadine Kano,微软出版,华盛顿)。所有语言的0号字串索引返回一个字串描述表,该字串描述表为双字节的LANGID数组,表示设备支持的语言,表8-11表示了该LANGID数组。USB设备可删除所有的字串描述表。USB设备删了字串描述表后就不能返回LANGID码了。LANGID数组不是以NULL结尾的。它的大小为bLength-2。
偏移量 |
域 |
大小 |
值 |
描述 |
0 |
bLength |
1 |
N+2 |
此描述表的字节数 |
1 |
bDescriptorType |
1 |
常量 |
字串描述表类型 |
2 |
wLANGID[0] |
2 |
数字 |
语言标识(LANGID) 码0 |
… |
… |
… |
… |
… |
N |
wLANGID[x] |
2 |
数字 |
语言标识(LANGID) 码X |
表1-11 体现设备所支持的语言的码字
UNICODE字串也不是NULL结尾的(见表8-12),字串长为bLength-2.
偏移量 |
域 |
大小 |
值 |
描述 |
0 |
bLength |
1 |
数字 |
此描述表的字节数 |
1 |
bDescriptorType |
1 |
常量 |
字串描述表类型 |
2 |
bString |
N |
数字 |
UNICODE 编码的字串 |
表1-12 UNICODE 字串描述表