diff --git a/sys/dev/atkbdc/psm.c b/sys/dev/atkbdc/psm.c index a34de641a08a..b01450ab4102 100644 --- a/sys/dev/atkbdc/psm.c +++ b/sys/dev/atkbdc/psm.c @@ -4948,6 +4948,9 @@ psmsoftintr(void *arg) case MOUSE_MODEL_SYNAPTICS: if (pb->inputbytes == MOUSE_PS2_PACKETSIZE) { + static int trbutt; + int tpbutt; + static int otpbutt; /* Don't rely on bit 3. It is garbled by mux */ switch (pb->ipacket[0] & 0xc0) { case 0x80: @@ -4960,8 +4963,25 @@ psmsoftintr(void *arg) bcopy(pb->ipacket, pb->ipacket + 3, 3); bcopy(sc->muxsave, pb->ipacket, 3); sc->muxsave[0] &= 0x03; + pb->ipacket[0] &= ~trbutt; + pb->ipacket[3] &= ~trbutt; + tpbutt = (pb->ipacket[3] & 0x03) << 2 | + (pb->ipacket[0] & 0x03); + if (tpbutt != otpbutt && + sc->fpcount < 3) { + pb->ipacket[0] &= 0xfc; + pb->ipacket[0] |= otpbutt & 0x03; + pb->ipacket[3] &= 0xfc; + pb->ipacket[3] |= otpbutt >> 2 & 0x03; + ++sc->fpcount; + } else { + sc->fpcount = 0; + otpbutt = tpbutt; + } +VLOG(3, (LOG_DEBUG, "buttons: [%02x],[%02x]\n", pb->ipacket[0], pb->ipacket[3])); break; default: + trbutt = pb->ipacket[0] & 0x03; /* Convert generic -> pass-through */ pb->ipacket[5] = pb->ipacket[2]; pb->ipacket[4] = pb->ipacket[1];