报告描述符和报告数据结构不正确?

时间:2015-04-22 14:34:36

标签: c++ c windows device-driver hid

我正在处理一个HID报告描述符,我在这里通过修改示例代码来使用它: https://code.msdn.microsoft.com/WudfVhidmini-Sample-b304f83a/sourcecode?fileId=42918&pathId=205101617(该链接打开queue.cpp文件,该文件是我的驱动程序的大部分读/写代码和默认的hid报告描述符)。到目前为止,我在驱动程序中更新的报告描述符是(截至2015年5月11日):

  HID_REPORT_DESCRIPTOR           G_DefaultReportDescriptor[] = {
0x06, 0x00,0xFF,     // (GLOBAL) USAGE_PAGE         0xFF00 Vendor-defined
0x09, 0x01,       // (LOCAL)  USAGE              0xFF000001
0xA1, 0x01,        //(MAIN)   COLLECTION         0x01 Application (Usage=0xFF000001: Page=Vendor-defined, Usage=, Type=)
0x85, 0x0F,         // (GLOBAL) REPORT_ID          0x0F (15)
0x09, 0x01,         // (LOCAL)  USAGE              0xFF000001
0x15, 0x00,        //  (GLOBAL) LOGICAL_MINIMUM    0x00 (0) <-- Redundant: LOGICAL_MINIMUM is already 0
0x26, 0xFF,0x00,      //  (GLOBAL) LOGICAL_MAXIMUM    0x00FF (255)
0x75, 0x08,          //(GLOBAL) REPORT_SIZE        0x08 (8) Number of bits per field
0x96, 0x09, 0x00,        //(GLOBAL) REPORT_COUNT       0x0009 (9) Number of fields
0xB1, 0x00,         // (MAIN)   FEATURE            0x00000000 (9 fields x 8 bits) 0=Data 0=Array 0=Absolute 0=NoWrap 0=Linear 0=PrefState 0=NoNull 0=NonVolatile 0=Bitmap
0x09, 0x01,         // (LOCAL)  USAGE              0xFF000001
0x96, 0x01, 0x00,       // (GLOBAL) REPORT_COUNT       0x0001 (1) Number of fields
0x81, 0x00,        //  (MAIN)   INPUT              0x00000000 (1 field x 8 bits) 0=Data 0=Array 0=Absolute 0=Ignored 0=Ignored 0=PrefState 0=NoNull
0x09, 0x01,          //(LOCAL)  USAGE              0xFF000001
0x96, 0x07, 0x00,       // (GLOBAL) REPORT_COUNT       0x0007 (7) Number of fields
0x91, 0x00,        //  (MAIN)   OUTPUT             0x00000000 (7 fields x 8 bits) 0=Data 0=Array 0=Absolute 0=NoWrap 0=Linear 0=PrefState 0=NoNull 0=NonVolatile 0=Bitmap
0xC0,          // (MAIN)   END_COLLECTION     Application
0x05, 0x01,       // (GLOBAL) USAGE_PAGE         0x0001 Generic Desktop Page
0x09, 0x02,       // (LOCAL)  USAGE              0x00010002 Mouse (CA=Application Collection)
0xA1, 0x01,       // (MAIN)   COLLECTION         0x01 Application (Usage=0x00010002: Page=Generic Desktop Page, Usage=Mouse, Type=CA)
0x09, 0x01,       // (LOCAL)  USAGE              0x00010001 Pointer (CP=Physical Collection)
0xA1, 0x02,       // (MAIN)   COLLECTION         0x02 Logical (Usage=0x00010001: Page=Generic Desktop Page, Usage=Pointer, Type=CP) <-- Warning: USAGE type should be CL (Logical)
0x05, 0x0A,       // (GLOBAL) USAGE_PAGE         0x000A Ordinal Page
0x09, 0x01,       // (LOCAL)  USAGE              0x000A0001 Instance 1 (UM=Usage Modifier)
0x85, 0x01,       // (GLOBAL) REPORT_ID          0x01 (1)
0xA1, 0x00,      //  (MAIN)   COLLECTION         0x00 Physical (Usage=0x000A0001: Page=Ordinal Page, Usage=Instance 1, Type=UM) <-- Warning: USAGE type should be CP (Physical)
0x05, 0x09,      //    (GLOBAL) USAGE_PAGE         0x0009 Button Page
0x19, 0x01,      // (LOCAL)  USAGE_MINIMUM      0x00090001 Button 1 Primary/trigger (MULTI=Selector, On/Off, Momentary, or One Shot)
0x29, 0x03,      //  (LOCAL)  USAGE_MAXIMUM      0x00090003 Button 3 Tertiary (MULTI=Selector, On/Off, Momentary, or One Shot)
0x15, 0x00,     //  (GLOBAL) LOGICAL_MINIMUM    0x00 (0) <-- Redundant: LOGICAL_MINIMUM is already 0
0x25, 0x01,     //  (GLOBAL) LOGICAL_MAXIMUM    0x01 (1)
0x75, 0x01,     //   (GLOBAL) REPORT_SIZE        0x01 (1) Number of bits per field
0x95, 0x03,      //  (GLOBAL) REPORT_COUNT       0x03 (3) Number of fields
0x81, 0x02,        // (MAIN)   INPUT              0x00000002 (3 fields x 1 bit) 0=Data 1=Variable 0=Absolute 0=NoWrap 0=Linear 0=PrefState 0=NoNull 0=NonVolatile 0=Bitmap
0x95, 0x05,      //   (GLOBAL)REPORT_COUNT       0x05 (5) Number of fields
0x81, 0x03,       //   (MAIN)INPUT              0x00000003 (5 fields x 1 bit) 1 = Constant 1 = Variable 0 = Absolute 0 = NoWrap 0 = Linear 0 = PrefState 0 = NoNull 0 = NonVolatile 0 = Bitmap
0x05, 0x01,       //       (GLOBAL)USAGE_PAGE         0x0001 Generic Desktop Page
0x09, 0x30,       //       (LOCAL)USAGE              0x00010030 X(DV = Dynamic Value)
0x09, 0x31,       //       (LOCAL)USAGE              0x00010031 Y(DV = Dynamic Value)
0x15, 0x81,       //      (GLOBAL)LOGICAL_MINIMUM    0x81 (-127)
0x25, 0x7F,       //       (GLOBAL)LOGICAL_MAXIMUM    0x7F (127)
0x75, 0x08,       //       (GLOBAL)REPORT_SIZE        0x08 (8) Number of bits per field
0x95, 0x02,       //       (GLOBAL)REPORT_COUNT       0x02 (2) Number of fields
0x81, 0x06,       //       (MAIN)INPUT              0x00000006 (2 fields x 8 bits) 0 = Data 1 = Variable 1 = Relative 0 = NoWrap 0 = Linear 0 = PrefState 0 = NoNull 0 = NonVolatile 0 = Bitmap
0xC0,  // END_COLLECTION     Physical
0x05, 0x0A,        //   (GLOBAL)USAGE_PAGE         0x000A Ordinal Page
0x09, 0x02,         //   (LOCAL)USAGE              0x000A0002 Instance 2 (UM = Usage Modifier)
0x85, 0x02,        //    (GLOBAL)REPORT_ID          0x02 (2)
0xA1, 0x00,        //    (MAIN)COLLECTION         0x00 Physical(Usage = 0x000A0002: Page = Ordinal Page, Usage = Instance 2, Type = UM) < --Warning: USAGE type should be CP(Physical)
0x05, 0x09,         //     (GLOBAL)USAGE_PAGE         0x0009 Button Page
0x19, 0x01,         //     (LOCAL)USAGE_MINIMUM      0x00090001 Button 1 Primary / trigger(MULTI = Selector, On / Off, Momentary, or One Shot)
0x29, 0x03,         //     (LOCAL)USAGE_MAXIMUM      0x00090003 Button 3 Tertiary(MULTI = Selector, On / Off, Momentary, or One Shot)
0x15, 0x00,       //       (GLOBAL)LOGICAL_MINIMUM    0x00 (0)
0x25, 0x01,       //       (GLOBAL)LOGICAL_MAXIMUM    0x01 (1)
0x75, 0x01,       //       (GLOBAL)REPORT_SIZE        0x01 (1) Number of bits per field
0x95, 0x03,       //       (GLOBAL)REPORT_COUNT       0x03 (3) Number of fields
0x81, 0x02,       //       (MAIN)INPUT              0x00000002 (3 fields x 1 bit) 0 = Data 1 = Variable 0 = Absolute 0 = NoWrap 0 = Linear 0 = PrefState 0 = NoNull 0 = NonVolatile 0 = Bitmap
0x95, 0x05,       //       (GLOBAL)REPORT_COUNT       0x05 (5) Number of fields
0x81, 0x03,       //       (MAIN)INPUT              0x00000003 (5 fields x 1 bit) 1 = Constant 1 = Variable 0 = Absolute 0 = NoWrap 0 = Linear 0 = PrefState 0 = NoNull 0 = NonVolatile 0 = Bitmap
0x05, 0x01,       //       (GLOBAL)USAGE_PAGE         0x0001 Generic Desktop Page
0x09, 0x30,       //       (LOCAL)USAGE              0x00010030 X(DV = Dynamic Value)
0x09, 0x31,       //       (LOCAL)USAGE              0x00010031 Y(DV = Dynamic Value)
0x15, 0x81,       //       (GLOBAL)LOGICAL_MINIMUM    0x81 (-127)
0x25, 0x7F,       //       (GLOBAL)LOGICAL_MAXIMUM    0x7F (127)
0x75, 0x08,       //       (GLOBAL)REPORT_SIZE        0x08 (8) Number of bits per field
0x95, 0x02,       //       (GLOBAL)REPORT_COUNT       0x02 (2) Number of fields
0x81, 0x06,           //   (MAIN)INPUT              0x00000006 (2 fields x 8 bits) 0 = Data 1 = Variable 1 = Relative 0 = NoWrap 0 = Linear 0 = PrefState 0 = NoNull 0 = NonVolatile 0 = Bitmap
0xC0,       // END_COLLECTION     Physical
0x05, 0x0A,         //   (GLOBAL)USAGE_PAGE         0x000A Ordinal Page
0x09, 0x03,         //   (LOCAL)USAGE              0x000A0003 Instance 3 (UM = Usage Modifier)
0x85, 0x03,         //   (GLOBAL)REPORT_ID          0x03 (3)
0xA1, 0x00,           // (MAIN)COLLECTION         0x00 Physical(Usage = 0x000A0003: Page = Ordinal Page, Usage = Instance 3, Type = UM) < --Warning: USAGE type should be CP(Physical)
0x05, 0x09,           //   (GLOBAL)USAGE_PAGE         0x0009 Button Page
0x19, 0x01,           //   (LOCAL)USAGE_MINIMUM      0x00090001 Button 1 Primary / trigger(MULTI = Selector, On / Off, Momentary, or One Shot)
0x29, 0x03,           //   (LOCAL)USAGE_MAXIMUM      0x00090003 Button 3 Tertiary(MULTI = Selector, On / Off, Momentary, or One Shot)
0x15, 0x00,             // (GLOBAL)LOGICAL_MINIMUM    0x00 (0)
0x25, 0x01,             // (GLOBAL)LOGICAL_MAXIMUM    0x01 (1)
0x75, 0x01,             // (GLOBAL)REPORT_SIZE        0x01 (1) Number of bits per field
0x95, 0x03,             // (GLOBAL)REPORT_COUNT       0x03 (3) Number of fields
0x81, 0x02,             // (MAIN)INPUT              0x00000002 (3 fields x 1 bit) 0 = Data 1 = Variable 0 = Absolute 0 = NoWrap 0 = Linear 0 = PrefState 0 = NoNull 0 = NonVolatile 0 = Bitmap
0x95, 0x05,            //  (GLOBAL)REPORT_COUNT       0x05 (5) Number of fields
0x81, 0x03,            //  (MAIN)INPUT              0x00000003 (5 fields x 1 bit) 1 = Constant 1 = Variable 0 = Absolute 0 = NoWrap 0 = Linear 0 = PrefState 0 = NoNull 0 = NonVolatile 0 = Bitmap
0x05, 0x01,            //  (GLOBAL)USAGE_PAGE         0x0001 Generic Desktop Page
0x09, 0x30,            //  (LOCAL)USAGE              0x00010030 X(DV = Dynamic Value)
0x09, 0x31,            //  (LOCAL)USAGE              0x00010031 Y(DV = Dynamic Value)
0x15, 0x81,            //  (GLOBAL)LOGICAL_MINIMUM    0x81 (-127)
0x25, 0x7F,            //  (GLOBAL)LOGICAL_MAXIMUM    0x7F (127)
0x75, 0x08,            //  (GLOBAL)REPORT_SIZE        0x08 (8) Number of bits per field
0x95, 0x02,           //  (GLOBAL)REPORT_COUNT       0x02 (2) Number of fields
0x81, 0x06,           //   (MAIN)INPUT              0x00000006 (2 fields x 8 bits) 0 = Data 1 = Variable 1 = Relative 0 = NoWrap 0 = Linear 0 = PrefState 0 = NoNull 0 = NonVolatile 0 = Bitmap
0xC0,        //   END_COLLECTION     Physical
0x05, 0x0A,           // (GLOBAL)USAGE_PAGE         0x000A Ordinal Page
0x09, 0x04,          //  (LOCAL)USAGE              0x000A0004 Instance 4 (UM = Usage Modifier)
0x85, 0x04,           // (GLOBAL)REPORT_ID          0x04 (4)
0xA1, 0x00,           // (MAIN)COLLECTION         0x00 Physical(Usage = 0x000A0004: Page = Ordinal Page, Usage = Instance 4, Type = UM) < --Warning: USAGE type should be CP(Physical)
0x05, 0x09,             // (GLOBAL)USAGE_PAGE         0x0009 Button Page
0x19, 0x01,            //  (LOCAL)USAGE_MINIMUM      0x00090001 Button 1 Primary / trigger(MULTI = Selector, On / Off, Momentary, or One Shot)
0x29, 0x03,            //  (LOCAL)USAGE_MAXIMUM      0x00090003 Button 3 Tertiary(MULTI = Selector, On / Off, Momentary, or One Shot)
0x15, 0x00,            //  (GLOBAL)LOGICAL_MINIMUM    0x00 (0)
0x25, 0x01,            //  (GLOBAL)LOGICAL_MAXIMUM    0x01 (1)
0x75, 0x01,            //  (GLOBAL)REPORT_SIZE        0x01 (1) Number of bits per field
0x95, 0x03,             // (GLOBAL)REPORT_COUNT       0x03 (3) Number of fields
0x81, 0x02,             // (MAIN)INPUT              0x00000002 (3 fields x 1 bit) 0 = Data 1 = Variable 0 = Absolute 0 = NoWrap 0 = Linear 0 = PrefState 0 = NoNull 0 = NonVolatile 0 = Bitmap
0x95, 0x05,             // (GLOBAL)REPORT_COUNT       0x05 (5) Number of fields
0x81, 0x03,            //  (MAIN)INPUT              0x00000003 (5 fields x 1 bit) 1 = Constant 1 = Variable 0 = Absolute 0 = NoWrap 0 = Linear 0 = PrefState 0 = NoNull 0 = NonVolatile 0 = Bitmap
0x05, 0x01,            //  (GLOBAL)USAGE_PAGE         0x0001 Generic Desktop Page
0x09, 0x30,            //  (LOCAL)USAGE              0x00010030 X(DV = Dynamic Value)
0x09, 0x31,            //  (LOCAL)USAGE              0x00010031 Y(DV = Dynamic Value)
0x15, 0x81,            //  (GLOBAL)LOGICAL_MINIMUM    0x81 (-127)
0x25, 0x7F,            //  (GLOBAL)LOGICAL_MAXIMUM    0x7F (127)
0x75, 0x08,            //  (GLOBAL)REPORT_SIZE        0x08 (8) Number of bits per field
0x95, 0x02,           //   (GLOBAL)REPORT_COUNT       0x02 (2) Number of fields
0x81, 0x06,           //   (MAIN)INPUT              0x00000006 (2 fields x 8 bits) 0 = Data 1 = Variable 1 = Relative 0 = NoWrap 0 = Linear 0 = PrefState 0 = NoNull 0 = NonVolatile 0 = Bitmap
0xC0,        //   END_COLLECTION     Physical
0xC0,  // END_COLLECTION     Logical
0xC0,  // END_COLLECTION     Application
};

这是我当前使用的示例附带的默认报表结构(直到我知道我可以在其中更改的内容):

typedef struct _HIDMINI_INPUT_REPORT {

    UCHAR ReportId;   

    UCHAR Data; 

} HIDMINI_INPUT_REPORT, *PHIDMINI_INPUT_REPORT;

//
// output to device from system
//
typedef struct _HIDMINI_OUTPUT_REPORT {

    UCHAR ReportId;   

    UCHAR Data; 

    USHORT Pad1;

    ULONG Pad2;

} HIDMINI_OUTPUT_REPORT, *PHIDMINI_OUTPUT_REPORT;

我的问题是4折:

  1. 我需要将4个鼠标设备中的数据从控件集合(到达鼠标设备评论开始之前的第一个集合)向下传递到鼠标集合中。我如何编写报告描述符来执行此操作,还是需要代码来执行此操作?

  2. 我的报表结构代码如何从Windows.Devices.HumanInterfaceDevice读取/写入控件结构?

  3. 我应该像vmulti那样发送每个报告描述符,除了一个循环中的所有报告描述符吗?

  4. 如果我想要为多点鼠标SDK或其他多鼠标应用程序模拟/模拟鼠标设备,那么上述内容有多少? (将输入发送到多鼠标应用程序)
  5. 注意:我计划使用https://msdn.microsoft.com/en-us/library/windows/apps/windows.devices.humaninterfacedevice.aspx类函数从上面定义的4个鼠标设备读取/写入,这就是为什么我要解决这个问题的麻烦。但msdn上的类明确指出我无法直接写入鼠标设备。如果是这样,我就不会写在这里。 在案例中出现问题:是的,这是关于将输入注入鼠标集合中,因此我可以让它们与多鼠标应用程序一起使用。以上指向WudfVhidmin-Sample的链接不是我的代码但是我用来写我的驱动程序的样本。

    如果我在第一个收集评论之前取出部分它会创建三个鼠标设备,但就是这样。

