[meta-freescale] [linux-boundary][PATCH] egalax_ts: Always report all touch points before input_sync()

Erik Botö erik.boto at pelagicore.com
Wed Jul 3 00:20:05 PDT 2013


Hi,

Since the motivation for this patch was only discussed in a separate
mail thread I'll summarize here:

The previous behavior of the driver did not work properly with Qt5
QtQuick multi touch-point gestures, due to how touch-points are
reported when removing a touch-point. My interpretation of the
available documentation [1] was that the driver should report all
touch-points between SYN_REPORTs, but it is not explicitly stated so.
I've found another mail-thread [2] where the creator of the protocol
states:

"The protocol defines a generic way of sending a variable amount of
contacts. The
contact count is obtained by counting the number of non-empty finger packets
between SYN_REPORT events." - Henrik Rydberg

I think this verifies my assumption that all touch-points should be
reported between SYN_REPORTs, otherwise it can not be used to obtain
the count.

[1] - https://www.kernel.org/doc/Documentation/input/multi-touch-protocol.txt
[2] - http://lists.x.org/archives/xorg-devel/2010-March/006466.html

Cheers,
Erik Botö

On Wed, Jul 3, 2013 at 8:28 AM, Erik Botö <erik.boto at pelagicore.com> wrote:
> ---
>  drivers/input/touchscreen/egalax_ts.c | 36 +++++++++++++++++------------------
>  1 file changed, 18 insertions(+), 18 deletions(-)
>
> diff --git a/drivers/input/touchscreen/egalax_ts.c b/drivers/input/touchscreen/egalax_ts.c
> index 0b6cde7..271f820 100644
> --- a/drivers/input/touchscreen/egalax_ts.c
> +++ b/drivers/input/touchscreen/egalax_ts.c
> @@ -133,7 +133,6 @@ retry:
>         }
>
>         if (down) {
> -               /* should also report old pointers */
>                 events[id].valid = valid;
>                 events[id].status = down;
>                 events[id].x = x;
> @@ -144,23 +143,6 @@ retry:
>                 input_report_abs(input_dev, ABS_Y, y);
>                 input_event(data->input_dev, EV_KEY, BTN_TOUCH, 1);
>                 input_report_abs(input_dev, ABS_PRESSURE, 1);
> -#else
> -               for (i = 0; i < MAX_SUPPORT_POINTS; i++) {
> -                       if (!events[i].valid)
> -                               continue;
> -                       dev_dbg(&client->dev, "report id:%d valid:%d x:%d y:%d",
> -                               i, valid, x, y);
> -
> -                       input_report_abs(input_dev,
> -                                        ABS_MT_TRACKING_ID, i);
> -                       input_report_abs(input_dev,
> -                                        ABS_MT_TOUCH_MAJOR, 1);
> -                       input_report_abs(input_dev,
> -                                        ABS_MT_POSITION_X, events[i].x);
> -                       input_report_abs(input_dev,
> -                                        ABS_MT_POSITION_Y, events[i].y);
> -                       input_mt_sync(input_dev);
> -               }
>  #endif
>         } else {
>                 dev_dbg(&client->dev, "release id:%d\n", id);
> @@ -176,6 +158,24 @@ retry:
>  #endif
>         }
>
> +#ifndef CONFIG_TOUCHSCREEN_EGALAX_SINGLE_TOUCH
> +       /* report all pointers */
> +       for (i = 0; i < MAX_SUPPORT_POINTS; i++) {
> +               if (!events[i].valid)
> +                       continue;
> +               dev_dbg(&client->dev, "report id:%d valid:%d x:%d y:%d",
> +                       i, valid, x, y);
> +                       input_report_abs(input_dev,
> +                                ABS_MT_TRACKING_ID, i);
> +               input_report_abs(input_dev,
> +                                ABS_MT_TOUCH_MAJOR, 1);
> +               input_report_abs(input_dev,
> +                                ABS_MT_POSITION_X, events[i].x);
> +               input_report_abs(input_dev,
> +                                ABS_MT_POSITION_Y, events[i].y);
> +               input_mt_sync(input_dev);
> +       }
> +#endif
>         input_sync(input_dev);
>         return IRQ_HANDLED;
>  }
> --
> 1.8.1.2
>



More information about the meta-freescale mailing list