키보드에서 추가 키를 읽는 방법 (Steelseries APEX 300)

키보드에서 추가 키를 읽는 방법 (Steelseries APEX 300)

Steelseries APEX 300의 추가 버튼을 작동시키려고 합니다. 기본 키와 표준 특수 키가 제대로 작동합니다.

마지막으로 이러한 키에 몇 가지 명령을 할당하는 작은 응용 프로그램(C/C++ Qt)을 작성하고 싶습니다.

나는 이것에 대해 몇 가지 조사를 했습니다.

  1. 장비 찾기:

    $ lsusb
    Bus 003 Device 004: ID 1038:1208 SteelSeries ApS 
    
  2. 커널 로그를 확인하십시오.

    [ 1173.630363] usb 3-1.1: new full-speed USB device number 13 using xhci_hcd
    [ 1173.748310] usb 3-1.1: New USB device found, idVendor=1038, idProduct=1208
    [ 1173.748314] usb 3-1.1: New USB device strings: Mfr=1, Product=2, SerialNumber=0
    [ 1173.748316] usb 3-1.1: Product: SteelSeries Apex 300 Gaming Keyboard
    [ 1173.748317] usb 3-1.1: Manufacturer: SteelSeries
    [ 1173.750546]  0003:1038:1208.000D: hiddev0,hidraw0: USB HID v1.11 Device [SteelSeries SteelSeries Apex 300 Gaming Keyboard] on usb-0000:00:14.0-1.1/input0
    [ 1173.751418] input: SteelSeries SteelSeries Apex 300 Gaming Keyboard as /devices/pci0000:00/0000:00:14.0/usb3/3-1/3-1.1/3-1.1:1.1/0003:1038:1208.000E/input/input32
    [ 1173.810811] hid-generic 0003:1038:1208.000E: input,hidraw2: USB HID v1.11 Keyboard [SteelSeries SteelSeries Apex 300 Gaming Keyboard] on usb-0000:00:14.0-1.1/input1
    [ 1173.812405] input: SteelSeries SteelSeries Apex 300 Gaming Keyboard as /devices/pci0000:00/0000:00:14.0/usb3/3-1/3-1.1/3-1.1:1.2/0003:1038:1208.000F/input/input33
    [ 1173.870645] hid-generic 0003:1038:1208.000F: input,hidraw3: USB HID v1.11 Device [SteelSeries SteelSeries Apex 300 Gaming Keyboard] on usb-0000:00:14.0-1.1/input2
    
  3. 보고 추가 했습니다 hidraw0. 그래서 나는 모든 출력을 살펴보고 다음을 사용하여 찾았습니다 .hidraw2hidraw3hidraw*sudo cat

    • hidraw0= ?
    • hidraw1= 쥐
    • hidraw2= 표준 키보드 키
    • hidraw3= 특수 기능 키(볼륨...)
    • hidraw4= 쥐
    • hidraw5= ?

어쩌면 그게 hidraw0핵심일 수도 있어요.

  1. 존재하다/dev/input/by-id/APEX에 대한 두 가지 적절한 항목을 찾았습니다.

    $ls /dev/input/by-id/usb-SteelSeries_SteelSeries_Apex_300_*
    usb-SteelSeries_SteelSeries_Apex_300_Gaming_Keyboard-event-if02
    usb-SteelSeries_SteelSeries_Apex_300_Gaming_Keyboard-if01-event-kbd
    

    여기서는 다음을 사용하여 다시 시도합니다 cat.

    • *-event-if02: 아무것도 없다
    • *-if01-event-kbd: 표준 키보드 입력

게시물을 찾았습니다 (추가 키보드 키 인식: Steelseries Apex) 이 키보드를 다루려고 하는데 하스켈 지식이 너무 부족합니다. 내가 아는 것은 APEX가 키를 활성화하려면 명령을 받아야 한다는 것뿐입니다.

어디서부터 시작해야 할지 몇 가지 팁을 주실 수 있나요?

답변1

링크된 Haskell 코드를 찾아보세요:

put (CmdEnableExtraKeys) = do
  put32 [0x02, 0x00, 0x02]

보내야 할 보고서입니다(3바이트).

withDevice 0x1038 [0x1200, 0x1202, 0x1208] $ \dev -> do
  withDeviceHandle dev $ \devHndl ->
  withDetachedKernelDriver devHndl 0 $
  withClaimedInterface devHndl 0 $ do ...

1038Vendor ID와 Device ID가 1200, , 1202인 장치를 찾아 1208커널 드라이버를 분리하여 작업합니다.

apexCtl :: DeviceHandle -> ByteString -> IO ()
apexCtl devHndl d = do
  putStrLn "WRITING SET_REPORT"
  writeControlExact devHndl controlSetup d noTimeout

