Input: elantech - provide a workaround for jumpy cursor on firmware 2.34
authorArjan Opmeer <arjan@opmeer.net>
Sun, 19 Apr 2009 02:05:40 +0000 (19:05 -0700)
committerDmitry Torokhov <dmitry.torokhov@gmail.com>
Sun, 19 Apr 2009 02:11:51 +0000 (19:11 -0700)
It seems that Elantech touchpad firmware version 2.34 on the Hercules eCAFÉ
suffers from a problem where bogus coordinates get reported at the beginning
of a touch action. This causes the mouse cursor or the scrolled page to
jump.

Included patch provides a workaround that discards mouse packets that are
likely to contain bogus coordinates. The workaround is activated when we
detect touchpad with fimware version 2.34.

Signed-off-by: Arjan Opmeer <arjan@opmeer.net>
Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
drivers/input/mouse/elantech.c
drivers/input/mouse/elantech.h

index 6ab0eb1ada1c6e94c5c4f3e14d846e24f6b3339d..d3b591673792efc9e43fe71ab75779c12f2eb3fa 100644 (file)
@@ -1,7 +1,7 @@
 /*
- * Elantech Touchpad driver (v5)
+ * Elantech Touchpad driver (v6)
  *
- * Copyright (C) 2007-2008 Arjan Opmeer <arjan@opmeer.net>
+ * Copyright (C) 2007-2009 Arjan Opmeer <arjan@opmeer.net>
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License version 2 as published
@@ -178,6 +178,7 @@ static void elantech_report_absolute_v1(struct psmouse *psmouse)
        struct elantech_data *etd = psmouse->private;
        unsigned char *packet = psmouse->packet;
        int fingers;
+       static int old_fingers;
 
        if (etd->fw_version_maj == 0x01) {
                /* byte 0:  D   U  p1  p2   1  p3   R   L
@@ -190,6 +191,14 @@ static void elantech_report_absolute_v1(struct psmouse *psmouse)
                fingers = (packet[0] & 0xc0) >> 6;
        }
 
+       if (etd->jumpy_cursor) {
+               /* Discard packets that are likely to have bogus coordinates */
+               if (fingers > old_fingers) {
+                       elantech_debug("elantech.c: discarding packet\n");
+                       goto discard_packet_v1;
+               }
+       }
+
        input_report_key(dev, BTN_TOUCH, fingers != 0);
 
        /* byte 2: x7  x6  x5  x4  x3  x2  x1  x0
@@ -216,6 +225,9 @@ static void elantech_report_absolute_v1(struct psmouse *psmouse)
        }
 
        input_sync(dev);
+
+ discard_packet_v1:
+       old_fingers = fingers;
 }
 
 /*
@@ -662,6 +674,17 @@ int elantech_init(struct psmouse *psmouse)
                param[0], param[1], param[2]);
        etd->capabilities = param[0];
 
+       /*
+        * This firmware seems to suffer from misreporting coordinates when
+        * a touch action starts causing the mouse cursor or scrolled page
+        * to jump. Enable a workaround.
+        */
+       if (etd->fw_version_maj == 0x02 && etd->fw_version_min == 0x22) {
+               pr_info("elantech.c: firmware version 2.34 detected, "
+                       "enabling jumpy cursor workaround\n");
+               etd->jumpy_cursor = 1;
+       }
+
        if (elantech_set_absolute_mode(psmouse)) {
                pr_err("elantech.c: failed to put touchpad into absolute mode.\n");
                goto init_fail;
index bee282b540bce3afb1285d96c6042ebda68ab4e2..ed848cc808140e70d03eb3bacadd99925d6449ce 100644 (file)
@@ -1,7 +1,7 @@
 /*
- * Elantech Touchpad driver (v5)
+ * Elantech Touchpad driver (v6)
  *
- * Copyright (C) 2007-2008 Arjan Opmeer <arjan@opmeer.net>
+ * Copyright (C) 2007-2009 Arjan Opmeer <arjan@opmeer.net>
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License version 2 as published
@@ -104,6 +104,7 @@ struct elantech_data {
        unsigned char fw_version_min;
        unsigned char hw_version;
        unsigned char paritycheck;
+       unsigned char jumpy_cursor;
        unsigned char parity[256];
 };