On Fri, Aug 28, 2015 at 10:04:51PM +0200, Ulf Brosziewski wrote: > > Some weeks ago a change was made in pms to support Synaptics touchpads > that don't provide W mode. I assume that only fairly old models are > concerned, and that the variant in the patch below is more accurate. It > only fakes W values where necessary. > > The patch contains a second change, a check whether the resolution query > was successful. According to the "Synaptics PS/2 Interfacing Guide", bit > 7 of the second response byte will be set in case of success. It seems > that if it isn't set, the other bytes are garbage or have an unknown > meaning. > > Unfortunately I only have that old model - with firmware 4.1 - for > testing. Could someone confirm that newer models aren't affected by > these changes? > >
Tested on X201 (Synaptics touchpad, firmware 7.4), no regress. See comment below. > Index: dev/pckbc/pms.c > =================================================================== > RCS file: /cvs/src/sys/dev/pckbc/pms.c,v > retrieving revision 1.65 > diff -u -p -r1.65 pms.c > --- dev/pckbc/pms.c 23 Aug 2015 04:45:23 -0000 1.65 > +++ dev/pckbc/pms.c 28 Aug 2015 18:04:45 -0000 > @@ -949,8 +949,10 @@ synaptics_get_hwinfo(struct pms_softc *s > return (-1); > } > > - syn->res_x = SYNAPTICS_RESOLUTION_X(syn->resolution); > - syn->res_y = SYNAPTICS_RESOLUTION_Y(syn->resolution); > + if (syn->resolution & 0x8000) { I think it makes sense to define SYNAPTICS_RESOLUTION_VALID instead of magic numbers. > + syn->res_x = SYNAPTICS_RESOLUTION_X(syn->resolution); > + syn->res_y = SYNAPTICS_RESOLUTION_Y(syn->resolution); > + } > syn->min_x = SYNAPTICS_XMIN_BEZEL; > syn->min_y = SYNAPTICS_YMIN_BEZEL; > syn->max_x = (syn->dimension) ? > @@ -1163,30 +1165,21 @@ pms_proc_synaptics(struct pms_softc *sc) > > w = ((sc->packet[0] & 0x30) >> 2) | ((sc->packet[0] & 0x04) >> 1) | > ((sc->packet[3] & 0x04) >> 2); > + z = sc->packet[2]; > > - /* > - * Conform to the encoding understood by > - * /usr/xenocara/driver/xf86-input-synaptics/src/wsconscomm.c > - */ > - switch (w) { > - case 0: > - /* fingerwidth 5, numfingers 2 */ > - break; > - case 1: > - /* fingerwidth 5, numfingers 3 */ > - break; > - case 5: > - /* fingerwidth 5, numfingers 1 */ > - break; > - case 4: > - case 8: > - /* fingerwidth 4, numfingers 1 */ > - w = 4; > - break; > - default: > - break; > + if ((syn->capabilities & SYNAPTICS_CAP_EXTENDED) == 0) { > + /* > + * Emulate W mode for models that don't provide it. Bit 3 > + * of the w-input signals a touch ("finger"), Bit 2 and > + * the "gesture" bits 1-0 can be ignored. > + */ > + if (w & 8) > + w = 4; > + else > + z = w = 0; > } > > + > if ((syn->capabilities & SYNAPTICS_CAP_PASSTHROUGH) && w == 3) { > synaptics_sec_proc(sc); > return; > @@ -1203,7 +1196,6 @@ pms_proc_synaptics(struct pms_softc *sc) > sc->packet[4]; > y = ((sc->packet[3] & 0x20) << 7) | ((sc->packet[1] & 0xf0) << 4) | > sc->packet[5]; > - z = sc->packet[2]; > > buttons = ((sc->packet[0] & sc->packet[3]) & 0x01) ? > WSMOUSE_BUTTON(1) : 0; -- Alexandr Shadchin