Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+25 −2
Original line number Diff line number Diff line
/*
 * 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;
+3 −2
Original line number Diff line number Diff line
/*
 * 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];
};