控制传输是最重要和结构最复杂的一种传输类型。整个USB枚举的过程,都是使用了控制传输。USB枚举过程中的指令,我们称为标准的USB设备请求指令。包括了:
请求命令名称 | bRequest字段值 | 作用 |
GET_STATUS | 0 | 用于返回特定接收者的状态信息 , 比如端点、接口等的状态 |
CLEAR_FEATURE | 1 | 主机清除或禁用接收者的某些特性 |
SET_FEATURE | 3 | 主机用来启用或激活命令接收者的某些特性 |
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、设备请求命令的格式
标准 USB 设备请求命令都是主机通过缺省的控制管道利用控制传输来发送的。
偏移量 | 0 | 1 | 2 | 4 | 6 |
请求 | bmRequestType | bRequest | wValue | wIndex | wLength |
大小(byte) | 1 | 1 | 2 | 2 | 2 |
(1).bmRequestType
请求命令类型。
D7 : 数据传输方向 0 主机到设备(OUT); 1 设备到主机(IN)
D6~D5 : 命令的类型 00 表示标准请求命令; 01 类请求命令; 10 用户定义的请求命令; 11 保留
D4~D0 : 该命令的接收者类型 00000 接收者为设备; 00001 接收者为接口; 00010 接收者为端点; 00011 其他接收者; 其他值保留
(2). bRequest
请求命令代码。(包括文章开头表中所有内容)
(3).wValue
命令信息,占用2个字节。
(4).wIndex
索引信息,占用2个字节。分为:端点、接口
D15~D8 | D7 | D6~D4 | D3~D0 |
保留(值为0) | 方向 | 保留(值为0) | 端点号 |
D15~D8 | D7~D0 |
保留(值为0) | 接口编号 |
(5).wLength
传输的数据大小,共有 2 字节。数据是主机到给设备 , 值便是实际的数据大小; 数据是设备到主机时, wLength 的值是设备能够 发送的最大数据包的大小, 当然, 设备实际发送的数据可以比 wLength 的值小。
2、获取状态请求 GET_STATUS
用于返回特定接收者的状态信息 , 比如端点、接口等的状态。
字段 | bmRequestType | bRequest | wValue | wIndex | wLength | 数据 |
内容 | 10000000 10000001 10000010 | GET_STATUS | 0 | 0 接口 端点 | 2 | 设备、接口或端点的状态 |
(1).bmRequestType
D7: 1 表明该命令要求设备发送数据给主机;
D1~D0: 00 设备、01 接口、10 端点;
(2).bRequest
值为0。
(3).wValue
该命令没有包含特殊的内容 , 因此没有启用该字段 , 值为 0x00
(4).wIndex
值要与 bmRequestType 内容匹配
该命令获取的是设备的状态时 , 值为 0x00;
接收者是接口时, 该字段值即为相应接口的编号, 即接口描述符的bInterfaceNumber字段;
接收者是端点时 , 该字段值即为相应的端点号, 即端点描述符的 bEndpointAddress字段。
(5).wLength
该命令要求设备返回相应接收者的状态 , 因此该字段的值即为相应状态信息的大小 , 这里规定为 0x02, 即 2 字节。
(6).数据
命令接收者为设备时,仅D1和D0位有效,其他位保留。
D1:设备的远程唤醒能力,在系统复位后,D1位默认为 0。主机可以通过 SET_FEATURE 和 CLEAR_FEATURE 命令来改 变设备的远程唤醒能力。
1 设备被使能 , 能够远程唤醒 ; 0 设备的远程唤醒能力被禁止。
D0 位指示设备的供电模式,主机无法改变设备的供电模式。
0 设备是总线供电 ; 1 设备为自供电。
命令接收者为接口时, 返回的数据不带有任何信息, 返回值都为0。
命令接收者为端点时, 其 中仅D0位有效, 指示该端点是否被禁止(Halt)。
D0:0 端点处于禁止状态 ; 1 端点状态正常。
3、清除特性请求 CLEAR_FEATURE
清除或禁用接收者的某些特性。
字段 | bmRequestType | bRequest | wValue | wIndex | wLength | 数据 |
内容 | 00000000 00000001 00000010 | CLEAR_FEATURE | 特性选择器 | 0 接口 端点 | 0 | 无 |
(1).bmRequestType
该命令仅用于主机输出给设备, 而命令的接收者可以是设备、接口和端点。接收者的某些特性就可以通过这个请求命令来清除或禁用。
(2).bRequest
值为0x01;
(3).wValue
特性选择器代表了一些特定的需要被清除或禁用的特性代码。
特性选择器 | 接收者 | wValue |
DEVICE_REMOTE_WAKEUP | 设备 | 1 |
ENDPIONT_HALT | 端点 | 0 |
DEVICE_REMOTE_ WAKEUP特性选择器 , 主机管理设备的远程唤醒的能力,主机可以禁用设备的远程唤醒功能。
ENDPOINT_HALT特性选择器选择端点的禁用特性, 主机可以利用此命令来解除 一个端点的禁用状态。
(4).wIndex
值要与 bmRequestType 内容匹配
该命令获取的是设备的状态时 , 值为 0x00;
接收者是接口时, 该字段值即为相应接口的编号, 即接口描述符的bInterfaceNumber字段;
接收者是端点时 , 该字段值即为相应的端点号, 即端点描述符的 bEndpointAddress字段。
(5).wLength
该命令没有要求设备返回任何数据, 因此该字段的值为0, 从而整个控制传输也没有“可选数据步骤”。
4、设置特性请求 SET_FEATURE
与CLEAR_FEATURE相对应。 主机用来启用或激活命令接收者的某些特性。
字段 | bmRequestType | bRequest | wValue | wIndex | wLength | 数据 |
内容 | 00000000 00000001 00000010 | SET_FEATURE | 特性选择器 | 0 接口 端点 | 0 | 无 |
(1). bmRequestType
该命令仅用于主机输出给设备, 而命令的接收者可以是设备、接口和端点。接收者的某些特性就可以通过这个请求命令来启用 或激活。
(2).bRequest
值为0x03。
(3).wValue
DEVICE_REMOTE_ WAKEUP特性选择器 , 主机管理设备的远程唤醒的能力,主机可以启用设备的远程唤醒功能。
ENDPOINT_HALT特性选择器选择端点的禁用特性, 主机可以利用此命令来使 一个端点处于禁用状态。
(4).wIndex
值要与 bmRequestType 内容匹配
该命令获取的是设备的状态时 , 值为 0x00;
接收者是接口时, 该字段值即为相应接口的编号, 即接口描述符的bInterfaceNumber字段;
接收者是端点时 , 该字段值即为相应的端点号, 即端点描述符的 bEndpointAddress字段。
(5).wLength
该命令没有要求设备返回任何数据, 因此该字段的值为0, 从而整个控制传输也没有“可选数据步骤”。
5、设置地址请求 SET_ADDRESS
主机给设备分配地址。
字段 | bmRequestType | bRequest | wValue | wIndex | wLength | 数据 |
内容 | 00000000 | SET_ADDRESS | 设备地址 | 0 | 0 | 无 |
(1). bmRequestType
值固定为0。主机发送给设备数据,该请求命令的接收者只能是设备。
(2).bRequest
值为0x05。
(3).wValue
总共2字节, 内容即为主机分配给设备的地址。
(4).wIndex
值为0。
(5).wLength
该命令没有要求设备返回任何数据, 因此该字段的值为0。
6、获取描述符请求 GET_DESCRIPTOR
主机获取设备的特定描述符。
字段 | bmRequestType | bRequest | wValue | wIndex | wLength | 数据 |
内容 | 10000000 | GET_DESCRIPTOR | 设备描述符和 描述符编号 | 0或者语言ID | 描述符的长度 | 描述符 |
(1). bmRequestType
固定为10000000,因此数据方向是输 入IN, 即设备发送数据给主机。 而命令接收者是设备。
(2).bRequest
值为0x06。
(3).wValue
总共2字节, 高字节为描述符的类型编号 , 低字节为描述符的字符串索引。这些值都可以在描述符中找到字段值对应。
D15~D8 | D7~D0 |
描述符编号 | 描述符索引值 |
(4).wIndex
获取的是字符串描述符, 则此字段的内容即为与字符串有关的语言ID;
获取的是设备或配置描述符, 则此字段的值为0。
(5).wLength
该字段的值即为要求设备返回的数据大小。
(6).数据
获取的是配置描述符时, 设备将会按顺序返回该配置描述符, 以及该配置支持的所有接口描述符和接口使用的所有端点描述符。
发送顺序:配置描述符、第一个接口描述符、端点描述符、第二个接口描述符(如果存在)、第二个接口的端点描述符
7、设置描述符请求 SET_DESCRIPTOR
修改设备中的有关描述符, 或者增加新的描述符。
字段 | bmRequestType | bRequest | wValue | wIndex | wLength | 数据 |
内容 | 00000000 | SET_DESCRIPTOR | 设备描述符和 描述符编号 | 0或者语言ID | 描述符的长度 | 描述符 |
(1). bmRequestType
固定为00000000,因此数据方向是输出OUT, 即主机发送数据给设备。 而命令接收者是设备。
(2).bRequest
值为0x07。
(3).wValue
总共2字节, 高字节为描述符的类型编号 , 低字节为描述符的字符串索引。这些值都可以在描述符中找到字段值对应。
D15~D8 | D7~D0 |
描述符编号 | 描述符索引值 |
(4).wIndex
获取的是字符串描述符, 则此字段的内容即为与字符串有关的语言ID;
获取的是设备或配置描述符, 则此字段的值为0。
(5).wLength
该字段的值即为要求设备返回的数据大小。
(6).数据
送给设备的新的描述符或修改后的描述符。
8、获取配置请求 GET_CONFIGURATION
主机获取设备当前的配置值。
与GET_DESCRIPTOR 请求的区别 : 该命令仅是获取当前设备的配置值,而配置描述符只能通过 GET_DESCRIPTOR 请求来获取。
字段 | bmRequestType | bRequest | wValue | wIndex | wLength | 数据 |
内容 | 10000000 | GET_CONFIGURATION | 0 | 0 | 1 | 配置值 |
(1). bmRequestType
固定为10000000,因此数据方向是输入IN, 即设备返回数据给主机。 而命令接收者是设备。
(2).bRequest
值为0x08。
(3).wValue
值为0。
(4).wIndex
值为0。
(5).wLength
1个字节,设备返回数据大小。
(6).数据
设备返回给主机的当前配置值,即配置描述符中的bConfigurationValue字段的值。
9、设置配置请求 SET_CONFIGURATION
主机获取设备当前的配置值。
字段 | bmRequestType | bRequest | wValue | wIndex | wLength | 数据 |
内容 | 00000000 | SET_CONFIGURATION | 配置值 | 0 | 0 | 无 |
(1). bmRequestType
固定为00000000,因此数据方向是输出OUT, 即主机发送数据给设备。 而命令接收者是设备。
(2).bRequest
值为0x09。
(3).wValue
值为主机要求设备采用的配置的配置值, 即配置描述符中的bConfigurationValue字段内容。
(4).wIndex
值为0。
(5).wLength
值为0。
10、获取接口请求 GET_INTERFACE
主机获取当前的某个接口的接口描述符编号。
字段 | bmRequestType | bRequest | wValue | wIndex | wLength | 数据 |
内容 | 10000001 | GET_INTERFACE | 0 | 接口 | 1 | 接口描述符编号 |
(1). bmRequestType
值固定为10000001, 说明数据方向为输入IN。 请求命令的接收者为接口。
(2).bRequest
值为0x0A。
(3).wValue
值为0。
(4).wIndex
值为接收该命令的接口的编号, 即接口描述符中的bInterfaceNumber字段的值。
(5).wLength
值为0。
(6).数据
设备返回给主机的与特定接口描述符一一对应的接口描述符编号 , 即接口描述符中的 bAlternat eSetting 字段的值。
11、设置接口请求 SET_INTERFACE
主机可以通过该命令来要求设备用某个接口描述符来描述接口。
字段 | bmRequestType | bRequest | wValue | wIndex | wLength | 数据 |
内容 | 00000001 | SET_INTERFACE | 接口描述符编号 | 接口 | 0 | 无 |
(1). bmRequestType
固定为00000001,因此数据方向是输出OUT, 即主机发送数据给设备。 而命令接收者是接口。
(2).bRequest
值为0x0B。
(3).wValue
值为主机希望设定的接口描述符编号, 即接口描述符中的 bAlternateSetting 字段。
(4).wIndex
值为接收该命令的接口编号, 即接口描述符中的 bInterfaceNumber 字段的值。
(5).wLength
值为0。
12、同步帧请求 SYNCH_FRAME
设备设置和报告一个端点的同步帧。
字段 | bmRequestType | bRequest | wValue | wIndex | wLength | 数据 |
内容 | 10000010 | SYNCH_FRAME | 0 | 端点 | 2 | 帧号 |
(1). bmRequestType
值固定为10000010, 表示数据方向为输入IN。请求命令的接收者为端点。
(2).bRequest
值为0x0C。
(3).wValue
值为0。
(4).wIndex
值为端点号, 即端点描述符中的 bEndpointAddress 字段。
(5).wLength
值为2, 即表明接下来端点返回的数据大小为2字节。
(6).数据
内容即为端点返回的帧号。
如有错误,请及时提出。谢谢!!!