Commit 3f8c0df4 authored by Arjan Opmeer's avatar Arjan Opmeer Committed by Dmitry Torokhov

Input: elantech - provide a workaround for jumpy cursor on firmware 2.34

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: default avatarArjan Opmeer <arjan@opmeer.net>
Signed-off-by: default avatarDmitry Torokhov <dtor@mail.ru>
parent 3deb649e
/* /*
* 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 * 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 * 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) ...@@ -178,6 +178,7 @@ static void elantech_report_absolute_v1(struct psmouse *psmouse)
struct elantech_data *etd = psmouse->private; struct elantech_data *etd = psmouse->private;
unsigned char *packet = psmouse->packet; unsigned char *packet = psmouse->packet;
int fingers; int fingers;
static int old_fingers;
if (etd->fw_version_maj == 0x01) { if (etd->fw_version_maj == 0x01) {
/* byte 0: D U p1 p2 1 p3 R L /* byte 0: D U p1 p2 1 p3 R L
...@@ -190,6 +191,14 @@ static void elantech_report_absolute_v1(struct psmouse *psmouse) ...@@ -190,6 +191,14 @@ static void elantech_report_absolute_v1(struct psmouse *psmouse)
fingers = (packet[0] & 0xc0) >> 6; 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); input_report_key(dev, BTN_TOUCH, fingers != 0);
/* byte 2: x7 x6 x5 x4 x3 x2 x1 x0 /* byte 2: x7 x6 x5 x4 x3 x2 x1 x0
...@@ -216,6 +225,9 @@ static void elantech_report_absolute_v1(struct psmouse *psmouse) ...@@ -216,6 +225,9 @@ static void elantech_report_absolute_v1(struct psmouse *psmouse)
} }
input_sync(dev); input_sync(dev);
discard_packet_v1:
old_fingers = fingers;
} }
/* /*
...@@ -662,6 +674,17 @@ int elantech_init(struct psmouse *psmouse) ...@@ -662,6 +674,17 @@ int elantech_init(struct psmouse *psmouse)
param[0], param[1], param[2]); param[0], param[1], param[2]);
etd->capabilities = param[0]; 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)) { if (elantech_set_absolute_mode(psmouse)) {
pr_err("elantech.c: failed to put touchpad into absolute mode.\n"); pr_err("elantech.c: failed to put touchpad into absolute mode.\n");
goto init_fail; goto init_fail;
......
/* /*
* 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 * 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 * under the terms of the GNU General Public License version 2 as published
...@@ -104,6 +104,7 @@ struct elantech_data { ...@@ -104,6 +104,7 @@ struct elantech_data {
unsigned char fw_version_min; unsigned char fw_version_min;
unsigned char hw_version; unsigned char hw_version;
unsigned char paritycheck; unsigned char paritycheck;
unsigned char jumpy_cursor;
unsigned char parity[256]; unsigned char parity[256];
}; };
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment