[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Bug#712994: Please add support for newer Elantech Touchpads



Package: src:linux
Version: 3.9.6-1
Severity: wishlist
Tags: patch

Hi,

I recently purchased a Samsung NP730U3E with a newer Elantech Touchpad.
Using the most recent kernel from unstable, 3.9.6, dmesg prints,

    psmouse serio1: elantech: unknown hardware version, aborting...

though the touchpad is still usable for basic clicking and pointing.


Rebuilding 3.9.6 with the attached patch fixes the issue for me, the
Touchpad is recognized as such (actually, as a Clickpad, which it is),
and Multitouch and so on just works.

A similar bug has been reported against Ubuntu[0] and Arch Linux[1]. I
took the patch from the latter, as it appears to be the newest iteration
of the same fix.

The fix from Arch Linux touches a number of files in
drivers/input/mouse/. However, in my case, it was sufficient to patch
drivers/input/mouse/elantech.c, as the attached patch does.

[0] https://bugs.launchpad.net/ubuntu/+source/linux/+bug/1166442
[1] https://aur.archlinux.org/packages.php?ID=51343&detail=1
>From 97fedf190f3359b1db60715a9f3ba4fbbb4b9a2f Mon Sep 17 00:00:00 2001
From: Matteo Delfino <bugs.kendatsuba@gmail.com>
Date: Fri, 14 Jun 2013 19:56:09 +0200
Subject: [PATCH] elantech: fix for newer hardware versions (v7)

* Fix version recognition in elantech_set_properties

  The new hardware reports itself as v7 but the packets'
  structure is unaltered.

* Fix packet type recognition in elantech_packet_check_v4

  The bitmask used for v6 is too wide, only the last three bits of
  the third byte in a packet (packet[3] & 0x03) are actually used to
  distinguish between packet types.
  Starting from v7, additional informations (to be interpreted) is
  stored in the remaining bits (packets[3] & 0x1c).
  In addition, the value stored in (packet[0] & 0x0c) is no longer
  a constant but contains additional information yet to be deciphered.
  This change should be backwards compatible with v6 hardware.

Additional-author: Giovanni Frigione <gio.frigione@gmail.com>
---
 drivers/input/mouse/elantech.c |   11 +++++------
 1 file changed, 5 insertions(+), 6 deletions(-)

diff --git a/src/elantech.c b/src/elantech.c
index e2a9867..4d54773 100644
--- a/src/elantech.c
+++ b/src/elantech.c
@@ -677,17 +677,15 @@ static int elantech_packet_check_v3(struct psmouse *psmouse)
 static int elantech_packet_check_v4(struct psmouse *psmouse)
 {
 	unsigned char *packet = psmouse->packet;
+	unsigned char packet_type = packet[3] & 0x03;
 
-	if ((packet[0] & 0x0c) == 0x04 &&
-	    (packet[3] & 0x1f) == 0x11)
+	if (packet_type == 0x01)
 		return PACKET_V4_HEAD;
 
-	if ((packet[0] & 0x0c) == 0x04 &&
-	    (packet[3] & 0x1f) == 0x12)
+	if (packet_type == 0x02)
 		return PACKET_V4_MOTION;
 
-	if ((packet[0] & 0x0c) == 0x04 &&
-	    (packet[3] & 0x1f) == 0x10)
+	if (packet_type == 0x00)
 		return PACKET_V4_STATUS;
 
 	return PACKET_UNKNOWN;
@@ -1226,6 +1224,7 @@ static int elantech_set_properties(struct elantech_data *etd)
 			etd->hw_version = 3;
 			break;
 		case 6:
+		case 7:
 			etd->hw_version = 4;
 			break;
 		default:
-- 
1.7.10.4


Reply to: