On Nov 21 2025, Peter Hutterer wrote: > A Digitizer/Button Type value of 1 indicates the device is a > pressurepad, see > https://learn.microsoft.com/en-us/windows-hardware/design/component-guidelines/touchpad-windows-precision-touchpad-collection#device-capabilities-feature-report > > For the selftests we have to resort to a bit of a hack: python-libevdev > gets the properties from libevdev at module init time. If libevdev > hasn't been rebuilt with the new property it won't be automatically > populated. So we hack around this by constructing the property manually. > > Signed-off-by: Peter Hutterer <[email protected]> > --- > drivers/hid/hid-multitouch.c | 12 ++++++- > .../testing/selftests/hid/tests/test_multitouch.py | 39 > +++++++++++++++++++--- > 2 files changed, 46 insertions(+), 5 deletions(-) > > diff --git a/drivers/hid/hid-multitouch.c b/drivers/hid/hid-multitouch.c > index > 179dc316b4b518d78bdc900d9fd15756c5eba83e..382e6f50c4f7e663af7d028abb8be7cb2e6e7b8e > 100644 > --- a/drivers/hid/hid-multitouch.c > +++ b/drivers/hid/hid-multitouch.c > @@ -81,6 +81,7 @@ MODULE_LICENSE("GPL"); > #define MT_INPUTMODE_TOUCHPAD 0x03 > > #define MT_BUTTONTYPE_CLICKPAD 0 > +#define MT_BUTTONTYPE_PRESSUREPAD 1 > > enum latency_mode { > HID_LATENCY_NORMAL = 0, > @@ -179,6 +180,7 @@ struct mt_device { > __u8 inputmode_value; /* InputMode HID feature value */ > __u8 maxcontacts; > bool is_buttonpad; /* is this device a button pad? */ > + bool is_pressurepad; /* is this device a pressurepad? */ > bool is_haptic_touchpad; /* is this device a haptic touchpad? */ > bool serial_maybe; /* need to check for serial protocol */ > > @@ -530,8 +532,14 @@ static void mt_feature_mapping(struct hid_device *hdev, > } > > mt_get_feature(hdev, field->report); > - if (field->value[usage->usage_index] == MT_BUTTONTYPE_CLICKPAD) > + switch (field->value[usage->usage_index]) { > + case MT_BUTTONTYPE_CLICKPAD: > td->is_buttonpad = true; > + break; > + case MT_BUTTONTYPE_PRESSUREPAD: > + td->is_pressurepad = true; > + break; > + } > > break; > case 0xff0000c5: > @@ -1393,6 +1401,8 @@ static int mt_touch_input_configured(struct hid_device > *hdev, > > if (td->is_buttonpad) > __set_bit(INPUT_PROP_BUTTONPAD, input->propbit); > + if (td->is_pressurepad) > + __set_bit(INPUT_PROP_PRESSUREPAD, input->propbit); > > app->pending_palm_slots = devm_kcalloc(&hi->input->dev, > BITS_TO_LONGS(td->maxcontacts), > diff --git a/tools/testing/selftests/hid/tests/test_multitouch.py > b/tools/testing/selftests/hid/tests/test_multitouch.py > index > a06a087f00b6991f7514adf7f8c713bef1a43563..fa4fb2054bd4febb1d2497f2787944f538b27889 > 100644 > --- a/tools/testing/selftests/hid/tests/test_multitouch.py > +++ b/tools/testing/selftests/hid/tests/test_multitouch.py > @@ -979,15 +979,36 @@ class BaseTest: > assert libevdev.InputEvent(libevdev.EV_ABS.ABS_MT_ORIENTATION, > 90) in events > > class TestPTP(TestWin8Multitouch): > + def test_buttontype(self): > + """Check for the right ButtonType.""" > + uhdev = self.uhdev > + assert uhdev is not None > + evdev = uhdev.get_evdev() > + > + # If libevdev.so is not yet compiled with INPUT_PROP_PRESSUREPAD > + # python-libevdev won't have it either, let's fake it > + if not getattr(libevdev, "INPUT_PROP_PRESSUREPAD", None): > + prop = libevdev.InputProperty(name="INPUT_PROP_PRESSUREPAD", > value=0x7) > + libevdev.INPUT_PROP_PRESSUREPAD = prop > + libevdev.props.append(prop) > + > + if uhdev.buttontype == HIDButtonType.CLICKPAD: > + assert libevdev.INPUT_PROP_BUTTONPAD in evdev.properties > + elif uhdev.buttontype == HIDButtonType.PRESSUREPAD: > + assert libevdev.INPUT_PROP_PRESSUREPAD in evdev.properties > + else: > + assert libevdev.INPUT_PROP_PRESSUREPAD not in > evdev.properties > + assert libevdev.INPUT_PROP_BUTTONPAD not in evdev.properties > + > def test_ptp_buttons(self): > """check for button reliability. > - There are 2 types of touchpads: the click pads and the pressure > pads. > - Each should reliably report the BTN_LEFT events. > + There are 3 types of touchpads: click pads + pressure pads and > + those with discrete buttons. Each should reliably report the > BTN_LEFT events. > """ > uhdev = self.uhdev > evdev = uhdev.get_evdev() > > - if uhdev.buttontype == HIDButtonType.CLICKPAD: > + if uhdev.buttontype in [HIDButtonType.CLICKPAD, > HIDButtonType.PRESSUREPAD]: > r = uhdev.event(click=True) > events = uhdev.next_sync_events() > self.debug_reports(r, uhdev, events) > @@ -999,7 +1020,7 @@ class BaseTest: > self.debug_reports(r, uhdev, events) > assert libevdev.InputEvent(libevdev.EV_KEY.BTN_LEFT, 0) in > events > assert evdev.value[libevdev.EV_KEY.BTN_LEFT] == 0 > - else: > + elif uhdev.buttontype == HIDButtonType.DISCRETE_BUTTONS: > r = uhdev.event(left=True) > events = uhdev.next_sync_events() > self.debug_reports(r, uhdev, events) > @@ -2062,6 +2083,16 @@ class Testite_06cb_2968(BaseTest.TestPTP): > ) > > > +class Testven_0488_108c(BaseTest.TestPTP): > + def create_device(self): > + return PTP( > + "uhid test ven_0488_108c", > + rdesc="05 01 09 02 a1 01 85 06 09 01 a1 00 05 09 19 01 29 > 03 15 00 25 01 95 03 75 01 81 02 95 01 75 05 81 03 05 01 09 30 09 31 09 > 38 15 81 25 7f 75 08 95 03 81 06 c0 c0 05 0d 09 05 a1 01 85 01 05 0d 09 > 22 a1 02 15 00 25 01 09 47 09 42 95 02 75 01 81 02 95 01 75 03 25 05 09 > 51 81 02 81 03 05 01 15 00 26 ba 0d 75 10 55 0e 65 11 09 30 35 00 46 d0 > 05 95 01 81 02 26 d0 06 46 bb 02 09 31 81 02 05 0d 95 01 75 10 26 ff 7f > 46 ff 7f 09 30 81 02 c0 05 0d 09 22 a1 02 15 00 25 01 09 47 09 42 95 02 > 75 01 81 02 95 01 75 03 25 05 09 51 81 02 81 03 05 01 15 00 26 ba 0d 75 > 10 55 0e 65 11 09 30 35 00 46 d0 05 95 01 81 02 26 d0 06 46 bb 02 09 31 > 81 02 05 0d 95 01 75 10 26 ff 7f 46 ff 7f 09 30 81 02 c0 05 0d 09 22 a1 > 02 15 00 25 01 09 47 09 42 95 02 75 01 81 02 95 01 75 03 25 05 09 51 81 > 02 81 03 05 01 15 00 26 ba 0d 75 10 55 0e 65 11 09 30 35 00 46 d0 05 95 > 01 81 02 26 d0 06 46 bb 02 09 31 81 02 05 0d 95 01 75 10 26 ff 7f 46 ff > 7f 09 30 81 02 c0 55 0c 66 01 10 47 ff ff 00 00 27 ff ff 00 00 75 10 95 > 01 05 0d 09 56 81 02 09 54 25 05 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 75 08 95 01 25 05 b1 02 09 > 59 b1 02 06 00 ff 85 03 09 c5 15 00 26 ff 00 75 08 96 00 01 b1 02 05 0e > 09 01 a1 02 85 13 09 23 15 00 25 64 75 08 95 01 b1 02 c0 c0 05 0d 09 0e > a1 01 85 04 09 22 a1 02 09 52 15 00 25 0a 75 08 95 01 b1 02 c0 09 22 a1 > 00 85 05 09 57 09 58 75 01 95 02 25 01 b1 02 95 06 b1 03 c0 c0 06 01 ff > 09 02 a1 01 09 00 85 07 15 00 26 ff 00 75 08 96 12 02 b1 02 c0 06 00 ff > 09 01 a1 01 85 0d 15 00 26 ff 00 75 08 95 11 09 01 81 02 09 01 91 02 c0 > 05 0e 09 01 a1 01 85 11 09 35 15 00 26 ff 00 75 08 95 17 b1 02 c0 06 81 > ff 09 01 a1 01 09 20 85 17 15 00 26 ff 00 75 08 95 3f 09 01 81 02 09 01 > 91 02 c0",
Patch is also corrupt here. Given that you need to send another revision, would you mind splitting the hid-multitouch.c changes from the selftests? Cheers, Benjamin > + input_info=(0x18, 0x0488, 0x108C), > + buttontype=HIDButtonType.PRESSUREPAD, > + ) > + > + > class Testn_trig_1b96_0c01(BaseTest.TestWin8Multitouch): > def create_device(self): > return Digitizer( > > -- > 2.51.1 >

