首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >解码HID描述符以匹配原始HID数据

解码HID描述符以匹配原始HID数据
EN

Stack Overflow用户
提问于 2019-04-25 06:19:19
回答 1查看 439关注 0票数 0

我正在尝试解码连接到linux计算机时从/dev/hidraw2读取的多点触摸屏的HID原始数据流。

我已经有了我的多点触摸屏的HID报告描述符和来自我的屏幕的64字节流。1 finger touch 到目前为止,我可以理解为02 - report id / 04 - 07如果按下或未按下/ xx -我不知道// xx xx协和//yy yy协和。但它必须是一种读取hid描述符并将其转换为我正在获取的数据流的方法。

代码语言:javascript
复制
Usage Page (Digitizer),             ; Digitizer (0Dh)
Usage (Touchscreen),                ; Touch screen (04h, application collection)
Collection (Application),
    Report ID (2),
    Usage (Finger),                 ; Finger (22h, logical collection)
    Collection (Logical),
        Usage Page (Digitizer),     ; Digitizer (0Dh)
        Usage (Tip Switch),         ; Tip switch (42h, momentary control)
        Logical Minimum (0),
        Logical Maximum (1),
        Report Size (1),
        Report Count (1),
        Input (Variable),
        Usage (In Range),           ; In range (32h, momentary control)
        Input (Variable),
        Usage (47h),
        Input (Variable),
        Report Count (5),
        Input (Constant, Variable),
        Report Size (8),
        Usage (51h),
        Report Count (1),
        Input (Variable),
        Usage Page (Desktop),       ; Generic desktop controls (01h)
        Logical Minimum (0),
        Logical Maximum (32767),
        Report Size (16),
        Usage (X),                  ; X (30h, dynamic value)
        Input (Variable),
        Usage (Y),                  ; Y (31h, dynamic value)
        Input (Variable),
    End Collection,
    Collection (Logical),
        Usage Page (Digitizer),     ; Digitizer (0Dh)
        Usage (Tip Switch),         ; Tip switch (42h, momentary control)
        Logical Minimum (0),
        Logical Maximum (1),
        Report Size (1),
        Report Count (1),
        Input (Variable),
        Usage (In Range),           ; In range (32h, momentary control)
        Input (Variable),
        Usage (47h),
        Input (Variable),
        Report Count (5),
        Input (Constant, Variable),
        Report Size (8),
        Usage (51h),
        Report Count (1),
        Input (Variable),
        Usage Page (Desktop),       ; Generic desktop controls (01h)
        Logical Minimum (0),
        Logical Maximum (32767),
        Report Size (16),
        Usage (X),                  ; X (30h, dynamic value)
        Input (Variable),
        Usage (Y),                  ; Y (31h, dynamic value)
        Input (Variable),
    End Collection,
    Collection (Logical),
        Usage Page (Digitizer),     ; Digitizer (0Dh)
        Usage (Tip Switch),         ; Tip switch (42h, momentary control)
        Logical Minimum (0),
        Logical Maximum (1),
        Report Size (1),
        Report Count (1),
        Input (Variable),
        Usage (In Range),           ; In range (32h, momentary control)
        Input (Variable),
        Usage (47h),
        Input (Variable),
        Report Count (5),
        Input (Constant, Variable),
        Report Size (8),
        Usage (51h),
        Report Count (1),
        Input (Variable),
        Usage Page (Desktop),       ; Generic desktop controls (01h)
        Logical Minimum (0),
        Logical Maximum (32767),
        Report Size (16),
        Usage (X),                  ; X (30h, dynamic value)
        Input (Variable),
        Usage (Y),                  ; Y (31h, dynamic value)
        Input (Variable),
    End Collection,
    Collection (Logical),
        Usage Page (Digitizer),     ; Digitizer (0Dh)
        Usage (Tip Switch),         ; Tip switch (42h, momentary control)
        Logical Minimum (0),
        Logical Maximum (1),
        Report Size (1),
        Report Count (1),
        Input (Variable),
        Usage (In Range),           ; In range (32h, momentary control)
        Input (Variable),
        Usage (47h),
        Input (Variable),
        Report Count (5),
        Input (Constant, Variable),
        Report Size (8),
        Usage (51h),
        Report Count (1),
        Input (Variable),
        Usage Page (Desktop),       ; Generic desktop controls (01h)
        Logical Minimum (0),
        Logical Maximum (32767),
        Report Size (16),
        Usage (X),                  ; X (30h, dynamic value)
        Input (Variable),
        Usage (Y),                  ; Y (31h, dynamic value)
        Input (Variable),
    End Collection,
    Collection (Logical),
        Usage Page (Digitizer),     ; Digitizer (0Dh)
        Usage (Tip Switch),         ; Tip switch (42h, momentary control)
        Logical Minimum (0),
        Logical Maximum (1),
        Report Size (1),
        Report Count (1),
        Input (Variable),
        Usage (In Range),           ; In range (32h, momentary control)
        Input (Variable),
        Usage (47h),
        Input (Variable),
        Report Count (5),
        Input (Constant, Variable),
        Report Size (8),
        Usage (51h),
        Report Count (1),
        Input (Variable),
        Usage Page (Desktop),       ; Generic desktop controls (01h)
        Logical Minimum (0),
        Logical Maximum (32767),
        Report Size (16),
        Usage (X),                  ; X (30h, dynamic value)
        Input (Variable),
        Usage (Y),                  ; Y (31h, dynamic value)
        Input (Variable),
    End Collection,
    Collection (Logical),
        Usage Page (Digitizer),     ; Digitizer (0Dh)
        Usage (Tip Switch),         ; Tip switch (42h, momentary control)
        Logical Minimum (0),
        Logical Maximum (1),
        Report Size (1),
        Report Count (1),
        Input (Variable),
        Usage (In Range),           ; In range (32h, momentary control)
        Input (Variable),
        Usage (47h),
        Input (Variable),
        Report Count (5),
        Input (Constant, Variable),
        Report Size (8),
        Usage (51h),
        Report Count (1),
        Input (Variable),
        Usage Page (Desktop),       ; Generic desktop controls (01h)
        Logical Minimum (0),
        Logical Maximum (32767),
        Report Size (16),
        Usage (X),                  ; X (30h, dynamic value)
        Input (Variable),
        Usage (Y),                  ; Y (31h, dynamic value)
        Input (Variable),
    End Collection,
    Collection (Logical),
        Usage Page (Digitizer),     ; Digitizer (0Dh)
        Usage (Tip Switch),         ; Tip switch (42h, momentary control)
        Logical Minimum (0),
        Logical Maximum (1),
        Report Size (1),
        Report Count (1),
        Input (Variable),
        Usage (In Range),           ; In range (32h, momentary control)
        Input (Variable),
        Usage (47h),
        Input (Variable),
        Report Count (5),
        Input (Constant, Variable),
        Report Size (8),
        Usage (51h),
        Report Count (1),
        Input (Variable),
        Usage Page (Desktop),       ; Generic desktop controls (01h)
        Logical Minimum (0),
        Logical Maximum (32767),
        Report Size (16),
        Usage (X),                  ; X (30h, dynamic value)
        Input (Variable),
        Usage (Y),                  ; Y (31h, dynamic value)
        Input (Variable),
    End Collection,
    Collection (Logical),
        Usage Page (Digitizer),     ; Digitizer (0Dh)
        Usage (Tip Switch),         ; Tip switch (42h, momentary control)
        Logical Minimum (0),
        Logical Maximum (1),
        Report Size (1),
        Report Count (1),
        Input (Variable),
        Usage (In Range),           ; In range (32h, momentary control)
        Input (Variable),
        Usage (47h),
        Input (Variable),
        Report Count (5),
        Input (Constant, Variable),
        Report Size (8),
        Usage (51h),
        Report Count (1),
        Input (Variable),
        Usage Page (Desktop),       ; Generic desktop controls (01h)
        Logical Minimum (0),
        Logical Maximum (32767),
        Report Size (16),
        Usage (X),                  ; X (30h, dynamic value)
        Input (Variable),
        Usage (Y),                  ; Y (31h, dynamic value)
        Input (Variable),
    End Collection,
    Collection (Logical),
        Usage Page (Digitizer),     ; Digitizer (0Dh)
        Usage (Tip Switch),         ; Tip switch (42h, momentary control)
        Logical Minimum (0),
        Logical Maximum (1),
        Report Size (1),
        Report Count (1),
        Input (Variable),
        Usage (In Range),           ; In range (32h, momentary control)
        Input (Variable),
        Usage (47h),
        Input (Variable),
        Report Count (5),
        Input (Constant, Variable),
        Report Size (8),
        Usage (51h),
        Report Count (1),
        Input (Variable),
        Usage Page (Desktop),       ; Generic desktop controls (01h)
        Logical Minimum (0),
        Logical Maximum (32767),
        Report Size (16),
        Usage (X),                  ; X (30h, dynamic value)
        Input (Variable),
        Usage (Y),                  ; Y (31h, dynamic value)
        Input (Variable),
    End Collection,
    Collection (Logical),
        Usage Page (Digitizer),     ; Digitizer (0Dh)
        Usage (Tip Switch),         ; Tip switch (42h, momentary control)
        Logical Minimum (0),
        Logical Maximum (1),
        Report Size (1),
        Report Count (1),
        Input (Variable),
        Usage (In Range),           ; In range (32h, momentary control)
        Input (Variable),
        Usage (47h),
        Input (Variable),
        Report Count (5),
        Input (Constant, Variable),
        Report Size (8),
        Usage (51h),
        Report Count (1),
        Input (Variable),
        Usage Page (Desktop),       ; Generic desktop controls (01h)
        Logical Minimum (0),
        Logical Maximum (32767),
        Report Size (16),
        Usage (X),                  ; X (30h, dynamic value)
        Input (Variable),
        Usage (Y),                  ; Y (31h, dynamic value)
        Input (Variable),
    End Collection,
    Usage Page (Digitizer),         ; Digitizer (0Dh)
    Usage (54h),
    Report Count (1),
    Report Size (8),
    Input (Variable),
    Usage (55h),
    Logical Maximum (10),
    Feature (Variable),
