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