보시다시피 저는 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 이벤트가 발생함) 더 많은 것으로 이해됩니다. 여기서는 그렇지 않습니다. 내 키는 실제로 키보드를 통해 입력되지만 어떤 방식으로든 그 동작을 "재정의"하고 싶습니다. 이상적으로는 "표준화된" 방식입니다. 플랫폼 드라이버.
내 옵션은 무엇입니까? "최상의"/"올바른" 선택은 무엇입니까?