HID描述符

 

 

 

HID描述符属于特定类描述符,不是我们前面介绍的标准描述符。键盘,鼠标就是HID设备,它们如果要将自己枚举成HID设备类,就必须要有对应的HID描述符,报告描述符,以及可选的实体描述符

设备描述符的第四个字段(bDeviceClass)就是表示USB设备所属的设备类,如果是0,那么我们就在接口描述符中进一步定义其具体功能为0x03,设置为HID设备。

e31cb28addfb4d3aa333b84015c0a2ea.png

8371c84414d74c24a3a30c381a064279.png

e57b1f2b86c5474890647f0a41cdcf2d.png

获取特定类描述符的请求数据和之前的标准描述符有所不同,但是结构是一样的。

使用HID特定类设备,我们就必须按照特定格式进行数据的传输,所以我们必须要理解报告描述符,报告描述符定义了数据用途与格式。

HID设备只支持控制与中断传输,并且最多可以使用两个端点(除端点0外)。

6a62706a0f65436584f0d11abe78ba6a.png

我们的HID描述就在接口描述符下面,我们之前提过接口描述符中的bInterfaceClass已经被设置成0x03,这就意味他已经把自己枚举成HID设备了,所以在他后面就要给出相应的HID描述符。

如果一个设备只有一个接口描述符,无论它有几个端点描述符,HID描述符都只有一个。

057e094ee9314a56bf72754f00db79bf.png

HID描述符的结构如下:

7330805cb9c5492cbcf2fccfdfac4d84.png

第一个字段(blength)  就是代表HID描述符的长度。

第二个(bDescriptorType) 表示描述符的类型。此处固定为0x21

043f728f416043a4ad147fc4d86bbbf8.png

第三个(bcdHID)表示HID规范版本  我们这里就是0100.

49ef42dc7023460b9391120acb66c8b5.png

第四个字段(bCountryCode)代表国家代码用来表示本地硬件,我们为0,直接表示不支持。

153beff6a5654a2297d1ac4254b1372b.png

第五个字段(bNumDescriptors)表示附加特定类描述符的数量,通常情况下至少为1,因为报告描述符是必需的。

接下来的第六个字段(bDescriptorType)和第七个字段(wItemLength)都是描述这个附加特定描述符的类型和长度的,虽然第六个字段(bDescriptorType)和第二个字段(bDescriptorType)名字一样,但是第六个是针对附加特定类描述符的。

第七个字段(wItemLength)就是代表附加特定类描述符的字节长度。

后面的字段是可选的,取决于第五个字段定义了几个附加特定类描述符,我们这里仅仅定义了一个

有一个实体描述符大概简单说一下吧,其实用的基本不多。

实体描述符的结构如下图:

7ff2a23774fc409493426f4d822fcb2f.png举个例子,就是实体描述符可以暗示右手大拇指用来激活某个按键,应用程序可以使用此信息给设备控制项分配相应的功能。

实体描述符的第一个字段(bDesignatar)标识影响某个控制项的人体部位,例如手,腿,肩

dbd22adac26c4b80822c6008f7c47e06.png

第二个字段(bFlags)就是一个位指定标志

低五位就是表示用户需要用多大的力气才能影响相应的控制项,我们为0的时候就越容易,越大越难,高三位就是进一步修饰身体部位,左手,右手,左脚,右脚。

be4ce697314f4833a214386593495156.png

 

我们获取HID类描述符的请求结构和标准请求差不多

fb593ffc2044442abcf7b09619a965f7.png

如果我们要获取设备描述符,需要发送什么数据呢?

第一个字段(bmRequestType)选择0x81 最高位为1 从设备到主机 低五位为00001b表示是针对接口的。

第二个字段是 GET_DESCRIPTOR  0x06

第三个字段(wValue)表示报告描述符 0x00 0x22  (小端)

第四个字节(wIndex)表示接口号应该为0 ,我们这个ST官方例程,游戏操作杆 只有一个接口,而接口编号是从0开始递增的。0x00 0x00 (小端)

第五个字节(wLength)在数组中给出来了 74 就是0x4A

3021d1d5919e4c7590122a3cb523dfa3.png

8b68b0e37de74fd5997ce8aeff01a728.png

所以数据就是  0x81 0x06 0x00 0x22  0x00 0x00 0x4A 0x00;   

其中还有6个HID特定类请求

905a7743a142436fb8a4d2059e7bac65.png

12ba62ef3de14082bf8e4f0f6656dd83.png

我们所有的设备都必须支持“获取报告(GET_REPORT)请求”

如果还支持启动功能,则必须支持“获取协议(GET_PROTOCOL)”与“设置协议(SET_PROTOCAOL)”

除了获取报告请求其他都是可选的

我们鼠标 的移动信息就是通过输入报告发送个主机的。

如果主机要控制开发板上的LED状态,就要发送输出报告,

特征报告是设备用来标记自身具有的一些可调整的属性。

我们有些集线器设备每个下行口都支持一个状态指示LED,另外有些没有,这个是否支持LED指示状态就属于一个特征0f4bad84817c412aad4a7c0747237556.png

fe699641e82d4ebe8181ec9541a09e46.png

这两个请求 一个是清除特征,一个是设置特征,就需要指定相应的特征选择符。

 

下节讲 具体怎么设计报告描述符 这个是描述符里最难得了。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 22
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值