如何让Linux用户态应用程序认为笔记本电脑的盖子始终打开?

如何让Linux用户态应用程序认为笔记本电脑的盖子始终打开?

目标:

我正在尝试让我的 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 动画时,我就知道我已经找到了解决方案。

到目前为止我已经尝试过的

  1. 机械的。我的笔记本电脑是 T400,它在蓝牙 LED 上方使用一个小磁铁作为其盖子开关。将一个小冰箱磁铁放在该位置会导致盖子开关卡在“关闭”位置,并且 xscreensaver 测试失败。启动时使用Button.lid_init_state=打开内核启动参数没有帮助。

  2. 按键模块启动参数。该内置模块是笔记本电脑盖子开关的驱动程序。使用按钮.lid_report_interval=0或者=-1或者=500000没有帮助。

  3. i915模块启动参数。 Devuan 中的内核支持i915.panel_ignore_lid启动参数。将其设置为 -2 无助于通过 xscreensaver 测试。

  4. 视频模块启动参数。使用video.report_key_events=0没有帮助。

  5. ACPI。禁用它ACPI=关闭内核启动参数无助于通过测试。

  6. 禁用盖子开关。令人惊讶的是,禁用盖子开关并没有帮助。很难禁用按钮模块,因为它内置于内核中(即,它显示为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 动画也会在盖子打开时启动,但在盖子关闭时不会启动。

  1. 捕获触摸板事件。我通过观察输出注意到猫 /dev/input/event5打开和关闭笔记本电脑盖子会导致 synaptics 触摸板生成一些输入。抓取所有输入evtest --grab /dev/input/event5 >/dev/null没有帮助。

  2. 告诉 X 别挡道。 X 启动后,我在启动时以普通用户身份运行这些命令:xset 关闭; xset-dpms; xset s noblank。这些命令告诉 X 我不想要它的空白屏幕屏幕保护程序,我不想要 DPMS,并且它永远不应该使屏幕空白。这没有帮助。

  3. 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 会导致我的轨迹点(“乳头鼠标”)变得无响应。这是不希望的副作用。

相关内容