八、USB标准请求指令

    控制传输是最重要和结构最复杂的一种传输类型。整个USB枚举的过程,都是使用了控制传输。USB枚举过程中的指令,我们称为标准的USB设备请求指令。包括了:

标准USB设备请求指令
请求命令名称bRequest字段值作用
GET_STATUS0用于返回特定接收者的状态信息 , 比如端点、接口等的状态
CLEAR_FEATURE1主机清除或禁用接收者的某些特性
SET_FEATURE3主机用来启用或激活命令接收者的某些特性
SET_ADDRESS5主机给设备分配地址
GET_DESCRIPTOR6主机获取设备的特定描述符
SET_DESCRIPTOR7主机通过该请求命令修改设备中的有关描述符,或者增加新的描述符
GET_CONFIGURATION8主机通过该请求命令得知设备当前的配置值
SET_CONFIGURATION9主机通过该请求命令来指示设备采用要求的配置
GET_INTERFACE10主机通过该命令来获取当前的某个接口的接口描述符编号
SET_INTERFACE11主机可以通过该命令来要求设备用某个接口描述符来描述接口
SYNCH_FRAME12此命令用于设备设置和报告一个端点的同步帧

     由上表可以看出,标准的请求指令主要都是由主机发起,设备端做应答或者相关操作,返回主机所需要的信息,从而让设备挂载在主机系统中。 

1、设备请求命令的格式

    标准 USB 设备请求命令都是主机通过缺省的控制管道利用控制传输来发送的。

标准USB设备请求指令
偏移量01246
请求bmRequestTypebRequestwValuewIndexwLength
大小(byte)11222

(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~D8D7D6~D4D3~D0
保留(值为0)方向保留(值为0)端点号
传输接口索引值内容
D15~D8D7~D0
保留(值为0)接口编号

(5).wLength

    传输的数据大小,共有 2 字节。数据是主机到给设备 , 值便是实际的数据大小; 数据是设备到主机时, wLength 的值是设备能够 发送的最大数据包的大小, 当然, 设备实际发送的数据可以比 wLength 的值小。

2、获取状态请求 GET_STATUS

    用于返回特定接收者的状态信息 , 比如端点、接口等的状态。

GET_STATUS字段内容
字段bmRequestTypebRequestwValuewIndexwLength数据
内容

      10000000

      10000001

      10000010

GET_STATUS0

      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

    清除或禁用接收者的某些特性。

CLEAR_FEATURE内容
字段bmRequestTypebRequestwValuewIndexwLength数据
内容

      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相对应。 主机用来启用或激活命令接收者的某些特性。

SET_FEATURE内容
字段bmRequestTypebRequestwValuewIndexwLength数据
内容

      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
   主机给设备分配地址。

字段bmRequestTypebRequestwValuewIndexwLength数据
内容

      00000000

SET_ADDRESS设备地址

       0

0

(1). bmRequestType

    值固定为0。主机发送给设备数据,该请求命令的接收者只能是设备。

(2).bRequest

    值为0x05。

(3).wValue

    总共2字节, 内容即为主机分配给设备的地址。

(4).wIndex

    值为0。

(5).wLength

    该命令没有要求设备返回任何数据, 因此该字段的值为0。

6、获取描述符请求 GET_DESCRIPTOR

    主机获取设备的特定描述符。

GET_DESCRIPTOR内容
字段bmRequestTypebRequestwValuewIndexwLength数据
内容

      10000000

GET_DESCRIPTOR

设备描述符和

描述符编号

       0或者语言ID

描述符的长度描述符

(1). bmRequestType

    固定为10000000,因此数据方向是输 入IN, 即设备发送数据给主机。 而命令接收者是设备。

(2).bRequest

    值为0x06。

(3).wValue

    总共2字节, 高字节为描述符的类型编号 , 低字节为描述符的字符串索引。这些值都可以在描述符中找到字段值对应。

wVlaue内容
D15~D8D7~D0
描述符编号描述符索引值

(4).wIndex

    获取的是字符串描述符, 则此字段的内容即为与字符串有关的语言ID;
    获取的是设备或配置描述符, 则此字段的值为0。

(5).wLength

    该字段的值即为要求设备返回的数据大小。

(6).数据

    获取的是配置描述符时, 设备将会按顺序返回该配置描述符, 以及该配置支持的所有接口描述符和接口使用的所有端点描述符。
    发送顺序:配置描述符、第一个接口描述符、端点描述符、第二个接口描述符(如果存在)、第二个接口的端点描述符

7、设置描述符请求 SET_DESCRIPTOR

    修改设备中的有关描述符, 或者增加新的描述符。

字段bmRequestTypebRequestwValuewIndexwLength数据
内容

      00000000

SET_DESCRIPTOR

设备描述符和

描述符编号

       0或者语言ID

描述符的长度描述符

(1). bmRequestType

    固定为00000000,因此数据方向是输出OUT, 即主机发送数据给设备。 而命令接收者是设备。

(2).bRequest

    值为0x07。

(3).wValue

    总共2字节, 高字节为描述符的类型编号 , 低字节为描述符的字符串索引。这些值都可以在描述符中找到字段值对应。

wVlaue内容
D15~D8D7~D0
描述符编号描述符索引值

(4).wIndex

    获取的是字符串描述符, 则此字段的内容即为与字符串有关的语言ID;
    获取的是设备或配置描述符, 则此字段的值为0。

(5).wLength

    该字段的值即为要求设备返回的数据大小。

(6).数据

    送给设备的新的描述符或修改后的描述符。

8、获取配置请求 GET_CONFIGURATION

    主机获取设备当前的配置值。
    与GET_DESCRIPTOR 请求的区别 : 该命令仅是获取当前设备的配置值,而配置描述符只能通过 GET_DESCRIPTOR 请求来获取。

GET_CONFIGURATION内容
字段bmRequestTypebRequestwValuewIndexwLength数据
内容

      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

  主机获取设备当前的配置值。

SET_CONFIGURATION内容
字段bmRequestTypebRequestwValuewIndexwLength数据
内容

      00000000

SET_CONFIGURATION

    配置值

      0

0

(1). bmRequestType

    固定为00000000,因此数据方向是输出OUT, 即主机发送数据给设备。 而命令接收者是设备。

(2).bRequest

    值为0x09。

(3).wValue

    值为主机要求设备采用的配置的配置值, 即配置描述符中的bConfigurationValue字段内容。

(4).wIndex

    值为0。

(5).wLength

    值为0。

10、获取接口请求 GET_INTERFACE

  主机获取当前的某个接口的接口描述符编号。

SET_CONFIGURATION内容
字段bmRequestTypebRequestwValuewIndexwLength数据
内容

      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

    主机可以通过该命令来要求设备用某个接口描述符来描述接口。

SET_INTERFACE内容
字段bmRequestTypebRequestwValuewIndexwLength数据
内容

      00000001

SET_INTERFACE

    接口描述符编号

      接口

0

(1). bmRequestType

    固定为00000001,因此数据方向是输出OUT, 即主机发送数据给设备。 而命令接收者是接口。

(2).bRequest

    值为0x0B。

(3).wValue

    值为主机希望设定的接口描述符编号, 即接口描述符中的 bAlternateSetting 字段。

(4).wIndex

    值为接收该命令的接口编号, 即接口描述符中的 bInterfaceNumber 字段的值。

(5).wLength

   值为0。

12、同步帧请求 SYNCH_FRAME

    设备设置和报告一个端点的同步帧。

SYNCH_FRAME内容
字段bmRequestTypebRequestwValuewIndexwLength数据
内容

      10000010

SYNCH_FRAME

    0

      端点

2帧号

(1). bmRequestType

    值固定为10000010, 表示数据方向为输入IN。请求命令的接收者为端点。

(2).bRequest

    值为0x0C。

(3).wValue

    值为0。

(4).wIndex

    值为端点号, 即端点描述符中的 bEndpointAddress 字段。

(5).wLength

   值为2, 即表明接下来端点返回的数据大小为2字节。

(6).数据

    内容即为端点返回的帧号。

 

如有错误,请及时提出。谢谢!!! 

 

 

              上一篇                                                                                下一篇

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值