三星 Galaxy Book 系列附加 Linux 平台驅動程式。
目前狀態:
其目的是在 Linux 中複製三星在 Windows 中所做的事情,我認為以下元件正在做的事情:
SCAI
ACPI 設備互動以控制許多此類設定。SamsungSystemSupportEngine.exe
的服務,該程式似乎處理用戶空間/應用程式方面的許多事情,包括:這是一個新的(目前)完全樹外核心平台驅動程序,旨在模仿Samsung 系統事件控制器Windows 系統裝置驅動程式似乎正在執行的操作(即與SCAI
ACPI 裝置通訊以控制這些額外功能) )。添加更多功能並經過測試後,我的目的是嘗試提交要添加到核心的驅動程式。
目前已實現以下功能:
fan_speed_rpm
sysfs 屬性以及新的 hwmon 設備進行風扇速度監控以下功能可能可以實現,但需要額外的調試和開發:
SAM0427
的型號的螢幕亮度此平台驅動程式支援的設備應該是sudo dmidecode --type 3
報告的任何設備Manufacturer: SAMSUNG ELECTRONICS CO., LTD.
Type: Notebook
,此外,ACPI 設備SCAI
ACPI 設備 ID 與驅動程式中給出的清單相符(撰寫本文時為SAM0427
、 SAM0428
、 SAM0429
和SAM0430
)。這涵蓋了大多數目前可用的「Samsung Galaxy Book」系列筆記型電腦,但也可能包括其他筆記型電腦。
目的是平台驅動程式中的每個功能在啟用該功能之前都會嘗試以某種方式測試它是否受支援。某些設備的硬體略有不同和/或行為方式略有不同;如果您的裝置的驅動程式停用了您認為應該支援的某些功能,請建立一個問題!
我還發現 Windows 對SAM0426
使用相同的驅動程式(由 Notebook 9 Pro 15" 和/或類似設備使用),因此我懷疑該驅動程式的大部分內容可能也適用於這些設備。如果您有一個這些設備,並想用它來測試這個驅動程序,請創建一個問題來尋求幫助並分享您的發現。
平台驅動程式支援以下模組參數:
kbd_backlight
:啟用鍵盤背光控制(預設為開啟)(布林)battery_threshold
:啟用電池充電閾值控制(預設為開啟)(布林)performance_mode
:啟用效能模式控制(預設為開啟)(布林)allow_recording
:啟用控制以允許或阻止存取攝影機和麥克風(預設開啟)(布林)fan_speed
:啟用風扇速度(預設開啟)(布林)i8042_filter
:啟用擷取鍵盤熱鍵事件(預設開啟)(布林)一般來說,這些參數的目的是允許啟用或停用驅動程式提供的各種功能,特別是在特定功能似乎導致裝置出現問題的情況下。各種「設定」平台屬性( usb_charge
、 start_on_lid_open
等)的可用性將始終啟用(如果它們似乎受支援),並且此時無法停用。
注意:如果您發現需要停用某些功能以避免裝置出現問題,請提出問題!
在樹外但針對目前載入的核心模組編譯模組:
make -C /lib/modules/ ` uname -r ` /build M= $PWD
將此模組安裝到目前已載入的核心模組:
sudo make -C /lib/modules/ ` uname -r ` /build M= $PWD modules_install
sudo depmod
注意:如果您希望啟用偵錯訊息,則可以新增
samsung_galaxybook.dyndbg=+p
或類似的啟動參數。
載入模組(包括啟用偵錯訊息):
sudo modprobe samsung-galaxybook dyndbg=+p
卸載模組:
sudo rmmod samsung-galaxybook
卸載模組:
sudo rm /lib/modules/ ` uname -r ` /updates/samsung-galaxybook.ko *
該模組可以與 dkms 一起安裝,並為每個新核心提供自動安裝。
將模組加入 dkms 樹:
sudo dkms add /path/to/module/directory/samsung-galaxybook-extras
建構模組:
sudo dkms build samsung-galaxybook/extras
安裝模組:
sudo dkms install samsung-galaxybook/extras
卸載模組:
sudo dkms uninstall samsung-galaxybook/extras
如果您想要對驅動程式進行簽名以避免出現訊息samsung_galaxybook: module verification failed: signature and/or required key missing - tainting kernel
,那麼您將需要按照您的發行版的典型流程對模組進行簽名。對於基於 Debian 的發行版(包括 Ubunutu),您可以為目前核心安裝linux-source
軟體包,並使用包含的金鑰和腳本對模組進行簽名,如下所示:
sudo rmmod samsung-galaxybook
/usr/src/ ` uname -r ` /debian/scripts/sign-module sha512 /usr/src/ ` uname -r ` /debian/certs/signing_key.pem /usr/src/ ` uname -r ` /debian/certs/signing_key.x509 samsung-galaxybook.ko
sudo cp samsung-galaxybook.ko /lib/modules/ ` uname -r ` /updates/samsung-galaxybook.ko
sudo modprobe samsung-galaxybook dyndbg=+p
如果您啟用列印偵錯訊息,則可以使用更詳細的訊息。如果目前核心的CONFIG_DYNAMIC_DEBUG
已啟用,則可以使用動態偵錯來完成此操作。有關如何使用此功能的更多信息,請參閱內核文檔:動態調試
以下是一些範例:
# enable printing all messages from the module when loading it
sudo modprobe samsung-galaxybook dyndbg=+p
# enable printing all messages from the module after it has been loaded
echo " module samsung_galaxybook +p " | sudo tee /sys/kernel/debug/dynamic_debug/control
您也可以將參數samsung_galaxyboo.dyndbg
新增至啟動命令列參數或modprobe.d
設定檔(如果您希望自動啟用),並新增任何所需的值(例如+p
)。
模組參數可用於啟用或停用大多數功能。例如,以下程式碼將僅使用核心設定標誌( usb_charge
、 start_on_lid_open
等)和 kbd_backlight LED 類別重新載入模組,並且所有其他功能將被停用:
sudo rmmod samsung-galaxybook
sudo modprobe samsung-galaxybook dyndbg=+p kbd_backlight=on battery_threshold=off performance_mode=off allow_recording=off fan_speed=off i8042_filter=off
請注意,這些也可以加入啟動參數(例如samsung_galaxybook.fan_speed=off
)。
我的一個普遍觀察是,三星這些設備的韌體實際上存在許多錯誤,例如:
如果我們真的能從三星那裡得到一些幫助,那就太好了!
三星決定使用主鍵盤設備來發送大部分熱鍵事件。如果驅動程式希望捕獲這些熱鍵並對其進行操作,那麼我們將不得不執行一些操作,例如使用 i8402 過濾器來「捕獲」按鍵事件。
我還發現一些熱鍵事件存在衝突,因此這是一個有點棘手的領域。
鍵盤背光熱鍵將以循環方式循環顯示所有可用的背光亮度級別,達到最大值時再次從 0 開始(即 0、1、2、3、0、1...)。
該操作將在熱鍵的 keyup 上觸發,因為 keydown 報告的事件似乎與電池充電進度的事件相同(因此當您開始充電時事情會變得有點瘋狂!)。
熱鍵也應該觸發 LED 的硬體變更事件,在 GNOME(以及其他可能的)中,LED 會自動顯示一個漂亮的 OSD 彈出窗口,並顯示正確的背光等級。
阻止錄製熱鍵將切換allow_recording
功能,該功能可阻止對內建攝影機和麥克風的存取。
效能模式熱鍵也將以循環方式循環瀏覽所有可用的平台設定檔(低功耗、安靜、平衡、效能、低功耗、安靜…)。
目前沒有 OSD 彈出窗口,但如果需要,可以從「Samsung Galaxy Book extra Buttons」輸入裝置擷取該事件。
創建了一個新的輸入裝置“Samsung Galaxy Book extra Button”,它將發送來自 ACPI 裝置的一些通知的輸入事件:
SAM0428
型號)SAM0428
型號)建立了一個名為samsung-galaxybook::kbd_backlight
的新 LED 類,可以透過/sys/class/leds/samsung-galaxybook::kbd_backlight/brightness
(值 0 到 3)的sysfs
或許多標準實用程式(例如brightnessctl
、 light
等
它似乎也會在面板中的 GNOME 45.x 中自動拾取,您可以在其中單擊Keyboard
旁邊的箭頭並調整滑桿。
請注意,Windows中「X秒後自動關閉鍵盤背光」的設定實際上是由三星的應用程式服務控制的,而不是由裝置驅動程式本身控制的; GNOME 中有一個類似的功能(可能還有其他功能),它會在一定的空閒時間後切換到最低級別(例如,當您空閒時從3 切換到1,然後在恢復時返回到3),但不管怎樣功能可能應該以某種方式在用戶空間中控制,而不是由核心驅動程式控制。
另請注意,大多數這些設備都有環境光感應器,這也會影響鍵盤背光。此行為在 Windows 中無法控制,而且我尚未在 ACPI 中找到任何似乎能夠停用此功能的內容。這意味著有時您可能會認為鍵盤背光只是隨機關閉或已停止工作,但實際情況是它是由於環境光感應器而關閉的。測試何時發生這種情況的一種方法(確保實際上是環境光感應器導致鍵盤背光關閉)是以某種方式覆蓋感應器(例如,用手指),然後查看是否燈又亮了。
此平台驅動程式將添加設定電池充電控制結束閾值,但無權設定啟動閾值。此功能通常被 Windows 中的各種 Samsung 應用程式稱為“電池保護程式”,但在 Linux 中,我們將實現添加到 UPower 識別的電池裝置中的標準屬性。
如果使用者希望保持與 Windows 的互通性,則應將該值設為 80 表示“開啟”,或設為 0 表示“關閉”,因為這些值會被各種基於 Windows 的三星應用程式和服務識別為“開”或“關”。否則,設備將接受 0(關閉)和 99 之間的任何值作為您希望電池停止充電的百分比。如果您嘗試將值設為 100,則驅動程式也會接受此輸入,但只需將屬性值設為 0(即 100% 解釋為「關閉電池保護程式」)。
在/sys/class/power_supply/BAT1/charge_control_end_threshold
處建立了一個新的裝置屬性,可以讀取或寫入該屬性。
# read current value (percentage the battery will stop charging)
cat /sys/class/power_supply/BAT1/charge_control_end_threshold
# turn on and set to 80%
echo 80 | sudo tee /sys/class/power_supply/BAT1/charge_control_end_threshold
# turn off charge control threshold so that charging will not be stopped before 100%
echo 0 | sudo tee /sys/class/power_supply/BAT1/charge_control_end_threshold
注意:我注意到,如果您目前已插入電源,而電池已經達到所需的
charge_control_end_threshold
,則關閉此功能(即您希望完全充電至 100%,因此將值設為 0),充電似乎不會自動啟動。在這種情況下,可能需要斷開並重新連接充電線。 Windows 驅動程式似乎正在對 ACPI 電池設備進行一些惡作劇,我還沒有完全弄清楚;我猜想這就是他們如何讓它在 Windows 中更無縫地工作?
還有一個輸入事件會傳送到標準鍵盤和 ACPI 設備,該事件在啟用充電控制並且充電達到所需的charge_control_end_threshold
時產生;該事件已映射到BATTERY
事件,以便可以顯示通知(有關此方面的更多信息,請參閱下面的鍵盤重新映射部分)。
要打開或關閉“打開蓋子時啟動”設定(打開蓋子時筆記型電腦將自動開機),在/sys/devices/platform/samsung-galaxybook/start_on_lid_open
中創建了一個新的設備屬性,可以讀取該屬性來自或寫給。值 0 表示“關閉”,而值 1 表示“開啟”。
# read current value (0 for disabled, 1 for enabled)
cat /sys/devices/platform/samsung-galaxybook/start_on_lid_open
# turn on (supports values such as: 1, on, true, yes, etc)
echo true | sudo tee /sys/devices/platform/samsung-galaxybook/start_on_lid_open
# turn off (supports values such as: 0, off, false, no, etc)
echo 0 | sudo tee /sys/devices/platform/samsung-galaxybook/start_on_lid_open
若要開啟或關閉「USB 充電」模式(即使筆記型電腦關閉,USB 連接埠也能供電),可在/sys/devices/platform/samsung-galaxybook/usb_charge
中建立一個新的裝置屬性讀取或寫入。值 0 表示“關閉”,而值 1 表示“開啟”。
# read current value (0 for disabled, 1 for enabled)
cat /sys/devices/platform/samsung-galaxybook/usb_charge
# turn on (supports values such as: 1, on, true, yes, etc)
echo true | sudo tee /sys/devices/platform/samsung-galaxybook/usb_charge
# turn off (supports values such as: 0, off, false, no, etc)
echo 0 | sudo tee /sys/devices/platform/samsung-galaxybook/usb_charge
我自己對該功能如何運作的觀察(實際上與該驅動程式本身無關):
要開啟或關閉「允許錄製」設定(允許或阻止使用內建相機和麥克風),請在/sys/devices/platform/samsung-galaxybook/allow_recording
中建立一個新的裝置屬性,可以讀取該屬性來自或寫入給。值 0 表示“關閉”,而值 1 表示“開啟”。
三星用戶手冊稱此設定為“阻止錄製模式”,但由於所需的值為 1 代表“不阻止”,0 代表“阻止”(即 1 vs 0 的值與名稱相比感覺“倒退”),因此對這位司機來說,這樣稱呼感覺有點用詞不當。 1表示“允許”,0表示“不允許”似乎更有意義;這樣,希望該驅動程式的使用者能夠更清楚地了解更改該值時實際發生的情況。
# read current value (0 for disabled, 1 for enabled)
cat /sys/devices/platform/samsung-galaxybook/allow_recording
# turn on (supports values such as: 1, on, true, yes, etc)
echo true | sudo tee /sys/devices/platform/samsung-galaxybook/allow_recording
# turn off (supports values such as: 0, off, false, no, etc)
echo 0 | sudo tee /sys/devices/platform/samsung-galaxybook/allow_recording
不同的設備具有不同數量的風扇,並且為了能夠成功讀取其狀態而採用不同的方法。三星似乎確實為大多數各種實作實現了 ACPI 標準風扇設備方法_FST
,但沒有實現 ACPI 規範中的其他可選方法,這會導致核心自動添加fan_speed_rpm
屬性。除此之外,韌體中似乎存在一些錯誤,當您嘗試執行此 ACPI 方法時,這些錯誤經常會引發異常。在 Windows 中也可以看到此行為(嘗試檢查風扇速度時會引發 ACPI 異常),並且在將此設備與 Windows 一起使用時,我無法使用各種硬體監控應用程式查看風扇速度。
此平台驅動程式嘗試解析 ACPI 中可用的所有 PNP 風扇,並使用以下決策邏輯添加對讀取其速度的支援:
_FST
方法是否存在且似乎正在工作(返回大於 0 的速度值)?如果是,請向其添加屬性fan_speed_rpm
並將其作為 hwmon 設備的風扇輸入通道。FANS
(風扇速度等級)字段,風扇上是否存在FANT
(風扇速度等級表)表?如果是這樣,請將fan_speed_rpm
添加到此風扇設備,並作為 hwmon 設備的風扇輸入通道,並根據以下邏輯建立自訂風扇速度清單(源自讀取 DSDT 並嘗試解釋原來的_FST
似乎想要工作)。可以使用 hwmon 感測器或讀取fan_speed_rpm
sysfs 屬性來監視風扇速度。
# read current fan speed rpm from sysfs attribute
cat /sys/bus/acpi/devices/PNP0C0B : 00/fan_speed_rpm
# read current fan speed rpm from hwmon device
sensors
對於_FST
方法無法正常運作的設備,使用下列邏輯來匯出FANS
欄位報告的每個可用等級的可能速度。
FANT
(「風扇表」?),它似乎是風扇可以針對每個不同「等級」(0 到 5)運行的可能 RPM 速度的某種清單。FANS
(“風扇速度”?)的資料字段,它似乎給出了風扇當前運行的“級別”。我假設FANT
的值是代表實際 RPM 值的整數(無論如何,它們看起來很合理),但不能百分之百確定這個假設是正確的。得到三星的確認或是否有人有辦法測量風扇的實際速度會很有趣。
風扇可以完全關閉 (0),也可以是FANT
中速度代表的等級之一。此驅動程式從FANT
讀取值,而不是對等級進行硬編碼,並假設不同設備可能有不同的值和不同數量的等級。作為參考,我在 Galaxy Book2 Pro 上看到的值是:
最重要的是,在三星的_FST
方法中,它似乎在嘗試報告每個值之前添加0x0a
(10),並且級別 3 和級別 4 應該具有相同的值,而級別 5 應該是FANT
的第四個值。然而,現實生活中的觀察結果表明,3 級和4 級實際上是不同的,並且5 級似乎比4 級響亮得多。的在FANT
中列出,最後一個等級可能比第 4 級快 1000 RPM(除非有人能找到比這更好的東西!)。
檔案 gb_test_fans_ssdt.dsl 中有一個可用的測試 SSDT,其中包括一組「偽造的」PNP ACPI 風扇設備,可用於測試驅動程式在不同場景下的工作方式。這可以動態建置和加載,但您還需要刪除並重新加載平台驅動程式模組,以測試它們將如何處理。
# create fake device table
sudo modprobe acpi_configfs
sudo mkdir /sys/kernel/config/acpi/table/gb_test_fans_ssdt
# build and load the aml
iasl gb_test_fans_ssdt.dsl
cat gb_test_fans_ssdt.aml | sudo tee /sys/kernel/config/acpi/table/gb_test_fans_ssdt/aml
# remove and reload the module (via insmod or modprobe)
sudo rmmod samsung-galaxybook
sudo insmod samsung-galaxybook.ko dyndbg=+p
注意:您需要重新啟動才能刪除這些假設備。
為了修改“效能模式”,驅動程式實作了platform_profile
介面。三星的「效能模式」到各自平台設定檔的映射是根據驅動程式程式碼中的映射動態完成的,驅動程式碼讀取 ACPI 報告支援的模式。優先嘗試映射low-power
、 balanced
和performance
配置文件,因為這些似乎是各種用戶空間工具使用(有時甚至需要)的最常見配置文件。
當模組載入時,映射的結果將列印在內核日誌中。然後可以從/sys/firmware/acpi/platform_profile_choices
檢索支援的設定文件,而/sys/firmware/acpi/platform_profile
可用於讀取或寫入所需的設定檔。
範例:
# Get supported platform profiles
cat /sys/firmware/acpi/platform_profile_choices
# set platform profile to low-power
echo low-power | sudo tee /sys/firmware/acpi/platform_profile
# get current platform profile
cat /sys/firmware/acpi/platform_profile
注意:為了符合 Windows 驅動程式中的邏輯,並避免導致其他功能出現問題,驅動程式目前每次在初始化期間(例如啟動時)都會將效能模式設定為「最佳化」。
應該可以設定您自己所需的啟動效能模式,或在重新啟動時儲存和恢復模式,您可以使用啟動腳本或安裝 TLP、power-profiles-daemon 或類似的。
這有點難以測試,但我嘗試透過設定每種不同的模式,然後使用以下命令執行快速壓力測試,看看這些不同的模式是否確實產生了可測量的變化:
sudo stress-ng --cpu 0 --cpu-load 100 --metrics-brief --perf -t 20
請注意,設定似乎至少需要幾秒鐘才能真正生效。
最後我發現,使用「靜默」(0) 模式時,我絕對可以看出結果的差異,因為使用「靜默」模式時,壓力測試中完成的操作數明顯較低(幾乎一半)。
主觀上,我確實覺得與其他兩種模式相比,「安靜」模式下的風扇音量要低得多,但我並沒有真正注意到壓力測試中完成的操作數量有任何重大差異。優化和高性能對我來說幾乎是一樣的。我也注意到,當核心達到接近 100C 時,可能會發生一些節流,所以這可能是我無法分辨差異的問題的一部分(不確定調整什麼是安全的)。這也可能只是一個有缺陷的測試機制!
提供的檔案 61-keyboard-samsung-galaxybook.hwdb 是最新 60-keyboard.hwdb 中這些裝置的相關部分的副本,可與舊版本的 systemd 一起使用。有關更多信息,請參閱 systemd/issues/34646 和 systemd/pull/34648。
注意: 「效能模式」鍵 (Fn+F11) 以 ACPI 通知提供,由
samsung-galaxybook
平台驅動程式處理。
您可以如下安裝此映射檔案:
sudo cp 61-keyboard-samsung-galaxybook.hwdb /etc/udev/hwdb.d/
sudo systemd-hwdb update
sudo udevadm trigger