簡體   English   中英

USB觸摸屏HID描述符(用於2個聯系人標識符)

[英]USB touch screen HID descriptor for 2 contact identifier

目前,我正在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觸摸筆記本電腦中對此進行測試,在這里我有USBlyzer來分析從主板發送到PC的數據。

在分析儀中,我將變成這樣.. 在此處輸入圖像描述

在分析中,即使我發送了不同的數據,它也顯示了與手指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的指尖開關,那么即使我也沒有得到單觸。

所以,請幫助我我哪里做錯了。

我不知道問題是由於報表描述符還是其他原因引起的。

謝謝

報告描述符在某些方面不太正確,這可能會使主機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;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM