目标:
我正在尝试使我的 linux 笔记本电脑(带有 Libreboot 的 T400 ThinkPad)无论盖子是打开还是关闭,其行为方式都完全相同。换句话说,我试图模拟一台笔记本电脑的盖子开关坏了,该开关始终处于“盖子打开”位置。我正在寻找一种不需要特定 init 系统或特定电源管理器的低级解决方案——只需要任何 GNU/Linux 系统中预期存在(或可用)的软件。
我的两个操作系统是运行 Xorg 和 Fluxbox 的 Devuan ASCII(64 位)和 Tiny Core Linux 10.1(64 位),以防万一。内核版本为 4.16.2 (Devuan) 和 4.19.10 (Tiny Core Linux)。
测试:
我正在使用 xscreensaver(设置为在 1 分钟不活动后开始播放动画)作为我的测试应用程序,因为我注意到 xscreensaver 在盖子关闭时不会启动并开始播放动画。因此,当我可以合上盖子时,稍等一分钟,重新打开盖子,发现正在播放 xscreensaver 动画,我就知道我找到了解决方案。
到目前为止我尝试了什么:
机械的。我的笔记本电脑是 T400,它使用蓝牙 LED 上方的小磁铁作为盖子开关。在该位置放置一个小型冰箱磁铁会导致盖子开关卡在“关闭”位置,并且 xscreensaver 测试失败。使用button.lid_init_state=open内核引导参数引导没有帮助。
按键模块启动参数。这个内置模块是笔记本电脑盖子开关的驱动程序。使用button.lid_report_interval=0或=-1或=500000没有帮助。
i915 模块启动参数。Devuan 中的内核支持i915.panel_ignore_lid引导参数。将其设置为 -2 无助于通过 xscreensaver 测试。
视频模块启动参数。使用video.report_key_events=0没有帮助。
ACPI。使用acpi=off内核引导参数禁用它无助于通过测试。
禁用盖子开关。令人惊讶的是,禁用盖子开关并没有帮助。很难禁用按钮模块,因为它内置在内核中(即,它显示为ls /sys/module但不显示为lsmod)。但是,可以在系统启动后取消绑定所有使用按钮模块的设备:
# 1. find the devices that use the button driver:
$ ls /sys/bus/acpi/drivers/button
LNXPWRBN:00 PNP0C0D:00 PNP0C0E:00 bind uevent unbind
# 2. disable the devices one by one:
$ echo "LNXPWRBN:00" | sudo tee /sys/bus/acpi/drivers/button/unbind
LNXPWRBN:00
$ echo "PNP0C0D:00" | sudo tee /sys/bus/acpi/drivers/button/unbind
PNP0C0D:00
$ echo "PNP0C0E:00" | sudo tee /sys/bus/acpi/drivers/button/unbind
PNP0C0E:00
# 3. satisfy oneself that the devices are gone:
$ ls /sys/bus/acpi/drivers/button
bind uevent unbind
即使这样,xscreensaver 动画会在盖子打开时启动,但不会在盖子关闭时启动。
捕获触摸板事件。通过观察cat /dev/input/event5的输出,我注意到打开和关闭笔记本电脑盖会导致突触触摸板生成一些输入。使用evtest --grab /dev/input/event5 >/dev/null 获取所有输入并没有帮助。
告诉X不要挡道。X 启动后,我在引导时以普通用户身份运行这些命令:xset s off; xset -dpms; xset 的 noblank。这些命令告诉 X 我不想要它的空白屏幕屏幕保护程序,我不想要 DPMS,并且它永远不应该使屏幕空白。它没有帮助。
BIOS。我已经搜索了在 BIOS(在我的情况下为 Libreboot)级别禁用盖子开关的方法,但没有找到任何相关的内容。
这就是我到目前为止所尝试的全部。即使结合了以上所有,用户态应用程序(xscreensaver 是它们的代表)仍然会根据笔记本电脑盖是打开还是关闭而表现不同。(在 xscreensaver 的情况下,它只在笔记本电脑盖打开时开始播放动画,而在它关闭时从不播放。)
当然,必须有一种方法可以通过软件完全禁用笔记本电脑的盖子开关,并让用户级应用程序认为笔记本电脑的盖子总是打开的。我错过了什么?
上面的数字 6 实际上确实完全禁用了盖子开关。
问题是 T400 的触摸板在合上盖子时实际上会产生一些噪音,这会阻止诸如 xscreensaver(等待输入设备空闲)之类的应用程序运行。我通过观察输出发现了这一点
(在我的系统上,event5 是触摸板)
像这样禁用盖子开关和触摸板会导致预期的行为:
现在,无论盖子是打开还是关闭,所有应用程序的行为都相同。
但是请注意,解除绑定 serio1 会导致我的跟踪点(“乳头鼠标”)变得无响应。这是不希望的副作用。