ご覧のとおり、Linux上でSamsung Galaxybook用の新しいプラットフォームドライバのプロトタイプを作業しています。ここ。私はWindowsでカーネルを正常にデバッグし、Windowsドライバ「Samsung System Event Controller」がいくつかの状況でどのように機能するかを大まかにまとめました。私が始めた最初の仕事はキーボードバックライトコントロールでした。
WindowsのドライバはACPIデバイスをインポートし、そのデバイス内に共通の「設定」ACPIメソッド(CSFI)があり、ドライバはさまざまなペイロードをデバイスに送信し、特定の項目(kbdバックライト、「パフォーマンスモード」、自動起動)を制御します。ふたを開けるときなど)。
キーボードバックライトには3つの明るさレベルがあり、ACPIメソッドに送信されたペイロードには0、1、2、または3で直接提供される特定のバイトがあります。これでキーボードバックライト用にこれを複製し、次の操作を行うとラップトップで正常に実行されます。
echo 3 | sudo tee /sys/class/leds/samsung-galaxybook::kbd_backlight/brightness
brightnessctl
他の同様のユーティリティでも正しく受信され、大きな人気を集めました!
sudo brightnessctl --device='samsung-galaxybook::kbd_backlight' set 3
Updated device 'samsung-galaxybook::kbd_backlight':
Device 'samsung-galaxybook::kbd_backlight' of class 'leds':
Current brightness: 3 (100%)
Max brightness: 3
それでは問題の核心を見てみましょう。
キーボードのキー(fn + F9)は、Windowsでこのキーを繰り返し押すと、円の中のさまざまなレベル(0、1、2、3、0、1、2など)を循環します。
Linuxでこのキーを押すと、通常のキーボードデバイスを介して着信しているように見えますが、マップされたキーではなく、実際にエラーが発生した場合は、次のエラーが表示されdmesg
ます。
kernel: atkbd serio0: Unknown key pressed (translated set 2, code 0xac on isa0060/serio0).
kernel: atkbd serio0: Use 'setkeycodes e02c <keycode>' to make it known.
私はhwdbを使ってマッピングを作成するのと同じことを試しました。
KEYBOARD_KEY_ac=kbdillumtoggle
、実際にバックライトを制御しますが、最大(3)だけバックライトを「オン」にして繰り返し押して(0)オフにします。レベル1と2に到達できません。KEYBOARD_KEY_ac=kbdillumup
、最初は0から始まり、1、2、3を経て段階的に移動できるため、「一種の」動作します。しかし、一番上に上がると上位3つだけに留まり、照明を消すことはできません。
「正しい」解決策が何であるかわからないので、今は路上に立っているようです。この新しいkbdバックライトを私が望む方法で制御できるように、実際にこのキーをマッピングする最良の方法は何ですか?実際にキーをキャプチャする方法でプラットフォームドライバにそれを構築し、この「ループ」動作を制御するコードを書くことはできますか?
いくつかの希薄なキーマップのサポートを調べましたが、キーがキーボードデバイスの「通常」キーボードで押すよりもACPIデバイスの一部である場合(押すとACPIイベントが発生する)、より多くのことがわかります。ここではそうではありません。私のキーは実際にキーボードを介して入力されますが、何らかの方法でその動作を「オーバーライド」したいと思います。理想的には「標準化された」方式です。プラットフォームドライバ。
私のオプションは何ですか? 「ベスト」/「正しい」選択は何ですか?