Video

如何讓 linux 使用者態應用程序認為筆記型電腦的蓋子總是打開的?

  • November 18, 2019

目標

我正在嘗試使我的 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 動畫,我就知道我找到了解決方案。

到目前為止我嘗試了什麼

  1. 機械的。我的筆記型電腦是 T400,它使用藍牙 LED 上方的小磁鐵作為蓋子開關。在該位置放置一個小型冰箱磁鐵會導致蓋子開關卡在“關閉”位置,並且 xscreensaver 測試失敗。使用button.lid_init_state=open核心引導參數引導沒有幫助。
  2. 按鍵模組啟動參數。這個內置模組是筆記型電腦蓋子開關的驅動程序。使用button.lid_report_interval=0或*=-1=500000*沒有幫助。
  3. i915 模組啟動參數。Devuan 中的核心支持i915.panel_ignore_lid引導參數。將其設置為 -2 無助於通過 xscreensaver 測試。
  4. 影片模組啟動參數。使用video.report_key_events=0沒有幫助。
  5. ACPI使用acpi=off核心引導參數禁用它無助於通過測試。
  6. 禁用蓋子開關。令人驚訝的是,禁用蓋子開關並沒有幫助。很難禁用按鈕模組,因為它內置在核心中(即,它顯示為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 動畫會在蓋子打開時啟動,但不會在蓋子關閉時啟動。

  1. 擷取觸摸板事件通過觀察cat /dev/input/event5的輸出,我注意到打開和關閉筆記型電腦蓋會導致突觸觸摸板生成一些輸入。使用evtest –grab /dev/input/event5 >/dev/null 獲取所有輸入並沒有幫助。
  2. 告訴X不要擋道。X 啟動後,我在引導時以普通使用者身份執行這些命令:xset s off; xset -dpms; xset 的 noblank。這些命令告訴 X 我不想要它的空白螢幕螢幕保護程序,我不想要 DPMS,並且它永遠不應該使螢幕空白。它沒有幫助。
  3. BIOS。我已經搜尋了在 BIOS(在我的情況下為 Libreboot)級別禁用蓋子開關的方法,但沒有找到任何相關的內容。

這就是我到目前為止所嘗試的全部。即使結合了以上所有,使用者態應用程序(xscreensaver 是它們的代表)仍然會根據筆記型電腦蓋是打開還是關閉而表現不同。(在 xscreensaver 的情況下,它只在筆記型電腦蓋打開時開始播放動畫,而在它關閉時從不播放。)

當然,必須有一種方法可以通過軟體完全禁用筆記型電腦的蓋子開關,並讓使用者級應用程序認為筆記型電腦的蓋子總是打開的。我錯過了什麼?

上面的數字 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 會導致我的跟踪點(“乳頭滑鼠”)變得無響應。這是不希望的副作用。

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