Module Name: src
Committed By: ryoon
Date: Sun Jun 3 07:24:18 UTC 2018
Modified Files:
src/sys/dev/pckbport: synaptics.c
Log Message:
Enable Synaptics multifinger capability (Extended W mode)
Magic parameters are taken from
https://github.com/RehabMan/OS-X-Voodoo-PS2-Controller/.
Tested on HP ProBook 4630s, Lenovo E530, VAIO Pro 11 and HP Spectre x360 ae.
To generate a diff of this commit:
cvs rdiff -u -r1.38 -r1.39 src/sys/dev/pckbport/synaptics.c
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.38 src/sys/dev/pckbport/synaptics.c:1.39
--- src/sys/dev/pckbport/synaptics.c:1.38 Wed May 30 13:20:39 2018
+++ src/sys/dev/pckbport/synaptics.c Sun Jun 3 07:24:18 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: synaptics.c,v 1.38 2018/05/30 13:20:39 ryoon Exp $ */
+/* $NetBSD: synaptics.c,v 1.39 2018/06/03 07:24:18 ryoon 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.38 2018/05/30 13:20:39 ryoon Exp $");
+__KERNEL_RCSID(0, "$NetBSD: synaptics.c,v 1.39 2018/06/03 07:24:18 ryoon Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -433,6 +433,7 @@ pms_synaptics_enable(void *vsc)
struct synaptics_softc *sc = &psc->u.synaptics;
u_char enable_modes;
int res;
+ u_char cmd[1], resp[3];
if (sc->flags & SYN_FLAG_HAS_PASSTHROUGH) {
/*
@@ -474,6 +475,50 @@ pms_synaptics_enable(void *vsc)
for (int i = 0; i < 2; i++)
synaptics_poll_cmd(psc, PMS_SET_SCALE11, 0);
+ /*
+ * Enable multi-finger capability in cold boot case with
+ * undocumented dequence.
+ * Parameters from
+ * https://github.com/RehabMan/OS-X-Voodoo-PS2-Controller/
+ * VoodooPS2Trackpad/VoodooPS2SynapticsTouchPad.cpp
+ * setTouchPadModeByte function.
+ */
+ if (sc->flags & SYN_FLAG_HAS_EXTENDED_WMODE) {
+ cmd[0] = 0xe6;
+ (void)pckbport_poll_cmd(psc->sc_kbctag, psc->sc_kbcslot,
+ cmd, 1, 3, resp, 0);
+ cmd[0] = 0xe8;
+ (void)pckbport_poll_cmd(psc->sc_kbctag, psc->sc_kbcslot,
+ cmd, 1, 3, resp, 0);
+ cmd[0] = 0x00;
+ (void)pckbport_poll_cmd(psc->sc_kbctag, psc->sc_kbcslot,
+ cmd, 1, 3, resp, 0);
+ cmd[0] = 0xe8;
+ (void)pckbport_poll_cmd(psc->sc_kbctag, psc->sc_kbcslot,
+ cmd, 1, 3, resp, 0);
+ cmd[0] = 0x00;
+ (void)pckbport_poll_cmd(psc->sc_kbctag, psc->sc_kbcslot,
+ cmd, 1, 3, resp, 0);
+ cmd[0] = 0xe8;
+ (void)pckbport_poll_cmd(psc->sc_kbctag, psc->sc_kbcslot,
+ cmd, 1, 3, resp, 0);
+ cmd[0] = 0x00;
+ (void)pckbport_poll_cmd(psc->sc_kbctag, psc->sc_kbcslot,
+ cmd, 1, 3, resp, 0);
+ cmd[0] = 0xe8;
+ (void)pckbport_poll_cmd(psc->sc_kbctag, psc->sc_kbcslot,
+ cmd, 1, 3, resp, 0);
+ cmd[0] = 0x03;
+ (void)pckbport_poll_cmd(psc->sc_kbctag, psc->sc_kbcslot,
+ cmd, 1, 3, resp, 0);
+ cmd[0] = 0xf3;
+ (void)pckbport_poll_cmd(psc->sc_kbctag, psc->sc_kbcslot,
+ cmd, 1, 3, resp, 0);
+ cmd[0] = 0xc8;
+ (void)pckbport_poll_cmd(psc->sc_kbctag, psc->sc_kbcslot,
+ cmd, 1, 3, resp, 0);
+ }
+
synaptics_poll_cmd(psc, PMS_DEV_ENABLE, 0);
sc->up_down = 0;