Hi all,

Hopefully I'm not too late to show up here.

> From: Peter Hutterer <[email protected]>
> 
> 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
> 
> Signed-off-by: Peter Hutterer <[email protected]>
> ---
>  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 
> 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);

I noticed that this leads to dual reporting on my device.

Consider previous checks:

        if (application == HID_DG_TOUCHPAD) {
                mt_application->mt_flags |= INPUT_MT_POINTER;
                td->inputmode_value = MT_INPUTMODE_TOUCHPAD;
        }

...

        /* check for clickpads */
        if ((app->mt_flags & INPUT_MT_POINTER) &&
            (app->buttons_count == 1))
                td->is_buttonpad = true;

... where `td->is_buttonpad' is set to true when a pressure pad has only
one button, i.e., the "touchpad button integrated with digitizer" [1].
Most (if not all) pressure pads fall into this category. As a result,
the presence of INPUT_PROP_PRESSUREPAD is always accompanied by the
presence of INPUT_PROP_BUTTONPAD.

Since the corresponding testcase neither expects dual reporting nor
prohibits it, I am confused of the intended properties to expose. Is it
a mistake or an intended behavior? If it's the former, I am going to
submit a patch to fix it. 

[1]: 
https://learn.microsoft.com/en-us/windows-hardware/design/component-guidelines/touchpad-buttons-report-level-usages

Thanks,
Rong

>  
>       app->pending_palm_slots = devm_kcalloc(&hi->input->dev,
>                                              BITS_TO_LONGS(td->maxcontacts),
> 
> -- 
> 2.51.1
> 

Reply via email to