如何讓 linux 使用者態應用程序認為筆記型電腦的蓋子總是打開的?
目標:
我正在嘗試使我的 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(等待輸入設備空閒)之類的應用程序執行。我通過觀察輸出發現了這一點
$ 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 會導致我的跟踪點(“乳頭滑鼠”)變得無響應。這是不希望的副作用。