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字节 :

  1. 字节0 :按钮状态(5 bits) + 填充(3 bits)。字节1 :X轴移动(相对值,-127~`+127`)。
    • Bit 0: 左键
    • Bit 1: 右键
    • Bit 2: 中键
    • Bits 3-4: 未使用
    • Bits 5-7: 常量填充。
  2. 字节1 :X轴移动(相对值,-127~`+127`)
  3. 字节2 :Y轴移动(相对值,-127~`+127`)。
  4. 字节3 :垂直滚轮(-127~`+127`)。
  5. 字节4 :水平滚轮(-127~`+127`)。
posted @ 2025-04-28 16:52  oTvTo  阅读(544)  评论(0)    收藏  举报