HID键盘报告描述符3
2026-08-06
本文链接为:http://www.usbzh.com/article/detail-1783.html ,欢迎转载,转载请附上本文链接。
0x05, 0x01, // Usage Page (Generic Desktop Ctrls)
0x09, 0x06, // Usage (Keyboard)
0xA1, 0x01, // Collection (Application)
0x85, 0x02, // Report ID (2)
0x05, 0x07, // Usage Page (Kbrd/Keypad)
0x19, 0xE0, // Usage Minimum (0xE0)
0x29, 0xE7, // Usage Maximum (0xE7)
0x15, 0x00, // Logical Minimum (0)
0x25, 0x01, // Logical Maximum (1)
0x75, 0x01, // Report Size (1)
0x95, 0x08, // Report Count (8)
0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
0x95, 0x01, // Report Count (1)
0x75, 0x08, // Report Size (8)
0x81, 0x03, // Input (Const,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
0x95, 0x05, // Report Count (5)
0x75, 0x01, // Report Size (1)
0x05, 0x08, // Usage Page (LEDs)
0x19, 0x01, // Usage Minimum (Num Lock)
0x29, 0x05, // Usage Maximum (Kana)
0x91, 0x02, // Output (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile)
0x95, 0x01, // Report Count (1)
0x75, 0x03, // Report Size (3)
0x91, 0x03, // Output (Const,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile)
0x95, 0x06, // Report Count (6)
0x75, 0x08, // Report Size (8)
0x15, 0x00, // Logical Minimum (0)
0x25, 0x65, // Logical Maximum (101)
0x05, 0x07, // Usage Page (Kbrd/Keypad)
0x19, 0x00, // Usage Minimum (0x00)
0x29, 0x65, // Usage Maximum (0x65)
0x81, 0x00, // Input (Data,Array,Abs,No Wrap,Linear,Preferred State,No Null Position)
0xC0, // End Collection
这是一个标准的 USB HID 键盘报告描述符。它定义了一个特定 Report ID 为 2 的键盘,包含 按键状态(修饰键 + 普通键) 和 LED 指示灯控制。
1. 基础信息与集合
0x05, 0x01/0x09, 0x06:定义为“键盘”用途。0x85, 0x02:关键点。此键盘使用 Report ID = 2。这意味着主机与设备通信时,数据包的第一个字节必须是0x02。
2. 第一块数据:修饰键(8 位)—— 输入
0x05, 0x07, 0x19, 0xE0, 0x29, 0xE7, 0x15, 0x00, 0x25, 0x01, 0x75, 0x01, 0x95, 0x08, 0x81, 0x02
- 内容:占用 8 个 bit(1 字节),每个 bit 代表一个修饰键(Ctrl、Shift、Alt、Win 等)。
- 含义:这是一个 位图(Bitmap)。如果按住了左 Ctrl,该字节的第 0 位即为 1。
3. 第二块数据:预留字节(1 字节)—— 输入
0x95, 0x01, 0x75, 0x08, 0x81, 0x03
- 内容:占用 8 个 bit(1 字节)。
- 标志:
0x03(常量),表示这是一个填充占位符,数据始终为 0,主机应忽略该字节。这是为了在数据结构中对齐后续的 LED 字节。
4. 第三块数据:指示灯(LEDs)—— 输出
0x95, 0x05, 0x75, 0x01, 0x05, 0x08, 0x19, 0x01, 0x29, 0x05, 0x91, 0x02
- 方向:
Output(主机 -> 设备)。用于控制键盘上的 Num Lock、Caps Lock 等指示灯。 - 内容:占用 5 个 bit,分别对应 Num Lock、Caps Lock、Scroll Lock、Compose、Kana。
- 注意:由于 Report ID 是
0x02,主机下发的数据包格式为:[0x02][LED状态字节]。
5. 第四块数据:LED 填充位(3 bit)—— 输出
0x95, 0x01, 0x75, 0x03, 0x91, 0x03
- 补齐 3 个 bit,使 LED 部分也凑成 1 字节,方便字节对齐。数据固定为 0。
6. 第五块数据:普通按键(6 个键)—— 输入
0x95, 0x06, 0x75, 0x08, 0x15, 0x00, 0x25, 0x65, 0x05, 0x07, 0x19, 0x00, 0x29, 0x65, 0x81, 0x00
- 内容:占用 6 字节。
- 格式:数组(Array)。每个字节存放一个按键的 Usage ID(值范围 0~101,即 0x00 ~ 0x65)。
- 机制:数组模式下,如果没按任何键,该字节为 0(报告无按键)。如果同时按下多个键,这里最多存储 6 个 同时按下的键(超过 6 个会产生溢出或丢弃)。
数据包结构总览
当你的设备发送 Report ID = 2 的数据给电脑时,数据格式固定为 8 字节:
| 字节偏移 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
|---|---|---|---|---|---|---|---|---|
| 内容 | Report ID | 修饰键 | 保留 | 普通按键 1 | 普通按键 2 | 普通按键 3 | 普通按键 4 | 普通按键 5 |
| 值(示例) | 0x02 |
0x22 |
0x00 |
0x04 |
0x00 |
0x00 |
0x00 |
0x00 |
示例数据含义(如上表):
0x02:标识是这张键盘ReportId。0x22:二进制0010 0010,表示按住了 左 Shift 和 左 Ctrl。0x04:表示按下了 A 键(键盘 Usage ID 0x04)。
潜在限制分析
- 最大按键数量:只支持 6 键无冲(6KRO)。如果同时按下第 7 个键,键盘可能不会上报,或上报错误的键值(取决于固件实现)。
- Usage ID 覆盖范围:只支持 0~101(即标准键盘的 A~Z、数字、F1~F12 等),不支持多媒体键(如音量加减)。
- Boot Protocol 兼容性:这个描述符完全兼容标准的 BIOS 和 USB 协议。如果设备插入只支持 Boot 协议的电脑(如老式 BIOS),可以正常工作。
HID人机交互QQ群:564808376
UAC音频QQ群:218581009
UVC相机QQ群:331552032
BOT&UASP大容量存储QQ群:258159197
STC-USB单片机QQ群:315457461
USB技术交流QQ群2:580684376
USB技术交流QQ群:952873936 USB技术交流3:1031974172
HID报表描述符大全及实例分析





