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