滑鼠墊在聯想 Thinkpad 中不起作用
我在這裡遇到了一個奇怪的問題——集成的突觸滑鼠/橡膠滑鼠在 Linux 中不起作用。
集成滑鼠/滑鼠墊僅在 Windows 已首先啟動它們時才起作用。我可以在 Linux 中進行多次重新啟動,並且它們確實可以繼續工作。只要筆記本沒有斷電,它們就會被辨識。
如果筆記本耗盡所有電池,我只能在首先在 Windows 中啟動時才能再次使用滑鼠墊/滑鼠。
因此,我可以在 Linux 執行時輕鬆重現錯誤並取出電池。這樣,滑鼠墊在我再次在 Windows 中啟動之前不會被辨識。因此,當硬體處於未知(初始化)狀態時,開源驅動程序似乎無法辨識設備。
我在 2016 Lenovo ThinkPad E560、i7-6500U CPU @ 2.50GHz、16GB RAM 和 SSD 磁碟中使用 Debian 9/Antix 17.1。
這台機器有一個雙卡,但是我
radeon.modeset=0
在核心參數中停用了 radeon。所以相關參數為:$ lspci | grep VGA 00:02.0 VGA compatible controller: Intel Corporation HD Graphics 520 (rev 07)
我的
xserver-xorg
相關軟體包是:xserver-xorg - 7.7+19 xserver-xorg-core - 1.19.2-1.0nosystemd2 xserver-xorg-input-libinput - 0.23.0-2 xserver-xorg-input-synaptics - 1.9.0-1+b1 xserver-xorg-video-intel - 2.99.917+git20161206-1
我已經嘗試執行 Antix 儲存庫中存在的 Debian 核心,
4.10.5-antix.3-amd64-smp
並且4.18.4-antix.1-amd64-smp
症狀沒有任何變化;正如@StephenKitt 告訴我的那樣,新版本的突觸處理髮生了變化。我目前的核心參數是:
$ cat /proc/cmdline BOOT_IMAGE=/boot/vmlinuz-4.18.4-antix.1-amd64-smp root=UUID=00c17984-859f-4197-8bd8-b346ddd092bd ro iommu=1 intel_iommu=on iommu=pt ipv6.disable=1 intremap=no_x2apic_optout radeon.modeset=0
我還遵循了一些線上建議,將 xorg 中的滑鼠墊處理從 xserver-xorg-input-synaptics 更改為 xserver-xorg-input-libinput,安裝後者,然後執行以下操作:
cd /etc/X11/xorg.conf.d ln -s /usr/share/X11/xorg.conf.d/40-libinput.conf
症狀保持不變。
我還在 Windows 10 的設備管理器中查看了設備/驅動程序的名稱,它是一個名為“Ultranav”的雙滑鼠滑鼠墊/鍵盤橡膠。
libinput-list-devices
也將其命名為“AlpsPS/2 ALPS DualPoint TouchPad”。其他一些人也將這款滑鼠 Elantech 稱為其他聯想型號。我也安裝
libinput-tools
了調試情況。有趣的是,libinput-list-devices
在執行 Windows 之後會看到執行該命令的滑鼠,而在它不存在之前。我已經有了與核心團隊一起填補 bug 的建議。
該怎麼辦?
製造商和型號的相關
dmidecode
數據為:# dmidecode -s system-manufacturer LENOVO # dmidecode -s system-product-name 20EV000YPG # dmidecode -s system-version ThinkPad E560
libunput-list-devices
啟動 Windows 10 之前和之後的差異。$ diff libunput-list-devices-before_windows.txt after-windows.txt 2c2 < Kernel: /dev/input/event8 --- > Kernel: /dev/input/event10 20c20 < Kernel: /dev/input/event10 --- > Kernel: /dev/input/event12 38c38 < Kernel: /dev/input/event7 --- > Kernel: /dev/input/event9 128c128 < Kernel: /dev/input/event18 --- > Kernel: /dev/input/event20 163,164c163,164 < Device: ThinkPad Extra Buttons < Kernel: /dev/input/event9 --- > Device: AlpsPS/2 ALPS DualPoint Stick > Kernel: /dev/input/event6 165a166,202 > Seat: seat0, default > Capabilities: pointer > Tap-to-click: n/a > Tap-and-drag: n/a > Tap drag lock: n/a > Left-handed: disabled > Nat.scrolling: disabled > Middle emulation: disabled > Calibration: n/a > Scroll methods: *button > Click methods: none > Disable-w-typing: n/a > Accel profiles: flat *adaptive > Rotation: n/a > > Device: AlpsPS/2 ALPS DualPoint TouchPad > Kernel: /dev/input/event7 > Group: 7 > Seat: seat0, default > Size: 97.50x53.87mm > Capabilities: pointer > Tap-to-click: disabled > Tap-and-drag: enabled > Tap drag lock: disabled > Left-handed: disabled > Nat.scrolling: disabled > Middle emulation: disabled > Calibration: n/a > Scroll methods: *two-finger edge > Click methods: *button-areas clickfinger > Disable-w-typing: enabled > Accel profiles: none > Rotation: n/a > > Device: ThinkPad Extra Buttons > Kernel: /dev/input/event11 > Group: 8
有趣的是,在搜尋這個 bug 的變體,包括 Lenovo、Alps 和 Ultranav,我在 Arch Linux wiki libinput的文章中發現了一篇建議核心參數的文章
根本沒有檢測到觸摸板
注意:不是 libinput 問題。Touchpad_Synaptics#No_Multi-touch_in_some_Elantech_touchpads 中連結了對參數的解釋,這比說“嘗試其中一些”要好得多。
如果根本沒有檢測到觸摸板設備並將其顯示為設備,則可能的解決方案可能是使用這些核心參數中的一個或多個。
i8042.noloop i8042.nomux i8042.nopnp i8042.reset
然後我做了一些測試,發現在我的情況下,將核心參數添加
i8042.reset
到文件中並執行就足夠GRUB_CMDLINE_LINUX_DEFAULT
了:/etc/default/grub
update-grub2
之後,我取出電池嘗試複製錯誤。機器當機重啟Linux後,Ultranav/Elantech內置滑鼠已經被辨識並開始工作,無需先啟動Windows 10。
我會說這是一個核心錯誤。
與其他筆記本類似,Lenovo Thinkpad 需要添加到 Linux 核心中的 i8042 設備重置列表中,其中有一個需要 i8042 晶片組重置的家庭機器列表,以便持續檢測其 Elantech TouchPad。
我在找到這些錯誤條目後發現了這個後來的要求 輸入:i8042 - 將聯想 LaVie Z 添加到 i8042 重置列表和輸入:i8042:將聯想 ThinkPad L460 添加到 i8042 重置列表
從 Linux 核心原始碼的視覺檢查來看,將 Lenovo ThinkPad E560 添加到 i8042 重置列表的原始碼也沒有出現在最新的 4.19-rc2 核心原始碼中。
所以為了添加它,我寫了一個簡單的 diff/patch 可以用來代替 grub 中的 i8042.reset 核心參數:
--- drivers/input/serio/i8042-x86ia64io.h.old 2018-09-06 04:53:36.460003164 +0100 +++ drivers/input/serio/i8042-x86ia64io.h 2018-09-06 04:57:16.833465129 +0100 @@ -655,6 +655,14 @@ DMI_MATCH(DMI_PRODUCT_NAME, "P65xRP"), }, }, + { + /* Lenovo ThinkPad E560 */ + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), + DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad E560"), + }, + }, + { } };
PS。根據@StephenKitt 的建議,我嘗試將這篇文章作為 Linux 核心錯誤報告發送到 linux-input@vger.kernel.org