On Mon, Apr 18, 2022 at 5:16 AM Tao Jin <tao-j@xxxxxxxxxxx> wrote: > > The trackpad of the given device sends continuous report of pointers > status as per wxn8 spec. However, the spec did not clarify when the > fingers are lifted so fast that between the interval of two report > frames fingers on pad reduced from >=2 to 0. The second last report > contains >=2 fingers with tip state 1 and the last report contains only > 1 finger with tip state 0. Although this can happen unfrequently, a > quick fix will be improve the consistency to 100%. A quick fix is to > disable MT_QUIRK_ALWAYS_VALID and enable MT_QUIRK_NOT_SEEN_MEANS_UP. > Since it always send reports when fingers on pad > MT_QUIRK_STICKY_FINGERS is also not needed. I would really like to see tests for this device added to hid-tools[0]. This would allow me to better understand the issue and also ensure we are not regressing in the future. Cheers, Benjamin [0] https://gitlab.freedesktop.org/libevdev/hid-tools > > In addition to this, I2C device 04CA:00B1 may also need similar class > but with MT_QUIRK_FORCE_MULTI_INPUT disabled (but it does not harm to > enable it on non-multi-input device either). The respective owner has > been notified and a patch may coming soon after test. > > Signed-off-by: Tao Jin <tao-j@xxxxxxxxxxx> > --- > drivers/hid/hid-multitouch.c | 12 +++++++++++- > 1 file changed, 11 insertions(+), 1 deletion(-) > > diff --git a/drivers/hid/hid-multitouch.c b/drivers/hid/hid-multitouch.c > index 0dece60..3ea57f3 100644 > --- a/drivers/hid/hid-multitouch.c > +++ b/drivers/hid/hid-multitouch.c > @@ -194,6 +194,7 @@ static void mt_post_parse(struct mt_device *td, struct mt_application *app); > #define MT_CLS_WIN_8_FORCE_MULTI_INPUT 0x0015 > #define MT_CLS_WIN_8_DISABLE_WAKEUP 0x0016 > #define MT_CLS_WIN_8_NO_STICKY_FINGERS 0x0017 > +#define MT_CLS_WIN_8_FORCE_MULTI_INPUT_NSMU 0x0018 > > /* vendor specific classes */ > #define MT_CLS_3M 0x0101 > @@ -286,6 +287,14 @@ static const struct mt_class mt_classes[] = { > MT_QUIRK_WIN8_PTP_BUTTONS | > MT_QUIRK_FORCE_MULTI_INPUT, > .export_all_inputs = true }, > + { .name = MT_CLS_WIN_8_FORCE_MULTI_INPUT_NSMU, > + .quirks = MT_QUIRK_IGNORE_DUPLICATES | > + MT_QUIRK_HOVERING | > + MT_QUIRK_CONTACT_CNT_ACCURATE | > + MT_QUIRK_WIN8_PTP_BUTTONS | > + MT_QUIRK_FORCE_MULTI_INPUT | > + MT_QUIRK_NOT_SEEN_MEANS_UP, > + .export_all_inputs = true }, > { .name = MT_CLS_WIN_8_DISABLE_WAKEUP, > .quirks = MT_QUIRK_ALWAYS_VALID | > MT_QUIRK_IGNORE_DUPLICATES | > @@ -783,6 +792,7 @@ static int mt_touch_input_mapping(struct hid_device *hdev, struct hid_input *hi, > case HID_DG_CONFIDENCE: > if ((cls->name == MT_CLS_WIN_8 || > cls->name == MT_CLS_WIN_8_FORCE_MULTI_INPUT || > + cls->name == MT_CLS_WIN_8_FORCE_MULTI_INPUT_NSMU || > cls->name == MT_CLS_WIN_8_DISABLE_WAKEUP) && > (field->application == HID_DG_TOUCHPAD || > field->application == HID_DG_TOUCHSCREEN)) > @@ -2035,7 +2045,7 @@ static const struct hid_device_id mt_devices[] = { > USB_DEVICE_ID_LENOVO_X1_TAB3) }, > > /* Lenovo X12 TAB Gen 1 */ > - { .driver_data = MT_CLS_WIN_8_FORCE_MULTI_INPUT, > + { .driver_data = MT_CLS_WIN_8_FORCE_MULTI_INPUT_NSMU, > HID_DEVICE(BUS_USB, HID_GROUP_MULTITOUCH_WIN_8, > USB_VENDOR_ID_LENOVO, > USB_DEVICE_ID_LENOVO_X12_TAB) }, > -- > 2.35.1 >