Module Name:    src
Committed By:   blymn
Date:           Sun Jun  2 08:55:00 UTC 2019

Modified Files:
        src/sys/dev/pckbport: synaptics.c synapticsreg.h synapticsvar.h

Log Message:
Changes based on code from an anonymous contributor.  This should make
trackpads work for Thinkpads.  Also adds code to handle externally
connected buttons (synaptics parlance), the first five are mapped to
mouse buttons 1-5.  The rest are currently not reported but could be
decoded if required.


To generate a diff of this commit:
cvs rdiff -u -r1.48 -r1.49 src/sys/dev/pckbport/synaptics.c
cvs rdiff -u -r1.11 -r1.12 src/sys/dev/pckbport/synapticsreg.h
cvs rdiff -u -r1.8 -r1.9 src/sys/dev/pckbport/synapticsvar.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/synaptics.c
diff -u src/sys/dev/pckbport/synaptics.c:1.48 src/sys/dev/pckbport/synaptics.c:1.49
--- src/sys/dev/pckbport/synaptics.c:1.48	Mon Apr 22 00:53:59 2019
+++ src/sys/dev/pckbport/synaptics.c	Sun Jun  2 08:55:00 2019
@@ -1,4 +1,4 @@
-/*	$NetBSD: synaptics.c,v 1.48 2019/04/22 00:53:59 blymn Exp $	*/
+/*	$NetBSD: synaptics.c,v 1.49 2019/06/02 08:55:00 blymn Exp $	*/
 
 /*
  * Copyright (c) 2005, Steve C. Woodford
@@ -48,7 +48,7 @@
 #include "opt_pms.h"
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: synaptics.c,v 1.48 2019/04/22 00:53:59 blymn Exp $");
+__KERNEL_RCSID(0, "$NetBSD: synaptics.c,v 1.49 2019/06/02 08:55:00 blymn Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -321,6 +321,9 @@ pms_synaptics_probe_extended(struct pms_
 				/* unreached */
 				break;
 			}
+
+			if ((val & SYN_CCAP_HAS_ADV_GESTURE_MODE))
+				sc->flags |= SYN_FLAG_HAS_ADV_GESTURE_MODE;
 		}
 	}
 }
@@ -477,7 +480,8 @@ pms_synaptics_enable(void *vsc)
 		synaptics_poll_cmd(psc, PMS_SET_SCALE11, 0);
 
 	/* Set advanced gesture mode */
-	if (sc->flags & SYN_FLAG_HAS_EXTENDED_WMODE)
+	if ((sc->flags & SYN_FLAG_HAS_EXTENDED_WMODE) ||
+	    (sc->flags & SYN_FLAG_HAS_ADV_GESTURE_MODE))
 		synaptics_special_write(psc, SYNAPTICS_WRITE_DELUXE_3, 0x3); 
 
 	synaptics_poll_cmd(psc, PMS_DEV_ENABLE, 0);
@@ -990,9 +994,33 @@ pms_synaptics_parse(struct pms_softc *ps
 		/* Pressure */
 		sp.sp_z = psc->packet[2];
 
-		/* Left/Right button handling. */
-		sp.sp_left = psc->packet[0] & PMS_LBUTMASK;
-		sp.sp_right = psc->packet[0] & PMS_RBUTMASK;
+		if ((psc->packet[0] ^ psc->packet[3]) & 0x02) {
+			/* extended buttons */
+
+			aprint_debug_dev(psc->sc_dev,
+			    "synaptics_parse: %02x %02x %02x %02x %02x %02x\n",
+			    psc->packet[0], psc->packet[1], psc->packet[2],
+			    psc->packet[3], psc->packet[4], psc->packet[5]);
+
+			if ((psc->packet[4] & SYN_1BUTMASK) != 0)
+				sp.sp_left = PMS_LBUTMASK;
+
+			if ((psc->packet[4] & SYN_3BUTMASK) != 0)
+				sp.sp_middle = PMS_MBUTMASK;
+
+			if ((psc->packet[5] & SYN_2BUTMASK) != 0)
+				sp.sp_right = PMS_RBUTMASK;
+
+			if ((psc->packet[5] & SYN_4BUTMASK) != 0)
+				sp.sp_up = 1;
+
+			if ((psc->packet[4] & SYN_5BUTMASK) != 0)
+				sp.sp_down = 1;
+		} else {
+			/* Left/Right button handling. */
+			sp.sp_left = psc->packet[0] & PMS_LBUTMASK;
+			sp.sp_right = psc->packet[0] & PMS_RBUTMASK;
+		}
 
 		/* Up/Down buttons. */
 		if (sc->flags & SYN_FLAG_HAS_BUTTONS_4_5) {

Index: src/sys/dev/pckbport/synapticsreg.h
diff -u src/sys/dev/pckbport/synapticsreg.h:1.11 src/sys/dev/pckbport/synapticsreg.h:1.12
--- src/sys/dev/pckbport/synapticsreg.h:1.11	Mon Apr 22 00:53:59 2019
+++ src/sys/dev/pckbport/synapticsreg.h	Sun Jun  2 08:55:00 2019
@@ -1,4 +1,4 @@
-/*	$NetBSD: synapticsreg.h,v 1.11 2019/04/22 00:53:59 blymn Exp $	*/
+/*	$NetBSD: synapticsreg.h,v 1.12 2019/06/02 08:55:00 blymn Exp $	*/
 
 /*
  * Copyright (c) 2005, Steve C. Woodford
@@ -101,6 +101,12 @@
 /* Extended mode button masks. */
 #define	SYN_1BUTMASK			0x1
 #define	SYN_2BUTMASK			0x1
+#define	SYN_3BUTMASK			0x2
+#define	SYN_4BUTMASK			0x2
+#define	SYN_5BUTMASK			0x4
+#define	SYN_6BUTMASK			0x4
+#define	SYN_7BUTMASK			0x8
+#define	SYN_8BUTMASK			0x8
 
 /* Touchpad edge boundaries (Recommended values from Synaptics documentation) */
 #define	SYNAPTICS_EDGE_LEFT		1632

Index: src/sys/dev/pckbport/synapticsvar.h
diff -u src/sys/dev/pckbport/synapticsvar.h:1.8 src/sys/dev/pckbport/synapticsvar.h:1.9
--- src/sys/dev/pckbport/synapticsvar.h:1.8	Tue Nov  6 09:13:17 2018
+++ src/sys/dev/pckbport/synapticsvar.h	Sun Jun  2 08:55:00 2019
@@ -1,4 +1,4 @@
-/*	$NetBSD: synapticsvar.h,v 1.8 2018/11/06 09:13:17 blymn Exp $	*/
+/*	$NetBSD: synapticsvar.h,v 1.9 2019/06/02 08:55:00 blymn Exp $	*/
 
 /*
  * Copyright (c) 2005, Steve C. Woodford
@@ -54,6 +54,7 @@ struct synaptics_softc {
 #define	SYN_FLAG_HAS_ONE_BUTTON_CLICKPAD	(1 << 9)
 #define	SYN_FLAG_HAS_TWO_BUTTON_CLICKPAD	(1 << 10)
 #define	SYN_FLAG_HAS_EXTENDED_WMODE		(1 << 11)
+#define	SYN_FLAG_HAS_ADV_GESTURE_MODE		(1 << 12)
 
 	u_int	total_packets[2];	/* Total number of packets received */
 #define	SYN_TIME(sc,c,n)	(((sc)->total_packets[(n)] >= (c)) ?	\

Reply via email to