mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
* [PATCH 1/2] HID: multitouch: add support for Goodix GXTP7863 touchpad
@ 2026-08-14 17:12 Ruzal Daminov
  2026-08-19  9:15 ` [PATCH v2] " Ruzal Daminov
                   ` (2 more replies)
  0 siblings, 3 replies; 8+ messages in thread
From: Ruzal Daminov @ 2026-08-14 17:12 UTC (permalink / raw)
  To: jikos, bentiss; +Cc: linux-input, linux-kernel, Ruzal Daminov

The Goodix GXTP7863 touchpad controller (VID: 0x27c6, PID: 0x01e0)
found on Honor MagicBook laptops (e.g. FMI-76 / X14 / X16 Plus)
was missing from the mt_devices[] table.

As a result, it was claimed by hid-generic, which erroneously mapped
the vendor telemetry collection (0xFF01) to an input node, translating
the 1-Hz heartbeat timestamp into an endless loop of phantom
KEY_BRIGHTNESSUP autorepeat events.

Add the device to mt_devices[] with MT_CLS_DEFAULT so hid-multitouch
claims the touchpad, eliminating the phantom input node.

Tested on Honor MagicBook X14 Plus (FMI-76, AMD Ryzen 8845HS).

Signed-off-by: Ruzal Daminov <daminovruzal7@gmail.com>
---
 drivers/hid/hid-multitouch.c | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/drivers/hid/hid-multitouch.c b/drivers/hid/hid-multitouch.c
