Module Name:    src
Committed By:   jmcneill
Date:           Sat Jan  7 10:27:59 UTC 2012

Modified Files:
        src/sys/dev/pckbport: elantech.c elantechvar.h

Log Message:
add support for elantech (v2) touchpads that report input pressure


To generate a diff of this commit:
cvs rdiff -u -r1.4 -r1.5 src/sys/dev/pckbport/elantech.c
cvs rdiff -u -r1.1 -r1.2 src/sys/dev/pckbport/elantechvar.h

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/dev/pckbport/elantech.c
diff -u src/sys/dev/pckbport/elantech.c:1.4 src/sys/dev/pckbport/elantech.c:1.5
--- src/sys/dev/pckbport/elantech.c:1.4	Fri Sep  9 14:29:47 2011
+++ src/sys/dev/pckbport/elantech.c	Sat Jan  7 10:27:58 2012
@@ -1,4 +1,4 @@
-/* $NetBSD: elantech.c,v 1.4 2011/09/09 14:29:47 jakllsch Exp $ */
+/* $NetBSD: elantech.c,v 1.5 2012/01/07 10:27:58 jmcneill Exp $ */
 
 /*-
  * Copyright (c) 2008 Jared D. McNeill <[email protected]>
@@ -29,7 +29,7 @@
 #include "opt_pms.h"
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: elantech.c,v 1.4 2011/09/09 14:29:47 jakllsch Exp $");
+__KERNEL_RCSID(0, "$NetBSD: elantech.c,v 1.5 2012/01/07 10:27:58 jmcneill Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -220,11 +220,20 @@ pms_elantech_input(void *opaque, int dat
 	if (!psc->sc_enabled)
 		return;
 
-	if ((psc->inputstate == 0 && (data & 0x0c) != 0x0c) ||
-	    (psc->inputstate == 3 && (data & 0x0f) != 0x08)) {
-		aprint_debug_dev(psc->sc_dev, "waiting for sync..\n");
-		psc->inputstate = 0;
-		return;
+	if (sc->version >= 0x020800) {
+		if ((psc->inputstate == 0 && (data & 0x0c) != 0x04) ||
+		    (psc->inputstate == 3 && (data & 0x0f) != 0x02)) {
+			aprint_debug_dev(psc->sc_dev, "waiting for sync..\n");
+			psc->inputstate = 0;
+			return;
+		}
+	} else {
+		if ((psc->inputstate == 0 && (data & 0x0c) != 0x0c) ||
+		    (psc->inputstate == 3 && (data & 0x0e) != 0x08)) {
+			aprint_debug_dev(psc->sc_dev, "waiting for sync..\n");
+			psc->inputstate = 0;
+			return;
+		}
 	}
 
 	psc->packet[psc->inputstate++] = data & 0xff;
@@ -245,8 +254,8 @@ pms_elantech_input(void *opaque, int dat
 	case 0:
 		/* FALLTHROUGH */
 	case 1:
-		ep.ep_x = ((int16_t)psc->packet[1] << 8) | psc->packet[2];
-		ep.ep_y = ((int16_t)psc->packet[4] << 8) | psc->packet[5];
+		ep.ep_x = ((int16_t)(psc->packet[1] & 0xf) << 8) | psc->packet[2];
+		ep.ep_y = ((int16_t)(psc->packet[4] & 0xf) << 8) | psc->packet[5];
 
 		aprint_debug_dev(psc->sc_dev,
 		    "%d finger detected in elantech mode:\n", ep.ep_nfingers);
@@ -365,9 +374,9 @@ pms_elantech_probe_init(void *opaque)
 		    resp[0], resp[2], resp[0], resp[1], resp[2]);
 		goto doreset;
 	}
-	sc->version = fwversion;
-	aprint_normal_dev(psc->sc_dev, "Elantech touchpad version %d.%d\n",
-	    resp[0], resp[2]);
+	sc->version = (resp[0] << 16) | (resp[1] << 8) | resp[2];
+	aprint_normal_dev(psc->sc_dev, "Elantech touchpad version %d.%d (%06x)\n",
+	    resp[0], resp[2], sc->version);
 
 	res = pms_elantech_init(psc);
 	if (res) {

Index: src/sys/dev/pckbport/elantechvar.h
diff -u src/sys/dev/pckbport/elantechvar.h:1.1 src/sys/dev/pckbport/elantechvar.h:1.2
--- src/sys/dev/pckbport/elantechvar.h:1.1	Sun Dec 14 00:42:33 2008
+++ src/sys/dev/pckbport/elantechvar.h	Sat Jan  7 10:27:58 2012
@@ -1,4 +1,4 @@
-/* $NetBSD: elantechvar.h,v 1.1 2008/12/14 00:42:33 jmcneill Exp $ */
+/* $NetBSD: elantechvar.h,v 1.2 2012/01/07 10:27:58 jmcneill Exp $ */
 
 /*-
  * Copyright (c) 2008 Jared D. McNeill <[email protected]>
@@ -30,7 +30,7 @@
 #define _DEV_PCKBCPORT_ELANTECHVAR_H
 
 struct elantech_softc {
-	uint16_t	version;
+	uint32_t	version;
 
 	bool		initializing;
 	int16_t		last_x, last_y, last_z;

Reply via email to