HID-compliant touch screen packet data structure
Asked Answered
G

1

6

I need to find out HID-compliant touch screen(single touch) input data structure(like byte ordering and what should be written in each byte).

I have used HID-compliant touchscreen descriptor from Microsoft official docs

and in host PC using device Manager I am able to see that it successfully enumerates HID -compliant device. Now I want to send HID report to the host but the problem is that I haven't found something like HID boot protocol for touchscreen (for mouse and keyboard it is clearly defined in USB org spec). This is a code sample that I am using to create touchscreen HID report and it works but not as expected. I found this combination of bytes by researching a lot of github codes and reading articles but I want to find some document by which I can proof that the ordering is correct.

    char report[8] = {0};
    uint16_t x_access = 10000;
    uint16_t y_access = 10000;

    report[0] = 0x01; //reportid
    report[1] = 0x3;   //statuss
    report[2] = LOWBYTE(x_access);  //x low byte
    report[3] = HIGHBYTE(x_access); //x high byte
    report[4] = LOWBYTE(y_access);  //y low byte
    report[5] = HIGHBYTE(y_access); //y high byte
    report[6] = 0x65;               //touch parsing time low byte 
    report[7] = 0x00;               //touch parsing time high byte
  //report[8] = 1                   //this doesn't have any impact (touch count)

Useful links that I have used

  1. https://www.usb.org/hid
  2. http://ww1.microchip.com/downloads/en/DeviceDoc/mXT1386E_2v9_Datasheet_BX.pdf
  3. https://www.interelectronix.com/de/sis95xx-series-touch-data-format.html
  4. http://ww1.microchip.com/downloads/en/devicedoc/41606b.pdf

Thanks in advance for the help

Gualtiero answered 4/11, 2021 at 14:30 Comment(1)
IIRC, the structure of reports depends entirely on the report descriptors you provide. I'd suggest reading the HID spec, section 8 and 6.2.2. You might also want to add information about the report descriptors you're using. Also, if I understand correctly boot protocol isn't relevant (is only defined for a mouse or keyboard, for simpler implementations that can't parse the HID reports descriptors, unless you want to impersonate a mouse).Snoopy
D
2

With RDD! HID Report Descriptor Decoder tool we can easily generate C structs from Microsoft provided touchscreen "Sample Report Descriptor":

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

typedef struct
{
  uint8_t  reportId;                                 // Report ID = 0x01 (1)
                                                     // Collection: CA:TouchScreen CL:Finger
  uint8_t  DIG_TouchScreenFingerTipSwitch : 1;       // Usage 0x000D0042: Tip Switch, Value = 0 to 1
  uint8_t  : 7;                                      // Pad
  uint8_t  DIG_TouchScreenFingerContactIdentifier;   // Usage 0x000D0051: Contact Identifier, Value = 0 to 1
  uint16_t GD_TouchScreenFingerX[2];                 // Usage 0x00010030: X, Value = 0 to 4095, Physical = Value x 241 / 819 in 10⁻² inch units
  uint16_t GD_TouchScreenFingerY[2];                 // Usage 0x00010031: Y, Value = 0 to 4095, Physical = Value x 302 / 1365 in 10⁻² inch units
  uint16_t DIG_TouchScreenFingerWidth;               // Usage 0x000D0048: Width, Value = 0 to 4095, Physical = Value x 302 / 1365 in 10⁻² inch units
  uint16_t DIG_TouchScreenFingerHeight;              // Usage 0x000D0049: Height, Value = 0 to 4095, Physical = Value x 302 / 1365 in 10⁻² inch units
  uint16_t DIG_TouchScreenFingerAzimuth;             // Usage 0x000D003F: Azimuth, Value = 0 to 62831, Physical = Value in 10⁻⁴ rad units
  uint8_t  DIG_TouchScreenFingerTipSwitch_1 : 1;     // Usage 0x000D0042: Tip Switch, Value = 0 to 1, Physical = Value x 62831 in 10⁻⁴ rad units
  uint8_t  : 7;                                      // Pad
  uint8_t  DIG_TouchScreenFingerContactIdentifier_1; // Usage 0x000D0051: Contact Identifier, Value = 0 to 1, Physical = Value x 62831 in 10⁻⁴ rad units
  uint16_t GD_TouchScreenFingerX_1[2];               // Usage 0x00010030: X, Value = 0 to 4095, Physical = Value x 241 / 819 in 10⁻² inch units
  uint16_t GD_TouchScreenFingerY_1[2];               // Usage 0x00010031: Y, Value = 0 to 4095, Physical = Value x 302 / 1365 in 10⁻² inch units
  uint16_t DIG_TouchScreenFingerWidth_1;             // Usage 0x000D0048: Width, Value = 0 to 4095, Physical = Value x 302 / 1365 in 10⁻² inch units
  uint16_t DIG_TouchScreenFingerHeight_1;            // Usage 0x000D0049: Height, Value = 0 to 4095, Physical = Value x 302 / 1365 in 10⁻² inch units
  uint16_t DIG_TouchScreenFingerAzimuth_1;           // Usage 0x000D003F: Azimuth, Value = 0 to 62831, Physical = Value in 10⁻⁴ rad units
                                                     // Collection: CA:TouchScreen
  uint16_t DIG_TouchScreenRelativeScanTime;          // Usage 0x000D0056: Relative Scan Time, Value = 0 to 65535, Physical = Value in 10⁻⁴ s units
  uint8_t  DIG_TouchScreenContactCount;              // Usage 0x000D0054: Contact Count, Value = 0 to 127, Physical = Value x 65535 / 127 in 10⁻⁴ s units
} inputReport01_t;
Dhiman answered 17/12, 2021 at 14:1 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.