第五篇 USB设备枚举过程(5)

上一篇:https://blog.csdn.net/qq_40088639/article/details/109768241

九、设置配置请求

经过上面的步骤之后,主机下发了设置配置的请求。回顾一下,上文中配置描述符的结构以及在程序代码中的定义,需要注意的是配置描述符的bConfigurationValue这个域。一个USB设备可以有很多个配置。bConfigurationValue就是每个配置的标识!主机请求设置配置的时候,会下发一个配置值,如果某个配置的bConfigurationValue和主机请求的配置值相匹配,就表示该配置被**,USB设备就使用这个配置。(由主机决定,设备使用哪个配置)

设置配置请求是一个输出请求,根据所请求的配置值,使能相应的端点。设备收到之后,返回一个0长度的状态数据包。设备收到非0的配置值之后,才会使能非0端点。否则会禁用非零端点。

协议分析仪:

第五篇 USB设备枚举过程(5)

设置配置请求也是一个标准请求,接下来分析一下它的结构以及各个字段的含义,再结合协议分析仪捕获的数据就能明白整个设置配置请求的过程。

1. SET_CONFIGURATION请求

命令结构

bmRequestType

bRequest

wValue(2 Byte)

wIndex(2 Byte)

wLength(2 Byte)

数据过程

0x00

0x09

 

0x0000

0x0000

没有

说明:

(1)在设置配置请求中,wValue的第一字节(低字节)为配置的值。当该值与某配置描述符中的配置编号一致时(相等时),表示选中的是该配置,接下来设备就使用这个配置。

结合上面协议分析仪里面的数据,wValue=0x0001。也就是说,主机告诉设备,使用的是编号为1的配置。返回配置描述符的定义,在程序中,就定义了一个配置描述符,并且该配置的编号刚好是1。------->主机请求的配置是存在的。实际上,主机请求的配置编号都是存在的,因为按照先后逻辑顺序,设备已经事先上传了配置描述符,主机通过解析数据就可以知道,当前设备总共设定了多少个配置。

配置描述符的定义:

第五篇 USB设备枚举过程(5)

 

十、设置接口请求

设置接口请求和设置设置配置请求的结构很相似。

1. 设置接口请求的结构

bmRequestType

bRequest

wValue(2 Byte)

wIndex(2 Byte)

wLength(2 Byte)

数据过程

0x01

0x0b 

 

0x0002

0x0000

没有

说明:

(1)在设置接口请求中,wValue的第一字节(低字节)为接口的编号值。当该值与某接口的编号一致时(相等时),表示选中的是该接口。所以,这里也得结合接口描述符的定义进行分析。

协议分析仪:

第五篇 USB设备枚举过程(5)

由此可知,wValue=0x0000  那么,编号为0的接口描述符是否存在?返回接口描述符定义处:

第五篇 USB设备枚举过程(5)

发现数值是对应的。

串口跟踪打印:

第五篇 USB设备枚举过程(5)

 

十一、重复请求两次产品字符串描述符

每次请求产品字符串描述符又分为两个过程(两个事务):

(1)请求获得字符串描述符,希望设备返回4字节[字符串描述符的前4个字节!]。

(2)第二次,再次请求,这次是根据第一次获取到的信息,请求返回22字节的产品字符串描述符。

协议分析仪:

第五篇 USB设备枚举过程(5)

串口打印跟踪:

第五篇 USB设备枚举过程(5)

 

十二、Set_Idle请求

接下来,在总线上可以看到,主机发了一个bRequest为0XA0的类输出请求。这就需要去查阅一下HID协议文档,HID协议规定了一些类请求。比如:Set_Idle、Get_Idle、Set_Report、Get_Report等,其中编码为0XA0代表是一个Set_Idle请求,关于HID这部分,在枚举阶段就先作了解(上文讲到的HID描述符、报告描述符等也是属于HID协议的内容),后面会单独解析各种USB类(HID类、音频类、视频类、大容量类……)。

这个请求是什么意思呢?这个请求告诉设备,在没有新的事件发生时,不要从中断端点返回数据。那么对于一个普通的HID设备,比如是鼠标。收到这个请求,可以什么都不用干,直接返回一个0长度的状态数据包即可。

协议分析仪:

第五篇 USB设备枚举过程(5)

串口跟踪打印:

第五篇 USB设备枚举过程(5)

 

十三、获取HID报告描述符

接着,主机又发送了一个获取描述符的请求,从串口打印中,解析指令后可知:

(1)这是一个获取报告描述符的请求(描述符代码为wValue=0x2200 ---> HID协议中有规定,这是一个报告描述符类型)

(2)这个请求的接收者是接口(bmRequestType的D4~D0的位值为1,也就是说bmRequestType=0x81)

串口跟踪打印如下:

第五篇 USB设备枚举过程(5)

协议分析仪:

第五篇 USB设备枚举过程(5)

接下来简述一下什么是报告和报告描述符,以及报告描述符如何构造。

 

1. 报告描述符

1.1 什么是报告

USB HID设备是通过报告来传送数据的。报告分为:输入报告 输出报告

输入报告:USB设备发给主机的。比如:USB鼠标将移动和点击等信息返回给电脑。

输出报告:是主机发送数据给USB设备的。比如:数字键盘锁定灯和大写字母锁定灯。即:输入和输出,数据流的方向是相对主机而言的。报告是一个数据包,数据包里面包含着所要传送的数据。

1.2 报告的传输方式

对于输入报告,则一定是通过中断输入端点输入的。

对于输出报告,如果没有中断输出端点时,就是用控制输出端点0输出;如果有中断输出端点,则通过中断输出端点发出数据包

1.3 报告描述符的结构

报告描述符描述了一个报告以及报告里面的数据。通过报告描述符,USB Host可以分析出报告里面数据所表示的意思,它通过控制输入端点0返回。那么主机如何获取报告描述符?同样的,主机要想获得任何类型的描述符,都是通过发指令到从机,从机相应而获取到的,所以说USB协议是数据交换协议。即主机发送获取报告描述符指令,从而获取报告描述符,这里需要注意的是,该指令是发送到接口的,并不是发送到设备。

一个报告描述符可以描述多个报告,不同的报告是通过ID来区分的。报告ID位于报告的最前面,也就是第一个字节。如果报告描述符中没有规定报告ID字段的时候,直接就是数据作为开始。报告描述符可以通过HID Descriptor tool来生成。

报告描述符的结构比较特殊,跟前面遇到的描述符结构不同。它没有各种域数据,而是由一个个条目(item)来组成。通常,在定义报告描述符时,一个条目占一行,看起来可读性就清晰一些。

HID中定义了两种条目,短条目和长条目,长条目很少使用。具体可查看HID协议和HID用途表。

1.4 报告描述符在代码中的定义

第五篇 USB设备枚举过程(5)

串口打印跟踪,主机的获得报告描述符请求(设备返回HID报告描述符):

第五篇 USB设备枚举过程(5)

详细、完整的报告描述符资料可以参考USB HID协议和USB用途表的文档,里面有大量的实例。

 

下一篇:https://blog.csdn.net/qq_40088639/article/details/109772393