Multitouch HID issue in Android 14

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Dear kernel developers,

We are reaching out to you to discuss and hopefully resolve an
important issue we’ve encountered in the recent versions of the
Android kernel (for example 5.10.177-Android13, as reported on a Pixel
7 device), which affects millions of automotive multimedia devices
already in production.


The issue we’ve detected is related to the handling of the HID
descriptor by the kernel. According to our investigation the issue is
caused by a conflicting interpretation of the “Usage Page (Button)”
and the “Usage (Touch Screen)” feature items in the used HID
descriptor. The issue is noticed when a registered HID descriptor
contains the “Usage Page (Button)” feature item, which when parsed
later on in the kernel, leads to interpreting the device as a
mouse-like or trackpad device, ignoring the value of the “Usage (Touch
Screen)” field, and manifesting a mouse cursor. Previous versions of
the kernel correctly handle the value of the “Usage (Touch Screen)”
field and identify properly the attached touch screen device, hence
our request for fixing the issue in the future versions of the kernel
and for the affected devices already in the field.


This issue does not reproduce with а Samsung device with Android 14,
which reports kernel version 5.10.177-Android12.


HID Descriptor overview:

static const uint8_t c_descriptorArray[] = {
  0x06, 0x0D, 0x00,  // Usage Page (Digitizer)
  0x0A, 0x04, 0x00,  // Usage (Touch Screen)
  0xA1, 0x01,        // Collection (Application)
  0x06, 0x0D, 0x00,  //   Usage Page (Digitizer)
  0x0A, 0x22, 0x00,  //   Usage (Finger)
  0xA1, 0x02,        //   Collection (Logical)
  0x06, 0x01, 0x00,  //     Usage Page (Generic Desktop Ctrls)
  0x0A, 0x01, 0x00,  //     Usage (Pointer)
  0xA1, 0x00,        //     Collection (Physical)
  0x06, 0x0D, 0x00,  //       Usage Page (Digitizer)
  0x0A, 0x51, 0x00,  //       Usage (Contact ID)
  0x16, 0x00, 0x00,  //       Logical Minimum (0)
  0x26, 0x00, 0x09,  // Logical Maximum (9)
  0x95, 0x01,        //       Report Count (1)
  0x75, 0x08,        //       Report Size (8)
  0x82, 0x02, 0x00,  // Input (Data,Var,Abs,No Wrap,Linear,Preferred
State,No Null Position,Bit Field)
  0x06, 0x0D, 0x00,  //       Usage Page (Digitizer)
  0x0A, 0x42, 0x00,  //       Usage (Tip Switch)
  0x0A, 0x32, 0x00,  //       Usage (In Range)
  0x16, 0x00, 0x00,  //       Logical Minimum (0)
  0x26, 0x01, 0x00,  //       Logical Maximum (1)
  0x95, 0x02,        //       Report Count (2)
  0x75, 0x01,        //       Report Size (1)
  0x82, 0x02, 0x00,  // Input (Data,Var,Abs,No Wrap,Linear,Preferred
State,No Null Position,Bit Field)
  0x95, 0x01,        // Report Count (1)
  0x75, 0x06,        //       Report Size (6)
  0x82, 0x01, 0x00,  // Input (Const,Array,Abs,No
Wrap,Linear,Preferred State,No Null Position,Bit Field)
  0x06, 0x0D, 0x00,  //       Usage Page (Digitizer)
  0x0A, 0x30, 0x00,  //       Usage (Tip Pressure)
  0x16, 0x00, 0x00,  //       Logical Minimum (0)
  0x26, 0xFF, 0x00,  // Logical Maximum (255)
  0x95, 0x01,        // Report Count (1)
  0x75, 0x08,        //       Report Size (8)
  0x82, 0x02, 0x00,  // Input (Data,Var,Abs,No Wrap,Linear,Preferred
State,No Null Position,Bit Field)
  0x06, 0x01, 0x00,  //       Usage Page (Generic Desktop Ctrls)
  0x0A, 0x30, 0x00,  //       Usage (X)
  0x0A, 0x31, 0x00,  //       Usage (Y)
  0x16, 0x00, 0x00,  // Logical Minimum (0)
  0x26, 0x00, 0x40,  // Logical Maximum (16384)
  0x95, 0x02,        //       Report Count (2)
  0x75, 0x10,        //       Report Size (16)
  0x82, 0x02, 0x00,  //  Input (Data,Var,Abs,No Wrap,Linear,Preferred
State,No Null Position,Bit Field)
  0x06, 0x09, 0x00,  //       Usage Page (Button)
  0x1A, 0x01, 0x00,  //       Usage Minimum (0x01)
  0x2A, 0x08, 0x00,  //       Usage Maximum (0x08)
  0x16, 0x00, 0x00,  //       Logical Minimum (0)
  0x26, 0x01, 0x00,  //       Logical Maximum (1)
  0x95, 0x08,        //       Report Count (8)
  0x75, 0x01,        //       Report Size (1)
  0x82, 0x02, 0x00,  //  Input (Data,Var,Abs,No Wrap,Linear,Preferred
State,No Null Position,Bit Field)
  0xC0,              //     End Collection
  0xC0,              //   End Collection
  0xC0,              // End Collection
};

struct SHIDReport_MT
{
  uint8_t m_touchPointId;
  uint8_t m_tipSwitch;
  uint8_t m_pressure;
  uint16_t m_posX;
  uint16_t m_posY;
  uint8_t m_button;
} SHIDReport_MT_PACKED;


Thank you for your time!

Best regards,

Lyuboslav Angelov
Software developer
Abalta Technologies, Inc.
langelov@xxxxxxxxxxxxxx





[Index of Archives]     [Linux Media Devel]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Linux Wireless Networking]     [Linux Omap]

  Powered by Linux