【问题标题】:USB touch screen HID descriptor for 2 contact identifier用于 2 个联系人标识符的 USB 触摸屏 HID 描述符
【发布时间】:2018-12-13 22:57:54
【问题描述】:

目前我正在研究 STM32f4 板上的 USB 触摸屏 HID 描述符(自定义 HID 描述符)。 为此,我为单接触标识符(单指触摸)实现了一个 HID 描述符,这对我有用。但是,我的要求是多点触摸手指。 所以,我正在将我的单点触控 HID 修改为多点触控 HID。在这种情况下,我为第二根手指添加了一些报告。

这是我的 2 个手指的报告描述符...

0x05, 0x0D,        // Usage Page (Digitizer)
0x09, 0x04,        // Usage (Touch Screen)
0xA1, 0x01,        // Collection (Application)
0x09, 0x55,        //   Usage (0x55)
0x25, 0x03,        //   Logical Maximum (3)
0xB1, 0x02,        //   Feature (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile)
0x09, 0x54,        //   Usage (0x54)
0x95, 0x01,        //   Report Count (1)
0x75, 0x08,        //   Report Size (8)
0x81, 0x02,        //   Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
0x09, 0x22,        //   Usage (Finger)
0xA1, 0x02,        //   Collection (Logical)
0x09, 0x51,        //     Usage (0x51)
0x75, 0x08,        //     Report Size (8)
0x95, 0x01,        //     Report Count (1)
0x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
0x09, 0x42,        //     Usage (Tip Switch)
0x09, 0x32,        //     Usage (In Range)
0x15, 0x00,        //     Logical Minimum (0)
0x25, 0x01,        //     Logical Maximum (1)
0x75, 0x01,        //     Report Size (1)
0x95, 0x02,        //     Report Count (2)
0x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
0x95, 0x06,        //     Report Count (6)
0x81, 0x03,        //     Input (Const,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
0x05, 0x01,        //     Usage Page (Generic Desktop Ctrls)
0x09, 0x30,        //     Usage (X)
0x09, 0x31,        //     Usage (Y)
0x16, 0x00, 0x00,  //     Logical Minimum (0)
0x26, 0x10, 0x27,  //     Logical Maximum (10000)
0x36, 0x00, 0x00,  //     Physical Minimum (0)
0x46, 0x10, 0x27,  //     Physical Maximum (10000)
0x66, 0x00, 0x00,  //     Unit (None)
0x75, 0x10,        //     Report Size (16)
0x95, 0x02,        //     Report Count (2)
0x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
0xC0,              //   End Collection
0x05, 0x0D,        //   Usage Page (Digitizer)
0x09, 0x22,        //   Usage (Finger)
0xA1, 0x02,        //   Collection (Logical)
0x05, 0x0D,        //     Usage Page (Digitizer) 
0x09, 0x51,        //     Usage (0x51)
0x75, 0x08,        //     Report Size (8)
0x95, 0x01,        //     Report Count (1)
0x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
0x09, 0x42,        //     Usage (Tip Switch)
0x09, 0x32,        //     Usage (In Range)
0x15, 0x00,        //     Logical Minimum (0)
0x25, 0x01,        //     Logical Maximum (1)
0x75, 0x01,        //     Report Size (1)
0x95, 0x02,        //     Report Count (2)
0x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
0x95, 0x06,        //     Report Count (6)
0x81, 0x03,        //     Input (Const,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
0x05, 0x01,        //     Usage Page (Generic Desktop Ctrls)
0x09, 0x30,        //     Usage (X)
0x09, 0x31,        //     Usage (Y)
0x16, 0x00, 0x00,  //     Logical Minimum (0) 
0x26, 0x10, 0x27,  //     Logical Maximum (10000)
0x66, 0x00, 0x00,  //     Unit (None)
0x75, 0x10,        //     Report Size (16)
0x95, 0x02,        //     Report Count (2)
0x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
0xC0,              //   End Collection
0xC0,              // End Collection
我正在 Windows 10 touch lapy 中对此进行测试,我有 USBlyzer 来分析从电路板发送到 PC 的数据。

