HID鼠标报告描述符(按键/X位移/Y位移/上下滚轮/左右滚轮)解析
/*------------报告描述符Mouse--------------*/
const uint8_t HID_ReportDescriptorMouse[]=
{
0x05,0x01, //81 GLOBAL_USAGE_PAGE(Generic Desktop Controls)
0x09,0x02, //83 LOCAL_USAGE(Mouse)
0xA1,0x01, //85 MAIN_COLLECTION(Applicatior)
0x09,0x01, //89 LOCAL_USAGE(Pointer)
0xA1,0x00, //91 MAIN_COLLECTION(Physical)
0x05,0x09, //93 GLOBAL_USAGE_PAGE(Button)
0x19,0x01, //95 LOCAL_USAGE_MINIMUM(1)
0x29,0x03, //97 LOCAL_USAGE_MAXIMUM(3)
0x15,0x00, //99 GLOBAL_LOGICAL_MINIMUM(0)
0x25,0x01, //101 GLOBAL_LOCAL_MAXIMUM(1)
0x95,0x05, //103 GLOBAL_REPORT_COUNT(5)
0x75,0x01, //105 GLOBAL_REPORT_SIZE(1)
0x81,0x02, //107 MAIN_INPUT(data var absolute NoWrap linear PreferredState NoNullPosition NonVolatile ) Input 18.5
0x95,0x01, //109 GLOBAL_REPORT_COUNT(1)
0x75,0x03, //111 GLOBAL_REPORT_SIZE(3)
0x81,0x01, //113 MAIN_INPUT(const array absolute NoWrap linear PreferredState NoNullPosition NonVolatile ) Input 19.0
0x05,0x01, //115 GLOBAL_USAGE_PAGE(Generic Desktop Controls)
0x09,0x30, //117 LOCAL_USAGE(X)
0x09,0x31, //119 LOCAL_USAGE(Y)
0x09,0x38, //121 LOCAL_USAGE(Wheel)
0x15,0x81, //123 GLOBAL_LOGICAL_MINIMUM(-127)
0x25,0x7F, //125 GLOBAL_LOCAL_MAXIMUM(127)
0x75,0x08, //127 GLOBAL_REPORT_SIZE(8)
0x95,0x03, //129 GLOBAL_REPORT_COUNT(3)
0x81,0x06, //131 MAIN_INPUT(data var relative NoWrap linear PreferredState NoNullPosition NonVolatile ) Input 22.0
0x95, 0x01, // Report Count (1)
0x05, 0x0C, // Usage Page (Consumer)
0x0A, 0x38, 0x02, // Usage (AC Pan)
0x81, 0x06, // Input (Data,Var,Rel,No Wrap,Linear,Preferred State,No Null Position)
0xC0, //133 MAIN_COLLECTION_END
0xC0, //134 MAIN_COLLECTION_END
};
1. 设备类型声明
0x05,0x01, // GLOBAL_USAGE_PAGE(Generic Desktop Controls)
0x09,0x02, // LOCAL_USAGE(Mouse)
0xA1,0x01, // MAIN_COLLECTION(Application)
- 用途页(Usage Page) :
0x01表示设备属于 通用桌面控制 类别。 - 用途(Usage) :
0x02明确设备为 鼠标 。 - 主集合(Collection) :
0xA1,0x01开始一个应用层集合,包含鼠标的所有功能。
2. 指针物理集合
0x09,0x01, // LOCAL_USAGE(Pointer)
0xA1,0x00, // MAIN_COLLECTION(Physical)
- 用途 :
0x01表示这是一个 指针设备 (鼠标的物理输入方式)。 - 物理集合 :
0xA1,0x00定义物理设备的输入行为(如移动、点击)。
3. 按钮定义
0x05,0x09, // GLOBAL_USAGE_PAGE(Button)
0x19,0x01, // LOCAL_USAGE_MINIMUM(Button 1)
0x29,0x03, // LOCAL_USAGE_MAXIMUM(Button 3)
0x15,0x00, // GLOBAL_LOGICAL_MINIMUM(0)
0x25,0x01, // GLOBAL_LOGICAL_MAXIMUM(1)
0x95,0x05, // GLOBAL_REPORT_COUNT(5)
0x75,0x01, // GLOBAL_REPORT_SIZE(1)
0x81,0x02, // MAIN_INPUT(Data,Var,Abs)
- 按钮范围 :支持 3个按钮 (左键、中键、右键),但定义了5个二进制位(实际使用3位,剩余2位可能为填充或保留)。
- 数据类型 :
- 每个按钮占 1 bit (
0x75,0x01),值为0(释放)或1(按下)。 - 共 5 bits (
0x95,0x05)用于按钮状态。
4. 填充位
0x95,0x01, // GLOBAL_REPORT_COUNT(1)
0x75,0x03, // GLOBAL_REPORT_SIZE(3)
0x81,0x01, // MAIN_INPUT(Const,Array,Abs)
- 填充 :剩余 3 bits 定义为常量(未使用的填充位),确保按钮数据对齐到 1字节 。
5. 坐标轴与滚轮
0x05,0x01, // GLOBAL_USAGE_PAGE(Generic Desktop Controls)
0x09,0x30, // LOCAL_USAGE(X)
0x09,0x31, // LOCAL_USAGE(Y)
0x09,0x38, // LOCAL_USAGE(Wheel)
0x15,0x81, // GLOBAL_LOGICAL_MINIMUM(-127)
0x25,0x7F, // GLOBAL_LOGICAL_MAXIMUM(127)
0x75,0x08, // GLOBAL_REPORT_SIZE(8)
0x95,0x03, // GLOBAL_REPORT_COUNT(3)
0x81,0x06, // MAIN_INPUT(Data,Var,Rel)
- X/Y轴和滚轮 :
- 数据范围:
-127到+127(8位有符号数)。 - 相对坐标 (
0x81,0x06中的Rel表示相对移动,非绝对位置)。 - 共 3字节 (X、Y、滚轮各1字节)。
6. 水平滚轮(AC Pan)
0x95, 0x01, // Report Count (1)
0x05, 0x0C, // Usage Page (Consumer)
0x0A, 0x38, 0x02, // Usage (AC Pan)
0x81, 0x06, // Input (Data,Var,Rel)
- 用途页 :
0x0C表示 消费者控制 (如多媒体设备)。 - 用途 :
0x0238对应 水平滚轮 (AC Pan)。 - 数据 :1字节的相对移动值(类似垂直滚轮)。
7. 集合结束
0xC0, // MAIN_COLLECTION_END (Physical)
0xC0, // MAIN_COLLECTION_END (Application)
- 关闭物理集合和应用集合。
报告结构总结:
鼠标的输入报告共 5字节 :
- 字节0 :按钮状态(5 bits) + 填充(3 bits)。字节1 :X轴移动(相对值,
-127~`+127`)。- Bit 0: 左键
- Bit 1: 右键
- Bit 2: 中键
- Bits 3-4: 未使用
- Bits 5-7: 常量填充。
- 字节1 :X轴移动(相对值,
-127~`+127`) - 字节2 :Y轴移动(相对值,
-127~`+127`)。 - 字节3 :垂直滚轮(
-127~`+127`)。 - 字节4 :水平滚轮(
-127~`+127`)。

浙公网安备 33010602011771号