Debian

滑鼠墊在聯想 Thinkpad 中不起作用

  • June 20, 2019

我在這裡遇到了一個奇怪的問題——集成的突觸滑鼠/橡膠滑鼠在 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

引用自:https://unix.stackexchange.com/questions/467199