HID 设备描述符关系
HID设备连接到USB主机后,主机通过发送Get_Descriptor请求读取HID设备的描述符,了解描述符对了解USB设备是至关重要的。
HID设备的描述符
HID设备除了支持USB设备的5种标准描述符之外,还支持HID设备特有的3种描述符。这些描述符是:
USB标准描述符:设备描述符、配置描述符、接口描述符、端点描述符和字符串描述符。
HID特有的描述符:HID描述符、报表描述符(Report)和实体描述符(Physical)
从描述符的关联关系看,HID描述符是关联于接口。所以如果一个HID设备有2个端点,设备不需要每个端点有一个HID描述符。
从前面的USB描述符可以看出一个规律,描述符的第一、二字节分别是描述符的长度和类型,描述符的类型字段(bDescriptorType)表明描述符的种类,下表列出了不同描述符的类型字段数值。
描述符 | 应用 | 数值类型 |
---|---|---|
设备描述符 | 所有设备必须有,只能一个 | 1 |
配置描述符 | 所有设备必须有,至少一个 | 2 |
字符串描述符 | 可选择 | 3 |
接口描述符 | 每一个接口一个 | 4 |
端点描述符 | 除端点0之外的每个端点一个 | 5 |
设备限定描述符 Device_Qualiffier | 同时支持全速与高速的设备必须有一个 | 6 |
其它速率配置描述符 Other_Speed_Configuration | 7 | |
Interface_power | 8 | |
HID描述符 | HID设备必须有 | 21 |
Hub描述符 | 29 | |
报表描述符 | HID设备必须有 | 22 |
实体描述符 Physical | 可选择的 | 23 |
对于一个HID设备,设备描述符与配置描述符没有HID特定的信息。其设备描述符的bDeviceClass和bDeviceSubClass字段的值为0,接口描述符的bInterfaceClass字段值为03,表示设备的该接口是HID类别。在接口描述符中其他包含HID特定信息的字段还有子类别码(blnterfaceSubClass)与协议码(blnterfaceProtocol字段)。
在接口描述符中子类别码字段等于1表示此设备支持启动接口(Boot Interface)。如果设备有启动接口,即便主机的HID没有加载驱动程序,设备也可以使用。这种情形可能发生在计算机是由DOS直接启动,在启动时观看系统设置画面或使用Wndows的安全模式时。
含有启动接口的键盘或鼠标可以使用BIOS或许多主机支持的默认简单协议。HID规范定义了键盘与鼠标的启动接口协议。如果设备没有启动接口,并且接口描述符中协议码字段是1,表示设备支持键盘接口,协议码字段是2,表示支持鼠标接口。接口描述符中协议码字段是0,表示设备不支持启动协议。
在 HID Usage Tables规范中定义了键盘与鼠标的启动描述符(Boot Descriptor)。BIOS不需要从设备中读取描述符,因为它知道启动协议,并且假设设备支持启动协议。所以要启动的设备不需要在固件内包含启动接口描述符,它只要在主机尚未要求在报表描述符中的定义协议时支持启动协议即可。在操作系统加载HlD驱动程序后会使用Set_Protocol请求,将设备由启动协议转换成报表协议。