index edb37b4c8..f5ddaff5c 100644
--- a/drivers/hid/hid-multitouch.c
+++ b/drivers/hid/hid-multitouch.c
@@ -2269,6 +2269,11 @@ static void mt_on_hid_hw_close(struct hid_device *hdev)
  * So there is no point in adding here any device with MT_CLS_DEFAULT.
  */
 static const struct hid_device_id mt_devices[] = {
+	/* Goodix GXTP7863 Touchpad */
+	{ .driver_data = MT_CLS_DEFAULT,
+	  HID_DEVICE(BUS_I2C, HID_GROUP_ANY,
+		     I2C_VENDOR_ID_GOODIX, I2C_DEVICE_ID_GOODIX_01E0) },
+
 
 	/* 3M panels */
 	{ .driver_data = MT_CLS_3M,
-- 
2.55.0


^ permalink raw reply	[flat|nested] 8+ messages in thread

* [PATCH v2] HID: multitouch: add support for Goodix GXTP7863 touchpad
  2026-08-14 17:12 [PATCH 1/2] HID: multitouch: add support for Goodix GXTP7863 touchpad Ruzal Daminov
@ 2026-08-19  9:15 ` Ruzal Daminov
  2026-08-19  9:39 ` [PATCH v3] " Ruzal Daminov
  2026-08-19 12:33 ` [PATCH v4] " Ruzal Daminov
  2 siblings, 0 replies; 8+ messages in thread
From: Ruzal Daminov @ 2026-08-19  9:15 UTC (permalink / raw)
  To: jikos, bentiss; +Cc: linux-input, linux-kernel, Ruzal Daminov

The Goodix GXTP7863 touchpad controller (VID: 0x27c6, PID: 0x01e0)
found on Honor MagicBook laptops (e.g. FMI-76 / X14 Plus)
was missing from the mt_devices[] table.

As a result, it was claimed by hid-generic, which erroneously mapped
the vendor telemetry collection (0xFF01) to an input node, translating
the 1-Hz heartbeat timestamp into an endless loop of phantom
KEY_BRIGHTNESSUP autorepeat events.

Add the I2C_DEVICE_ID_GOODIX_01E0 definition to hid-ids.h and add the
device to mt_devices[] with MT_CLS_WIN_8_FORCE_MULTI_INPUT_NSMU so
hid-multitouch claims the touchpad, eliminating the phantom input node.

Tested on Honor MagicBook X14 Plus (FMI-76, AMD Ryzen 8845HS).

Signed-off-by: Ruzal Daminov <daminovruzal7@gmail.com>
---
v1 -> v2:
 - Move entry to alphabetical order in the Goodix section.
 - Declare I2C_DEVICE_ID_GOODIX_01E0 in hid-ids.h instead of hardcoding.
 - Use MT_CLS_WIN_8_FORCE_MULTI_INPUT_NSMU matching sibling GT7868Q devices.

 drivers/hid/hid-ids.h        | 1 +
 drivers/hid/hid-multitouch.c | 5 +++++
 2 files changed, 6 insertions(+)

diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h
index 1059922baaacd2..60d9d524cd2e15 100644
--- a/drivers/hid/hid-ids.h
+++ b/drivers/hid/hid-ids.h
@@ -562,6 +562,7 @@
 #define USB_DEVICE_ID_GENERAL_TOUCH_WIN8_PIT_E100 0xe100
 
 #define I2C_VENDOR_ID_GOODIX		0x27c6
+#define I2C_DEVICE_ID_GOODIX_01E0	0x01e0
 #define I2C_DEVICE_ID_GOODIX_01E8	0x01e8
 #define I2C_DEVICE_ID_GOODIX_01E9	0x01e9
 #define I2C_DEVICE_ID_GOODIX_01F0	0x01f0
diff --git a/drivers/hid/hid-multitouch.c b/drivers/hid/hid-multitouch.c
index edb37b4c867e4b..ca0b40e6b8a83d 100644
--- a/drivers/hid/hid-multitouch.c
+++ b/drivers/hid/hid-multitouch.c
@@ -2460,6 +2460,11 @@ static const struct hid_device_id mt_devices[] = {
 		MT_BT_DEVICE(USB_VENDOR_ID_FRUCTEL,
 			USB_DEVICE_ID_GAMETEL_MT_MODE) },
 
+	/* Goodix GXTP7863 Touchpad */
+	{ .driver_data = MT_CLS_WIN_8_FORCE_MULTI_INPUT_NSMU,
+	  HID_DEVICE(BUS_I2C, HID_GROUP_ANY, I2C_VENDOR_ID_GOODIX,
+		     I2C_DEVICE_ID_GOODIX_01E0) },
+
 	/* Goodix GT7868Q devices */
 	{ .driver_data = MT_CLS_WIN_8_FORCE_MULTI_INPUT_NSMU,
 	  HID_DEVICE(BUS_I2C, HID_GROUP_ANY, I2C_VENDOR_ID_GOODIX,
-- 
2.45.2

^ permalink raw reply	[flat|nested] 8+ messages in thread

* [PATCH v3] HID: multitouch: add support for Goodix GXTP7863 touchpad
  2026-08-14 17:12 [PATCH 1/2] HID: multitouch: add support for Goodix GXTP7863 touchpad Ruzal Daminov
  2026-08-19  9:15 ` [PATCH v2] " Ruzal Daminov
@ 2026-08-19  9:39 ` Ruzal Daminov
  2026-08-19 12:33 ` [PATCH v4] " Ruzal Daminov
  2 siblings, 0 replies; 8+ messages in thread
From: Ruzal Daminov @ 2026-08-19  9:39 UTC (permalink / raw)
  To: jikos, bentiss; +Cc: linux-input, linux-kernel, Ruzal Daminov

The Goodix GXTP7863 touchpad controller (VID: 0x27c6, PID: 0x01e0)
found on Honor MagicBook laptops (e.g. FMI-76 / X14 Plus)
was missing from the mt_devices[] table.

As a result, it was claimed by hid-generic, which erroneously mapped
the vendor telemetry collection (0xFF01) to an input node, translating
the 1-Hz heartbeat timestamp into an endless loop of phantom
KEY_BRIGHTNESSUP autorepeat events.

Add the I2C_DEVICE_ID_GOODIX_01E0 definition to hid-ids.h and add the
device to mt_devices[] with MT_CLS_DEFAULT so hid-multitouch claims the
touchpad. Using MT_CLS_DEFAULT ensures export_all_inputs remains false
(unlike MT_CLS_WIN_8 classes), allowing mt_input_mapping() to ignore the
vendor telemetry collection (0xFF01) and eliminate the phantom input node.

Tested on Honor MagicBook X14 Plus (FMI-76, AMD Ryzen 8845HS).

Signed-off-by: Ruzal Daminov <daminovruzal7@gmail.com>
---
v2 -> v3:
 - Use MT_CLS_DEFAULT instead of MT_CLS_WIN_8_FORCE_MULTI_INPUT_NSMU
   to ensure export_all_inputs remains false, allowing mt_input_mapping()
   to ignore the vendor telemetry collection (0xFF01) and eliminate
   the phantom input node.
v1 -> v2:
 - Move entry to alphabetical order in the Goodix section.
 - Declare I2C_DEVICE_ID_GOODIX_01E0 in hid-ids.h instead of hardcoding.

 drivers/hid/hid-ids.h        | 1 +
 drivers/hid/hid-multitouch.c | 5 +++++
 2 files changed, 6 insertions(+)

diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h
index 1059922baaacd2..60d9d524cd2e15 100644
--- a/drivers/hid/hid-ids.h
+++ b/drivers/hid/hid-ids.h
@@ -562,6 +562,7 @@
 #define USB_DEVICE_ID_GENERAL_TOUCH_WIN8_PIT_E100 0xe100
 
 #define I2C_VENDOR_ID_GOODIX		0x27c6
+#define I2C_DEVICE_ID_GOODIX_01E0	0x01e0
 #define I2C_DEVICE_ID_GOODIX_01E8	0x01e8
 #define I2C_DEVICE_ID_GOODIX_01E9	0x01e9
 #define I2C_DEVICE_ID_GOODIX_01F0	0x01f0
diff --git a/drivers/hid/hid-multitouch.c b/drivers/hid/hid-multitouch.c
index edb37b4c867e4b..ca0b40e6b8a83d 100644
--- a/drivers/hid/hid-multitouch.c
+++ b/drivers/hid/hid-multitouch.c
@@ -2460,6 +2460,11 @@ static const struct hid_device_id mt_devices[] = {
 		MT_BT_DEVICE(USB_VENDOR_ID_FRUCTEL,
 			USB_DEVICE_ID_GAMETEL_MT_MODE) },
 
+	/* Goodix GXTP7863 Touchpad */
+	{ .driver_data = MT_CLS_DEFAULT,
+	  HID_DEVICE(BUS_I2C, HID_GROUP_ANY, I2C_VENDOR_ID_GOODIX,
+		     I2C_DEVICE_ID_GOODIX_01E0) },
+
 	/* Goodix GT7868Q devices */
 	{ .driver_data = MT_CLS_WIN_8_FORCE_MULTI_INPUT_NSMU,
 	  HID_DEVICE(BUS_I2C, HID_GROUP_ANY, I2C_VENDOR_ID_GOODIX,
-- 
2.45.2

^ permalink raw reply	[flat|nested] 8+ messages in thread

* [PATCH v4] HID: multitouch: add support for Goodix GXTP7863 touchpad
  2026-08-14 17:12 [PATCH 1/2] HID: multitouch: add support for Goodix GXTP7863 touchpad Ruzal Daminov
  2026-08-19  9:15 ` [PATCH v2] " Ruzal Daminov
  2026-08-19  9:39 ` [PATCH v3] " Ruzal Daminov
@ 2026-08-19 12:33 ` Ruzal Daminov
  2026-09-17  7:30   ` Benjamin Tissoires
  2 siblings, 1 reply; 8+ messages in thread
From: Ruzal Daminov @ 2026-08-19 12:33 UTC (permalink / raw)
  To: jikos, bentiss; +Cc: linux-input, linux-kernel, Ruzal Daminov

The Goodix GXTP7863 touchpad controller (VID: 0x27c6, PID: 0x01e0)
found on Honor MagicBook laptops (e.g. FMI-76 / X14 Plus)
was missing from the mt_devices[] table.

As a result, it was claimed by hid-generic, which erroneously mapped
the vendor telemetry collection (0xFF01) to an input node, translating
the 1-Hz heartbeat timestamp into an endless loop of phantom
KEY_BRIGHTNESSUP autorepeat events.

Fix this by:
 1. Adding I2C_DEVICE_ID_GOODIX_01E0 to hid-ids.h.
 2. Adding the device to mt_devices[] with MT_CLS_WIN_8 so hid-multitouch
    claims the touchpad and retains full Win8 PTP quirks.
 3. Filtering out the 0xFF01 vendor collection in mt_input_mapping()
    so the telemetry report is ignored and no phantom input node is
    created.

Tested on Honor MagicBook X14 Plus (FMI-76, AMD Ryzen 8845HS).

Signed-off-by: Ruzal Daminov <daminovruzal7@gmail.com>
---
v3 -> v4:
 - Retain MT_CLS_WIN_8 to preserve Win8 PTP quirks, while explicitly
   filtering out field->application == 0xff010001 in mt_input_mapping()
   to ignore the vendor telemetry collection.
v2 -> v3:
 - Use MT_CLS_DEFAULT to keep export_all_inputs false.
v1 -> v2:
 - Move entry to alphabetical order in the Goodix section.
 - Declare I2C_DEVICE_ID_GOODIX_01E0 in hid-ids.h.

 drivers/hid/hid-ids.h        |  1 +
 drivers/hid/hid-multitouch.c | 11 +++++++++++
 2 files changed, 12 insertions(+)

diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h
index 1059922baaacd2..60d9d524cd2e15 100644
--- a/drivers/hid/hid-ids.h
+++ b/drivers/hid/hid-ids.h
@@ -562,6 +562,7 @@
 #define USB_DEVICE_ID_GENERAL_TOUCH_WIN8_PIT_E100 0xe100
 
 #define I2C_VENDOR_ID_GOODIX		0x27c6
+#define I2C_DEVICE_ID_GOODIX_01E0	0x01e0
 #define I2C_DEVICE_ID_GOODIX_01E8	0x01e8
 #define I2C_DEVICE_ID_GOODIX_01E9	0x01e9
 #define I2C_DEVICE_ID_GOODIX_01F0	0x01f0
diff --git a/drivers/hid/hid-multitouch.c b/drivers/hid/hid-multitouch.c
index edb37b4c867e4b..d2ada08a6b01bf 100644
--- a/drivers/hid/hid-multitouch.c
+++ b/drivers/hid/hid-multitouch.c
@@ -1543,6 +1543,12 @@ static int mt_input_mapping(struct hid_device *hdev, struct hid_input *hi,
 	if (ret != 0)
 		return ret;
 
+	/* Ignore Goodix FreeTouch vendor telemetry collection */
+	if (hdev->vendor == I2C_VENDOR_ID_GOODIX &&
+	    hdev->product == I2C_DEVICE_ID_GOODIX_01E0 &&
+	    field->application == 0xff010001)
+		return -1;
+
 	/* let hid-core decide for the others */
 	return 0;
 }
@@ -2460,6 +2466,11 @@ static const struct hid_device_id mt_devices[] = {
 		MT_BT_DEVICE(USB_VENDOR_ID_FRUCTEL,
 			USB_DEVICE_ID_GAMETEL_MT_MODE) },
 
+	/* Goodix GXTP7863 Touchpad */
+	{ .driver_data = MT_CLS_WIN_8,
+	  HID_DEVICE(BUS_I2C, HID_GROUP_ANY, I2C_VENDOR_ID_GOODIX,
+		     I2C_DEVICE_ID_GOODIX_01E0) },
+
 	/* Goodix GT7868Q devices */
 	{ .driver_data = MT_CLS_WIN_8_FORCE_MULTI_INPUT_NSMU,
 	  HID_DEVICE(BUS_I2C, HID_GROUP_ANY, I2C_VENDOR_ID_GOODIX,
-- 
2.45.2

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH v4] HID: multitouch: add support for Goodix GXTP7863 touchpad
  2026-08-19 12:33 ` [PATCH v4] " Ruzal Daminov
@ 2026-09-17  7:30   ` Benjamin Tissoires
  2026-09-17 12:51     ` Ruzal
  0 siblings, 1 reply; 8+ messages in thread
From: Benjamin Tissoires @ 2026-09-17  7:30 UTC (permalink / raw)
  To: Ruzal Daminov
  Cc: jikos, linux-input, linux-kernel,
	Рузаль

Hi,

sorry it looks like this one fell through the cracks.

On Aug 19 2026, Ruzal Daminov wrote:
> The Goodix GXTP7863 touchpad controller (VID: 0x27c6, PID: 0x01e0)
> found on Honor MagicBook laptops (e.g. FMI-76 / X14 Plus)
> was missing from the mt_devices[] table.
> 
> As a result, it was claimed by hid-generic, which erroneously mapped
> the vendor telemetry collection (0xFF01) to an input node, translating
> the 1-Hz heartbeat timestamp into an endless loop of phantom
> KEY_BRIGHTNESSUP autorepeat events.
> 
> Fix this by:
>  1. Adding I2C_DEVICE_ID_GOODIX_01E0 to hid-ids.h.
>  2. Adding the device to mt_devices[] with MT_CLS_WIN_8 so hid-multitouch
>     claims the touchpad and retains full Win8 PTP quirks.
>  3. Filtering out the 0xFF01 vendor collection in mt_input_mapping()
>     so the telemetry report is ignored and no phantom input node is
>     created.

FWIW, ou should not describe exactly what the patch does in the commit
description. We can read the code :)

> 
> Tested on Honor MagicBook X14 Plus (FMI-76, AMD Ryzen 8845HS).
> 
> Signed-off-by: Ruzal Daminov <daminovruzal7@gmail.com>
> ---
> v3 -> v4:
>  - Retain MT_CLS_WIN_8 to preserve Win8 PTP quirks, while explicitly
>    filtering out field->application == 0xff010001 in mt_input_mapping()
>    to ignore the vendor telemetry collection.
> v2 -> v3:
>  - Use MT_CLS_DEFAULT to keep export_all_inputs false.
> v1 -> v2:
>  - Move entry to alphabetical order in the Goodix section.
>  - Declare I2C_DEVICE_ID_GOODIX_01E0 in hid-ids.h.
> 
>  drivers/hid/hid-ids.h        |  1 +
>  drivers/hid/hid-multitouch.c | 11 +++++++++++
>  2 files changed, 12 insertions(+)
> 
> diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h
> index 1059922baaacd2..60d9d524cd2e15 100644
> --- a/drivers/hid/hid-ids.h
> +++ b/drivers/hid/hid-ids.h
> @@ -562,6 +562,7 @@
>  #define USB_DEVICE_ID_GENERAL_TOUCH_WIN8_PIT_E100 0xe100
>  
>  #define I2C_VENDOR_ID_GOODIX		0x27c6
> +#define I2C_DEVICE_ID_GOODIX_01E0	0x01e0
>  #define I2C_DEVICE_ID_GOODIX_01E8	0x01e8
>  #define I2C_DEVICE_ID_GOODIX_01E9	0x01e9
>  #define I2C_DEVICE_ID_GOODIX_01F0	0x01f0
> diff --git a/drivers/hid/hid-multitouch.c b/drivers/hid/hid-multitouch.c
> index edb37b4c867e4b..d2ada08a6b01bf 100644
> --- a/drivers/hid/hid-multitouch.c
> +++ b/drivers/hid/hid-multitouch.c
> @@ -1543,6 +1543,12 @@ static int mt_input_mapping(struct hid_device *hdev, struct hid_input *hi,
>  	if (ret != 0)
>  		return ret;
>  
> +	/* Ignore Goodix FreeTouch vendor telemetry collection */
> +	if (hdev->vendor == I2C_VENDOR_ID_GOODIX &&
> +	    hdev->product == I2C_DEVICE_ID_GOODIX_01E0 &&
> +	    field->application == 0xff010001)
> +		return -1;
> +
>  	/* let hid-core decide for the others */
>  	return 0;
>  }
> @@ -2460,6 +2466,11 @@ static const struct hid_device_id mt_devices[] = {
>  		MT_BT_DEVICE(USB_VENDOR_ID_FRUCTEL,
>  			USB_DEVICE_ID_GAMETEL_MT_MODE) },
>  
> +	/* Goodix GXTP7863 Touchpad */
> +	{ .driver_data = MT_CLS_WIN_8,
> +	  HID_DEVICE(BUS_I2C, HID_GROUP_ANY, I2C_VENDOR_ID_GOODIX,

I'm puzzled here: HID_GROUP_ANY? How can this even be working with hid-multitouch?

Are you sure the touchpad part is not already handled by hid-multitouch, but only
the telemetry/phantom event gets assigned to hid-generic?

Can you share the report descriptors of all nodes with hid-recorder so I
can understand why we suddenly have to map to non multitouch devices.

Cheers,
Benjamin

> +		     I2C_DEVICE_ID_GOODIX_01E0) },
> +
>  	/* Goodix GT7868Q devices */
>  	{ .driver_data = MT_CLS_WIN_8_FORCE_MULTI_INPUT_NSMU,
>  	  HID_DEVICE(BUS_I2C, HID_GROUP_ANY, I2C_VENDOR_ID_GOODIX,
> -- 
> 2.45.2
> 

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH v4] HID: multitouch: add support for Goodix GXTP7863 touchpad
  2026-09-17  7:30   ` Benjamin Tissoires
@ 2026-09-17 12:51     ` Ruzal
  2026-09-18 16:18       ` Benjamin Tissoires
  0 siblings, 1 reply; 8+ messages in thread
From: Ruzal @ 2026-09-17 12:51 UTC (permalink / raw)
  To: Benjamin Tissoires; +Cc: jikos, linux-input, linux-kernel

On 9/17/26 10:30 AM, Benjamin Tissoires wrote:
> Hi,
> 
> sorry it looks like this one fell through the cracks.
> 
> On Aug 19 2026, Ruzal Daminov wrote:
>> The Goodix GXTP7863 touchpad controller (VID: 0x27c6, PID: 0x01e0)
>> found on Honor MagicBook laptops (e.g. FMI-76 / X14 Plus)
>> was missing from the mt_devices[] table.
>>
>> As a result, it was claimed by hid-generic, which erroneously mapped
>> the vendor telemetry collection (0xFF01) to an input node, translating
>> the 1-Hz heartbeat timestamp into an endless loop of phantom
>> KEY_BRIGHTNESSUP autorepeat events.
>>
>> Fix this by:
>>  1. Adding I2C_DEVICE_ID_GOODIX_01E0 to hid-ids.h.
>>  2. Adding the device to mt_devices[] with MT_CLS_WIN_8 so hid-multitouch
>>     claims the touchpad and retains full Win8 PTP quirks.
>>  3. Filtering out the 0xFF01 vendor collection in mt_input_mapping()
>>     so the telemetry report is ignored and no phantom input node is
>>     created.
> 
> FWIW, ou should not describe exactly what the patch does in the commit
> description. We can read the code :)
> 
>>
>> Tested on Honor MagicBook X14 Plus (FMI-76, AMD Ryzen 8845HS).
>>
>> Signed-off-by: Ruzal Daminov <daminovruzal7@gmail.com>
>> ---
>> v3 -> v4:
>>  - Retain MT_CLS_WIN_8 to preserve Win8 PTP quirks, while explicitly
>>    filtering out field->application == 0xff010001 in mt_input_mapping()
>>    to ignore the vendor telemetry collection.
>> v2 -> v3:
>>  - Use MT_CLS_DEFAULT to keep export_all_inputs false.
>> v1 -> v2:
>>  - Move entry to alphabetical order in the Goodix section.
>>  - Declare I2C_DEVICE_ID_GOODIX_01E0 in hid-ids.h.
>>
>>  drivers/hid/hid-ids.h        |  1 +
>>  drivers/hid/hid-multitouch.c | 11 +++++++++++
>>  2 files changed, 12 insertions(+)
>>
>> diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h
>> index 1059922baaacd2..60d9d524cd2e15 100644
>> --- a/drivers/hid/hid-ids.h
>> +++ b/drivers/hid/hid-ids.h
>> @@ -562,6 +562,7 @@
>>  #define USB_DEVICE_ID_GENERAL_TOUCH_WIN8_PIT_E100 0xe100
>>  
>>  #define I2C_VENDOR_ID_GOODIX		0x27c6
>> +#define I2C_DEVICE_ID_GOODIX_01E0	0x01e0
>>  #define I2C_DEVICE_ID_GOODIX_01E8	0x01e8
>>  #define I2C_DEVICE_ID_GOODIX_01E9	0x01e9
>>  #define I2C_DEVICE_ID_GOODIX_01F0	0x01f0
>> diff --git a/drivers/hid/hid-multitouch.c b/drivers/hid/hid-multitouch.c
>> index edb37b4c867e4b..d2ada08a6b01bf 100644
>> --- a/drivers/hid/hid-multitouch.c
>> +++ b/drivers/hid/hid-multitouch.c
>> @@ -1543,6 +1543,12 @@ static int mt_input_mapping(struct hid_device *hdev, struct hid_input *hi,
>>  	if (ret != 0)
>>  		return ret;
>>  
>> +	/* Ignore Goodix FreeTouch vendor telemetry collection */
>> +	if (hdev->vendor == I2C_VENDOR_ID_GOODIX &&
>> +	    hdev->product == I2C_DEVICE_ID_GOODIX_01E0 &&
>> +	    field->application == 0xff010001)
>> +		return -1;
>> +
>>  	/* let hid-core decide for the others */
>>  	return 0;
>>  }
>> @@ -2460,6 +2466,11 @@ static const struct hid_device_id mt_devices[] = {
>>  		MT_BT_DEVICE(USB_VENDOR_ID_FRUCTEL,
>>  			USB_DEVICE_ID_GAMETEL_MT_MODE) },
>>  
>> +	/* Goodix GXTP7863 Touchpad */
>> +	{ .driver_data = MT_CLS_WIN_8,
>> +	  HID_DEVICE(BUS_I2C, HID_GROUP_ANY, I2C_VENDOR_ID_GOODIX,
> 
> I'm puzzled here: HID_GROUP_ANY? How can this even be working with hid-multitouch?
> 
> Are you sure the touchpad part is not already handled by hid-multitouch, but only
> the telemetry/phantom event gets assigned to hid-generic?
> 
> Can you share the report descriptors of all nodes with hid-recorder so I
> can understand why we suddenly have to map to non multitouch devices.
> 
> Cheers,
> Benjamin

Hi Benjamin,

Thanks for pointing that out. You were completely right, and I apologize
for the inaccurate explanation in my previous commit messages.

I re-checked the device binding: the touchpad is indeed claimed by
hid-multitouch out of the box under HID_GROUP_MULTITOUCH_WIN_8 (using
MT_CLS_WIN_8). It was never claimed by hid-generic.

The actual root cause is that MT_CLS_WIN_8 sets `.export_all_inputs = true`.
Because of this, hid-multitouch exports the vendor application collection
(Usage Page 0xFF01, Usage 0x01, Report ID 8) to an input node.

As captured in the hid-recorder trace below, the firmware sends a 1-Hz
heartbeat packet on Report ID 8:
  E: 000000.000000 30 08 ab 00 00 2a ...
  E: 000001.006503 30 08 ab 00 00 2a ...
  E: 000002.012748 30 08 ab 00 00 2a ...

hid-input interprets these changing payload bytes as key events, resulting
in the endless KEY_BRIGHTNESSUP autorepeat loop.

So, adding the device entry with HID_GROUP_ANY to mt_devices[] is indeed
completely redundant. The only thing needed is to ignore the 0xFF01 vendor
collection so that no phantom input node is created for it.

Here is the report descriptor and event recording from hid-recorder:

# GXTP7863:00 27C6:01E0
# 0x05, 0x01,                    // Usage Page (Generic Desktop)        0
# 0x09, 0x02,                    // Usage (Mouse)                       2
# 0xa1, 0x01,                    // Collection (Application)            4
# 0x85, 0x01,                    //  Report ID (1)                      6
# 0x09, 0x01,                    //  Usage (Pointer)                    8
# 0xa1, 0x00,                    //  Collection (Physical)              10
# 0x05, 0x09,                    //   Usage Page (Button)               12
# 0x19, 0x01,                    //   Usage Minimum (1)                 14
# 0x29, 0x02,                    //   Usage Maximum (2)                 16
# 0x15, 0x00,                    //   Logical Minimum (0)               18
# 0x25, 0x01,                    //   Logical Maximum (1)               20
# 0x75, 0x01,                    //   Report Size (1)                   22
# 0x95, 0x02,                    //   Report Count (2)                  24
# 0x81, 0x02,                    //   Input (Data,Var,Abs)              26
# 0x95, 0x06,                    //   Report Count (6)                  28
# 0x81, 0x03,                    //   Input (Cnst,Var,Abs)              30
# 0x05, 0x01,                    //   Usage Page (Generic Desktop)      32
# 0x09, 0x30,                    //   Usage (X)                         34
# 0x09, 0x31,                    //   Usage (Y)                         36
# 0x09, 0x38,                    //   Usage (Wheel)                     38
# 0x15, 0x81,                    //   Logical Minimum (-127)            40
# 0x25, 0x7f,                    //   Logical Maximum (127)             42
# 0x75, 0x08,                    //   Report Size (8)                   44
# 0x95, 0x03,                    //   Report Count (3)                  46
# 0x81, 0x06,                    //   Input (Data,Var,Rel)              48
# 0x05, 0x0c,                    //   Usage Page (Consumer Devices)     50
# 0x0a, 0x38, 0x02,              //   Usage (AC Pan)                    52
# 0x95, 0x01,                    //   Report Count (1)                  55
# 0x81, 0x06,                    //   Input (Data,Var,Rel)              57
# 0x75, 0x08,                    //   Report Size (8)                   59
# 0x95, 0x03,                    //   Report Count (3)                  61
# 0x81, 0x03,                    //   Input (Cnst,Var,Abs)              63
# 0xc0,                          //  End Collection                     65
# 0xc0,                          // End Collection                      66
# 0x05, 0x0d,                    // Usage Page (Digitizers)             67
# 0x09, 0x05,                    // Usage (Touch Pad)                   69
# 0xa1, 0x01,                    // Collection (Application)            71
# 0x85, 0x04,                    //  Report ID (4)                      73
# 0x05, 0x0d,                    //  Usage Page (Digitizers)            75
# 0x09, 0x22,                    //  Usage (Finger)                     77
# 0xa1, 0x02,                    //  Collection (Logical)               79
# 0x15, 0x00,                    //   Logical Minimum (0)               81
# 0x25, 0x01,                    //   Logical Maximum (1)               83
# 0x09, 0x47,                    //   Usage (Confidence)                85
# 0x09, 0x42,                    //   Usage (Tip Switch)                87
# 0x95, 0x02,                    //   Report Count (2)                  89
# 0x75, 0x01,                    //   Report Size (1)                   91
# 0x81, 0x02,                    //   Input (Data,Var,Abs)              93
# 0x75, 0x01,                    //   Report Size (1)                   95
# 0x95, 0x02,                    //   Report Count (2)                  97
# 0x81, 0x03,                    //   Input (Cnst,Var,Abs)              99
# 0x95, 0x01,                    //   Report Count (1)                  101
# 0x75, 0x04,                    //   Report Size (4)                   103
# 0x25, 0x0f,                    //   Logical Maximum (15)              105
# 0x09, 0x51,                    //   Usage (Contact Id)                107
# 0x81, 0x02,                    //   Input (Data,Var,Abs)              109
# 0x05, 0x01,                    //   Usage Page (Generic Desktop)      111
# 0x15, 0x00,                    //   Logical Minimum (0)               113
# 0x26, 0x64, 0x0e,              //   Logical Maximum (3684)            115
# 0x75, 0x10,                    //   Report Size (16)                  118
# 0x55, 0x0e,                    //   Unit Exponent (-2)                120
# 0x65, 0x13,                    //   Unit (EnglishLinear: in)          122
# 0x09, 0x30,                    //   Usage (X)                         124
# 0x35, 0x00,                    //   Physical Minimum (0)              126
# 0x46, 0xcf, 0x01,              //   Physical Maximum (463)            128
# 0x95, 0x01,                    //   Report Count (1)                  131
# 0x81, 0x02,                    //   Input (Data,Var,Abs)              133
# 0x46, 0x12, 0x01,              //   Physical Maximum (274)            135
# 0x26, 0x80, 0x08,              //   Logical Maximum (2176)            138
# 0x09, 0x31,                    //   Usage (Y)                         141
# 0x81, 0x02,                    //   Input (Data,Var,Abs)              143
# 0xc0,                          //  End Collection                     145
# 0x05, 0x0d,                    //  Usage Page (Digitizers)            146
# 0x09, 0x22,                    //  Usage (Finger)                     148
# 0xa1, 0x02,                    //  Collection (Logical)               150
# 0x15, 0x00,                    //   Logical Minimum (0)               152
# 0x25, 0x01,                    //   Logical Maximum (1)               154
# 0x09, 0x47,                    //   Usage (Confidence)                156
# 0x09, 0x42,                    //   Usage (Tip Switch)                158
# 0x95, 0x02,                    //   Report Count (2)                  160
# 0x75, 0x01,                    //   Report Size (1)                   162
# 0x81, 0x02,                    //   Input (Data,Var,Abs)              164
# 0x75, 0x01,                    //   Report Size (1)                   166
# 0x95, 0x02,                    //   Report Count (2)                  168
# 0x81, 0x03,                    //   Input (Cnst,Var,Abs)              170
# 0x95, 0x01,                    //   Report Count (1)                  172
# 0x75, 0x04,                    //   Report Size (4)                   174
# 0x25, 0x0f,                    //   Logical Maximum (15)              176
# 0x09, 0x51,                    //   Usage (Contact Id)                178
# 0x81, 0x02,                    //   Input (Data,Var,Abs)              180
# 0x05, 0x01,                    //   Usage Page (Generic Desktop)      182
# 0x15, 0x00,                    //   Logical Minimum (0)               184
# 0x26, 0x64, 0x0e,              //   Logical Maximum (3684)            186
# 0x75, 0x10,                    //   Report Size (16)                  189
# 0x55, 0x0e,                    //   Unit Exponent (-2)                191
# 0x65, 0x13,                    //   Unit (EnglishLinear: in)          193
# 0x09, 0x30,                    //   Usage (X)                         195
# 0x35, 0x00,                    //   Physical Minimum (0)              197
# 0x46, 0xcf, 0x01,              //   Physical Maximum (463)            199
# 0x95, 0x01,                    //   Report Count (1)                  202
# 0x81, 0x02,                    //   Input (Data,Var,Abs)              204
# 0x46, 0x12, 0x01,              //   Physical Maximum (274)            206
# 0x26, 0x80, 0x08,              //   Logical Maximum (2176)            209
# 0x09, 0x31,                    //   Usage (Y)                         212
# 0x81, 0x02,                    //   Input (Data,Var,Abs)              214
# 0xc0,                          //  End Collection                     216
# 0x05, 0x0d,                    //  Usage Page (Digitizers)            217
# 0x09, 0x22,                    //  Usage (Finger)                     219
# 0xa1, 0x02,                    //  Collection (Logical)               221
# 0x15, 0x00,                    //   Logical Minimum (0)               223
# 0x25, 0x01,                    //   Logical Maximum (1)               225
# 0x09, 0x47,                    //   Usage (Confidence)                227
# 0x09, 0x42,                    //   Usage (Tip Switch)                229
# 0x95, 0x02,                    //   Report Count (2)                  231
# 0x75, 0x01,                    //   Report Size (1)                   233
# 0x81, 0x02,                    //   Input (Data,Var,Abs)              235
# 0x75, 0x01,                    //   Report Size (1)                   237
# 0x95, 0x02,                    //   Report Count (2)                  239
# 0x81, 0x03,                    //   Input (Cnst,Var,Abs)              241
# 0x95, 0x01,                    //   Report Count (1)                  243
# 0x75, 0x04,                    //   Report Size (4)                   245
# 0x25, 0x0f,                    //   Logical Maximum (15)              247
# 0x09, 0x51,                    //   Usage (Contact Id)                249
# 0x81, 0x02,                    //   Input (Data,Var,Abs)              251
# 0x05, 0x01,                    //   Usage Page (Generic Desktop)      253
# 0x15, 0x00,                    //   Logical Minimum (0)               255
# 0x26, 0x64, 0x0e,              //   Logical Maximum (3684)            257
# 0x75, 0x10,                    //   Report Size (16)                  260
# 0x55, 0x0e,                    //   Unit Exponent (-2)                262
# 0x65, 0x13,                    //   Unit (EnglishLinear: in)          264
# 0x09, 0x30,                    //   Usage (X)                         266
# 0x35, 0x00,                    //   Physical Minimum (0)              268
# 0x46, 0xcf, 0x01,              //   Physical Maximum (463)            270
# 0x95, 0x01,                    //   Report Count (1)                  273
# 0x81, 0x02,                    //   Input (Data,Var,Abs)              275
# 0x46, 0x12, 0x01,              //   Physical Maximum (274)            277
# 0x26, 0x80, 0x08,              //   Logical Maximum (2176)            280
# 0x09, 0x31,                    //   Usage (Y)                         283
# 0x81, 0x02,                    //   Input (Data,Var,Abs)              285
# 0xc0,                          //  End Collection                     287
# 0x05, 0x0d,                    //  Usage Page (Digitizers)            288
# 0x09, 0x22,                    //  Usage (Finger)                     290
# 0xa1, 0x02,                    //  Collection (Logical)               292
# 0x15, 0x00,                    //   Logical Minimum (0)               294
# 0x25, 0x01,                    //   Logical Maximum (1)               296
# 0x09, 0x47,                    //   Usage (Confidence)                298
# 0x09, 0x42,                    //   Usage (Tip Switch)                300
# 0x95, 0x02,                    //   Report Count (2)                  302
# 0x75, 0x01,                    //   Report Size (1)                   304
# 0x81, 0x02,                    //   Input (Data,Var,Abs)              306
# 0x75, 0x01,                    //   Report Size (1)                   308
# 0x95, 0x02,                    //   Report Count (2)                  310
# 0x81, 0x03,                    //   Input (Cnst,Var,Abs)              312
# 0x95, 0x01,                    //   Report Count (1)                  314
# 0x75, 0x04,                    //   Report Size (4)                   316
# 0x25, 0x0f,                    //   Logical Maximum (15)              318
# 0x09, 0x51,                    //   Usage (Contact Id)                320
# 0x81, 0x02,                    //   Input (Data,Var,Abs)              322
# 0x05, 0x01,                    //   Usage Page (Generic Desktop)      324
# 0x15, 0x00,                    //   Logical Minimum (0)               326
# 0x26, 0x64, 0x0e,              //   Logical Maximum (3684)            328
# 0x75, 0x10,                    //   Report Size (16)                  331
# 0x55, 0x0e,                    //   Unit Exponent (-2)                333
# 0x65, 0x13,                    //   Unit (EnglishLinear: in)          335
# 0x09, 0x30,                    //   Usage (X)                         337
# 0x35, 0x00,                    //   Physical Minimum (0)              339
# 0x46, 0xcf, 0x01,              //   Physical Maximum (463)            341
# 0x95, 0x01,                    //   Report Count (1)                  344
# 0x81, 0x02,                    //   Input (Data,Var,Abs)              346
# 0x46, 0x12, 0x01,              //   Physical Maximum (274)            348
# 0x26, 0x80, 0x08,              //   Logical Maximum (2176)            351
# 0x09, 0x31,                    //   Usage (Y)                         354
# 0x81, 0x02,                    //   Input (Data,Var,Abs)              356
# 0xc0,                          //  End Collection                     358
# 0x05, 0x0d,                    //  Usage Page (Digitizers)            359
# 0x09, 0x22,                    //  Usage (Finger)                     361
# 0xa1, 0x02,                    //  Collection (Logical)               363
# 0x15, 0x00,                    //   Logical Minimum (0)               365
# 0x25, 0x01,                    //   Logical Maximum (1)               367
# 0x09, 0x47,                    //   Usage (Confidence)                369
# 0x09, 0x42,                    //   Usage (Tip Switch)                371
# 0x95, 0x02,                    //   Report Count (2)                  373
# 0x75, 0x01,                    //   Report Size (1)                   375
# 0x81, 0x02,                    //   Input (Data,Var,Abs)              377
# 0x75, 0x01,                    //   Report Size (1)                   379
# 0x95, 0x02,                    //   Report Count (2)                  381
# 0x81, 0x03,                    //   Input (Cnst,Var,Abs)              383
# 0x95, 0x01,                    //   Report Count (1)                  385
# 0x75, 0x04,                    //   Report Size (4)                   387
# 0x25, 0x0f,                    //   Logical Maximum (15)              389
# 0x09, 0x51,                    //   Usage (Contact Id)                391
# 0x81, 0x02,                    //   Input (Data,Var,Abs)              393
# 0x05, 0x01,                    //   Usage Page (Generic Desktop)      395
# 0x15, 0x00,                    //   Logical Minimum (0)               397
# 0x26, 0x64, 0x0e,              //   Logical Maximum (3684)            399
# 0x75, 0x10,                    //   Report Size (16)                  402
# 0x55, 0x0e,                    //   Unit Exponent (-2)                404
# 0x65, 0x13,                    //   Unit (EnglishLinear: in)          406
# 0x09, 0x30,                    //   Usage (X)                         408
# 0x35, 0x00,                    //   Physical Minimum (0)              410
# 0x46, 0xcf, 0x01,              //   Physical Maximum (463)            412
# 0x95, 0x01,                    //   Report Count (1)                  415
# 0x81, 0x02,                    //   Input (Data,Var,Abs)              417
# 0x46, 0x12, 0x01,              //   Physical Maximum (274)            419
# 0x26, 0x80, 0x08,              //   Logical Maximum (2176)            422
# 0x09, 0x31,                    //   Usage (Y)                         425
# 0x81, 0x02,                    //   Input (Data,Var,Abs)              427
# 0xc0,                          //  End Collection                     429
# 0x05, 0x0d,                    //  Usage Page (Digitizers)            430
# 0x55, 0x0c,                    //  Unit Exponent (-4)                 432
# 0x66, 0x01, 0x10,              //  Unit (SILinear: s)                 434
# 0x47, 0xff, 0xff, 0x00, 0x00,  //  Physical Maximum (65535)           437
# 0x27, 0xff, 0xff, 0x00, 0x00,  //  Logical Maximum (65535)            442
# 0x75, 0x10,                    //  Report Size (16)                   447
# 0x95, 0x01,                    //  Report Count (1)                   449
# 0x09, 0x56,                    //  Usage (Scan Time)                  451
# 0x81, 0x02,                    //  Input (Data,Var,Abs)               453
# 0x09, 0x54,                    //  Usage (Contact Count)              455
# 0x25, 0x7f,                    //  Logical Maximum (127)              457
# 0x95, 0x01,                    //  Report Count (1)                   459
# 0x75, 0x08,                    //  Report Size (8)                    461
# 0x81, 0x02,                    //  Input (Data,Var,Abs)               463
# 0x05, 0x09,                    //  Usage Page (Button)                465
# 0x09, 0x01,                    //  Usage (Vendor Usage 0x01)          467
# 0x25, 0x01,                    //  Logical Maximum (1)                469
# 0x75, 0x01,                    //  Report Size (1)                    471
# 0x95, 0x01,                    //  Report Count (1)                   473
# 0x81, 0x02,                    //  Input (Data,Var,Abs)               475
# 0x95, 0x07,                    //  Report Count (7)                   477
# 0x81, 0x03,                    //  Input (Cnst,Var,Abs)               479
# 0x05, 0x0d,                    //  Usage Page (Digitizers)            481
# 0x85, 0x02,                    //  Report ID (2)                      483
# 0x09, 0x55,                    //  Usage (Contact Max)                485
# 0x09, 0x59,                    //  Usage (Button Type)                487
# 0x75, 0x04,                    //  Report Size (4)                    489
# 0x95, 0x02,                    //  Report Count (2)                   491
# 0x25, 0x0f,                    //  Logical Maximum (15)               493
# 0xb1, 0x02,                    //  Feature (Data,Var,Abs)             495
# 0x85, 0x07,                    //  Report ID (7)                      497
# 0x09, 0x60,                    //  Usage (Vendor Usage 0x60)          499
# 0x75, 0x01,                    //  Report Size (1)                    501
# 0x95, 0x01,                    //  Report Count (1)                   503
# 0x15, 0x00,                    //  Logical Minimum (0)                505
# 0x25, 0x01,                    //  Logical Maximum (1)                507
# 0xb1, 0x02,                    //  Feature (Data,Var,Abs)             509
# 0x95, 0x0f,                    //  Report Count (15)                  511
# 0xb1, 0x03,                    //  Feature (Cnst,Var,Abs)             513
# 0x06, 0x00, 0xff,              //  Usage Page (Vendor Defined Page 1) 515
# 0x06, 0x00, 0xff,              //  Usage Page (Vendor Defined Page 1) 518
# 0x85, 0x06,                    //  Report ID (6)                      521
# 0x09, 0xc5,                    //  Usage (Vendor Usage 0xc5)          523
# 0x15, 0x00,                    //  Logical Minimum (0)                525
# 0x26, 0xff, 0x00,              //  Logical Maximum (255)              527
# 0x75, 0x08,                    //  Report Size (8)                    530
# 0x96, 0x00, 0x01,              //  Report Count (256)                 532
# 0xb1, 0x02,                    //  Feature (Data,Var,Abs)             535
# 0x85, 0x0d,                    //  Report ID (13)                     537
# 0x09, 0xc4,                    //  Usage (Vendor Usage 0xc4)          539
# 0x15, 0x00,                    //  Logical Minimum (0)                541
# 0x26, 0xff, 0x00,              //  Logical Maximum (255)              543
# 0x75, 0x08,                    //  Report Size (8)                    546
# 0x95, 0x04,                    //  Report Count (4)                   548
# 0xb1, 0x02,                    //  Feature (Data,Var,Abs)             550
# 0x85, 0x0c,                    //  Report ID (12)                     552
# 0x09, 0xc6,                    //  Usage (Vendor Usage 0xc6)          554
# 0x96, 0xe0, 0x02,              //  Report Count (736)                 556
# 0x75, 0x08,                    //  Report Size (8)                    559
# 0xb1, 0x02,                    //  Feature (Data,Var,Abs)             561
# 0x85, 0x0b,                    //  Report ID (11)                     563
# 0x09, 0xc7,                    //  Usage (Vendor Usage 0xc7)          565
# 0x95, 0x42,                    //  Report Count (66)                  567
# 0x75, 0x08,                    //  Report Size (8)                    569
# 0xb1, 0x02,                    //  Feature (Data,Var,Abs)             571
# 0xc0,                          // End Collection                      573
# 0x05, 0x0d,                    // Usage Page (Digitizers)             574
# 0x09, 0x0e,                    // Usage (Device Configuration)        576
# 0xa1, 0x01,                    // Collection (Application)            578
# 0x85, 0x03,                    //  Report ID (3)                      580
# 0x09, 0x22,                    //  Usage (Finger)                     582
# 0xa1, 0x00,                    //  Collection (Physical)              584
# 0x09, 0x52,                    //   Usage (Inputmode)                 586
# 0x15, 0x00,                    //   Logical Minimum (0)               588
# 0x25, 0x0a,                    //   Logical Maximum (10)              590
# 0x75, 0x08,                    //   Report Size (8)                   592
# 0x95, 0x02,                    //   Report Count (2)                  594
# 0xb1, 0x02,                    //   Feature (Data,Var,Abs)            596
# 0xc0,                          //  End Collection                     598
# 0x09, 0x22,                    //  Usage (Finger)                     599
# 0xa1, 0x00,                    //  Collection (Physical)              601
# 0x85, 0x05,                    //   Report ID (5)                     603
# 0x09, 0x57,                    //   Usage (Surface Switch)            605
# 0x09, 0x58,                    //   Usage (Button Switch)             607
# 0x15, 0x00,                    //   Logical Minimum (0)               609
# 0x75, 0x01,                    //   Report Size (1)                   611
# 0x95, 0x02,                    //   Report Count (2)                  613
# 0x25, 0x03,                    //   Logical Maximum (3)               615
# 0xb1, 0x02,                    //   Feature (Data,Var,Abs)            617
# 0x95, 0x0e,                    //   Report Count (14)                 619
# 0xb1, 0x03,                    //   Feature (Cnst,Var,Abs)            621
# 0xc0,                          //  End Collection                     623
# 0xc0,                          // End Collection                      624
# 0x06, 0x01, 0xff,              // Usage Page (Vendor Usage Page 0xff01) 625
# 0x09, 0x01,                    // Usage (Vendor Usage 0x01)           628
# 0xa1, 0x01,                    // Collection (Application)            630
# 0x85, 0x08,                    //  Report ID (8)                      632
# 0x09, 0x01,                    //  Usage (Vendor Usage 0x01)          634
# 0x19, 0x00,                    //  Usage Minimum (0)                  636
# 0x29, 0xff,                    //  Usage Maximum (255)                638
# 0x15, 0x00,                    //  Logical Minimum (0)                640
# 0x25, 0xff,                    //  Logical Maximum (255)              642
# 0x95, 0x40,                    //  Report Count (64)                  644
# 0x75, 0x08,                    //  Report Size (8)                    646
# 0x91, 0x02,                    //  Output (Data,Var,Abs)              648
# 0x09, 0x01,                    //  Usage (Vendor Usage 0x01)          650
# 0x19, 0x00,                    //  Usage Minimum (0)                  652
# 0x29, 0xff,                    //  Usage Maximum (255)                654
# 0x15, 0x00,                    //  Logical Minimum (0)                656
# 0x25, 0xff,                    //  Logical Maximum (255)              658
# 0x95, 0x1d,                    //  Report Count (29)                  660
# 0x81, 0x02,                    //  Input (Data,Var,Abs)               662
# 0xc0,                          // End Collection                      664
# 0x06, 0x00, 0xff,              // Usage Page (Vendor Defined Page 1)  665
# 0x09, 0x01,                    // Usage (Vendor Usage 1)              668
# 0xa1, 0x01,                    // Collection (Application)            670
# 0x85, 0x0e,                    //  Report ID (14)                     672
# 0x09, 0x01,                    //  Usage (Vendor Usage 1)             674
# 0x19, 0x00,                    //  Usage Minimum (0)                  676
# 0x29, 0xff,                    //  Usage Maximum (255)                678
# 0x15, 0x00,                    //  Logical Minimum (0)                680
# 0x25, 0xff,                    //  Logical Maximum (255)              682
# 0x95, 0x40,                    //  Report Count (64)                  684
# 0x75, 0x08,                    //  Report Size (8)                    686
# 0x91, 0x02,                    //  Output (Data,Var,Abs)              688
# 0x09, 0x01,                    //  Usage (Vendor Usage 1)             690
# 0x19, 0x00,                    //  Usage Minimum (0)                  692
# 0x29, 0xff,                    //  Usage Maximum (255)                694
# 0x15, 0x00,                    //  Logical Minimum (0)                696
# 0x25, 0xff,                    //  Logical Maximum (255)              698
# 0x95, 0x40,                    //  Report Count (64)                  700
# 0x81, 0x02,                    //  Input (Data,Var,Abs)               702
# 0xc0,                          // End Collection                      704
# 
R: 705 05 01 09 02 a1 01 85 01 09 01 a1 00 05 09 19 01 29 02 15 00 25 01 75 01 95 02 81 02 95 06 81 03 05 01 09 30 09 31 09 38 15 81 25 7f 75 08 95 03 81 06 05 0c 0a 38 02 95 01 81 06 75 08 95 03 81 03 c0 c0 05 0d 09 05 a1 01 85 04 05 0d 09 22 a1 02 15 00 25 01 09 47 09 42 95 02 75 01 81 02 75 01 95 02 81 03 95 01 75 04 25 0f 09 51 81 02 05 01 15 00 26 64 0e 75 10 55 0e 65 13 09 30 35 00 46 cf 01 95 01 81 02 46 12 01 26 80 08 09 31 81 02 c0 05 0d 09 22 a1 02 15 00 25 01 09 47 09 42 95 02 75 01 81 02 75 01 95 02 81 03 95 01 75 04 25 0f 09 51 81 02 05 01 15 00 26 64 0e 75 10 55 0e 65 13 09 30 35 00 46 cf 01 95 01 81 02 46 12 01 26 80 08 09 31 81 02 c0 05 0d 09 22 a1 02 15 00 25 01 09 47 09 42 95 02 75 01 81 02 75 01 95 02 81 03 95 01 75 04 25 0f 09 51 81 02 05 01 15 00 26 64 0e 75 10 55 0e 65 13 09 30 35 00 46 cf 01 95 01 81 02 46 12 01 26 80 08 09 31 81 02 c0 05 0d 09 22 a1 02 15 00 25 01 09 47 09 42 95 02 75 01 81 02 75 01 95 02 81 03 95 01 75 04 25 0f 09 51 81 02 05 01 15 00 26 64 0e 75 10 55 0e 65 13 09 30 35 00 46 cf 01 95 01 81 02 46 12 01 26 80 08 09 31 81 02 c0 05 0d 09 22 a1 02 15 00 25 01 09 47 09 42 95 02 75 01 81 02 75 01 95 02 81 03 95 01 75 04 25 0f 09 51 81 02 05 01 15 00 26 64 0e 75 10 55 0e 65 13 09 30 35 00 46 cf 01 95 01 81 02 46 12 01 26 80 08 09 31 81 02 c0 05 0d 55 0c 66 01 10 47 ff ff 00 00 27 ff ff 00 00 75 10 95 01 09 56 81 02 09 54 25 7f 95 01 75 08 81 02 05 09 09 01 25 01 75 01 95 01 81 02 95 07 81 03 05 0d 85 02 09 55 09 59 75 04 95 02 25 0f b1 02 85 07 09 60 75 01 95 01 15 00 25 01 b1 02 95 0f b1 03 06 00 ff 06 00 ff 85 06 09 c5 15 00 26 ff 00 75 08 96 00 01 b1 02 85 0d 09 c4 15 00 26 ff 00 75 08 95 04 b1 02 85 0c 09 c6 96 e0 02 75 08 b1 02 85 0b 09 c7 95 42 75 08 b1 02 c0 05 0d 09 0e a1 01 85 03 09 22 a1 00 09 52 15 00 25 0a 75 08 95 02 b1 02 c0 09 22 a1 00 85 05 09 57 09 58 15 00 75 01 95 02 25 03 b1 02 95 0e b1 03 c0 c0 06 01 ff 09 01 a1 01 85 08 09 01 19 00 29 ff 15 00 25 ff 95 40 75 08 91 02 09 01 19 00 29 ff 15 00 25 ff 95 1d 81 02 c0 06 00 ff 09 01 a1 01 85 0e 09 01 19 00 29 ff 15 00 25 ff 95 40 75 08 91 02 09 01 19 00 29 ff 15 00 25 ff 95 40 81 02 c0
N: GXTP7863:00 27C6:01E0
I: 18 27c6 01e0
# ReportID: 8 / 0xff010000:  171 | 0xff010001:    0 | 0xff010002:    0 | 0xff010003:   42 | 0xff010004:   29 | 0xff010005:  209 | 0xff010006:   13 | 0xff010007:    0 | 0xff010008:    0 | 0xff010009:    3 | 0xff01000a:    3 | 0xff01000b:    0 | 0xff01000c:    0 | 0xff01000d:    0 | 0xff01000e:    0 | 0xff01000f:    0 | 0xff010010:    0 | 0xff010011:    0 | 0xff010012:    0 | 0xff010013:    0 | 0xff010014:    0 | 0xff010015:    0 | 0xff010016:    0 | 0xff010017:    0 | 0xff010018:    0 | 0xff010019:  167 | 0xff01001a:    5 | 0xff01001b:    1 | 0xff01001c:    0 
E: 000000.000000 30 08 ab 00 00 2a 1d d1 0d 00 00 03 03 00 00 00 00 00 00 00 00 00 00 00 00 00 00 a7 05 01 00
# ReportID: 8 / 0xff010000:  171 | 0xff010001:    0 | 0xff010002:    0 | 0xff010003:   42 | 0xff010004:   14 | 0xff010005:  213 | 0xff010006:   13 | 0xff010007:    0 | 0xff010008:    0 | 0xff010009:    4 | 0xff01000a:    3 | 0xff01000b:    0 | 0xff01000c:    0 | 0xff01000d:    0 | 0xff01000e:    0 | 0xff01000f:    0 | 0xff010010:    0 | 0xff010011:    0 | 0xff010012:    0 | 0xff010013:    0 | 0xff010014:    0 | 0xff010015:    0 | 0xff010016:    0 | 0xff010017:    0 | 0xff010018:    0 | 0xff010019:  167 | 0xff01001a:    5 | 0xff01001b:    1 | 0xff01001c:    0 
E: 000001.006503 30 08 ab 00 00 2a 0e d5 0d 00 00 04 03 00 00 00 00 00 00 00 00 00 00 00 00 00 00 a7 05 01 00
# ReportID: 8 / 0xff010000:  171 | 0xff010001:    0 | 0xff010002:    0 | 0xff010003:   42 | 0xff010004:  254 | 0xff010005:  216 | 0xff010006:   13 | 0xff010007:    0 | 0xff010008:    0 | 0xff010009:    5 | 0xff01000a:    3 | 0xff01000b:    0 | 0xff01000c:    0 | 0xff01000d:    0 | 0xff01000e:    0 | 0xff01000f:    0 | 0xff010010:    0 | 0xff010011:    0 | 0xff010012:    0 | 0xff010013:    0 | 0xff010014:    0 | 0xff010015:    0 | 0xff010016:    0 | 0xff010017:    0 | 0xff010018:    0 | 0xff010019:  167 | 0xff01001a:    5 | 0xff01001b:    1 | 0xff01001c:    0 
E: 000002.012748 30 08 ab 00 00 2a fe d8 0d 00 00 05 03 00 00 00 00 00 00 00 00 00 00 00 00 00 00 a7 05 01 00
# ReportID: 4 / Confidence: 1 | Tip Switch: 1 | # | Contact Id:   0 | X:   2509 | Y:   1245 
#             | Confidence: 0 | Tip Switch: 0 | # | Contact Id:   0 | X:      0 | Y:      0 
#             | Confidence: 0 | Tip Switch: 0 | # | Contact Id:   0 | X:      0 | Y:      0 
#             | Confidence: 0 | Tip Switch: 0 | # | Contact Id:   0 | X:      0 | Y:      0 
#             | Confidence: 0 | Tip Switch: 0 | # | Contact Id:   0 | X:      0 | Y:      0 | Scan Time:  56607 | Contact Count:    1 | Button: 0 | # 
E: 000002.217700 30 04 03 cd 09 dd 04 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 1f dd 01 00
# ReportID: 4 / Confidence: 1 | Tip Switch: 1 | # | Contact Id:   0 | X:   2509 | Y:   1245 
#             | Confidence: 0 | Tip Switch: 0 | # | Contact Id:   0 | X:      0 | Y:      0 
#             | Confidence: 0 | Tip Switch: 0 | # | Contact Id:   0 | X:      0 | Y:      0 
#             | Confidence: 0 | Tip Switch: 0 | # | Contact Id:   0 | X:      0 | Y:      0 
#             | Confidence: 0 | Tip Switch: 0 | # | Contact Id:   0 | X:      0 | Y:      0 | Scan Time:  56677 | Contact Count:    1 | Button: 0 | # 
E: 000002.225269 30 04 03 cd 09 dd 04 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 65 dd 01 00
# ReportID: 4 / Confidence: 1 | Tip Switch: 1 | # | Contact Id:   0 | X:   2509 | Y:   1245 
#             | Confidence: 0 | Tip Switch: 0 | # | Contact Id:   0 | X:      0 | Y:      0 
#             | Confidence: 0 | Tip Switch: 0 | # | Contact Id:   0 | X:      0 | Y:      0 
#             | Confidence: 0 | Tip Switch: 0 | # | Contact Id:   0 | X:      0 | Y:      0 
#             | Confidence: 0 | Tip Switch: 0 | # | Contact Id:   0 | X:      0 | Y:      0 | Scan Time:  56747 | Contact Count:    1 | Button: 0 | # 
E: 000002.231541 30 04 03 cd 09 dd 04 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ab dd 01 00
# ReportID: 4 / Confidence: 1 | Tip Switch: 1 | # | Contact Id:   0 | X:   2508 | Y:   1246 
#             | Confidence: 0 | Tip Switch: 0 | # | Contact Id:   0 | X:      0 | Y:      0 
#             | Confidence: 0 | Tip Switch: 0 | # | Contact Id:   0 | X:      0 | Y:      0 
#             | Confidence: 0 | Tip Switch: 0 | # | Contact Id:   0 | X:      0 | Y:      0 
#             | Confidence: 0 | Tip Switch: 0 | # | Contact Id:   0 | X:      0 | Y:      0 | Scan Time:  56817 | Contact Count:    1 | Button: 0 | # 
E: 000002.238719 30 04 03 cc 09 de 04 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 f1 dd 01 00
# ReportID: 4 / Confidence: 1 | Tip Switch: 1 | # | Contact Id:   0 | X:   2502 | Y:   1250 
#             | Confidence: 0 | Tip Switch: 0 | # | Contact Id:   0 | X:      0 | Y:      0 
#             | Confidence: 0 | Tip Switch: 0 | # | Contact Id:   0 | X:      0 | Y:      0 
#             | Confidence: 0 | Tip Switch: 0 | # | Contact Id:   0 | X:      0 | Y:      0 
#             | Confidence: 0 | Tip Switch: 0 | # | Contact Id:   0 | X:      0 | Y:      0 | Scan Time:  56887 | Contact Count:    1 | Button: 0 | # 
E: 000002.245823 30 04 03 c6 09 e2 04 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 37 de 01 00
# ReportID: 4 / Confidence: 1 | Tip Switch: 1 | # | Contact Id:   0 | X:   2492 | Y:   1258 
#             | Confidence: 0 | Tip Switch: 0 | # | Contact Id:   0 | X:      0 | Y:      0 
#             | Confidence: 0 | Tip Switch: 0 | # | Contact Id:   0 | X:      0 | Y:      0 
#             | Confidence: 0 | Tip Switch: 0 | # | Contact Id:   0 | X:      0 | Y:      0 
#             | Confidence: 0 | Tip Switch: 0 | # | Contact Id:   0 | X:      0 | Y:      0 | Scan Time:  56957 | Contact Count:    1 | Button: 0 | # 
E: 000002.252430 30 04 03 bc 09 ea 04 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 7d de 01 00
# ReportID: 4 / Confidence: 1 | Tip Switch: 1 | # | Contact Id:   0 | X:   2480 | Y:   1266 
#             | Confidence: 0 | Tip Switch: 0 | # | Contact Id:   0 | X:      0 | Y:      0 
#             | Confidence: 0 | Tip Switch: 0 | # | Contact Id:   0 | X:      0 | Y:      0 
#             | Confidence: 0 | Tip Switch: 0 | # | Contact Id:   0 | X:      0 | Y:      0 
#             | Confidence: 0 | Tip Switch: 0 | # | Contact Id:   0 | X:      0 | Y:      0 | Scan Time:  57027 | Contact Count:    1 | Button: 0 | # 
E: 000002.259483 30 04 03 b0 09 f2 04 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 c3 de 01 00
# ReportID: 4 / Confidence: 1 | Tip Switch: 1 | # | Contact Id:   0 | X:   2470 | Y:   1274 
#             | Confidence: 0 | Tip Switch: 0 | # | Contact Id:   0 | X:      0 | Y:      0 
#             | Confidence: 0 | Tip Switch: 0 | # | Contact Id:   0 | X:      0 | Y:      0 
#             | Confidence: 0 | Tip Switch: 0 | # | Contact Id:   0 | X:      0 | Y:      0 
#             | Confidence: 0 | Tip Switch: 0 | # | Contact Id:   0 | X:      0 | Y:      0 | Scan Time:  57097 | Contact Count:    1 | Button: 0 | # 
E: 000002.266476 30 04 03 a6 09 fa 04 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 09 df 01 00
# ReportID: 4 / Confidence: 1 | Tip Switch: 1 | # | Contact Id:   0 | X:   2460 | Y:   1281 
#             | Confidence: 0 | Tip Switch: 0 | # | Contact Id:   0 | X:      0 | Y:      0 
#             | Confidence: 0 | Tip Switch: 0 | # | Contact Id:   0 | X:      0 | Y:      0 
#             | Confidence: 0 | Tip Switch: 0 | # | Contact Id:   0 | X:      0 | Y:      0 
#             | Confidence: 0 | Tip Switch: 0 | # | Contact Id:   0 | X:      0 | Y:      0 | Scan Time:  57167 | Contact Count:    1 | Button: 0 | # 
E: 000002.273555 30 04 03 9c 09 01 05 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 4f df 01 00
# ReportID: 4 / Confidence: 1 | Tip Switch: 1 | # | Contact Id:   0 | X:   2449 | Y:   1288 
#             | Confidence: 0 | Tip Switch: 0 | # | Contact Id:   0 | X:      0 | Y:      0 
#             | Confidence: 0 | Tip Switch: 0 | # | Contact Id:   0 | X:      0 | Y:      0 
#             | Confidence: 0 | Tip Switch: 0 | # | Contact Id:   0 | X:      0 | Y:      0 
#             | Confidence: 0 | Tip Switch: 0 | # | Contact Id:   0 | X:      0 | Y:      0 | Scan Time:  57237 | Contact Count:    1 | Button: 0 | # 
E: 000002.280933 30 04 03 91 09 08 05 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 95 df 01 00
# ReportID: 4 / Confidence: 1 | Tip Switch: 1 | # | Contact Id:   0 | X:   2437 | Y:   1294 
#             | Confidence: 0 | Tip Switch: 0 | # | Contact Id:   0 | X:      0 | Y:      0 
#             | Confidence: 0 | Tip Switch: 0 | # | Contact Id:   0 | X:      0 | Y:      0 
#             | Confidence: 0 | Tip Switch: 0 | # | Contact Id:   0 | X:      0 | Y:      0 
#             | Confidence: 0 | Tip Switch: 0 | # | Contact Id:   0 | X:      0 | Y:      0 | Scan Time:  57307 | Contact Count:    1 | Button: 0 | # 
E: 000002.287696 30 04 03 85 09 0e 05 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 db df 01 00
# ReportID: 4 / Confidence: 1 | Tip Switch: 1 | # | Contact Id:   0 | X:   2425 | Y:   1299 
#             | Confidence: 0 | Tip Switch: 0 | # | Contact Id:   0 | X:      0 | Y:      0 
#             | Confidence: 0 | Tip Switch: 0 | # | Contact Id:   0 | X:      0 | Y:      0 
#             | Confidence: 0 | Tip Switch: 0 | # | Contact Id:   0 | X:      0 | Y:      0 
#             | Confidence: 0 | Tip Switch: 0 | # | Contact Id:   0 | X:      0 | Y:      0 | Scan Time:  57377 | Contact Count:    1 | Button: 0 | # 
E: 000002.294963 30 04 03 79 09 13 05 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 21 e0 01 00
# ReportID: 4 / Confidence: 1 | Tip Switch: 1 | # | Contact Id:   0 | X:   2412 | Y:   1303 
#             | Confidence: 0 | Tip Switch: 0 | # | Contact Id:   0 | X:      0 | Y:      0 
#             | Confidence: 0 | Tip Switch: 0 | # | Contact Id:   0 | X:      0 | Y:      0 
#             | Confidence: 0 | Tip Switch: 0 | # | Contact Id:   0 | X:      0 | Y:      0 
#             | Confidence: 0 | Tip Switch: 0 | # | Contact Id:   0 | X:      0 | Y:      0 | Scan Time:  57447 | Contact Count:    1 | Button: 0 | # 
E: 000002.301663 30 04 03 6c 09 17 05 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 67 e0 01 00
# ReportID: 4 / Confidence: 1 | Tip Switch: 1 | # | Contact Id:   0 | X:   2400 | Y:   1305 
#             | Confidence: 0 | Tip Switch: 0 | # | Contact Id:   0 | X:      0 | Y:      0 
#             | Confidence: 0 | Tip Switch: 0 | # | Contact Id:   0 | X:      0 | Y:      0 
#             | Confidence: 0 | Tip Switch: 0 | # | Contact Id:   0 | X:      0 | Y:      0 
#             | Confidence: 0 | Tip Switch: 0 | # | Contact Id:   0 | X:      0 | Y:      0 | Scan Time:  57517 | Contact Count:    1 | Button: 0 | # 
E: 000002.309095 30 04 03 60 09 19 05 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ad e0 01 00
# ReportID: 4 / Confidence: 1 | Tip Switch: 1 | # | Contact Id:   0 | X:   2387 | Y:   1306 
#             | Confidence: 0 | Tip Switch: 0 | # | Contact Id:   0 | X:      0 | Y:      0 
#             | Confidence: 0 | Tip Switch: 0 | # | Contact Id:   0 | X:      0 | Y:      0 
#             | Confidence: 0 | Tip Switch: 0 | # | Contact Id:   0 | X:      0 | Y:      0 
#             | Confidence: 0 | Tip Switch: 0 | # | Contact Id:   0 | X:      0 | Y:      0 | Scan Time:  57587 | Contact Count:    1 | Button: 0 | # 
E: 000002.315699 30 04 03 53 09 1a 05 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 f3 e0 01 00
# ReportID: 4 / Confidence: 1 | Tip Switch: 1 | # | Contact Id:   0 | X:   2375 | Y:   1307 
#             | Confidence: 0 | Tip Switch: 0 | # | Contact Id:   0 | X:      0 | Y:      0 
#             | Confidence: 0 | Tip Switch: 0 | # | Contact Id:   0 | X:      0 | Y:      0 
#             | Confidence: 0 | Tip Switch: 0 | # | Contact Id:   0 | X:      0 | Y:      0 
#             | Confidence: 0 | Tip Switch: 0 | # | Contact Id:   0 | X:      0 | Y:      0 | Scan Time:  57657 | Contact Count:    1 | Button: 0 | # 
E: 000002.322504 30 04 03 47 09 1b 05 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 39 e1 01 00
# ReportID: 4 / Confidence: 1 | Tip Switch: 1 | # | Contact Id:   0 | X:   2363 | Y:   1307 
#             | Confidence: 0 | Tip Switch: 0 | # | Contact Id:   0 | X:      0 | Y:      0 
#             | Confidence: 0 | Tip Switch: 0 | # | Contact Id:   0 | X:      0 | Y:      0 
#             | Confidence: 0 | Tip Switch: 0 | # | Contact Id:   0 | X:      0 | Y:      0 
#             | Confidence: 0 | Tip Switch: 0 | # | Contact Id:   0 | X:      0 | Y:      0 | Scan Time:  57727 | Contact Count:    1 | Button: 0 | # 
E: 000002.330075 30 04 03 3b 09 1b 05 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 7f e1 01 00
# ReportID: 4 / Confidence: 1 | Tip Switch: 1 | # | Contact Id:   0 | X:   2352 | Y:   1307 
#             | Confidence: 0 | Tip Switch: 0 | # | Contact Id:   0 | X:      0 | Y:      0 
#             | Confidence: 0 | Tip Switch: 0 | # | Contact Id:   0 | X:      0 | Y:      0 
#             | Confidence: 0 | Tip Switch: 0 | # | Contact Id:   0 | X:      0 | Y:      0 
#             | Confidence: 0 | Tip Switch: 0 | # | Contact Id:   0 | X:      0 | Y:      0 | Scan Time:  57797 | Contact Count:    1 | Button: 0 | # 
E: 000002.336411 30 04 03 30 09 1b 05 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 c5 e1 01 00
# ReportID: 4 / Confidence: 1 | Tip Switch: 1 | # | Contact Id:   0 | X:   2341 | Y:   1306 
#             | Confidence: 0 | Tip Switch: 0 | # | Contact Id:   0 | X:      0 | Y:      0 
#             | Confidence: 0 | Tip Switch: 0 | # | Contact Id:   0 | X:      0 | Y:      0 
#             | Confidence: 0 | Tip Switch: 0 | # | Contact Id:   0 | X:      0 | Y:      0 
#             | Confidence: 0 | Tip Switch: 0 | # | Contact Id:   0 | X:      0 | Y:      0 | Scan Time:  57867 | Contact Count:    1 | Button: 0 | # 
E: 000002.343664 30 04 03 25 09 1a 05 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0b e2 01 00
# ReportID: 4 / Confidence: 1 | Tip Switch: 1 | # | Contact Id:   0 | X:   2330 | Y:   1305 
#             | Confidence: 0 | Tip Switch: 0 | # | Contact Id:   0 | X:      0 | Y:      0 
#             | Confidence: 0 | Tip Switch: 0 | # | Contact Id:   0 | X:      0 | Y:      0 
#             | Confidence: 0 | Tip Switch: 0 | # | Contact Id:   0 | X:      0 | Y:      0 
#             | Confidence: 0 | Tip Switch: 0 | # | Contact Id:   0 | X:      0 | Y:      0 | Scan Time:  57937 | Contact Count:    1 | Button: 0 | # 
E: 000002.350659 30 04 03 1a 09 19 05 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 51 e2 01 00
# ReportID: 4 / Confidence: 1 | Tip Switch: 1 | # | Contact Id:   0 | X:   2318 | Y:   1304 
#             | Confidence: 0 | Tip Switch: 0 | # | Contact Id:   0 | X:      0 | Y:      0 
#             | Confidence: 0 | Tip Switch: 0 | # | Contact Id:   0 | X:      0 | Y:      0 
#             | Confidence: 0 | Tip Switch: 0 | # | Contact Id:   0 | X:      0 | Y:      0 
#             | Confidence: 0 | Tip Switch: 0 | # | Contact Id:   0 | X:      0 | Y:      0 | Scan Time:  58007 | Contact Count:    1 | Button: 0 | # 
E: 000002.358279 30 04 03 0e 09 18 05 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 97 e2 01 00
# ReportID: 4 / Confidence: 1 | Tip Switch: 1 | # | Contact Id:   0 | X:   2306 | Y:   1301 
#             | Confidence: 0 | Tip Switch: 0 | # | Contact Id:   0 | X:      0 | Y:      0 
#             | Confidence: 0 | Tip Switch: 0 | # | Contact Id:   0 | X:      0 | Y:      0 
#             | Confidence: 0 | Tip Switch: 0 | # | Contact Id:   0 | X:      0 | Y:      0 
#             | Confidence: 0 | Tip Switch: 0 | # | Contact Id:   0 | X:      0 | Y:      0 | Scan Time:  58077 | Contact Count:    1 | Button: 0 | # 
E: 000002.364759 30 04 03 02 09 15 05 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 dd e2 01 00
# ReportID: 4 / Confidence: 1 | Tip Switch: 1 | # | Contact Id:   0 | X:   2293 | Y:   1299 
#             | Confidence: 0 | Tip Switch: 0 | # | Contact Id:   0 | X:      0 | Y:      0 
#             | Confidence: 0 | Tip Switch: 0 | # | Contact Id:   0 | X:      0 | Y:      0 
#             | Confidence: 0 | Tip Switch: 0 | # | Contact Id:   0 | X:      0 | Y:      0 
#             | Confidence: 0 | Tip Switch: 0 | # | Contact Id:   0 | X:      0 | Y:      0 | Scan Time:  58147 | Contact Count:    1 | Button: 0 | # 
E: 000002.371791 30 04 03 f5 08 13 05 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 23 e3 01 00
# ReportID: 4 / Confidence: 1 | Tip Switch: 1 | # | Contact Id:   0 | X:   2280 | Y:   1296 
#             | Confidence: 0 | Tip Switch: 0 | # | Contact Id:   0 | X:      0 | Y:      0 
#             | Confidence: 0 | Tip Switch: 0 | # | Contact Id:   0 | X:      0 | Y:      0 
#             | Confidence: 0 | Tip Switch: 0 | # | Contact Id:   0 | X:      0 | Y:      0 
#             | Confidence: 0 | Tip Switch: 0 | # | Contact Id:   0 | X:      0 | Y:      0 | Scan Time:  58217 | Contact Count:    1 | Button: 0 | # 
E: 000002.379503 30 04 03 e8 08 10 05 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 69 e3 01 00
# ReportID: 4 / Confidence: 1 | Tip Switch: 1 | # | Contact Id:   0 | X:   2266 | Y:   1292 
#             | Confidence: 0 | Tip Switch: 0 | # | Contact Id:   0 | X:      0 | Y:      0 
#             | Confidence: 0 | Tip Switch: 0 | # | Contact Id:   0 | X:      0 | Y:      0 
#             | Confidence: 0 | Tip Switch: 0 | # | Contact Id:   0 | X:      0 | Y:      0 
#             | Confidence: 0 | Tip Switch: 0 | # | Contact Id:   0 | X:      0 | Y:      0 | Scan Time:  58287 | Contact Count:    1 | Button: 0 | # 
E: 000002.385506 30 04 03 da 08 0c 05 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 af e3 01 00
# ReportID: 4 / Confidence: 1 | Tip Switch: 1 | # | Contact Id:   0 | X:   2253 | Y:   1289 
#             | Confidence: 0 | Tip Switch: 0 | # | Contact Id:   0 | X:      0 | Y:      0 
#             | Confidence: 0 | Tip Switch: 0 | # | Contact Id:   0 | X:      0 | Y:      0 
#             | Confidence: 0 | Tip Switch: 0 | # | Contact Id:   0 | X:      0 | Y:      0 
#             | Confidence: 0 | Tip Switch: 0 | # | Contact Id:   0 | X:      0 | Y:      0 | Scan Time:  58357 | Contact Count:    1 | Button: 0 | # 
E: 000002.392920 30 04 03 cd 08 09 05 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 f5 e3 01 00
# ReportID: 4 / Confidence: 1 | Tip Switch: 1 | # | Contact Id:   0 | X:   2239 | Y:   1286 
#             | Confidence: 0 | Tip Switch: 0 | # | Contact Id:   0 | X:      0 | Y:      0 
#             | Confidence: 0 | Tip Switch: 0 | # | Contact Id:   0 | X:      0 | Y:      0 
#             | Confidence: 0 | Tip Switch: 0 | # | Contact Id:   0 | X:      0 | Y:      0 
#             | Confidence: 0 | Tip Switch: 0 | # | Contact Id:   0 | X:      0 | Y:      0 | Scan Time:  58427 | Contact Count:    1 | Button: 0 | # 
E: 000002.399353 30 04 03 bf 08 06 05 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 3b e4 01 00
# ReportID: 4 / Confidence: 1 | Tip Switch: 1 | # | Contact Id:   0 | X:   2225 | Y:   1283 
#             | Confidence: 0 | Tip Switch: 0 | # | Contact Id:   0 | X:      0 | Y:      0 
#             | Confidence: 0 | Tip Switch: 0 | # | Contact Id:   0 | X:      0 | Y:      0 
#             | Confidence: 0 | Tip Switch: 0 | # | Contact Id:   0 | X:      0 | Y:      0 
#             | Confidence: 0 | Tip Switch: 0 | # | Contact Id:   0 | X:      0 | Y:      0 | Scan Time:  58497 | Contact Count:    1 | Button: 0 | # 
E: 000002.406125 30 04 03 b1 08 03 05 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 81 e4 01 00
# ReportID: 4 / Confidence: 1 | Tip Switch: 1 | # | Contact Id:   0 | X:   2212 | Y:   1280 
#             | Confidence: 0 | Tip Switch: 0 | # | Contact Id:   0 | X:      0 | Y:      0 
#             | Confidence: 0 | Tip Switch: 0 | # | Contact Id:   0 | X:      0 | Y:      0 
#             | Confidence: 0 | Tip Switch: 0 | # | Contact Id:   0 | X:      0 | Y:      0 
#             | Confidence: 0 | Tip Switch: 0 | # | Contact Id:   0 | X:      0 | Y:      0 | Scan Time:  58567 | Contact Count:    1 | Button: 0 | # 
E: 000002.413540 30 04 03 a4 08 00 05 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 c7 e4 01 00
# ReportID: 4 / Confidence: 1 | Tip Switch: 1 | # | Contact Id:   0 | X:   2200 | Y:   1278 
#             | Confidence: 0 | Tip Switch: 0 | # | Contact Id:   0 | X:      0 | Y:      0 
#             | Confidence: 0 | Tip Switch: 0 | # | Contact Id:   0 | X:      0 | Y:      0 
#             | Confidence: 0 | Tip Switch: 0 | # | Contact Id:   0 | X:      0 | Y:      0 
#             | Confidence: 0 | Tip Switch: 0 | # | Contact Id:   0 | X:      0 | Y:      0 | Scan Time:  58637 | Contact Count:    1 | Button: 0 | # 
E: 000002.420403 30 04 03 98 08 fe 04 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0d e5 01 00

Would you prefer handling this by simply dropping the 0xff010001 collection
in mt_input_mapping() in hid-multitouch, or should this device quirk be
implemented via HID-BPF instead?

Best regards,
Ruzal


^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH v4] HID: multitouch: add support for Goodix GXTP7863 touchpad
  2026-09-17 12:51     ` Ruzal
@ 2026-09-18 16:18       ` Benjamin Tissoires
  2026-09-18 18:01         ` Ruzal
  0 siblings, 1 reply; 8+ messages in thread
From: Benjamin Tissoires @ 2026-09-18 16:18 UTC (permalink / raw)
  To: Ruzal; +Cc: jikos, linux-input, linux-kernel

On Sep 17 2026, Ruzal wrote:
> On 9/17/26 10:30 AM, Benjamin Tissoires wrote:
> > Hi,
> > 
> > sorry it looks like this one fell through the cracks.
> > 
> > On Aug 19 2026, Ruzal Daminov wrote:
> >> The Goodix GXTP7863 touchpad controller (VID: 0x27c6, PID: 0x01e0)
> >> found on Honor MagicBook laptops (e.g. FMI-76 / X14 Plus)
> >> was missing from the mt_devices[] table.
> >>
[...]
> >>  
> >> +	/* Goodix GXTP7863 Touchpad */
> >> +	{ .driver_data = MT_CLS_WIN_8,
> >> +	  HID_DEVICE(BUS_I2C, HID_GROUP_ANY, I2C_VENDOR_ID_GOODIX,
> > 
> > I'm puzzled here: HID_GROUP_ANY? How can this even be working with hid-multitouch?
> > 
> > Are you sure the touchpad part is not already handled by hid-multitouch, but only
> > the telemetry/phantom event gets assigned to hid-generic?
> > 
> > Can you share the report descriptors of all nodes with hid-recorder so I
> > can understand why we suddenly have to map to non multitouch devices.
> > 
> > Cheers,
> > Benjamin
> 
> Hi Benjamin,
> 
> Thanks for pointing that out. You were completely right, and I apologize
> for the inaccurate explanation in my previous commit messages.

no need to apologize, we can make mistakes, and that's our job as
maintainers to catch them :)

> 
> I re-checked the device binding: the touchpad is indeed claimed by
> hid-multitouch out of the box under HID_GROUP_MULTITOUCH_WIN_8 (using
> MT_CLS_WIN_8). It was never claimed by hid-generic.

Well, I guess it was the first time you started the laptop, until
hid-multitouch gets loaded.

> 
> The actual root cause is that MT_CLS_WIN_8 sets `.export_all_inputs = true`.
> Because of this, hid-multitouch exports the vendor application collection
> (Usage Page 0xFF01, Usage 0x01, Report ID 8) to an input node.

Actually, it's even worse than that.

Because some vendors are not using standard HID usages, we do have a
`HID_UP_HPVENDOR2` definition of (Usage Page 0xFF01). And hid-input.c
considers that this is only used by HP laptops/keyboards, and then we
have some fancy mapping of non standard usages.

The real fix would be to actually ensure this mapping is only triggered
for:
- keyboards
- HP platforms

But, there is always a but, `HID_UP_HPVENDOR` was there since the origin
of time (git conversion IIRC), and `HID_UP_HPVENDOR2` appeared in 2012.

We do have some info on the affected devices (VID/PID) but nothing else
like the report descriptor. So it's the typical case of "damn, we can't
fix this without possibly regressing a lot of existing hardware".

> 
> As captured in the hid-recorder trace below, the firmware sends a 1-Hz
> heartbeat packet on Report ID 8:
>   E: 000000.000000 30 08 ab 00 00 2a ...
>   E: 000001.006503 30 08 ab 00 00 2a ...
>   E: 000002.012748 30 08 ab 00 00 2a ...
> 
> hid-input interprets these changing payload bytes as key events, resulting
> in the endless KEY_BRIGHTNESSUP autorepeat loop.
> 
> So, adding the device entry with HID_GROUP_ANY to mt_devices[] is indeed
> completely redundant. The only thing needed is to ignore the 0xFF01 vendor
> collection so that no phantom input node is created for it.
> 
> Here is the report descriptor and event recording from hid-recorder:
> 
> # GXTP7863:00 27C6:01E0
> # 0x05, 0x01,                    // Usage Page (Generic Desktop)        0
> # 0x09, 0x02,                    // Usage (Mouse)                       2
[...]
> # 0xc0,                          // End Collection                      624
> # 0x06, 0x01, 0xff,              // Usage Page (Vendor Usage Page 0xff01) 625
> # 0x09, 0x01,                    // Usage (Vendor Usage 0x01)           628
> # 0xa1, 0x01,                    // Collection (Application)            630
> # 0x85, 0x08,                    //  Report ID (8)                      632
> # 0x09, 0x01,                    //  Usage (Vendor Usage 0x01)          634
> # 0x19, 0x00,                    //  Usage Minimum (0)                  636
> # 0x29, 0xff,                    //  Usage Maximum (255)                638
> # 0x15, 0x00,                    //  Logical Minimum (0)                640
> # 0x25, 0xff,                    //  Logical Maximum (255)              642
> # 0x95, 0x40,                    //  Report Count (64)                  644
> # 0x75, 0x08,                    //  Report Size (8)                    646
> # 0x91, 0x02,                    //  Output (Data,Var,Abs)              648
> # 0x09, 0x01,                    //  Usage (Vendor Usage 0x01)          650
> # 0x19, 0x00,                    //  Usage Minimum (0)                  652

Technically, we could simply convert these 0x01 and 0x00 into 0x05 and
this would make the mapping ignored by hid-input.c

However, when changing those bytes in the hid-recorder output and
replaying the device this creates a 10 seconds freeze on my desktop
because some component is not happy about the empty input node it creates.

I'm trying to investigate what is going on, without much success. I'll
continue working on it on Monday.

> # 0x29, 0xff,                    //  Usage Maximum (255)                654
> # 0x15, 0x00,                    //  Logical Minimum (0)                656
> # 0x25, 0xff,                    //  Logical Maximum (255)              658
> # 0x95, 0x1d,                    //  Report Count (29)                  660
> # 0x81, 0x02,                    //  Input (Data,Var,Abs)               662
> # 0xc0,                          // End Collection                      664
[...]
> 
> Would you prefer handling this by simply dropping the 0xff010001 collection
> in mt_input_mapping() in hid-multitouch, or should this device quirk be
> implemented via HID-BPF instead?

So:
- mt_input_mapping() in hid-multitouch -> probably not. Having such
  quirk in the hid-multitouch code would be better handled with a proper
  quirk, not a random check in mt_input_mapping().
- HID-BPF: so far, if it weren't for that 10s freeze, I would have said
  yes, go for it. But right now there is something fishy in the code
  that creates empty input devices that are not properly cleaned up by
  hid-input and that messes up userspace.
 
Ideally we should fix the generic mapping, but that has a strong chance
of regressing existing HW, which is a PITA.

And to add to the bucket, when replaying your device, I see that fwupd
is trying to communicate with the device, so we should be sure to not
break this as well :(

Hopefully I'll have a better understanding next week.

Cheers,
Benjamin

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH v4] HID: multitouch: add support for Goodix GXTP7863 touchpad
  2026-09-18 16:18       ` Benjamin Tissoires
@ 2026-09-18 18:01         ` Ruzal
  0 siblings, 0 replies; 8+ messages in thread
From: Ruzal @ 2026-09-18 18:01 UTC (permalink / raw)
  To: Benjamin Tissoires; +Cc: jikos, linux-input, linux-kernel

On 9/18/26 7:18 PM, Benjamin Tissoires wrote:

> On Sep 17 2026, Ruzal wrote:
>> On 9/17/26 10:30 AM, Benjamin Tissoires wrote:
>>> Hi,
>>>
>>> sorry it looks like this one fell through the cracks.
>>>
>>> On Aug 19 2026, Ruzal Daminov wrote:
>>>> The Goodix GXTP7863 touchpad controller (VID: 0x27c6, PID: 0x01e0)
>>>> found on Honor MagicBook laptops (e.g. FMI-76 / X14 Plus)
>>>> was missing from the mt_devices[] table.
>>>>
> [...]
>>>>  
>>>> +	/* Goodix GXTP7863 Touchpad */
>>>> +	{ .driver_data = MT_CLS_WIN_8,
>>>> +	  HID_DEVICE(BUS_I2C, HID_GROUP_ANY, I2C_VENDOR_ID_GOODIX,
>>> I'm puzzled here: HID_GROUP_ANY? How can this even be working with hid-multitouch?
>>>
>>> Are you sure the touchpad part is not already handled by hid-multitouch, but only
>>> the telemetry/phantom event gets assigned to hid-generic?
>>>
>>> Can you share the report descriptors of all nodes with hid-recorder so I
>>> can understand why we suddenly have to map to non multitouch devices.
>>>
>>> Cheers,
>>> Benjamin
>> Hi Benjamin,
>>
>> Thanks for pointing that out. You were completely right, and I apologize
>> for the inaccurate explanation in my previous commit messages.
> no need to apologize, we can make mistakes, and that's our job as
> maintainers to catch them :)
>
>> I re-checked the device binding: the touchpad is indeed claimed by
>> hid-multitouch out of the box under HID_GROUP_MULTITOUCH_WIN_8 (using
>> MT_CLS_WIN_8). It was never claimed by hid-generic.
> Well, I guess it was the first time you started the laptop, until
> hid-multitouch gets loaded.
>
>> The actual root cause is that MT_CLS_WIN_8 sets `.export_all_inputs = true`.
>> Because of this, hid-multitouch exports the vendor application collection
>> (Usage Page 0xFF01, Usage 0x01, Report ID 8) to an input node.
> Actually, it's even worse than that.
>
> Because some vendors are not using standard HID usages, we do have a
> `HID_UP_HPVENDOR2` definition of (Usage Page 0xFF01). And hid-input.c
> considers that this is only used by HP laptops/keyboards, and then we
> have some fancy mapping of non standard usages.
>
> The real fix would be to actually ensure this mapping is only triggered
> for:
> - keyboards
> - HP platforms
>
> But, there is always a but, `HID_UP_HPVENDOR` was there since the origin
> of time (git conversion IIRC), and `HID_UP_HPVENDOR2` appeared in 2012.
>
> We do have some info on the affected devices (VID/PID) but nothing else
> like the report descriptor. So it's the typical case of "damn, we can't
> fix this without possibly regressing a lot of existing hardware".
>
>> As captured in the hid-recorder trace below, the firmware sends a 1-Hz
>> heartbeat packet on Report ID 8:
>>   E: 000000.000000 30 08 ab 00 00 2a ...
>>   E: 000001.006503 30 08 ab 00 00 2a ...
>>   E: 000002.012748 30 08 ab 00 00 2a ...
>>
>> hid-input interprets these changing payload bytes as key events, resulting
>> in the endless KEY_BRIGHTNESSUP autorepeat loop.
>>
>> So, adding the device entry with HID_GROUP_ANY to mt_devices[] is indeed
>> completely redundant. The only thing needed is to ignore the 0xFF01 vendor
>> collection so that no phantom input node is created for it.
>>
>> Here is the report descriptor and event recording from hid-recorder:
>>
>> # GXTP7863:00 27C6:01E0
>> # 0x05, 0x01,                    // Usage Page (Generic Desktop)        0
>> # 0x09, 0x02,                    // Usage (Mouse)                       2
> [...]
>> # 0xc0,                          // End Collection                      624
>> # 0x06, 0x01, 0xff,              // Usage Page (Vendor Usage Page 0xff01) 625
>> # 0x09, 0x01,                    // Usage (Vendor Usage 0x01)           628
>> # 0xa1, 0x01,                    // Collection (Application)            630
>> # 0x85, 0x08,                    //  Report ID (8)                      632
>> # 0x09, 0x01,                    //  Usage (Vendor Usage 0x01)          634
>> # 0x19, 0x00,                    //  Usage Minimum (0)                  636
>> # 0x29, 0xff,                    //  Usage Maximum (255)                638
>> # 0x15, 0x00,                    //  Logical Minimum (0)                640
>> # 0x25, 0xff,                    //  Logical Maximum (255)              642
>> # 0x95, 0x40,                    //  Report Count (64)                  644
>> # 0x75, 0x08,                    //  Report Size (8)                    646
>> # 0x91, 0x02,                    //  Output (Data,Var,Abs)              648
>> # 0x09, 0x01,                    //  Usage (Vendor Usage 0x01)          650
>> # 0x19, 0x00,                    //  Usage Minimum (0)                  652
> Technically, we could simply convert these 0x01 and 0x00 into 0x05 and
> this would make the mapping ignored by hid-input.c
>
> However, when changing those bytes in the hid-recorder output and
> replaying the device this creates a 10 seconds freeze on my desktop
> because some component is not happy about the empty input node it creates.
>
> I'm trying to investigate what is going on, without much success. I'll
> continue working on it on Monday.
>
>> # 0x29, 0xff,                    //  Usage Maximum (255)                654
>> # 0x15, 0x00,                    //  Logical Minimum (0)                656
>> # 0x25, 0xff,                    //  Logical Maximum (255)              658
>> # 0x95, 0x1d,                    //  Report Count (29)                  660
>> # 0x81, 0x02,                    //  Input (Data,Var,Abs)               662
>> # 0xc0,                          // End Collection                      664
> [...]
>> Would you prefer handling this by simply dropping the 0xff010001 collection
>> in mt_input_mapping() in hid-multitouch, or should this device quirk be
>> implemented via HID-BPF instead?
> So:
> - mt_input_mapping() in hid-multitouch -> probably not. Having such
>   quirk in the hid-multitouch code would be better handled with a proper
>   quirk, not a random check in mt_input_mapping().
> - HID-BPF: so far, if it weren't for that 10s freeze, I would have said
>   yes, go for it. But right now there is something fishy in the code
>   that creates empty input devices that are not properly cleaned up by
>   hid-input and that messes up userspace.
>  
> Ideally we should fix the generic mapping, but that has a strong chance
> of regressing existing HW, which is a PITA.
>
> And to add to the bucket, when replaying your device, I see that fwupd
> is trying to communicate with the device, so we should be sure to not
> break this as well :(
>
> Hopefully I'll have a better understanding next week.
>
> Cheers,
> Benjamin
Hi Benjamin,

I did some testing to investigate the freeze you
experienced.

I tried two different descriptor modifications to see how userspace reacts:

1. Test A (Your approach: changing Usage Page 0xFF01 to 0xFF05):
   Changing the usage page indeed strips the keyboard keys
   (KEY_BRIGHTNESSUP/DOWN disappear), but hid-input still registers the
   third input node ("GXTP7863:00 27C6:01E0 UNKNOWN").

   Checking /proc/bus/input/devices during the replay shows that this node
   is created with an anomalous capability set:
     N: Name="GXTP7863:00 27C6:01E0 UNKNOWN"
     H: Handlers=event15
     B: PROP=0
     B: EV=9 (EV_SYN | EV_ABS)
     B: ABS=10000000000 (ABS_MISC only, zero keys, no X/Y axes)

   This triggered the desktop freeze for ~15 seconds until the timeout
   expired and the system recovered.

2. Test B (Changing the 29-byte payload to Constant/Padding):
   I also tried keeping the original Usage Page 0xFF01 but changing
   `Input (Data,Var,Abs)` (0x81, 0x02) to `Input (Cnst,Var,Abs)` (0x81, 0x03)
   in Report ID 8, hoping hid-input would ignore the fields.

   Running `libinput debug-events` during this test captured the exact
   watchdog trace during the stall:
     event13  DEVICE_ADDED                 GXTP7863:00 27C6:01E0 Mouse
     client bug: timer event6 keyboard: scheduled expiry is in the past (-14747ms), your system is too slow
     client bug: timer event6 hold: scheduled expiry is in the past (-14396ms), your system is too slow
     client bug: timer event6 hold: scheduled expiry is in the past (-14389ms), your system is too slow
     client bug: timer event6 hold: scheduled expiry is in the past (-14369ms), your system is too slow
     event14  DEVICE_ADDED                 GXTP7863:00 27C6:01E0 Touchpad

   libinput explicitly confirms that the compositor's event loop was
   completely blocked for 14,747 ms (~15 seconds) during enumeration.
   Notice that the third node (UNKNOWN) is never even announced as
   DEVICE_ADDED.

Conclusion:
Both descriptor-level approaches confirm what you suspected: modifying the
descriptor still leaves the application collection instantiated as an empty/
broken input node, which trips up libinput and blocks the compositor event
loop for ~15 seconds.

Hope this empirical data helps you track down the hid-input cleanup issue on
Monday!

Cheers,
Ruzal

^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2026-09-18 18:01 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2026-08-14 17:12 [PATCH 1/2] HID: multitouch: add support for Goodix GXTP7863 touchpad Ruzal Daminov
2026-08-19  9:15 ` [PATCH v2] " Ruzal Daminov
2026-08-19  9:39 ` [PATCH v3] " Ruzal Daminov
2026-08-19 12:33 ` [PATCH v4] " Ruzal Daminov
2026-09-17  7:30   ` Benjamin Tissoires
2026-09-17 12:51     ` Ruzal
2026-09-18 16:18       ` Benjamin Tissoires
2026-09-18 18:01         ` Ruzal

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®