Skip to content

Commit

Permalink
Input: elantech - provide a workaround for jumpy cursor on firmware 2.34
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Arjan Opmeer authored and Dmitry Torokhov committed Apr 19, 2009
1 parent 3deb649 commit 3f8c0df
Show file tree
Hide file tree
Showing 2 changed files with 28 additions and 4 deletions.
27 changes: 25 additions & 2 deletions drivers/input/mouse/elantech.c
Original file line number Diff line number Diff line change
@@ -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
Expand Down Expand Up @@ -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
Expand All @@ -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
Expand All @@ -216,6 +225,9 @@ static void elantech_report_absolute_v1(struct psmouse *psmouse)
}

input_sync(dev);

discard_packet_v1:
old_fingers = fingers;
}

/*
Expand Down Expand Up @@ -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;
Expand Down
5 changes: 3 additions & 2 deletions drivers/input/mouse/elantech.h
Original file line number Diff line number Diff line change
@@ -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
Expand Down Expand Up @@ -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];
};

Expand Down

0 comments on commit 3f8c0df

Please sign in to comment.