Hi Alexander,

that is indeed an odd phenomenon - and an odd workaround which I
wouldn't like to see in pms without being sure that there is a
firmware bug.  If you don't mind to make more tests, I'll send
you some patches for debugging (please be patient, it may take a
while).

Regards,
Ulf

On 1/23/20 22:58, Alexander Cronheim wrote:
> Hi,
> 
> In my machine, sometimes an odd 5 byte packet is received by pms
> in the 6 byte elantech v4 touchpad protocol as documented in [1].
> The packet in question in hex notation is 80 80 36 00 00, which
> corresponds with a zero movement trackpoint packet missing its first
> byte which normally carries the trackpoint button states.
> 
> As pms assumes 6 bytes per packet with this protocol, receiving a
> 5 byte packet causes a desynchronisation between the software and
> hardware state.  It is triggered by simultaneous use of any trackpoint
> button and multi touch input, especially but not necessarily in
> conjunction with trackpoint movement.
> 
> The attached patch tests for the specific byte sequence and prepends
> a null byte such that it is interpreted as a trackpoint button
> release [2].  Running this patch, the desynchronisation issue no
> longer occurs, and it seems that no 5 byte packets other then the
> kind described above are received.  Since in the protocol as
> documented the first byte is never 0x80, I believe that this
> workaround has no further side effects.
> 
> As to how and why sometimes this odd packet is received I do not
> know.  It could be that there is a bug in the touchpad firmware,
> that under some circumstances drops the first byte in a packet
> if it is null, or perhaps a bug in pms/pckbd that does the same.
> 
> Perhaps this information is useful.
> 
> Alexander
> 
> 1.  https://www.kernel.org/doc/html/v4.16/input/devices/elantech.html
> 2.  When just discarding these 5 byte packets I have occasionally
>     observed trackpoint buttons seemingly getting stuck until a new
>     mouse button press.
> 
> Index: sys/dev/pckbc/pms.c
> ===================================================================
> RCS file: /cvs/src/sys/dev/pckbc/pms.c,v
> retrieving revision 1.90
> diff -u -p -r1.90 pms.c
> --- sys/dev/pckbc/pms.c       20 Sep 2019 21:21:47 -0000      1.90
> +++ sys/dev/pckbc/pms.c       19 Jan 2020 12:14:12 -0000
> @@ -2382,8 +2382,34 @@ elantech_packet_type(struct elantech_sof
>  int
>  pms_sync_elantech_v4(struct pms_softc *sc, int data)
>  {
> +     int i;
> +
>       if (sc->inputstate == 0)
>               return ((data & 0x08) == 0 ? 0 : -1);
> +             
> +     /*
> +      * XXX Sometimes an empty trackpoint packet (80 80 36 00 00)
> +      * with missing first byte is received, interpret as trackpoint
> +      * button release.
> +      */
> +     if (sc->inputstate >= 3
> +         && (sc->elantech->flags & ELANTECH_F_TRACKPOINT)
> +         && sc->packet[0] == 0x80
> +         && sc->packet[1] == 0x80
> +         && sc->packet[2] == 0x36
> +         && sc->packet[3] == 0x00) {
> +             if (sc->inputstate == 3)
> +                     return (0);
> +             else if (sc->packet[4] != 0x00)
> +                     return (-1);
> +             else {
> +                     for (i = 5; i > 0; i--)
> +                             sc->packet[i] = sc->packet[i-1];
> +                     sc->packet[0] = 0x00;
> +                     sc->inputstate++;
> +                     return (0);
> +             }
> +     }
>  
>       if (sc->inputstate == 3) {
>               switch (elantech_packet_type(sc->elantech, data)) {
> 
> Packet data sample from a pms patched to print each validated packet:
>  44 | 0b 3a 32 0c 32
>  44 | 00 2b 32 fc 27
>  01 | 80 80 36 00 00
>  44 | f6 19 32 f3 1c
>  44 | e6 0b 32 e8 16
> pms0: not in sync yet, discard input (state = 3, 80 80 36 00 | e8 16)
> pms0: not in sync yet, discard input (state = 3, 00 44 b6 fe | e8 16)
> pms0: not in sync yet, discard input (state = 3, 32 a8 0e 44 | e8 16)
> pms0: not in sync yet, discard input (state = 0, d8 | a8 0e 44 e8 16)
> pms0: not in sync yet, discard input (state = 3, f1 32 cb f9 | e8 16)
>  44 | 94 b6 32 92 ca
>  44 | c9 d8 32 ce de
>  44 | cf d1 32 c9 d7
>  44 | c2 b4 32 b6 b8
>  44 | cc b5 32 cc bd
>  44 | da bc 32 e4 cc
>  01 | 80 80 36 00 00
>  44 | ef cb 32 f1 cf
>  44 | fa d2 32 fb d1
> 
> dmesg:
> OpenBSD 6.6-current (GENERIC.MP) #6: Sat Jan 18 11:56:49 CET 2020
>      XXXXXX@XXXXXXX:/usr/src/sys/arch/amd64/compile/GENERIC.MP
> real mem = 16908791808 (16125MB)
> avail mem = 16383868928 (15624MB)
> mpath0 at root
> scsibus0 at mpath0: 256 targets
> mainbus0 at root
> bios0 at mainbus0: SMBIOS rev. 3.0 @ 0x7f0d6000 (63 entries)
> bios0: vendor LENOVO version "R0SET49W (1.33 )" date 12/27/2019
> bios0: LENOVO 20LHCTO1WW
> acpi0 at bios0: ACPI 5.0
> acpi0: sleep states S0 S3 S4 S5
> acpi0: tables DSDT FACP SSDT SSDT TPM2 UEFI SSDT SSDT HPET APIC MCFG ECDT 
> SSDT SSDT BOOT BATB SSDT SSDT SSDT LPIT WSMT SSDT SSDT SSI
> acpi0: wakeup devices GLAN(S4) XHC_(S3) XDCI(S4) RP01(S4) PXSX(S4) RP02(S4) 
> PXSX(S4) PXSX(S4) RP04(S4) PXSX(S4) RP05(S4) PXSX(S4) R]
> acpitimer0 at acpi0: 3579545 Hz, 24 bits
> acpihpet0 at acpi0: 23999999 Hz
> acpimadt0 at acpi0 addr 0xfee00000: PC-AT compat
> cpu0 at mainbus0: apid 0 (boot processor)
> cpu0: Intel(R) Core(TM) i7-8550U CPU @ 1.80GHz, 1587.85 MHz, 06-8e-0a
> cpu0: 
> FPU,VME,DE,PSE,TSC,MSR,PAE,MCE,CX8,APIC,SEP,MTRR,PGE,MCA,CMOV,PAT,PSE36,CFLUSH,DS,ACPI,MMX,FXSR,SSE,SSE2,SS,HTT,TM,PBE,SSE3,PN
> cpu0: 256KB 64b/line 8-way L2 cache
> cpu0: smt 0, core 0, package 0
> mtrr: Pentium Pro MTRR support, 10 var ranges, 88 fixed ranges
> cpu0: apic clock running at 24MHz
> cpu0: mwait min=64, max=64, C-substates=0.2.1.2.4.1.1.1, IBE
> cpu1 at mainbus0: apid 2 (application processor)
> cpu1: Intel(R) Core(TM) i7-8550U CPU @ 1.80GHz, 1439.83 MHz, 06-8e-0a
> cpu1: 
> FPU,VME,DE,PSE,TSC,MSR,PAE,MCE,CX8,APIC,SEP,MTRR,PGE,MCA,CMOV,PAT,PSE36,CFLUSH,DS,ACPI,MMX,FXSR,SSE,SSE2,SS,HTT,TM,PBE,SSE3,PN
> cpu1: 256KB 64b/line 8-way L2 cache
> cpu1: smt 0, core 1, package 0
> cpu2 at mainbus0: apid 4 (application processor)
> cpu2: Intel(R) Core(TM) i7-8550U CPU @ 1.80GHz, 1252.62 MHz, 06-8e-0a
> cpu2: 
> FPU,VME,DE,PSE,TSC,MSR,PAE,MCE,CX8,APIC,SEP,MTRR,PGE,MCA,CMOV,PAT,PSE36,CFLUSH,DS,ACPI,MMX,FXSR,SSE,SSE2,SS,HTT,TM,PBE,SSE3,PN
> cpu2: 256KB 64b/line 8-way L2 cache
> cpu2: smt 0, core 2, package 0
> cpu3 at mainbus0: apid 6 (application processor)
> cpu3: Intel(R) Core(TM) i7-8550U CPU @ 1.80GHz, 1141.82 MHz, 06-8e-0a
> cpu3: 
> FPU,VME,DE,PSE,TSC,MSR,PAE,MCE,CX8,APIC,SEP,MTRR,PGE,MCA,CMOV,PAT,PSE36,CFLUSH,DS,ACPI,MMX,FXSR,SSE,SSE2,SS,HTT,TM,PBE,SSE3,PN
> cpu3: 256KB 64b/line 8-way L2 cache
> cpu3: smt 0, core 3, package 0
> ioapic0 at mainbus0: apid 2 pa 0xfec00000, version 20, 120 pins
> acpimcfg0 at acpi0
> acpimcfg0: addr 0xf8000000, bus 0-63
> acpiec0 at acpi0
> acpiprt0 at acpi0: bus 0 (PCI0)
> acpiprt1 at acpi0: bus 2 (RP01)
> acpiprt2 at acpi0: bus -1 (RP02)
> acpiprt3 at acpi0: bus 4 (RP03)
> acpiprt4 at acpi0: bus -1 (RP04)
> acpiprt5 at acpi0: bus 5 (RP05)
> acpiprt6 at acpi0: bus -1 (RP06)
> acpiprt7 at acpi0: bus -1 (RP07)
> acpiprt8 at acpi0: bus -1 (RP08)
> acpiprt9 at acpi0: bus 6 (RP09)
> acpiprt10 at acpi0: bus -1 (RP10)
> acpiprt11 at acpi0: bus -1 (RP11)
> acpiprt12 at acpi0: bus -1 (RP12)
> acpiprt13 at acpi0: bus -1 (RP13)
> acpiprt14 at acpi0: bus -1 (RP14)
> acpiprt15 at acpi0: bus -1 (RP15)
> acpiprt16 at acpi0: bus -1 (RP16)
> acpiprt17 at acpi0: bus -1 (RP17)
> acpiprt18 at acpi0: bus -1 (RP18)
> acpiprt19 at acpi0: bus -1 (RP19)
> acpiprt20 at acpi0: bus -1 (RP20)
> acpiprt21 at acpi0: bus -1 (RP21)
> acpiprt22 at acpi0: bus -1 (RP22)
> acpiprt23 at acpi0: bus -1 (RP23)
> acpiprt24 at acpi0: bus -1 (RP24)
> acpicpu0 at acpi0: C3(200@1034 mwait.1@0x60), C2(200@151 mwait.1@0x33), 
> C1(1000@1 mwait.1), PSS
> acpicpu1 at acpi0: C3(200@1034 mwait.1@0x60), C2(200@151 mwait.1@0x33), 
> C1(1000@1 mwait.1), PSS
> acpicpu2 at acpi0: C3(200@1034 mwait.1@0x60), C2(200@151 mwait.1@0x33), 
> C1(1000@1 mwait.1), PSS
> acpicpu3 at acpi0: C3(200@1034 mwait.1@0x60), C2(200@151 mwait.1@0x33), 
> C1(1000@1 mwait.1), PSS
> acpipwrres0 at acpi0: PUBS, resource for XHC_
> acpipci0 at acpi0 PCI0: 0x00000010 0x00000011 0x00000000
> acpithinkpad0 at acpi0: version 2.0
> acpiac0 at acpi0: AC unit offline
> acpibat0 at acpi0: BAT0 model "01AV433" serial  XXXX type LiP oem "SMP"
> "PNP0C60" at acpi0 not configured
> "LEN0100" at acpi0 not configured
> "INT3403" at acpi0 not configured
> "INT3403" at acpi0 not configured
> "INT3403" at acpi0 not configured
> acpicmos0 at acpi0
> "INT0E0C" at acpi0 not configured
> acpibtn0 at acpi0: SLPB
> acpibtn1 at acpi0: PWRB
> "PNP0C14" at acpi0 not configured
> "INT33A1" at acpi0 not configured
> acpibtn2 at acpi0: LID_
> "PNP0C14" at acpi0 not configured
> "PNP0C14" at acpi0 not configured
> "PNP0C14" at acpi0 not configured
> "PNP0C14" at acpi0 not configured
> "INT3400" at acpi0 not configured
> "STM7304" at acpi0 not configured
> "USBC000" at acpi0 not configured
> acpivideo0 at acpi0: GFX0
> acpivout0 at acpivideo0: DD1F
> cpu0: using VERW MDS workaround (except on vmm entry)
> cpu0: Enhanced SpeedStep 1587 MHz: speeds: 2001, 2000, 1900, 1800, 1700, 
> 1500, 1400, 1300, 1200, 1100, 1000, 800, 700, 600, 500, 40z
> pci0 at mainbus0 bus 0
> pchb0 at pci0 dev 0 function 0 "Intel Core 8G Host" rev 0x08
> inteldrm0 at pci0 dev 2 function 0 "Intel UHD Graphics 620" rev 0x07
> drm0 at inteldrm0
> inteldrm0: msi
> "Intel Core 6G Thermal" rev 0x08 at pci0 dev 4 function 0 not configured
> "Intel Core GMM" rev 0x00 at pci0 dev 8 function 0 not configured
> "Intel 100 Series ISH" rev 0x21 at pci0 dev 19 function 0 not configured
> xhci0 at pci0 dev 20 function 0 "Intel 100 Series xHCI" rev 0x21: msi, xHCI 
> 1.0
> usb0 at xhci0: USB revision 3.0
> uhub0 at usb0 configuration 1 interface 0 "Intel xHCI root hub" rev 3.00/1.00 
> addr 1
> pchtemp0 at pci0 dev 20 function 2 "Intel 100 Series Thermal" rev 0x21
> "Intel 100 Series MEI" rev 0x21 at pci0 dev 22 function 0 not configured
> ppb0 at pci0 dev 28 function 0 "Intel 100 Series PCIE" rev 0xf1: msi
> pci1 at ppb0 bus 2
> rtsx0 at pci1 dev 0 function 0 "Realtek RTS522A Card Reader" rev 0x01: msi
> sdmmc0 at rtsx0: 4-bit, dma
> ppb1 at pci0 dev 28 function 2 "Intel 100 Series PCIE" rev 0xf1: msi
> pci2 at ppb1 bus 4
> iwm0 at pci2 dev 0 function 0 "Intel Dual Band Wireless-AC 8265" rev 0x78, msi
> ppb2 at pci0 dev 28 function 4 "Intel 100 Series PCIE" rev 0xf1: msi
> pci3 at ppb2 bus 5
> nvme0 at pci3 dev 0 function 0 "Samsung SM981/PM981 NVMe" rev 0x00: msix, 
> NVMe 1.2
> nvme0: SAMSUNG MZVLB1T0HALR-000L7, firmware 5L2QEXA7, serial XXXXXXXXXXXXXX
> scsibus1 at nvme0: 2 targets, initiator 0
> sd0 at scsibus1 targ 1 lun 0: <NVMe, SAMSUNG MZVLB1T0, 5L2Q>
> sd0: 976762MB, 512 bytes/sector, 2000409264 sectors
> ppb3 at pci0 dev 29 function 0 "Intel 100 Series PCIE" rev 0xf1: msi
> pci4 at ppb3 bus 6
> pcib0 at pci0 dev 31 function 0 "Intel 200 Series LPC" rev 0x21
> "Intel 100 Series PMC" rev 0x21 at pci0 dev 31 function 2 not configured
> azalia0 at pci0 dev 31 function 3 "Intel 200 Series HD Audio" rev 0x21: msi
> azalia0: codecs: Conexant/0x2008, Intel/0x280b, using Conexant/0x2008
> audio0 at azalia0
> ichiic0 at pci0 dev 31 function 4 "Intel 100 Series SMBus" rev 0x21: apic 2 
> int 16
> iic0 at ichiic0
> em0 at pci0 dev 31 function 6 "Intel I219-V" rev 0x21: msi, address 
> 9c:5a:44:1f:b7:65
> isa0 at pcib0
> isadma0 at isa0
> pckbc0 at isa0 port 0x60/5 irq 1 irq 12
> pckbd0 at pckbc0 (kbd slot)
> wskbd0 at pckbd0: console keyboard
> pms0 at pckbc0 (aux slot)
> wsmouse0 at pms0 mux 0
> pms0: Elantech Clickpad, version 4, firmware 0x4d1f00
> wsmouse1 at pms0 mux 0
> pcppi0 at isa0 port 0x61
> spkr0 at pcppi0
> vmm0 at mainbus0: VMX/EPT
> efifb at mainbus0 not configured
> uvideo0 at uhub0 port 8 configuration 1 interface 0 "SunplusIT Inc Integrated 
> Camera" rev 2.01/17.91 addr 2
> video0 at uvideo0
> uhidev0 at uhub0 port 10 configuration 1 interface 0 "Wacom Co.,Ltd. Pen and 
> multitouch sensor" rev 2.00/0.02 addr 3
> uhidev0: iclass 3/0, 14 report ids
> uhid0 at uhidev0 reportid 2: input=0, output=0, feature=1
> uhid1 at uhidev0 reportid 3: input=39, output=0, feature=63
> uhid2 at uhidev0 reportid 4: input=0, output=0, feature=15
> uhid3 at uhidev0 reportid 7: input=0, output=0, feature=255
> uhid4 at uhidev0 reportid 8: input=0, output=0, feature=135
> uhid5 at uhidev0 reportid 9: input=0, output=0, feature=63
> ums0 at uhidev0 reportid 10
> ums0: mouse has no X report
> ums1 at uhidev0 reportid 12: 1 button, tip
> wsmouse2 at ums1 mux 0
> uhid6 at uhidev0 reportid 13: input=0, output=0, feature=7
> uhid7 at uhidev0 reportid 14: input=0, output=0, feature=2
> uhidev1 at uhub0 port 10 configuration 1 interface 1 "Wacom Co.,Ltd. Pen and 
> multitouch sensor" rev 2.00/0.02 addr 3
> uhidev1: iclass 3/0, 19 report ids
> ums2 at uhidev1 reportid 1: 2 buttons
> wsmouse3 at ums2 mux 0
> uhid8 at uhidev1 reportid 5: input=23, output=0, feature=8
> ums3 at uhidev1 reportid 6: 3 buttons, tip, barrel, eraser
> wsmouse4 at ums3 mux 0
> uhid9 at uhidev1 reportid 11: input=15, output=0, feature=63
> uhid10 at uhidev1 reportid 15: input=39, output=0, feature=7
> uhid11 at uhidev1 reportid 16: input=20, output=0, feature=63
> uhid12 at uhidev1 reportid 17: input=0, output=0, feature=9
> uhid13 at uhidev1 reportid 18: input=0, output=0, feature=255
> ums4 at uhidev1 reportid 19
> ums4: mouse has no X report
> vscsi0 at root
> scsibus2 at vscsi0: 256 targets
> softraid0 at root
> scsibus3 at softraid0: 256 targets
> sd1 at scsibus3 targ 1 lun 0: <OPENBSD, SR CRYPTO, 006>
> sd1: 831837MB, 512 bytes/sector, 1703603696 sectors
> root on sd1a (XXXXXXXXXXXXXXXX.a) swap on sd1b dump on sd1b
> inteldrm0: 1920x1080, 32bpp
> wsdisplay0 at inteldrm0 mux 1: console (std, vt100 emulation), using wskbd0
> wsdisplay0: screen 1-5 added (std, vt100 emulation)
> iwm0: hw rev 0x230, fw ver 34.0.1, address a0:51:0b:e9:bb:6e
> 

Reply via email to