手把手教你解读HID设备描述符:从十六进制到实际功能的完整指南
当你第一次看到HID设备描述符时,可能会被那一串十六进制数字搞得一头雾水。这就像是在看天书——0x05、0x01、0x09这些数字组合到底代表什么?别担心,今天我们就来彻底解密这个看似神秘的语言,让你不仅能读懂它,还能自己动手编写和修改。
HID(Human Interface Device)协议是USB和蓝牙设备中广泛使用的一种标准,从键盘鼠标到游戏手柄,甚至一些专业医疗设备都在使用它。理解HID描述符对于嵌入式开发者来说至关重要,特别是当你需要定制特殊输入设备或调试现有设备时。我们将从最基础的字节解析开始,逐步深入到实际应用案例,最后还会分享一些调试技巧和常见问题解决方案。
1. HID描述符基础:理解字节背后的语言
HID描述符本质上是一种紧凑的二进制语言,用于定义设备的功能和数据结构。每个描述符都由一系列条目(item)组成,而每个条目又由一个前缀字节和可选的数据字节构成。
1.1 条目结构解析
让我们先来看一个最简单的条目示例:{0x05, 0x01}。这个两字节组合实际上包含了两部分信息:
-
第一个字节
0x05是前缀,它又可以分为三个部分:- bType(位4-5):条目类型
- bTag(位6-7):功能标识
- bSize(位0-3):数据字节数
-
第二个字节
0x01是实际数据
用二进制表示,0x05是00000101,我们可以这样分解:
7 6 5 4 3 2 1 0
0 0 0 0 0 1 0 1
│ │ │ └─ bSize (01 = 1字节数据)
│ └─ bType (01 = 全局条目)
└─ bTag (00 = Usage Page)
1.2 条目类型详解
HID协议定义了三种基本条目类型:
| 类型值 | 类型名称 | 作用描述 |
|---|---|---|
| 0 | 主条目 | 定义数据结构(输入/输出/集合等) |
| 1 | 全局条目 | 定义数据属性和范围(大小/数量/极值等) |
| 2 | 局部条目 | 定义具体用途和标识符 |
每种类型下又有多个功能标签(bTag),下面是一些常见标签的速查表:
主条目标签示例:
#define TAG_MAIN_INPUT 0x80
#define TAG_MAIN_OUTPUT 0x90
#define TAG_MAIN_FEATURE 0xB0
#define TAG_MAIN_COLLECTION 0xA0
#define TAG_MAIN_COL_END 0xC0
全局条目标签示例:
#define TAG_GLOBAL_USAGE_PAGE 0x00
#define TAG_GLOBAL_LOG_MIN 0x10
#define TAG_GLOBAL_LOG_MAX 0x20
#define TAG_GLOBAL_RPT_SIZE 0x70
#define TAG_G


402

被折叠的 条评论
为什么被折叠?