End Collection,
Usage (0Eh),
Collection (Application),
    Report ID (4),
    Usage (23h),
    Collection (Logical),
        Usage (52h),
        Logical Minimum (0),
        Logical Maximum (10),
        Report Size (8),
        Report Count (1),
        Feature (Variable),
    End Collection,
End Collection,
Usage Page (FF00h),                 ; FF00h, vendor-defined
Usage (01h),
Collection (Application),
    Report ID (250),
    Usage (01h),
    Usage Minimum (01h),
    Usage Maximum (3Fh),
    Logical Minimum (0),
    Logical Maximum (-1),
    Report Size (8),
    Report Count (63),
    Input (Variable),
    Report ID (18),
    Usage (02h),
    Usage Minimum (01h),
    Usage Maximum (3Fh),
    Output (Variable),
    Report ID (16),
    Usage (03h),
    Usage Minimum (01h),
    Usage Maximum (3Fh),
    Logical Minimum (0),
    Logical Maximum (-1),
    Report Size (8),
    Report Count (7),
    Feature (Variable),
End Collection
EN

回答 1

Stack Overflow用户

发布于 2019-04-25 10:41:37

输入报告02解码为以下C语言结构(见下文)。基本上,它包括1字节的报告id、10批次的手指触摸数据(标志、联系人id、x,y)和1字节的接触计数(即检测到的触摸次数)。输入报告总长度应为1+10x(1+1+2+2)+1 = 62字节:

