HID描述符属于特定类描述符,不是我们前面介绍的标准描述符。键盘,鼠标就是HID设备,它们如果要将自己枚举成HID设备类,就必须要有对应的HID描述符,报告描述符,以及可选的实体描述符
设备描述符的第四个字段(bDeviceClass)就是表示USB设备所属的设备类,如果是0,那么我们就在接口描述符中进一步定义其具体功能为0x03,设置为HID设备。
获取特定类描述符的请求数据和之前的标准描述符有所不同,但是结构是一样的。
使用HID特定类设备,我们就必须按照特定格式进行数据的传输,所以我们必须要理解报告描述符,报告描述符定义了数据用途与格式。
HID设备只支持控制与中断传输,并且最多可以使用两个端点(除端点0外)。
我们的HID描述就在接口描述符下面,我们之前提过接口描述符中的bInterfaceClass已经被设置成0x03,这就意味他已经把自己枚举成HID设备了,所以在他后面就要给出相应的HID描述符。
如果一个设备只有一个接口描述符,无论它有几个端点描述符,HID描述符都只有一个。
HID描述符的结构如下:
第一个字段(blength) 就是代表HID描述符的长度。
第二个(bDescriptorType) 表示描述符的类型。此处固定为0x21
第三个(bcdHID)表示HID规范版本 我们这里就是0100.
第四个字段(bCountryCode)代表国家代码用来表示本地硬件,我们为0,直接表示不支持。
第五个字段(bNumDescriptors)表示附加特定类描述符的数量,通常情况下至少为1,因为报告描述符是必需的。
接下来的第六个字段(bDescriptorType)和第七个字段(wItemLength)都是描述这个附加特定描述符的类型和长度的,虽然第六个字段(bDescriptorType)和第二个字段(bDescriptorType)名字一样,但是第六个是针对附加特定类描述符的。
第七个字段(wItemLength)就是代表附加特定类描述符的字节长度。
后面的字段是可选的,取决于第五个字段定义了几个附加特定类描述符,我们这里仅仅定义了一个
有一个实体描述符大概简单说一下吧,其实用的基本不多。
实体描述符的结构如下图:
举个例子,就是实体描述符可以暗示右手大拇指用来激活某个按键,应用程序可以使用此信息给设备控制项分配相应的功能。
实体描述符的第一个字段(bDesignatar)标识影响某个控制项的人体部位,例如手,腿,肩
第二个字段(bFlags)就是一个位指定标志
低五位就是表示用户需要用多大的力气才能影响相应的控制项,我们为0的时候就越容易,越大越难,高三位就是进一步修饰身体部位,左手,右手,左脚,右脚。
我们获取HID类描述符的请求结构和标准请求差不多
如果我们要获取设备描述符,需要发送什么数据呢?
第一个字段(bmRequestType)选择0x81 最高位为1 从设备到主机 低五位为00001b表示是针对接口的。
第二个字段是 GET_DESCRIPTOR 0x06
第三个字段(wValue)表示报告描述符 0x00 0x22 (小端)
第四个字节(wIndex)表示接口号应该为0 ,我们这个ST官方例程,游戏操作杆 只有一个接口,而接口编号是从0开始递增的。0x00 0x00 (小端)
第五个字节(wLength)在数组中给出来了 74 就是0x4A
所以数据就是 0x81 0x06 0x00 0x22 0x00 0x00 0x4A 0x00;
其中还有6个HID特定类请求
我们所有的设备都必须支持“获取报告(GET_REPORT)请求”
如果还支持启动功能,则必须支持“获取协议(GET_PROTOCOL)”与“设置协议(SET_PROTOCAOL)”
除了获取报告请求其他都是可选的
我们鼠标 的移动信息就是通过输入报告发送个主机的。
如果主机要控制开发板上的LED状态,就要发送输出报告,
特征报告是设备用来标记自身具有的一些可调整的属性。
我们有些集线器设备每个下行口都支持一个状态指示LED,另外有些没有,这个是否支持LED指示状态就属于一个特征
这两个请求 一个是清除特征,一个是设置特征,就需要指定相应的特征选择符。
下节讲 具体怎么设计报告描述符 这个是描述符里最难得了。