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: Arjan Opmeer <arjan@opmeer.net> Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
This commit is contained in:
Родитель
3deb649e65
Коммит
3f8c0df43d
|
@ -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
|
* 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)
|
||||||
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)
|
||||||
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)
|
||||||
}
|
}
|
||||||
|
|
||||||
input_sync(dev);
|
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]);
|
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;
|
||||||
|
|
|
@ -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
|
* 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 {
|
||||||
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];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Загрузка…
Ссылка в новой задаче