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)) ? \