USB主机是如何获取设备描述符

我们前面说了5种USB的标准描述符,这五种标准描述符,他们对于所有USB设备都是适用的。

当USB设备与主机连接时,主机会通过各种请求(命令)来获取所需要的描述符。

USB从机设备想要给主机发送命令,必须要收到对应的请求,才可以做出对应的响应,发送数据,不同的请求虽   同的 数据和 用 途,但所有USB请求的结构是一样的。都是八个字节。

USB请求结构如下图:

d8c16766f4ef46caaa0334f76c45de13.png

以下是USB定义的八种标准请求:

23567891fc1e44f2a2df315f6d868d67.png

176c8df017ea4561bd9d34f0e8feab11.png

这上图中的1~5列分别是对应USB请求结构那个图中的各字段数据取值,第六列就是主机请求发送或者设备返回的数据。

标准请求第二列详解如下图:

e03dc5d343b445f59b82b1f1ca9be917.png

比如当bRquest为 5 的时候 就是SET_ADDRESS,表示给设备分配地址,

当bRequest = 6 的时候,就是GET_DESCRIPTOR 表示该请求用来获取USB设备的描述符,要记得所有获取标准描述符的请求代码都是GET_DESCRIPTOR,

所以其中的 8 和 10 不是指获取设备的配置描述符和接口描述符 ,他们只是返回设备当前的配置值和备用接口号。

具体要获取哪个标准描述符要在wVlaue字段中进一步给出来,如果是字符串描述符,还会在wIndex中给出具体的LANGID

在USB定义的八种标准请求的表中,bmRequestType,他是具体用途的细分,用来定义请求的性(含传输方向,类型,及接收方),具体如下图

cc3aa4af391c4035ba9b354a744ca58c.png

最高位D7表示的是传输方向,

D6和D5都是种类,种类是针对于请求的,其值为0表示USB标准请求.为1就是特定类请求,比如HID设备就有获取报告描述符的请求,他是不属于标准请求的。为2就表示是由厂商专属的驱动程序,特定类产品定义的,上面都是标准请求,所以都为0。

低五位是接收方,它表示请求针对的对象,它可以是设备,设备的接口,接口的端点或者其它。

打个比方,我们使用获取状态(GET_STATUS)的请求时,还需要指定想要设备,接口还是端点的状态?当针对设备的时候,我们的wIndex必须为0,当针对设备的接口时候,wIndex字段就要给出对应的端口号,针对设备的端点时候wIndex就要给出相应的端点号,

举个例子,我们要获取设备描述符,需要发送的请求是啥呢?

858700aff7254a1597086c3f57af8d0e.png

第一个bmRequestType  = 0x80;

第二个bRequest = 0x06

第三个wVlaue 类型与索引就是表示是哪种描述符 如下图 固定为0x01

56d8e028a4f24751851d1fd73e9a4591.png

第四个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

b8354b6da1bd4d1c95db1f3d41a15cfc.png

82e28b9e44434b55a51691f0d7925acf.png

7259a03757fa41bd91a6e028a9838b5c.png

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

-

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

           

 

  • 12
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值