Thinkpad t480s elantech touchpad device is not recognized: unknown touchpad firmware (firmware v.0x7f3001)
Andrey Kosachenko
andrey.kosachenko at gmail.com
Thu May 16 22:39:44 UTC 2019
Hi,
Recently I've replaced my t410 with t480s model.
Before ordering the device I found positive feedback in terms of FreeBSD
compatibility (pages like https://wiki.freebsd.org/Laptops/Thinkpad_T480)
Apparently device is equipped with newer clickpad+trackpoint device
which is not recognized by 12R properly:
FreeBSD beastie.intra 12.0-RELEASE-p3 FreeBSD 12.0-RELEASE-p3 #2
r347114M: Sun May 12 00:08:31 EEST 2019
root at beastie.intra:/usr/obj/usr/src/amd64.amd64/sys/BEASTIE-EVDEV amd64
Attempts to enable hw.psm.synaptics_support or(and)
hw.psm.elantech_support didn't help either. Though trackpoint works
just fine after enabling hw.psm.trackpoint_support
instead touchpad is recognized as generic PS/2 mouse (relevant strings
from dmesg)
===
May 11 22:39:41 beastie kernel: atkbd0: [GIANT-LOCKED]
May 11 22:39:41 beastie kernel: Unknown touchpad hardware (firmware
v.0x7f3001)
May 11 22:39:41 beastie kernel: psm0: <PS/2 Mouse> irq 12 on atkbdc0
May 11 22:39:41 beastie kernel: psm0: [GIANT-LOCKED]
May 11 22:39:41 beastie kernel: psm0: model Generic PS/2 mouse, device ID 0
===
I was pretty much happy working with the device in general and with the
tuouchpad in particular (as a simple mouse). Even got accustomed to the
absence of double-finger scroll capability (which I could simulate via
holding mid-button+swipe on touchpad) and triple-finger-tap as a
midle-button-click). The only thing that I failed to workaround was
accidental palm touches which is really painful and makes keyboard usage
unbearable. Eventually I tried to seek for normal solution.
Lenovo site sujests for t480s devices "ELAN UltraNav Driver for Windows
10 64-bit - ThinkPad T480s (Type 20L7, 20L8)" driver. Which made me
think it is elantech (not synaptics). Looking through the psm sources
quickly led me to the point where a very simple modification and
recompilation of the kernel helped to recognize touchpad properly. In
particular:
===
[silent at beastie][/usr/src]svnlite diff sys/dev/atkbdc/psm.c
Index: sys/dev/atkbdc/psm.c
===================================================================
--- sys/dev/atkbdc/psm.c (revision 347114)
+++ sys/dev/atkbdc/psm.c (working copy)
@@ -6929,7 +6929,7 @@
{
static const int ic2hw[] =
/*IC: 0 1 2 3 4 5 6 7 8 9 a b c d e f */
- { 0, 0, 2, 0, 2, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 0 };
+ { 0, 0, 2, 0, 2, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4 };
static const int fw_sizes[][3] = {
/* FW.vers MaxX MaxY */
{ 0x020030, 1152, 768 },
===
I.e. after that simple modification system started to recognize fw version:
===
[silent at beastie][/usr/src]dmesg | egrep psm
psm0: <PS/2 Mouse> irq 12 on atkbdc0
psm0: [GIANT-LOCKED]
psm0: model Elantech Touchpad, device ID 0
===
and all expected touchpad features (multi-tap gestures and scrolling,
whatsoever) started to function properly under xorg+evdev. I'm happy
with a touchpad now however trackpoint stopped to work. In particular
attempt to use trackpoint causes strange flickering of the mice cursor
(which lasts few fractions of the second) after which cursor jumps to
the left-upper corner of the screen and it's impossible to move it (via
trackpoint) anymore (though swiping touchpad surface moves cursor as
expected). Also I found in Xorg.log messages emerging when a palm
touches the surface of a touchpad:
===
[ 65.729] (EE) event3 - ETPS/2 Elantech Touchpad: kernel bug: Touch
jump detected and discarded.
See
https://wayland.freedesktop.org/libinput/doc/1.12.6/touchpad-jumping-cursors.html
for details
===
Additionally I found relevant topic in openbsd lists
http://openbsd-archive.7691.n7.nabble.com/ThinkPad-T480s-Elantech-v4-clickpad-configuration-td342242.html.
Eventually I narrow down it to the following changes:
https://github.com/openbsd/src/commit/8e9e9c10431cb45d93e2c0d81f668ff9575f8015#diff-ff06b79b08490ebbfa34b15aa4ebf370
. I might be inherently wrong (due to lack of knowledge in C language
and driver implementation) however it seemed to me that the similar
logic the diff above reveals (besides fw detection) had already been
added to psm.c from FreeBSD sources earlier.
So I'm writing here for 2 purposes:
1) not sure that my modification is proper in terms of firmware version
detection (so can't send patch since there is a high chance it will be
rejected)
2) modification is definitely either incomplete or incorrect since it
brakes trackpoint functioning.
Since I possess a laptop with a device which is not supported yet, I
might help to debug the issue or even dedicate some time and try to add
support for a new device (just need a nudge into proper direction)
Thanks in advance!
--
WBR,
Andrey Kosachenko
More information about the freebsd-drivers
mailing list