Steelseries APEX 300의 추가 버튼을 작동시키려고 합니다. 기본 키와 표준 특수 키가 제대로 작동합니다.
마지막으로 이러한 키에 몇 가지 명령을 할당하는 작은 응용 프로그램(C/C++ Qt)을 작성하고 싶습니다.
나는 이것에 대해 몇 가지 조사를 했습니다.
장비 찾기:
$ lsusb Bus 003 Device 004: ID 1038:1208 SteelSeries ApS
커널 로그를 확인하십시오.
[ 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
보고 추가 했습니다
hidraw0
. 그래서 나는 모든 출력을 살펴보고 다음을 사용하여 찾았습니다 .hidraw2
hidraw3
hidraw*
sudo cat
hidraw0
= ?hidraw1
= 쥐hidraw2
= 표준 키보드 키hidraw3
= 특수 기능 키(볼륨...)hidraw4
= 쥐hidraw5
= ?
어쩌면 그게 hidraw0
핵심일 수도 있어요.
존재하다/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 ...
1038
Vendor ID와 Device ID가 1200
, , 1202
인 장치를 찾아 1208
커널 드라이버를 분리하여 작업합니다.
apexCtl :: DeviceHandle -> ByteString -> IO ()
apexCtl devHndl d = do
putStrLn "WRITING SET_REPORT"
writeControlExact devHndl controlSetup d noTimeout
실제 글쓰기를 해보세요.정밀한 쓰기 제어System.USB
USB 컨트롤 에서 나오 므로 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