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
> 

Reply via email to