1 个答案:

答案 0 :(得分:0)

听起来你想要定义一个报告描述符来容纳四个物理鼠标指针(至少这是你问题的一部分?)。 HID报告描述符规范允许“实例”的概念,所以我认为尝试类似下面的报告描述符可能值得研究。 我不知道它是否会在实践中发挥作用,但它基于HID Usage Tables 1.12 specification中“附录A.5控件的多个实例”中的一个(相当严格的恕我直言)示例。

据我所知,没有办法定义一次实例,并以某种方式生成其中的四个。您似乎必须为每个实例复制报告描述符。

无论如何都值得一试。

以下内容是我编写的一些代码hidrdd编写的,以帮助我解码HID报告描述符:

//--------------------------------------------------------------------------------
// Decoded Application Collection
//--------------------------------------------------------------------------------

/*
06 00FF      (GLOBAL) USAGE_PAGE         0xFF00 Vendor-defined 
09 01        (LOCAL)  USAGE              0xFF000001  
A1 01        (MAIN)   COLLECTION         0x01 Application (Usage=0xFF000001: Page=Vendor-defined, Usage=, Type=)
85 0F          (GLOBAL) REPORT_ID          0x0F (15) 
09 01          (LOCAL)  USAGE              0xFF000001  
15 00          (GLOBAL) LOGICAL_MINIMUM    0x00 (0) <-- Redundant: LOGICAL_MINIMUM is already 0
26 FF00        (GLOBAL) LOGICAL_MAXIMUM    0x00FF (255) 
75 08          (GLOBAL) REPORT_SIZE        0x08 (8) Number of bits per field 
96 0900        (GLOBAL) REPORT_COUNT       0x0009 (9) Number of fields 
B1 00          (MAIN)   FEATURE            0x00000000 (9 fields x 8 bits) 0=Data 0=Array 0=Absolute 0=NoWrap 0=Linear 0=PrefState 0=NoNull 0=NonVolatile 0=Bitmap 
09 01          (LOCAL)  USAGE              0xFF000001  
96 0100        (GLOBAL) REPORT_COUNT       0x0001 (1) Number of fields 
81 00          (MAIN)   INPUT              0x00000000 (1 field x 8 bits) 0=Data 0=Array 0=Absolute 0=Ignored 0=Ignored 0=PrefState 0=NoNull 
09 01          (LOCAL)  USAGE              0xFF000001  
96 0700        (GLOBAL) REPORT_COUNT       0x0007 (7) Number of fields 
91 00          (MAIN)   OUTPUT             0x00000000 (7 fields x 8 bits) 0=Data 0=Array 0=Absolute 0=NoWrap 0=Linear 0=PrefState 0=NoNull 0=NonVolatile 0=Bitmap 
C0           (MAIN)   END_COLLECTION     Application
*/