실제 글쓰기를 해보세요.정밀한 쓰기 제어System.USBUSB 컨트롤 에서 나오 므로 HID 레이어가 우회된 것처럼 보입니다. 이 도서관에 익숙하지 않기 때문에 이것은 추측입니다.

그래서 나는 Haskell 프로그램을 실행해 보거나(지침은 링크된 git readme에 있음) 더 익숙한 것을 사용하여 USB 제어 쓰기를 수행할 것입니다.

그런데 이를 사용하면 evtest입력 레이어에서 무슨 일이 일어나고 있는지 더 잘 이해하고 HID 보고서를 보고 HID 레이어를 이해할 수 있습니다.

mount -t debugfs none /sys/kernel/debug
cat /sys/kernel/debug/hid/YOUR_DEVICE/rdesc

답변2

Apex 매크로추가 키 입력을 가능하게 하는 또 다른 프로그램입니다. C로 작성되었기 때문에 Haskell에 익숙하지 않다면 더 명확할 수도 있습니다.

나는 이 기능을 장치 특성으로 커널 드라이버에 추가해야 한다고 생각합니다.


이 키보드의 현재 기능은 추가 키의 기본 기능입니다. ApexCtrl 및 Apex-Macros 프로그램은 단순히 키보드에 명령을 보내 일반 키처럼 키를 보고합니다. 이 명령이 전송되면 커널은 L/M/MX 키에 대한 스캔 코드를 수신하고 정상적으로 정의될 수 있습니다.

  • hwdb는 스캔 코드와 특정 키 코드의 매핑을 재정의할 수 있습니다.
  • XKB는 특정 키 기호에 대한 키 코드 매핑을 재정의할 수 있습니다.
  • 이러한 키로 작동하도록 애플리케이션을 구성할 수 있습니다.

이전 버전을 사용하고 있습니다.정점 제어, 마지막 컴파일 시도는 실패했지만. hwdb의 기본 키 정의와 사용자 정의 XKB 옵션의 조합을 통해 매크로 명령을 사용하여 사용할 수 있는 미사용 키 기호로 추가 키를 설정할 수 있습니다 xbindkeys.

ApexCtl과 함께 제공되는 hwdb는 이전 udev 형식이므로 업데이트해야 합니다. 내 생각에는 Apex-Macros가 동일한 접근 방식을 사용하므로 ApexCtl의 hwdb가 해당 도구에도 작동할 것입니다. 바라보다ApexCtl에 대한 설명서어떤 스캔 코드가 어떤 하드웨어 키에 속하는지 그리고 이에 따라 정의를 조정할 수 있습니다.

# original -- ApexCtl/config/90-apex.hwdb
keyboard:usb:v1038p120[02]*

# new format + my tweaks
evdev:input:b0003v1038p120[028]*
 KEYBOARD_KEY_0700a8=prog1
 KEYBOARD_KEY_0700a9=prog2
 KEYBOARD_KEY_0700ac=coffee
 KEYBOARD_KEY_0700ad=msdos
 KEYBOARD_KEY_0700e8=nextsong
 KEYBOARD_KEY_0700e9=playpause
 KEYBOARD_KEY_0700ea=previoussong
 KEYBOARD_KEY_0700eb=stopcd
 KEYBOARD_KEY_0700ec=record
 KEYBOARD_KEY_0700f4=f13
 KEYBOARD_KEY_0700f5=f14
 KEYBOARD_KEY_0700f6=f15
 KEYBOARD_KEY_0700f7=f16
 KEYBOARD_KEY_0700f8=f17
 KEYBOARD_KEY_0700f9=f18
 KEYBOARD_KEY_0700fa=f19
 KEYBOARD_KEY_0700fb=f20
 KEYBOARD_KEY_0700fc=f21
 KEYBOARD_KEY_0700fd=f22
 KEYBOARD_KEY_0700fe=f23
 KEYBOARD_KEY_0700ff=f24

hwdb의 이러한 키코드 정의를 통해 이 XKB 기호 파일을 사용하여 필요에 따라 옵션을 설정합니다. 일반적으로 나는 여러 옵션을 소개하기 위해 메타 옵션을 사용합니다 apexf13. 실제 덮어쓰기는 한 번에 하나의 키 그룹을 처리하는 작은 옵션으로 수행되므로 다른 키 그룹에 영향을 주지 않고 재정의할 수 있습니다.

// place in /usr/share/X11/xkb/symbols/apex
// or a custom location for use with setxkbmap -I
// modify /usr/share/X11/xkb/rules/evdev{,.lst,.xml} to use systemwide

// These are intended to be loaded after inet(evdev) to override
// its generic ideas.

// for use with Apex300
// L1-L2 as layout toggles
partial alphanumeric_keys
xkb_symbols "lkeys_grp" {
    key <I156> { [ ISO_Next_Group, ISO_First_Group ] };
    key <I157> { [ ISO_Prev_Group, ISO_Last_Group  ] };
}; // end of "lkeys_grp"

