Samsung Galaxy Book シリーズの追加 Linux プラットフォーム ドライバー。
現在のステータス:
その目的は、Samsung が Windows で行ったことを、次のコンポーネントが行っていると思われることを Linux でもある程度再現することです。
SCAI
ACPI デバイスと対話する ACPI ドライバー。SamsungSystemSupportEngine.exe
を開始するサービスで、ユーザー空間/アプリケーション側で次のような多くの処理を行うようです。これは、 Samsung システム イベント コントローラーWindows システム デバイス ドライバーが実行しているように見えること (つまり、これらの追加機能を制御するためにSCAI
ACPI デバイスと通信すること) を模倣することを目的とした、(現在は) 完全にツリー外の新しいカーネル プラットフォーム ドライバーです。 )。さらに機能が追加され、テストが完了したら、カーネルに追加するドライバーを送信してみます。
現在、次の機能が実装されています。
fan_speed_rpm
sysfs 属性と新しい hwmon デバイスによるファン速度の監視次の機能は実装できる可能性がありますが、追加のデバッグと開発が必要です。
SAM0427
搭載モデルでは画面の明るさを高める「アウトドアモード」このプラットフォーム ドライバーでサポートされるデバイスは、 sudo dmidecode --type 3
でManufacturer: SAMSUNG ELECTRONICS CO., LTD.
Type: Notebook
、さらに、ドライバーで指定されたリスト (この記事の執筆時点ではSAM0427
、 SAM0428
、 SAM0429
、およびSAM0430
) と一致する ACPI デバイス ID を持つ ACPI デバイスSCAI
が存在すること。これは現在入手可能な「Samsung Galaxy Book」シリーズのノートブックのほとんどをカバーしますが、他のものも含まれる可能性があります。
その目的は、プラットフォーム ドライバー内の各機能が、その機能が有効になる前に何らかの方法でサポートされているかどうかをテストしようとすることです。一部のデバイスは、ハードウェアがわずかに異なったり、動作がわずかに異なります。サポートされるべきだと思われる特定の機能がドライバーによって無効になっているデバイスをお持ちの場合は、問題を作成してください。
また、Windows がSAM0426
(Notebook 9 Pro 15 インチなどのデバイスで使用される) に同じドライバーを使用していることも確認したため、このドライバーの大部分はおそらくこれらのデバイスでも機能するのではないかと考えています。これらのデバイスでこのドライバーをテストしたい場合は、問題を作成してヘルプを求め、結果を共有してください。
プラットフォーム ドライバーは、次のモジュール パラメーターをサポートします。
kbd_backlight
: キーボードのバックライト制御を有効にする (デフォルトはオン) (bool)battery_threshold
: バッテリー充電しきい値制御を有効にする (デフォルトはオン) (bool)performance_mode
: パフォーマンス モード制御を有効にする (デフォルトはオン) (bool)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 ベースのディストリビューション (Ubuntu を含む) の場合は、現在のカーネルの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
任意の値 (例: +p
) とともにブート コマンド ライン パラメーターまたはmodprobe.d
構成ファイルに追加することもできます。
モジュール パラメーターを使用して、ほとんどの機能を有効または無効にすることができます。たとえば、次の場合は、コア設定フラグ ( 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
)。
私が一般的に観察したことの 1 つは、これらのデバイス用の Samsung のファームウェアには実際に非常に多くのバグがあるということです。たとえば、次のとおりです。
これに関してサムスンから実際に支援が得られれば素晴らしいですね。
Samsung は、ほとんどのホットキー イベントの送信にもメインのキーボード デバイスを使用することにしました。ドライバーがこれらのホットキーをキャプチャして操作したい場合は、i8402 フィルターを使用してキー イベントを「キャッチ」するなどの操作を行う必要があります。
また、いくつかのホットキー イベントには競合があることもわかりました。そのため、これは少し難しい領域です。
キーボードのバックライト ホットキーは、利用可能なすべてのバックライト輝度レベルをラウンドロビン方式で循環し、最大値に達すると再び 0 から始まります (つまり、0、1、2、3、0、1、...)。
keydown によって報告されるイベントはバッテリー充電の進行状況に関するイベントと同じであると思われるため、このアクションはホットキーの keyup でトリガーされます (したがって、充電を開始すると状況が少しおかしくなります!)。
ホットキーは LED のハードウェア変更イベントもトリガーする必要があります。GNOME (およびおそらく他のもの) では、適切なバックライト レベルが表示された適切な OSD ポップアップが自動的に表示されます。
録画ブロック ホットキーは、内蔵カメラとマイクへのアクセスをブロックする、 allow_recording
機能を切り替えます。
また、パフォーマンス モードのホットキーは、利用可能なすべてのプラットフォーム プロファイルをラウンドロビン方式で循環します (低電力、静音、バランス、パフォーマンス、低電力、静音など)。
現在 OSD ポップアップはありませんが、必要に応じて「Samsung Galaxy Book 追加ボタン」入力デバイスからイベントをキャプチャできます。
「Samsung Galaxy Book 追加ボタン」という新しい入力デバイスが作成され、ACPI デバイスからのいくつかの通知の入力イベントが送信されます。
SAM0428
モデルのみサポートの疑いあり)SAM0428
モデルのみサポートの疑いあり)samsung-galaxybook::kbd_backlight
という新しい LED クラスが作成されます。これは/sys/class/leds/samsung-galaxybook::kbd_backlight/brightness
のsysfs
を介して、または次のような標準ユーティリティの多くによって制御できます。 brightnessctl
、 light
など
また、GNOME 45.x ではパネル内で自動的に選択されるようで、 Keyboard
横にある矢印をクリックしてスライダーを調整できます。
Windows の「X 秒後にキーボードのバックライトを自動的にオフにする」設定は、実際にはデバイス ドライバー自体ではなく、Samsung のアプリケーション サービスによって制御されることに注意してください。 GNOME (およびおそらく他の機能) にも同様の機能があり、一定のアイドル期間が経過すると最小レベルに切り替わります (たとえば、アイドル状態では 3 から 1 に、再開すると 3 に戻ります)。しかし、これとは関係なく、この機能はおそらく、カーネル ドライバーではなく、何らかの方法でユーザー空間で制御される必要があります。
また、これらのデバイスのほとんどには、キーボードのバックライトにも影響を与える周囲光センサーが搭載されていることに注意してください。この動作は Windows では制御できず、ACPI にはこの機能を無効にできると思われるものはまだ見つかりません。これが意味するのは、キーボードのバックライトが単にランダムにオフになっている、または動作を停止していると思われる場合があるかもしれませんが、実際には、この環境光センサーが原因でバックライトがオフになっているということです。これが発生したときにテストする (実際に周囲光センサーがキーボードのバックライトをオフにする原因であることを確認する) 方法の 1 つは、センサーを何らかの方法で (たとえば指で) 覆い、センサーが正常に動作しているかどうかを確認することです。ライトが再び点灯します。
このプラットフォーム ドライバーは、バッテリー充電制御の終了しきい値の設定を追加しますが、開始しきい値を設定するためのアクセス権はありません。この機能は通常、Windows のさまざまな Samsung アプリケーションによって「バッテリー セーバー」と呼ばれますが、Linux では、UPower によって認識されるバッテリー デバイスに追加される標準属性を実装します。
ユーザーが Windows との相互運用性を維持したい場合は、値を「オン」を表す 80 に設定するか、「オフ」を表す 0 に設定する必要があります。これらの値は、さまざまな Windows ベースの Samsung アプリケーションおよびサービスによって「」として認識されるためです。オン」または「オフ」。それ以外の場合、デバイスは、バッテリーの充電を停止する割合として 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 は「オン」を意味します。
Samsung のユーザー マニュアルでは、この設定を「録画ブロッキング モード」と呼んでいますが、必要な値は「ブロックされていない」の場合は 1、「ブロックされた」の場合は 0 であるため (つまり、1 対 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
デバイスが異なれば、ファンの数も異なり、ステータスを正常に読み取るための方法も異なります。 Samsung は、さまざまな実装のほとんどに ACPI 標準ファン デバイス メソッド_FST
実装しているようですが、カーネルにfan_speed_rpm
属性を自動的に追加させる ACPI 仕様の他のオプション メソッドは実装していないようです。さらに、ファームウェアには、この 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 値を表す整数であると仮定しました(いずれにせよ、それらは合理的だと思われます) が、この仮定が正しいかどうかは 100% 確信できません。サムスンから確認を取るか、誰かが実際のファンの速度を測定する方法を持っているかどうかは興味深いでしょう。
ファンは完全にオフ (0) にすることも、 FANT
の速度で表されるレベルの 1 つにすることもできます。このドライバーは、デバイスごとに異なる値と異なるレベル数が存在する可能性があることを前提として、レベルをハードコーディングするのではなく、 FANT
から値を読み取ります。参考までに、私の Galaxy Book2 Pro で表示される値は次のとおりです。
これに加えて、Samsung の_FST
メソッドでは、値を報告する前に各値に0x0a
(10) を追加しているようです。レベル 3 と 4 は同じ値を持つ必要があり、レベル 5 はFANT
からの 4 番目の値である必要があります。ただし、実際の観察によると、レベル 3 と 4 は実際には異なり、レベル 5 の音量はレベル 4 よりもかなり大きいようです。このため、このドライバーは、レベル 3 と 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
インターフェイスを実装します。 Samsung の「パフォーマンス モード」のそれぞれのプラットフォーム プロファイルへのマッピングは、どのモードが 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) モードを使用した場合の結果の違いが明確にわかるということでした。これは、ストレス テストで完了した操作の数が、「サイレント」モードを使用した場合に大幅に低かったためです (ほぼ)。半分)。
主観的には、他の 2 つに比べて「静音」モードではファンの音量がかなり小さいことを体感したような気がしますが、ストレス テストからの完了動作数に大きな違いは感じられませんでした。私にとって、「最適化」と「高パフォーマンス」はほぼ同じように思えました。また、コアが 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