//--------------------------------------------------------------------------------
// Decoded Application Collection
//--------------------------------------------------------------------------------

/*
05 01        (GLOBAL) USAGE_PAGE         0x0001 Generic Desktop Page 
09 02        (LOCAL)  USAGE              0x00010002 Mouse (CA=Application Collection) 
A1 01        (MAIN)   COLLECTION         0x01 Application (Usage=0x00010002: Page=Generic Desktop Page, Usage=Mouse, Type=CA)
09 01          (LOCAL)  USAGE              0x00010001 Pointer (CP=Physical Collection) 
A1 02          (MAIN)   COLLECTION         0x02 Logical (Usage=0x00010001: Page=Generic Desktop Page, Usage=Pointer, Type=CP) <-- Warning: USAGE type should be CL (Logical)
05 0A            (GLOBAL) USAGE_PAGE         0x000A Ordinal Page 
09 01            (LOCAL)  USAGE              0x000A0001 Instance 1 (UM=Usage Modifier) 
85 01            (GLOBAL) REPORT_ID          0x01 (1) 
A1 00            (MAIN)   COLLECTION         0x00 Physical (Usage=0x000A0001: Page=Ordinal Page, Usage=Instance 1, Type=UM) <-- Warning: USAGE type should be CP (Physical)
05 09              (GLOBAL) USAGE_PAGE         0x0009 Button Page 
19 01              (LOCAL)  USAGE_MINIMUM      0x00090001 Button 1 Primary/trigger (MULTI=Selector, On/Off, Momentary, or One Shot) 
29 03              (LOCAL)  USAGE_MAXIMUM      0x00090003 Button 3 Tertiary (MULTI=Selector, On/Off, Momentary, or One Shot) 
15 00              (GLOBAL) LOGICAL_MINIMUM    0x00 (0) <-- Redundant: LOGICAL_MINIMUM is already 0
25 01              (GLOBAL) LOGICAL_MAXIMUM    0x01 (1) 
75 01              (GLOBAL) REPORT_SIZE        0x01 (1) Number of bits per field 
95 03              (GLOBAL) REPORT_COUNT       0x03 (3) Number of fields 
81 02              (MAIN)   INPUT              0x00000002 (3 fields x 1 bit) 0=Data 1=Variable 0=Absolute 0=NoWrap 0=Linear 0=PrefState 0=NoNull 0=NonVolatile 0=Bitmap 
95 05              (GLOBAL) REPORT_COUNT       0x05 (5) Number of fields 
81 03              (MAIN)   INPUT              0x00000003 (5 fields x 1 bit) 1=Constant 1=Variable 0=Absolute 0=NoWrap 0=Linear 0=PrefState 0=NoNull 0=NonVolatile 0=Bitmap 
05 01              (GLOBAL) USAGE_PAGE         0x0001 Generic Desktop Page 
09 30              (LOCAL)  USAGE              0x00010030 X (DV=Dynamic Value) 
09 31              (LOCAL)  USAGE              0x00010031 Y (DV=Dynamic Value) 
15 81              (GLOBAL) LOGICAL_MINIMUM    0x81 (-127) 
25 7F              (GLOBAL) LOGICAL_MAXIMUM    0x7F (127) 
75 08              (GLOBAL) REPORT_SIZE        0x08 (8) Number of bits per field 
95 02              (GLOBAL) REPORT_COUNT       0x02 (2) Number of fields 
81 06              (MAIN)   INPUT              0x00000006 (2 fields x 8 bits) 0=Data 1=Variable 1=Relative 0=NoWrap 0=Linear 0=PrefState 0=NoNull 0=NonVolatile 0=Bitmap 
C0               (MAIN)   END_COLLECTION     Physical
05 0A            (GLOBAL) USAGE_PAGE         0x000A Ordinal Page 
09 02            (LOCAL)  USAGE              0x000A0002 Instance 2 (UM=Usage Modifier) 
85 02            (GLOBAL) REPORT_ID          0x02 (2) 
A1 00            (MAIN)   COLLECTION         0x00 Physical (Usage=0x000A0002: Page=Ordinal Page, Usage=Instance 2, Type=UM) <-- Warning: USAGE type should be CP (Physical)
05 09              (GLOBAL) USAGE_PAGE         0x0009 Button Page 
19 01              (LOCAL)  USAGE_MINIMUM      0x00090001 Button 1 Primary/trigger (MULTI=Selector, On/Off, Momentary, or One Shot) 
29 03              (LOCAL)  USAGE_MAXIMUM      0x00090003 Button 3 Tertiary (MULTI=Selector, On/Off, Momentary, or One Shot) 
15 00              (GLOBAL) LOGICAL_MINIMUM    0x00 (0) 
25 01              (GLOBAL) LOGICAL_MAXIMUM    0x01 (1) 
75 01              (GLOBAL) REPORT_SIZE        0x01 (1) Number of bits per field 
95 03              (GLOBAL) REPORT_COUNT       0x03 (3) Number of fields 
81 02              (MAIN)   INPUT              0x00000002 (3 fields x 1 bit) 0=Data 1=Variable 0=Absolute 0=NoWrap 0=Linear 0=PrefState 0=NoNull 0=NonVolatile 0=Bitmap 
95 05              (GLOBAL) REPORT_COUNT       0x05 (5) Number of fields 
81 03              (MAIN)   INPUT              0x00000003 (5 fields x 1 bit) 1=Constant 1=Variable 0=Absolute 0=NoWrap 0=Linear 0=PrefState 0=NoNull 0=NonVolatile 0=Bitmap 
05 01              (GLOBAL) USAGE_PAGE         0x0001 Generic Desktop Page 
09 30              (LOCAL)  USAGE              0x00010030 X (DV=Dynamic Value) 
09 31              (LOCAL)  USAGE              0x00010031 Y (DV=Dynamic Value) 
15 81              (GLOBAL) LOGICAL_MINIMUM    0x81 (-127) 
25 7F              (GLOBAL) LOGICAL_MAXIMUM    0x7F (127) 
75 08              (GLOBAL) REPORT_SIZE        0x08 (8) Number of bits per field 
95 02              (GLOBAL) REPORT_COUNT       0x02 (2) Number of fields 
81 06              (MAIN)   INPUT              0x00000006 (2 fields x 8 bits) 0=Data 1=Variable 1=Relative 0=NoWrap 0=Linear 0=PrefState 0=NoNull 0=NonVolatile 0=Bitmap 
C0               (MAIN)   END_COLLECTION     Physical
05 0A            (GLOBAL) USAGE_PAGE         0x000A Ordinal Page 
09 03            (LOCAL)  USAGE              0x000A0003 Instance 3 (UM=Usage Modifier) 
85 03            (GLOBAL) REPORT_ID          0x03 (3) 
A1 00            (MAIN)   COLLECTION         0x00 Physical (Usage=0x000A0003: Page=Ordinal Page, Usage=Instance 3, Type=UM) <-- Warning: USAGE type should be CP (Physical)
05 09              (GLOBAL) USAGE_PAGE         0x0009 Button Page 
19 01              (LOCAL)  USAGE_MINIMUM      0x00090001 Button 1 Primary/trigger (MULTI=Selector, On/Off, Momentary, or One Shot) 
29 03              (LOCAL)  USAGE_MAXIMUM      0x00090003 Button 3 Tertiary (MULTI=Selector, On/Off, Momentary, or One Shot) 
15 00              (GLOBAL) LOGICAL_MINIMUM    0x00 (0) 
25 01              (GLOBAL) LOGICAL_MAXIMUM    0x01 (1) 
75 01              (GLOBAL) REPORT_SIZE        0x01 (1) Number of bits per field 
95 03              (GLOBAL) REPORT_COUNT       0x03 (3) Number of fields 
81 02              (MAIN)   INPUT              0x00000002 (3 fields x 1 bit) 0=Data 1=Variable 0=Absolute 0=NoWrap 0=Linear 0=PrefState 0=NoNull 0=NonVolatile 0=Bitmap 
95 05              (GLOBAL) REPORT_COUNT       0x05 (5) Number of fields 
81 03              (MAIN)   INPUT              0x00000003 (5 fields x 1 bit) 1=Constant 1=Variable 0=Absolute 0=NoWrap 0=Linear 0=PrefState 0=NoNull 0=NonVolatile 0=Bitmap 
05 01              (GLOBAL) USAGE_PAGE         0x0001 Generic Desktop Page 
09 30              (LOCAL)  USAGE              0x00010030 X (DV=Dynamic Value) 
09 31              (LOCAL)  USAGE              0x00010031 Y (DV=Dynamic Value) 
15 81              (GLOBAL) LOGICAL_MINIMUM    0x81 (-127) 
25 7F              (GLOBAL) LOGICAL_MAXIMUM    0x7F (127) 
75 08              (GLOBAL) REPORT_SIZE        0x08 (8) Number of bits per field 
95 02              (GLOBAL) REPORT_COUNT       0x02 (2) Number of fields 
81 06              (MAIN)   INPUT              0x00000006 (2 fields x 8 bits) 0=Data 1=Variable 1=Relative 0=NoWrap 0=Linear 0=PrefState 0=NoNull 0=NonVolatile 0=Bitmap 
C0               (MAIN)   END_COLLECTION     Physical
05 0A            (GLOBAL) USAGE_PAGE         0x000A Ordinal Page 
09 04            (LOCAL)  USAGE              0x000A0004 Instance 4 (UM=Usage Modifier) 
85 04            (GLOBAL) REPORT_ID          0x04 (4) 
A1 00            (MAIN)   COLLECTION         0x00 Physical (Usage=0x000A0004: Page=Ordinal Page, Usage=Instance 4, Type=UM) <-- Warning: USAGE type should be CP (Physical)
05 09              (GLOBAL) USAGE_PAGE         0x0009 Button Page 
19 01              (LOCAL)  USAGE_MINIMUM      0x00090001 Button 1 Primary/trigger (MULTI=Selector, On/Off, Momentary, or One Shot) 
29 03              (LOCAL)  USAGE_MAXIMUM      0x00090003 Button 3 Tertiary (MULTI=Selector, On/Off, Momentary, or One Shot) 
15 00              (GLOBAL) LOGICAL_MINIMUM    0x00 (0) 
25 01              (GLOBAL) LOGICAL_MAXIMUM    0x01 (1) 
75 01              (GLOBAL) REPORT_SIZE        0x01 (1) Number of bits per field 
95 03              (GLOBAL) REPORT_COUNT       0x03 (3) Number of fields 
81 02              (MAIN)   INPUT              0x00000002 (3 fields x 1 bit) 0=Data 1=Variable 0=Absolute 0=NoWrap 0=Linear 0=PrefState 0=NoNull 0=NonVolatile 0=Bitmap 
95 05              (GLOBAL) REPORT_COUNT       0x05 (5) Number of fields 
81 03              (MAIN)   INPUT              0x00000003 (5 fields x 1 bit) 1=Constant 1=Variable 0=Absolute 0=NoWrap 0=Linear 0=PrefState 0=NoNull 0=NonVolatile 0=Bitmap 
05 01              (GLOBAL) USAGE_PAGE         0x0001 Generic Desktop Page 
09 30              (LOCAL)  USAGE              0x00010030 X (DV=Dynamic Value) 
09 31              (LOCAL)  USAGE              0x00010031 Y (DV=Dynamic Value) 
15 81              (GLOBAL) LOGICAL_MINIMUM    0x81 (-127) 
25 7F              (GLOBAL) LOGICAL_MAXIMUM    0x7F (127) 
75 08              (GLOBAL) REPORT_SIZE        0x08 (8) Number of bits per field 
95 02              (GLOBAL) REPORT_COUNT       0x02 (2) Number of fields 
81 06              (MAIN)   INPUT              0x00000006 (2 fields x 8 bits) 0=Data 1=Variable 1=Relative 0=NoWrap 0=Linear 0=PrefState 0=NoNull 0=NonVolatile 0=Bitmap 
C0               (MAIN)   END_COLLECTION     Physical
C0             (MAIN)   END_COLLECTION     Logical
C0           (MAIN)   END_COLLECTION     Application

这应该对应于C声明:

//--------------------------------------------------------------------------------
// Vendor-defined featureReport 0F (Device <-> Host)
//--------------------------------------------------------------------------------

typedef struct
{
  uint8_t  reportId;                                 // Report ID = 0x0F (15)
  uint8_t  VEN_VendorDefined[9];                     // Value = 0 to 255
} featureReport0F_t;


//--------------------------------------------------------------------------------
// Vendor-defined inputReport 0F (Device --> Host)
//--------------------------------------------------------------------------------

typedef struct
{
  uint8_t  reportId;                                 // Report ID = 0x0F (15)
  uint8_t  VEN_VendorDefined;                        // Value = 0 to 255
} inputReport0F_t;


//--------------------------------------------------------------------------------
// Vendor-defined outputReport 0F (Device <-- Host)
//--------------------------------------------------------------------------------

typedef struct
{
  uint8_t  reportId;                                 // Report ID = 0x0F (15)
  uint8_t  VEN_VendorDefined[7];                     // Value = 0 to 255
} outputReport0F_t;


//--------------------------------------------------------------------------------
// Button Page inputReport 01 (Device --> Host)
//--------------------------------------------------------------------------------

typedef struct
{
  uint8_t  reportId;                                 // Report ID = 0x01 (1)
                                                     // Collection: Mouse Pointer Instance1
  uint8_t  BTN_MousePointerInstance1Button1 : 1;     // Usage 0x00090001: Button 1 Primary/trigger, Value = 0 to 1
  uint8_t  BTN_MousePointerInstance1Button2 : 1;     // Usage 0x00090002: Button 2 Secondary, Value = 0 to 1
  uint8_t  BTN_MousePointerInstance1Button3 : 1;     // Usage 0x00090003: Button 3 Tertiary, Value = 0 to 1
  uint8_t  : 1;                                      // Pad
  uint8_t  : 1;                                      // Pad
  uint8_t  : 1;                                      // Pad
  uint8_t  : 1;                                      // Pad
  uint8_t  : 1;                                      // Pad
  int8_t   GD_MousePointerInstance1X;                // Usage 0x00010030: X, Value = -127 to 127
  int8_t   GD_MousePointerInstance1Y;                // Usage 0x00010031: Y, Value = -127 to 127
} inputReport01_t;


//--------------------------------------------------------------------------------
// Button Page inputReport 02 (Device --> Host)
//--------------------------------------------------------------------------------

typedef struct
{
  uint8_t  reportId;                                 // Report ID = 0x02 (2)
                                                     // Collection: Mouse Pointer Instance2
  uint8_t  BTN_MousePointerInstance2Button1 : 1;     // Usage 0x00090001: Button 1 Primary/trigger, Value = 0 to 1
  uint8_t  BTN_MousePointerInstance2Button2 : 1;     // Usage 0x00090002: Button 2 Secondary, Value = 0 to 1
  uint8_t  BTN_MousePointerInstance2Button3 : 1;     // Usage 0x00090003: Button 3 Tertiary, Value = 0 to 1
  uint8_t  : 1;                                      // Pad
  uint8_t  : 1;                                      // Pad
  uint8_t  : 1;                                      // Pad
  uint8_t  : 1;                                      // Pad
  uint8_t  : 1;                                      // Pad
  int8_t   GD_MousePointerInstance2X;                // Usage 0x00010030: X, Value = -127 to 127
  int8_t   GD_MousePointerInstance2Y;                // Usage 0x00010031: Y, Value = -127 to 127
} inputReport02_t;


//--------------------------------------------------------------------------------
// Button Page inputReport 03 (Device --> Host)
//--------------------------------------------------------------------------------

typedef struct
{
  uint8_t  reportId;                                 // Report ID = 0x03 (3)
                                                     // Collection: Mouse Pointer Instance3
  uint8_t  BTN_MousePointerInstance3Button1 : 1;     // Usage 0x00090001: Button 1 Primary/trigger, Value = 0 to 1
  uint8_t  BTN_MousePointerInstance3Button2 : 1;     // Usage 0x00090002: Button 2 Secondary, Value = 0 to 1
  uint8_t  BTN_MousePointerInstance3Button3 : 1;     // Usage 0x00090003: Button 3 Tertiary, Value = 0 to 1
  uint8_t  : 1;                                      // Pad
  uint8_t  : 1;                                      // Pad
  uint8_t  : 1;                                      // Pad
  uint8_t  : 1;                                      // Pad
  uint8_t  : 1;                                      // Pad
  int8_t   GD_MousePointerInstance3X;                // Usage 0x00010030: X, Value = -127 to 127
  int8_t   GD_MousePointerInstance3Y;                // Usage 0x00010031: Y, Value = -127 to 127
} inputReport03_t;


//--------------------------------------------------------------------------------
// Button Page inputReport 04 (Device --> Host)
//--------------------------------------------------------------------------------

typedef struct
{
  uint8_t  reportId;                                 // Report ID = 0x04 (4)
                                                     // Collection: Mouse Pointer Instance4
  uint8_t  BTN_MousePointerInstance4Button1 : 1;     // Usage 0x00090001: Button 1 Primary/trigger, Value = 0 to 1
  uint8_t  BTN_MousePointerInstance4Button2 : 1;     // Usage 0x00090002: Button 2 Secondary, Value = 0 to 1
  uint8_t  BTN_MousePointerInstance4Button3 : 1;     // Usage 0x00090003: Button 3 Tertiary, Value = 0 to 1
  uint8_t  : 1;                                      // Pad
  uint8_t  : 1;                                      // Pad
  uint8_t  : 1;                                      // Pad
  uint8_t  : 1;                                      // Pad
  uint8_t  : 1;                                      // Pad
  int8_t   GD_MousePointerInstance4X;                // Usage 0x00010030: X, Value = -127 to 127
  int8_t   GD_MousePointerInstance4Y;                // Usage 0x00010031: Y, Value = -127 to 127
} inputReport04_t;