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;