当前位置:网站首页>USB 枚举过程中8 字节标准请求解析

USB 枚举过程中8 字节标准请求解析

2022-08-11 05:25:00 Emily_rong_2021

请求
请求和描述符一样,有标准的设备请求,而对于不同类的设备,又有自己特定的请求。先介绍标准的设备请求,对于特殊的请求,介绍每个不同的类设备时,再做解析。

1. 标准设备请求的数据结构
USB协议中规定,标准请求的长度为8个字节。在设备枚举过程中,Host会下发一系列的标准请求,设备端需要去解析这些标准请求(SETUP事务),并作出正确响应,设备才能成功枚举。成功枚举之后,才能调用相关接口进行数据通信。

8字节的标准请求结构如下:

每个域的解析如下表

 对于标准的请求,D6~D5 = 00,USB协议规定了11个标准请求,请求码(bRequest)如下表。

标准请求代码表

实例:

  • 请求数据为8个字节HEX:80 06 00 01 00 00 12 00 ==> 获取设备描述符

注:这个阶段的设备地址(address)用的0,当然默认端点(endpoint)也是0。

第一个字节0x80拆分可以得到,这是一个主机发给设备(bit0~bit4)的一个标准(bit5~bit6)的请求命令,请求的结果是要求设备给Host返回(bit7 == 1)。

第二个字节0x06查看表9-4可以得到这是一个GET_DESCRIPTOR,即获取描述符 的请求。

第三四自己传的是0x0100 ,查看描述符表,得知高字节表示描述符类型,01表示设备,02表示配置;低字节表示索引。比如设备有多个配置,那需要读取不同配置的时候就通过低字节。或者一个配置下有多个接口,通过索引选择不同的接口。所以这里高字节的1代表 设备,低字节在本设备没用到。
3.3.1 分配地址

  • 数据为HEX:00 05 03 00 00 00 00 00 ==> 主机给设备分配地址

注:这个阶段的设备地址(address)用的0,当然默认端点(endpoint)也是0。

第一个字节0x0,这是一个主机发给设备(bit0~bit4)的一个标准(bit5~bit6)的请求命令,请求的结果是主机和设备发送(bit7 == 0)信息。

第二个字节0x05,从table 9-4可以看到,SET_ADDRESS,是主机给从机设置地址。

第三四个字节合起来是0x03,对照标准的设备请求表,可以知道,这是就是主机给设备分配的设备地址3。
 

3.4.1 建立阶段的请求分析 

  • 请求数据为8个字节HEX:80 06 00 01 00 00 12 00  ==> 获取设备描述符的请求

3.5.1 建立阶段的请求分析

  • 请求数据为8个字节HEX:80 06 00 02 00 00 09 00 == > 获取配置描述符的请求

第一个字节0x80拆分可以得到,这是一个主机发给设备(bit0~bit4)的一个标准(bit5~bit6)的请求命令,请求的结果是要求设备给Host返回(bit7 == 1)。

第二个字节0x06查看表9-4可以得到这是一个GET_DESCRIPTOR,即获取描述符 的请求。

第三四字节传的是0x0100 ,查看描述符表,得知高字节表示描述符类型,01表示设备02表示配置;低字节表示索引。比如设备有多个配置,那需要读取不同配置的时候就通过低字节。或者一个配置下有多个接口,通过索引选择不同的接口。所以这里高字节的2代表配置,低字节在本设备没用到。

第四五字节为0x0,这个参数如果为0,则不关心;如果为非零,则表示Langurage ID,每一位都有对应的意义。


设备类描述符+配置描述符+接口描述符+端点描述符+厂商定义的描述符的总字节长度为34个字节

  •  请求数据为8个字节HEX:80 06 00 03 00 00 FF 00  ==> 获取字符串描述符的请求

第三四字节传的是0x0300 ,查看9-5描述符表,得知高字节表示描述符类型,01表示设备,02表示配置,3表示字符串;低字节表示索引。比如设备有多个配置,那需要读取不同配置的时候就通过低字节。或者一个配置下有多个接口,通过索引选择不同的接口。所以这里高字节的3表示字符串,低字节为索引0。

第六七字节为0xFF,即代表返回的数据不应该多于255个字节。

请求数据为8个字节HEX:80 06 02 03 09 04 FF 00  ==> 获取字符串描述符的请求,索引值为2

第三四字节传的是0x0302 。所以这里高字节的3表示字符串,低字节为索引2

第四五字节为0x0409,当这个请求的是字符串描述符时,则表示Langurage ID,0x0409表示美式英语。

第六七字节为0xFF,即代表返回的数据不应该多于255个字节。

  • 请求数据为8个字节HEX:80 06 01 03 09 04 FF 00  ==> 获取字符串描述符的请求,索引值为1
  • 请求数据为8个字节HEX:00 09 01 00 00 00 00 00 ==> 设置配置描述符的请求

第一个字节0x80拆分可以得到,这是一个主机发给设备(bit0~bit4)的一个标准(bit5~bit6)的请求命令,请求的结果是主机给设备发送信息(bit7 == 0)。

第二个字节0x09查看表9-4可以得到这是一个SET_CONFIGURATION,即设置配置。

第三四字节传的是0x1,查看9-3标准请求表,得知这里1就是配置的值。

第四五字节为0x0,在设置配置里,无意义。

第六七字节为0x0,在设置配置里,无意义。

  • 请求数据为8个字节HEX: 21 0A 00 00 00 00 00 00 

第一个字节0x21拆分可以得到,这是一个主机发给接口(bit0~bit4)的一个类(bit5~bit6)的特定类请求命令,请求的结果是主机给接口发送类命令(bit7 == 0)

根据手册:0A表示Set_Idle功能,Set_Idle请求使中断输入管道上的特定报告静默,直到发生新事件或经过指定的时间。

 

参考:

(5条消息) 从零开始学USB(十七、USB的枚举)_To_run_away的博客-CSDN博客

原网站

版权声明
本文为[Emily_rong_2021]所创,转载请带上原文链接,感谢
https://blog.csdn.net/Emily_rong_2021/article/details/122423478