在分析仪中,我变得像这样.. enter image description here

在分析中,它显示了手指 1,2 的相同数据,即使我发送不同的数据。

我在这里附上我如何发送数据..

            my_buff[0] = 0x02;//contact count 
            
            my_buff[1] = 0x01;//contact identifier(finger1)
            my_buff[2] = 0x03;//tip switch and in range
            my_buff[3] = 0x88;//x axis lsb
            my_buff[4] = 0x13;//x axis msb
            my_buff[5] = 0x88;//y axis lsb
            my_buff[6] = 0x13;//y axis msb
            
            my_buff[7] = 0x02;//contact identifier(finger2)
            my_buff[8] = 0x03;//tip switch and in range
            my_buff[9] = 0x70;//x axis lsb
            my_buff[10]= 0x12;//x axis msb
            my_buff[11] = 0x70;//y axis lsb
            my_buff[12] = 0x12;//y axis msb
            
            USBD_HID_SendReport (&USB_OTG_dev, 
                                 my_buff,
                                     13);

在这种情况下,我什至没有得到单点触摸。但是,如果我禁用手指 2 中的尖端开关,那么手指 1 触摸工作。

但是如果我禁用手指 1 尖端开关,并启用手指 2 尖端开关,那么即使我没有得到单点触摸。

所以,请帮助我哪里出错了。

我不知道问题是由于报告描述符还是其他原因..

谢谢

