我们前面说了5种USB的标准描述符,这五种标准描述符,他们对于所有USB设备都是适用的。
当USB设备与主机连接时,主机会通过各种请求(命令)来获取所需要的描述符。
USB从机设备想要给主机发送命令,必须要收到对应的请求,才可以做出对应的响应,发送数据,不同的请求虽 同的 数据和 用 途,但所有USB请求的结构是一样的。都是八个字节。
USB请求结构如下图:
以下是USB定义的八种标准请求:
这上图中的1~5列分别是对应USB请求结构那个图中的各字段数据取值,第六列就是主机请求发送或者设备返回的数据。
标准请求第二列详解如下图:
比如当bRquest为 5 的时候 就是SET_ADDRESS,表示给设备分配地址,
当bRequest = 6 的时候,就是GET_DESCRIPTOR 表示该请求用来获取USB设备的描述符,要记得所有获取标准描述符的请求代码都是GET_DESCRIPTOR,
所以其中的 8 和 10 不是指获取设备的配置描述符和接口描述符 ,他们只是返回设备当前的配置值和备用接口号。
具体要获取哪个标准描述符要在wVlaue字段中进一步给出来,如果是字符串描述符,还会在wIndex中给出具体的LANGID
在USB定义的八种标准请求的表中,bmRequestType,他是具体用途的细分,用来定义请求的性(含传输方向,类型,及接收方),具体如下图
最高位D7表示的是传输方向,
D6和D5都是种类,种类是针对于请求的,其值为0表示USB标准请求.为1就是特定类请求,比如HID设备就有获取报告描述符的请求,他是不属于标准请求的。为2就表示是由厂商专属的驱动程序,特定类产品定义的,上面都是标准请求,所以都为0。
低五位是接收方,它表示请求针对的对象,它可以是设备,设备的接口,接口的端点或者其它。
打个比方,我们使用获取状态(GET_STATUS)的请求时,还需要指定想要设备,接口还是端点的状态?当针对设备的时候,我们的wIndex必须为0,当针对设备的接口时候,wIndex字段就要给出对应的端口号,针对设备的端点时候wIndex就要给出相应的端点号,
举个例子,我们要获取设备描述符,需要发送的请求是啥呢?
第一个bmRequestType = 0x80;
第二个bRequest = 0x06
第三个wVlaue 类型与索引就是表示是哪种描述符 如下图 固定为0x01
第四个wIndex 字符串描述符才有LANGID,所以获取设置描述符,这个位为0,0x00
第五个wLength表示描述符长度,设备描述符固定为18字节(0x12)
这里要注意 wVlaue wIndex wLength 都是双字节,并且是小端模式,低字节在前
所以 第三个 第四个 第五个 分别是 0x00 0x01;0x00 0x00; 0x12 0x00;
相应的请求数据就是 0x80 0x06 0x00 0x01 0x00 0x00 0x12 0x00
简单抓的数据,这个ST官方例程 游戏操作杆的枚举过程 ,软件用的是 Device Monitoring Studio
-