代码语言:javascript
复制
//--------------------------------------------------------------------------------
// Digitizer Device Page inputReport 02 (Device --> Host)
//--------------------------------------------------------------------------------

typedef struct
{
  uint8_t  reportId;                                 // Report ID = 0x02 (2)
                                                     // Collection: CA:TouchScreen CL: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
  uint8_t  DIG_TouchScreenFingerTipSwitch_2 : 1;     // Usage 0x000D0042: Tip Switch, Value = 0 to 1
  uint8_t  DIG_TouchScreenFingerInRange_2 : 1;       // Usage 0x000D0032: In Range, Value = 0 to 1
  uint8_t  DIG_TouchScreenFingerConfidence_2 : 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_2; // Usage 0x000D0051: Contact Identifier, Value = 0 to 1
  uint16_t GD_TouchScreenFingerX_2;                  // Usage 0x00010030: X, Value = 0 to 32767
  uint16_t GD_TouchScreenFingerY_2;                  // Usage 0x00010031: Y, Value = 0 to 32767
  uint8_t  DIG_TouchScreenFingerTipSwitch_3 : 1;     // Usage 0x000D0042: Tip Switch, Value = 0 to 1
  uint8_t  DIG_TouchScreenFingerInRange_3 : 1;       // Usage 0x000D0032: In Range, Value = 0 to 1
  uint8_t  DIG_TouchScreenFingerConfidence_3 : 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_3; // Usage 0x000D0051: Contact Identifier, Value = 0 to 1
  uint16_t GD_TouchScreenFingerX_3;                  // Usage 0x00010030: X, Value = 0 to 32767
  uint16_t GD_TouchScreenFingerY_3;                  // Usage 0x00010031: Y, Value = 0 to 32767
  uint8_t  DIG_TouchScreenFingerTipSwitch_4 : 1;     // Usage 0x000D0042: Tip Switch, Value = 0 to 1
  uint8_t  DIG_TouchScreenFingerInRange_4 : 1;       // Usage 0x000D0032: In Range, Value = 0 to 1
  uint8_t  DIG_TouchScreenFingerConfidence_4 : 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_4; // Usage 0x000D0051: Contact Identifier, Value = 0 to 1
  uint16_t GD_TouchScreenFingerX_4;                  // Usage 0x00010030: X, Value = 0 to 32767
  uint16_t GD_TouchScreenFingerY_4;                  // Usage 0x00010031: Y, Value = 0 to 32767
  uint8_t  DIG_TouchScreenFingerTipSwitch_5 : 1;     // Usage 0x000D0042: Tip Switch, Value = 0 to 1
  uint8_t  DIG_TouchScreenFingerInRange_5 : 1;       // Usage 0x000D0032: In Range, Value = 0 to 1
  uint8_t  DIG_TouchScreenFingerConfidence_5 : 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_5; // Usage 0x000D0051: Contact Identifier, Value = 0 to 1
  uint16_t GD_TouchScreenFingerX_5;                  // Usage 0x00010030: X, Value = 0 to 32767
  uint16_t GD_TouchScreenFingerY_5;                  // Usage 0x00010031: Y, Value = 0 to 32767
  uint8_t  DIG_TouchScreenFingerTipSwitch_6 : 1;     // Usage 0x000D0042: Tip Switch, Value = 0 to 1
  uint8_t  DIG_TouchScreenFingerInRange_6 : 1;       // Usage 0x000D0032: In Range, Value = 0 to 1
  uint8_t  DIG_TouchScreenFingerConfidence_6 : 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_6; // Usage 0x000D0051: Contact Identifier, Value = 0 to 1
  uint16_t GD_TouchScreenFingerX_6;                  // Usage 0x00010030: X, Value = 0 to 32767
  uint16_t GD_TouchScreenFingerY_6;                  // Usage 0x00010031: Y, Value = 0 to 32767
  uint8_t  DIG_TouchScreenFingerTipSwitch_7 : 1;     // Usage 0x000D0042: Tip Switch, Value = 0 to 1
  uint8_t  DIG_TouchScreenFingerInRange_7 : 1;       // Usage 0x000D0032: In Range, Value = 0 to 1
  uint8_t  DIG_TouchScreenFingerConfidence_7 : 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_7; // Usage 0x000D0051: Contact Identifier, Value = 0 to 1
  uint16_t GD_TouchScreenFingerX_7;                  // Usage 0x00010030: X, Value = 0 to 32767
  uint16_t GD_TouchScreenFingerY_7;                  // Usage 0x00010031: Y, Value = 0 to 32767
  uint8_t  DIG_TouchScreenFingerTipSwitch_8 : 1;     // Usage 0x000D0042: Tip Switch, Value = 0 to 1
  uint8_t  DIG_TouchScreenFingerInRange_8 : 1;       // Usage 0x000D0032: In Range, Value = 0 to 1
  uint8_t  DIG_TouchScreenFingerConfidence_8 : 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_8; // Usage 0x000D0051: Contact Identifier, Value = 0 to 1
  uint16_t GD_TouchScreenFingerX_8;                  // Usage 0x00010030: X, Value = 0 to 32767
  uint16_t GD_TouchScreenFingerY_8;                  // Usage 0x00010031: Y, Value = 0 to 32767
  uint8_t  DIG_TouchScreenFingerTipSwitch_9 : 1;     // Usage 0x000D0042: Tip Switch, Value = 0 to 1
  uint8_t  DIG_TouchScreenFingerInRange_9 : 1;       // Usage 0x000D0032: In Range, Value = 0 to 1
  uint8_t  DIG_TouchScreenFingerConfidence_9 : 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_9; // Usage 0x000D0051: Contact Identifier, Value = 0 to 1
  uint16_t GD_TouchScreenFingerX_9;                  // Usage 0x00010030: X, Value = 0 to 32767
  uint16_t GD_TouchScreenFingerY_9;                  // Usage 0x00010031: Y, Value = 0 to 32767
                                                     // Collection: CA:TouchScreen
  uint8_t  DIG_TouchScreenContactCount;              // Usage 0x000D0054: Contact Count, Value = 0 to 10
} inputReport02_t;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55839331

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档