为什么我的笔记本电脑的键盘从内核 5.4.0-47 到 5.8.0-20 都乱了?

为什么我的笔记本电脑的键盘从内核 5.4.0-47 到 5.8.0-20 都乱了?

我的 Kubuntu 从内核 5.4.0-42 更新到内核 5.4.0-47,我的笔记本电脑键盘停止工作(亮度键除外)。重新启动到 5.4.0-42 解决了这个问题。

键盘在 Windows 10 上也能完美运行(我有双启动)。

键盘在 GRUB (2.04) 中也能正常工作。但在内核 5.4.0-47 及以上版本中则不行。

更新到 Kubuntu 20.10(测试版)也无济于事(内核 5.8.0-20 有同样的问题)。

我的问题与此类似:HP 笔记本电脑上的键盘在内核 5.4.0-45-generic 下停止工作

是的,我在启动板上看到了这个:https://bugs.launchpad.net/ubuntu/+source/linux/+bug/1894017

那么问题是什么?为什么它没有在内核 5.4.0-47 - 5.8.0-20 的整个范围内修复?

答案1

解决方案在这里找到:https://bugs.launchpad.net/ubuntu/+source/linux/+bug/1894017

我刚刚将intel_vbtn内核模块列入黑名单/etc/modprobe.d/blacklist.conf并重新启动。作者提到,不知何故intel_vbtn认为我的笔记本电脑处于平板电脑模式(什么?!)并禁用了键盘/触摸板。

如何加入黑名单

/etc/modprobe.d要实现这一点,您可以创建一个带有后缀的新文件.conf,也可以使用主blacklist.conf文件。前者可能更可取,因为您可以在不再需要该文件时(即修复错误时)删除它:

sudoedit /etc/modprobe.d/blacklist-intel_vbtn.conf

在文件中添加一行,可选择添加注释来解释为什么这样做

# bug in module breaks keyboard, so don't load it
blacklist intel_vbtn

保存文件,退出并重新启动。

PS:在与 RedHat 的 Hans de Goede 先生发送邮件后,我得到了以下答复:

这个问题应该由这个上游提交来修复,几个小时前它出现在 Linus 的树中: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/drivers/platform/x86?id=8169bd3e6e193497cab781acddcff8fde5d0c416

伊戈尔,如果你这么做:

cat /sys/class/dmi/id/chassis_type

在你的笔记本电脑上,输出是不是“31”或“32”然后此修复应该有效为你。

如果输出实际上是“31”或“32(我不希望这样),那么请告诉我,因为我们需要不同的修复方法。

PPS 在我的系统(Intel Celeron N2940)上chassis_type返回10

答案2

这似乎是 libinput,它SW_TABLET_MODE从笔记本电脑的某个输入设备接收事件。我不知道为什么他们在接收该事件时禁用键盘和触摸板,但我猜这是为了避免按下笔记本电脑上的按钮,你可以翻转屏幕,这样键盘/触摸板就位于触摸屏下方。

但是,即使键盘没有翻转,某些笔记本电脑型号也会发出此事件。Dell Precision 5760 有一个“Intel HID 开关”输入设备,当笔记本电脑移动时会触发此事件。因此,每次我触发加速度计时,内置键盘和触摸板都会停止工作一段时间。然后它又回到笔记本电脑模式。这个错误似乎已经 [几周前修复] [1],所以希望它能很快在稳定版本中推出。

其他人建议使用黑名单intel_vbtn,但对我来说没用。可能是因为使用了不同的驱动程序。但我找到了另一种解决方法,这是 libinput 中针对此确切问题的解决方案;为触发平板电脑模式的输入设备注册一个怪癖:ModelTabletModeSwitchUnreliable

首先,您需要确定哪个输入设备触发了该SW_TABLET_MODE事件。安装 libinput-tools 以帮助您调试问题:

$ sudo atp install libinput-tools

现在我们需要用 记录所有输入事件sudo libinput debug-events。启动它,并尝试触发SW_TABLET_MODE事件。它应该看起来像这样:

-event27  SW_TABLET_MODE  .....

这意味着它/dev/input/event27触发了平板电脑模式。其他设备的数字可能不同。让我们列出输入设备以找出它的名称:

$ sudo libinput list-devices

查找之前获取的活动编号,并记下设备名称

Device:           Intel HID switches
Kernel:           /dev/input/event27

现在我们需要一些用于识别您计算机的 Modalias 的标识符:

$ cat /sys/class/dmi/id/modalias
dmi:bvnDellInc.:bvr1.4.1:bd09/08/2021:br1.4:svnDellInc.:pnPrecision5760:pvr:sku0A5E:rvnDellInc.:rn0FW9DW:rvrA00:cvnDellInc.:ct10:cvr:

选择哪个部分实际上并不重要,但我选择了它,svnDellInc.:pnPrecision5760:因为它包括了我的计算机的制造商和型号。

以root身份创建一个文件/etc/libinput/local-overrides.quirks

[QUIRKS DESCRIPTION]
MatchName=*DEVICE NAME*
MatchDMIModalias=dmi:*PART OF MODALIAS*
ModelTabletModeSwitchUnreliable=1

对于我的 Dell Precision 5760 来说,它看起来像这样:

[Precision 5760 Disable Tablet Mode]
MatchName=*Intel HID switches*
MatchDMIModalias=dmi:*svnDellInc.:pnPrecision5760:*
ModelTabletModeSwitchUnreliable=1

保存文件。要验证怪癖是否与设备匹配,请尝试:

$ libinput quirks list /dev/input/event27

它应该输出ModelTabletModeSwitchUnreliable怪癖。

重新启动计算机,该SW_TABLET_MODE事件将被忽略。

相关内容