// for use with Apex300
// L1-L2 as VolUp-VolDown
partial alphanumeric_keys
xkb_symbols "lkeys_vol" {
    key <I156> { [ XF86AudioRaiseVolume ] };
    key <I157> { [ XF86AudioLowerVolume ] };
}; // end of "lkeys_vol"

// for use with Apex300
// Combo arrows mute
partial alphanumeric_keys
xkb_symbols "arrows_mute" {
    key <I160> { [ XF86AudioMicMute      ] };
    key <I159> { [ XF86AudioMute         ] };
}; // end of "arrows_mute"

// for use with Apex300
// Combo arrows as browser Back/Forward, shifted Stop/Reload
partial alphanumeric_keys
xkb_symbols "arrows_www" {
    key <I160> { [ XF86Back,    XF86Stop   ] };
    key <I159> { [ XF86Forward, XF86Reload ] };
}; // end of "arrows_www"

// for use with Apex300
// MX1-MX5 as media keys
partial alphanumeric_keys
xkb_symbols "mxkeys_media" {
    key <I171> { [ XF86AudioNext                   ] };
    key <I172> { [ XF86AudioPlay,   XF86AudioPause ] };
    key <I173> { [ XF86AudioPrev                   ] };
    key <I174> { [ XF86AudioStop,   XF86Eject      ] };
    key <I175> { [ XF86AudioRecord                 ] };
}; // end of "mxkeys_media"

// for use with Apex300
// MX1-MX5 as Launch1-5
partial alphanumeric_keys
xkb_symbols "mxkeys_prog" {
    key <I171> { [ XF86Launch1 ] };
    key <I172> { [ XF86Launch2 ] };
    key <I173> { [ XF86Launch3 ] };
    key <I174> { [ XF86Launch4 ] };
    key <I175> { [ XF86Launch5 ] };
}; // end of "mxkeys_prog"

// for use with Apex300
// M1-M4 as F13-F16
partial alphanumeric_keys
xkb_symbols "mkeys1_f13" {
    key <FK13> { [ F13      ] };
    key <FK14> { [ F14      ] };
    key <FK15> { [ F15      ] };
    key <FK16> { [ F16      ] };
}; // end of "mkeys1_f13"

// for use with Apex300
// M5-M8 as F17-F20
partial alphanumeric_keys
xkb_symbols "mkeys5_f17" {
    key <FK17> { [ F17      ] };
    key <FK18> { [ F18      ] };
    key <FK19> { [ F19      ] };
    key <FK20> { [ F20      ] };
}; // end of "mkeys5_f17"

// for use with Apex300
// M9-M12 as F21-F24
partial alphanumeric_keys
xkb_symbols "mkeys9_f21" {
    key <FK21> { [ F21      ] };
    key <FK22> { [ F22      ] };
    key <FK23> { [ F23      ] };
    key <FK24> { [ F24      ] };
}; // end of "mkeys9_f21"

// for use with Apex300
// M1-M12 as F13-F24
partial alphanumeric_keys
xkb_symbols "mkeys_f13" {
    include "apex(mkeys1_f13)"
    include "apex(mkeys5_f17)"
    include "apex(mkeys9_f21)"
}; // end of "mkeys_f13"

// for use with Apex300
// M5-M8 as Launch5-8
partial alphanumeric_keys
xkb_symbols "mkeys5_prog5" {
    key <FK17> { [ XF86Launch5 ] };
    key <FK18> { [ XF86Launch6 ] };
    key <FK19> { [ XF86Launch7 ] };
    key <FK20> { [ XF86Launch8 ] };
}; // end of "mkeys5_prog5"

// for use with Apex300
partial alphanumeric_keys
xkb_symbols "apexf13" {
    include "apex(mkeys_f13)"
    include "apex(lkeys_volmute)"
    include "apex(arrows_mute)"
    include "apex(mxkeys_media)"
}; // end of "apexf13"

// define other options here

수정된 hwdb 및 xkb 기호가 로드된 후 예상대로 애플리케이션에서 사용할 수 있습니다. 구성할 수 없는 유일한 키는 SteelSeries 로고 키입니다. 이는 기본적으로 하드와이어된 Fn키입니다(다음 페이지에 간략하게 문서화되어 있음).XKB의 Apex300 지오메트리).

예를 들어, 저는 이 구성을 사용하여 i3wm미디어 키를 다음에 바인딩합니다 playerctl.

#$mod+key activates playerctl thru dbus for MPRIS-capable players
bindsym $mod+XF86AudioRaiseVolume exec playerctl volume 0.05+
bindsym $mod+XF86AudioLowerVolume exec playerctl volume 0.05-
bindsym $mod+XF86AudioNext exec playerctl next
bindsym $mod+XF86AudioPrev exec playerctl previous
bindsym $mod+XF86AudioPlay exec playerctl play-pause
bindsym $mod+XF86AudioStop exec playerctl stop

관련 정보