【问题讨论】:

    标签: c multi-touch hid


    【解决方案1】:

    报告描述符有很多不正确的地方,可能会混淆主机 HID 解析器(或导致跨主机操作系统的不同行为),因此我建议首先修复这些问题,包括:

    • 一个空的功能报告定义(这可能是真正的问题)
    • 未指定逻辑最小值
    • 报告太小,无法容纳逻辑最大值
    • 在定义后续字段之前忘记重置物理单位(您可以为此使用 PUSH 和 POP)

    当前的报告描述符将被解析为:

    //--------------------------------------------------------------------------------
    // Decoded Application Collection
    //--------------------------------------------------------------------------------
    
    /*
    05 0D        (GLOBAL) USAGE_PAGE         0x000D Digitizer Device Page 
    09 04        (LOCAL)  USAGE              0x000D0004 Touch Screen (Application Collection)  
    A1 01        (MAIN)   COLLECTION         0x01 Application (Usage=0x000D0004: Page=Digitizer Device Page, Usage=Touch Screen, Type=Application Collection)
    09 55          (LOCAL)  USAGE              0x000D0055 Contact Count Maximum (Static Value)  
    25 03          (GLOBAL) LOGICAL_MAXIMUM    0x03 (3)  
    B1 02          (MAIN)   FEATURE            0x00000002 ( fields x  bits) 0=Data 1=Variable 0=Absolute 0=NoWrap 0=Linear 0=PrefState 0=NoNull 0=NonVolatile 0=Bitmap  <-- Error: REPORT_SIZE is undefined <-- Error: REPORT_COUNT is undefined <-- Error: LOGICAL_MINIMUM is undefined
    09 54          (LOCAL)  USAGE              0x000D0054 Contact Count (Dynamic Value)  
    95 01          (GLOBAL) REPORT_COUNT       0x01 (1) Number of fields  
    75 08          (GLOBAL) REPORT_SIZE        0x08 (8) Number of bits per field  
    81 02          (MAIN)   INPUT              0x00000002 (1 field x 8 bits) 0=Data 1=Variable 0=Absolute 0=NoWrap 0=Linear 0=PrefState 0=NoNull 0=NonVolatile 0=Bitmap  <-- Error: LOGICAL_MINIMUM is undefined
    09 22          (LOCAL)  USAGE              0x000D0022 Finger (Logical Collection)  
    A1 02          (MAIN)   COLLECTION         0x02 Logical (Usage=0x000D0022: Page=Digitizer Device Page, Usage=Finger, Type=Logical Collection)
    09 51            (LOCAL)  USAGE              0x000D0051 Contact Identifier (Dynamic Value)  
    75 08            (GLOBAL) REPORT_SIZE        0x08 (8) Number of bits per field <-- Redundant: REPORT_SIZE is already 8 
    95 01            (GLOBAL) REPORT_COUNT       0x01 (1) Number of fields <-- Redundant: REPORT_COUNT is already 1 
    81 02            (MAIN)   INPUT              0x00000002 (1 field x 8 bits) 0=Data 1=Variable 0=Absolute 0=NoWrap 0=Linear 0=PrefState 0=NoNull 0=NonVolatile 0=Bitmap  <-- Error: LOGICAL_MINIMUM is undefined
    09 42            (LOCAL)  USAGE              0x000D0042 Tip Switch (Momentary Control)  
    09 32            (LOCAL)  USAGE              0x000D0032 In Range (Momentary Control)  
    15 00            (GLOBAL) LOGICAL_MINIMUM    0x00 (0)  <-- Info: Consider replacing 15 00 with 14
    25 01            (GLOBAL) LOGICAL_MAXIMUM    0x01 (1)  
    75 01            (GLOBAL) REPORT_SIZE        0x01 (1) Number of bits per field  
    95 02            (GLOBAL) REPORT_COUNT       0x02 (2) Number of fields  
    81 02            (MAIN)   INPUT              0x00000002 (2 fields x 1 bit) 0=Data 1=Variable 0=Absolute 0=NoWrap 0=Linear 0=PrefState 0=NoNull 0=NonVolatile 0=Bitmap 
    95 06            (GLOBAL) REPORT_COUNT       0x06 (6) Number of fields  
    81 03            (MAIN)   INPUT              0x00000003 (6 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 (Dynamic Value)  
    09 31            (LOCAL)  USAGE              0x00010031 Y (Dynamic Value)  
    16 0000          (GLOBAL) LOGICAL_MINIMUM    0x0000 (0) <-- Redundant: LOGICAL_MINIMUM is already 0 <-- Info: Consider replacing 16 0000 with 14
    26 1027          (GLOBAL) LOGICAL_MAXIMUM    0x2710 (10000)  
    36 0000          (GLOBAL) PHYSICAL_MINIMUM   0x0000 (0)  <-- Info: Consider replacing 36 0000 with 34
    46 1027          (GLOBAL) PHYSICAL_MAXIMUM   0x2710 (10000)  
    66 0000          (GLOBAL) UNIT               0x0000 No unit (0=None) <-- Redundant: UNIT is already 0x00000000 <-- Info: Consider replacing 66 0000 with 64
    75 10            (GLOBAL) REPORT_SIZE        0x10 (16) Number of bits per field  
    95 02            (GLOBAL) REPORT_COUNT       0x02 (2) Number of fields  
    81 02            (MAIN)   INPUT              0x00000002 (2 fields x 16 bits) 0=Data 1=Variable 0=Absolute 0=NoWrap 0=Linear 0=PrefState 0=NoNull 0=NonVolatile 0=Bitmap 
    C0             (MAIN)   END_COLLECTION     Logical  <-- Warning: Physical units are still in effect PHYSICAL(MIN=0,MAX=10000) UNIT(0x,EXP=0)
    05 0D          (GLOBAL) USAGE_PAGE         0x000D Digitizer Device Page 
    09 22          (LOCAL)  USAGE              0x000D0022 Finger (Logical Collection)  
    A1 02          (MAIN)   COLLECTION         0x02 Logical (Usage=0x000D0022: Page=Digitizer Device Page, Usage=Finger, Type=Logical Collection)
    05 0D            (GLOBAL) USAGE_PAGE         0x000D Digitizer Device Page <-- Redundant: USAGE_PAGE is already 0x000D
    09 51            (LOCAL)  USAGE              0x000D0051 Contact Identifier (Dynamic Value)  
    75 08            (GLOBAL) REPORT_SIZE        0x08 (8) Number of bits per field  
    95 01            (GLOBAL) REPORT_COUNT       0x01 (1) Number of fields  
    81 02            (MAIN)   INPUT              0x00000002 (1 field x 8 bits) 0=Data 1=Variable 0=Absolute 0=NoWrap 0=Linear 0=PrefState 0=NoNull 0=NonVolatile 0=Bitmap  <-- Error: REPORT_SIZE (8) is too small for LOGICAL_MAXIMUM (10000) which needs 14 bits.
    09 42            (LOCAL)  USAGE              0x000D0042 Tip Switch (Momentary Control)  
    09 32            (LOCAL)  USAGE              0x000D0032 In Range (Momentary Control)  
    15 00            (GLOBAL) LOGICAL_MINIMUM    0x00 (0) <-- Redundant: LOGICAL_MINIMUM is already 0 <-- Info: Consider replacing 15 00 with 14
    25 01            (GLOBAL) LOGICAL_MAXIMUM    0x01 (1)  
    75 01            (GLOBAL) REPORT_SIZE        0x01 (1) Number of bits per field  
    95 02            (GLOBAL) REPORT_COUNT       0x02 (2) Number of fields  
    81 02            (MAIN)   INPUT              0x00000002 (2 fields x 1 bit) 0=Data 1=Variable 0=Absolute 0=NoWrap 0=Linear 0=PrefState 0=NoNull 0=NonVolatile 0=Bitmap 
    95 06            (GLOBAL) REPORT_COUNT       0x06 (6) Number of fields  
    81 03            (MAIN)   INPUT              0x00000003 (6 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 (Dynamic Value)  
    09 31            (LOCAL)  USAGE              0x00010031 Y (Dynamic Value)  
    16 0000          (GLOBAL) LOGICAL_MINIMUM    0x0000 (0) <-- Redundant: LOGICAL_MINIMUM is already 0 <-- Info: Consider replacing 16 0000 with 14
    26 1027          (GLOBAL) LOGICAL_MAXIMUM    0x2710 (10000)  
    66 0000          (GLOBAL) UNIT               0x0000 No unit (0=None) <-- Redundant: UNIT is already 0x00000000 <-- Info: Consider replacing 66 0000 with 64
    75 10            (GLOBAL) REPORT_SIZE        0x10 (16) Number of bits per field  
    95 02            (GLOBAL) REPORT_COUNT       0x02 (2) Number of fields  
    81 02            (MAIN)   INPUT              0x00000002 (2 fields x 16 bits) 0=Data 1=Variable 0=Absolute 0=NoWrap 0=Linear 0=PrefState 0=NoNull 0=NonVolatile 0=Bitmap 
    C0             (MAIN)   END_COLLECTION     Logical  <-- Warning: Physical units are still in effect PHYSICAL(MIN=0,MAX=10000) UNIT(0x,EXP=0)
    C0           (MAIN)   END_COLLECTION     Application  <-- Warning: Physical units are still in effect PHYSICAL(MIN=0,MAX=10000) UNIT(0x,EXP=0)
    */
    
    //--------------------------------------------------------------------------------
    // Digitizer Device Page featureReport (Device <-> Host)
    //--------------------------------------------------------------------------------
    
    typedef struct
    {
                                                         // No REPORT ID byte
                                                         // Collection: TouchScreen
                                                         // Usage 0x000D0055 Contact Count Maximum, Value =  to 3 <-- Ignored: REPORT_COUNT () is too small
    } featureReport_t;
    
    
    //--------------------------------------------------------------------------------
    // Digitizer Device Page inputReport (Device --> Host)
    //--------------------------------------------------------------------------------
    
    typedef struct
    {
                                                         // No REPORT ID byte
                                                         // Collection: TouchScreen
      int8_t   DIG_TouchScreenContactCount;              // Usage 0x000D0054: Contact Count, Value =  to 3
                                                         // Collection: TouchScreen Finger
      int8_t   DIG_TouchScreenFingerContactIdentifier;   // Usage 0x000D0051: Contact Identifier, Value =  to 3
      uint8_t  DIG_TouchScreenFingerTipSwitch : 1;       // Usage 0x000D0042: Tip Switch, Value = 0 to 1
      uint8_t  DIG_TouchScreenFingerInRange : 1;         // Usage 0x000D0032: In Range, Value = 0 to 1
      uint8_t  : 1;                                      // Pad
      uint8_t  : 1;                                      // Pad
      uint8_t  : 1;                                      // Pad
      uint8_t  : 1;                                      // Pad
      uint8_t  : 1;                                      // Pad
      uint8_t  : 1;                                      // Pad
      uint16_t GD_TouchScreenFingerX;                    // Usage 0x00010030: X, Value = 0 to 10000, Physical = Value
      uint16_t GD_TouchScreenFingerY;                    // Usage 0x00010031: Y, Value = 0 to 10000, Physical = Value
      uint8_t  DIG_TouchScreenFingerContactIdentifier_1; // Usage 0x000D0051: Contact Identifier, Value = 0 to 10000, Physical = Value
      uint8_t  DIG_TouchScreenFingerTipSwitch_1 : 1;     // Usage 0x000D0042: Tip Switch, Value = 0 to 1, Physical = Value x 10000
      uint8_t  DIG_TouchScreenFingerInRange_1 : 1;       // Usage 0x000D0032: In Range, Value = 0 to 1, Physical = Value x 10000
      uint8_t  : 1;                                      // Pad
      uint8_t  : 1;                                      // Pad
      uint8_t  : 1;                                      // Pad
      uint8_t  : 1;                                      // Pad
      uint8_t  : 1;                                      // Pad
      uint8_t  : 1;                                      // Pad
      uint16_t GD_TouchScreenFingerX_1;                  // Usage 0x00010030: X, Value = 0 to 10000, Physical = Value
      uint16_t GD_TouchScreenFingerY_1;                  // Usage 0x00010031: Y, Value = 0 to 10000, Physical = Value
    } inputReport_t;
    

    这是另一个值得尝试的多点触控报告描述符(使用报告 ID):

    //--------------------------------------------------------------------------------
    // Decoded Application Collection
    //--------------------------------------------------------------------------------
    
    /*
    05 0D        (GLOBAL) USAGE_PAGE         0x000D Digitizer Device Page 
    09 04        (LOCAL)  USAGE              0x000D0004 Touch Screen (Application Collection)  
    A1 01        (MAIN)   COLLECTION         0x01 Application (Usage=0x000D0004: Page=Digitizer Device Page, Usage=Touch Screen, Type=Application Collection)
    85 54          (GLOBAL) REPORT_ID          0x54 (84) 'T'  
    09 22          (LOCAL)  USAGE              0x000D0022 Finger (Logical Collection)  
    A1 02          (MAIN)   COLLECTION         0x02 Logical (Usage=0x000D0022: Page=Digitizer Device Page, Usage=Finger, Type=Logical Collection)
    09 42            (LOCAL)  USAGE              0x000D0042 Tip Switch (Momentary Control)  
    14               (GLOBAL) LOGICAL_MINIMUM    (0)  
    25 01            (GLOBAL) LOGICAL_MAXIMUM    0x01 (1)  
    75 01            (GLOBAL) REPORT_SIZE        0x01 (1) Number of bits per field  
    95 01            (GLOBAL) REPORT_COUNT       0x01 (1) Number of fields  
    81 02            (MAIN)   INPUT              0x00000002 (1 field x 1 bit) 0=Data 1=Variable 0=Absolute 0=NoWrap 0=Linear 0=PrefState 0=NoNull 0=NonVolatile 0=Bitmap 
    09 32            (LOCAL)  USAGE              0x000D0032 In Range (Momentary Control)  
    81 02            (MAIN)   INPUT              0x00000002 (1 field x 1 bit) 0=Data 1=Variable 0=Absolute 0=NoWrap 0=Linear 0=PrefState 0=NoNull 0=NonVolatile 0=Bitmap 
    09 47            (LOCAL)  USAGE              0x000D0047 Confidence (Dynamic Value)  
    81 02            (MAIN)   INPUT              0x00000002 (1 field 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 
    75 08            (GLOBAL) REPORT_SIZE        0x08 (8) Number of bits per field  
    09 51            (LOCAL)  USAGE              0x000D0051 Contact Identifier (Dynamic Value)  
    95 01            (GLOBAL) REPORT_COUNT       0x01 (1) Number of fields  
    81 02            (MAIN)   INPUT              0x00000002 (1 field x 8 bits) 0=Data 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 
    26 FF7F          (GLOBAL) LOGICAL_MAXIMUM    0x7FFF (32767)  
    75 10            (GLOBAL) REPORT_SIZE        0x10 (16) Number of bits per field  
    09 30            (LOCAL)  USAGE              0x00010030 X (Dynamic Value)  
    81 02            (MAIN)   INPUT              0x00000002 (1 field x 16 bits) 0=Data 1=Variable 0=Absolute 0=NoWrap 0=Linear 0=PrefState 0=NoNull 0=NonVolatile 0=Bitmap 
    09 31            (LOCAL)  USAGE              0x00010031 Y (Dynamic Value)  
    81 02            (MAIN)   INPUT              0x00000002 (1 field x 16 bits) 0=Data 1=Variable 0=Absolute 0=NoWrap 0=Linear 0=PrefState 0=NoNull 0=NonVolatile 0=Bitmap 
    C0             (MAIN)   END_COLLECTION     Logical 
    05 0D          (GLOBAL) USAGE_PAGE         0x000D Digitizer Device Page 
    09 22          (LOCAL)  USAGE              0x000D0022 Finger (Logical Collection)  
    A1 02          (MAIN)   COLLECTION         0x02 Logical (Usage=0x000D0022: Page=Digitizer Device Page, Usage=Finger, Type=Logical Collection)
    09 42            (LOCAL)  USAGE              0x000D0042 Tip Switch (Momentary Control)  
    25 01            (GLOBAL) LOGICAL_MAXIMUM    0x01 (1)  
    75 01            (GLOBAL) REPORT_SIZE        0x01 (1) Number of bits per field  
    81 02            (MAIN)   INPUT              0x00000002 (1 field x 1 bit) 0=Data 1=Variable 0=Absolute 0=NoWrap 0=Linear 0=PrefState 0=NoNull 0=NonVolatile 0=Bitmap 
    09 32            (LOCAL)  USAGE              0x000D0032 In Range (Momentary Control)  
    81 02            (MAIN)   INPUT              0x00000002 (1 field x 1 bit) 0=Data 1=Variable 0=Absolute 0=NoWrap 0=Linear 0=PrefState 0=NoNull 0=NonVolatile 0=Bitmap 
    09 47            (LOCAL)  USAGE              0x000D0047 Confidence (Dynamic Value)  
    81 02            (MAIN)   INPUT              0x00000002 (1 field 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 
    75 08            (GLOBAL) REPORT_SIZE        0x08 (8) Number of bits per field  
    95 01            (GLOBAL) REPORT_COUNT       0x01 (1) Number of fields  
    09 51            (LOCAL)  USAGE              0x000D0051 Contact Identifier (Dynamic Value)  
    81 02            (MAIN)   INPUT              0x00000002 (1 field x 8 bits) 0=Data 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 
    26 FF7F          (GLOBAL) LOGICAL_MAXIMUM    0x7FFF (32767)  
    75 10            (GLOBAL) REPORT_SIZE        0x10 (16) Number of bits per field  
    09 30            (LOCAL)  USAGE              0x00010030 X (Dynamic Value)  
    81 02            (MAIN)   INPUT              0x00000002 (1 field x 16 bits) 0=Data 1=Variable 0=Absolute 0=NoWrap 0=Linear 0=PrefState 0=NoNull 0=NonVolatile 0=Bitmap 
    09 31            (LOCAL)  USAGE              0x00010031 Y (Dynamic Value)  
    81 02            (MAIN)   INPUT              0x00000002 (1 field x 16 bits) 0=Data 1=Variable 0=Absolute 0=NoWrap 0=Linear 0=PrefState 0=NoNull 0=NonVolatile 0=Bitmap 
    C0             (MAIN)   END_COLLECTION     Logical 
    05 0D          (GLOBAL) USAGE_PAGE         0x000D Digitizer Device Page 
    09 54          (LOCAL)  USAGE              0x000D0054 Contact Count (Dynamic Value)  
    75 08          (GLOBAL) REPORT_SIZE        0x08 (8) Number of bits per field  
    25 08          (GLOBAL) LOGICAL_MAXIMUM    0x08 (8)  
    81 02          (MAIN)   INPUT              0x00000002 (1 field x 8 bits) 0=Data 1=Variable 0=Absolute 0=NoWrap 0=Linear 0=PrefState 0=NoNull 0=NonVolatile 0=Bitmap 
    09 55          (LOCAL)  USAGE              0x000D0055 Contact Count Maximum (Static Value)  
    B1 02          (MAIN)   FEATURE            0x00000002 (1 field x 8 bits) 0=Data 1=Variable 0=Absolute 0=NoWrap 0=Linear 0=PrefState 0=NoNull 0=NonVolatile 0=Bitmap 
    C0           (MAIN)   END_COLLECTION     Application 
    */
    
    //--------------------------------------------------------------------------------
    // Digitizer Device Page featureReport 54 (Device <-> Host)
    //--------------------------------------------------------------------------------
    
    typedef struct
    {
      uint8_t  reportId;                                 // Report ID = 0x54 (84) 'T'
                                                         // Collection: TouchScreen
      uint8_t  DIG_TouchScreenContactCountMaximum;       // Usage 0x000D0055: Contact Count Maximum, Value = 0 to 8
    } featureReport54_t;
    
    
    //--------------------------------------------------------------------------------
    // Digitizer Device Page inputReport 54 (Device --> Host)
    //--------------------------------------------------------------------------------
    
    typedef struct
    {
      uint8_t  reportId;                                 // Report ID = 0x54 (84) 'T'
                                                         // Collection: TouchScreen Finger
      uint8_t  DIG_TouchScreenFingerTipSwitch : 1;       // Usage 0x000D0042: Tip Switch, Value = 0 to 1
      uint8_t  DIG_TouchScreenFingerInRange : 1;         // Usage 0x000D0032: In Range, Value = 0 to 1
      uint8_t  DIG_TouchScreenFingerConfidence : 1;      // Usage 0x000D0047: Confidence, Value = 0 to 1
      uint8_t  : 1;                                      // Pad
      uint8_t  : 1;                                      // Pad
      uint8_t  : 1;                                      // Pad
      uint8_t  : 1;                                      // Pad
      uint8_t  : 1;                                      // Pad
      uint8_t  DIG_TouchScreenFingerContactIdentifier;   // Usage 0x000D0051: Contact Identifier, Value = 0 to 1
      uint16_t GD_TouchScreenFingerX;                    // Usage 0x00010030: X, Value = 0 to 32767
      uint16_t GD_TouchScreenFingerY;                    // Usage 0x00010031: Y, Value = 0 to 32767
      uint8_t  DIG_TouchScreenFingerTipSwitch_1 : 1;     // Usage 0x000D0042: Tip Switch, Value = 0 to 1
      uint8_t  DIG_TouchScreenFingerInRange_1 : 1;       // Usage 0x000D0032: In Range, Value = 0 to 1
      uint8_t  DIG_TouchScreenFingerConfidence_1 : 1;    // Usage 0x000D0047: Confidence, Value = 0 to 1
      uint8_t  : 1;                                      // Pad
      uint8_t  : 1;                                      // Pad
      uint8_t  : 1;                                      // Pad
      uint8_t  : 1;                                      // Pad
      uint8_t  : 1;                                      // Pad
      uint8_t  DIG_TouchScreenFingerContactIdentifier_1; // Usage 0x000D0051: Contact Identifier, Value = 0 to 1
      uint16_t GD_TouchScreenFingerX_1;                  // Usage 0x00010030: X, Value = 0 to 32767
      uint16_t GD_TouchScreenFingerY_1;                  // Usage 0x00010031: Y, Value = 0 to 32767
                                                         // Collection: TouchScreen
      uint8_t  DIG_TouchScreenContactCount;              // Usage 0x000D0054: Contact Count, Value = 0 to 8
    } inputReport54_t;
    

    【讨论】:

      猜你喜欢
      • 2012-11-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-06
      • 2011-11-10
      • 2021-12-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多