我试着让钢铁系列APEX 300的额外密钥正常工作。主键和标准专用键正确工作。
最后,我想编写一个小应用程序(C/C++ Qt),为这些键分配一些命令。
为此,我做了一些研究:
hidraw0,hidraw2和hidraw3在那里加了。因此,我最终查看了所有hidraw*的输出,并使用sudo cat:找到了hidraw0 =?hidraw1 =鼠标hidraw2 = std键盘键hidraw3 =特殊函数键(卷.)hidraw4 =鼠标hidraw5 =?可能hidraw0是关键。
cat:*-event-if02:没什么*-if01-event-kbd:标准键盘输入我找到了一个关于这个键盘的帖子(识别额外键盘键:钢系列Apex),但是我的Haskell知识太差了。我只知道APEX需要接收一个命令来启用键。
你能告诉我从哪里开始吗?
发布于 2018-01-21 20:17:01
只需浏览链接的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 ...查找具有供应商id 1038和设备id 1200、1202、1208的设备,分离内核驱动程序并在其上工作。
apexCtl :: DeviceHandle -> ByteString -> IO ()
apexCtl devHndl d = do
putStrLn "WRITING SET_REPORT"
writeControlExact devHndl controlSetup d noTimeout进行实际的写入;writeControlExact来自System.USB,编写USB,因此似乎绕过了HID层。这是一个猜测,因为我不熟悉这个图书馆。
因此,我要么尝试让Haskell程序运行(您所链接的git上有说明),要么用您熟悉的任何东西执行USB控件写操作。
顺便说一句,您可以使用evtest来更好地理解输入层上发生的事情,并查看HID报告来理解HID层。
mount -t debugfs none /sys/kernel/debug
cat /sys/kernel/debug/hid/YOUR_DEVICE/rdesc发布于 2018-01-21 21:54:48
顶点-宏是另一个启用额外密钥的程序。它是用C编写的,如果您不习惯Haskell,可能会更清楚。
我怀疑这个功能应该添加到内核驱动程序中,作为一种设备怪癖。
这个键盘目前起作用的是额外键的基本功能。ApexCtrl和ApexCtrl程序只需向键盘发送命令,就可以像普通键一样报告键。发送此命令后,内核将接收L/M/MX密钥的扫描代码,并且可以正常定义:
我使用了一个旧版本的ApexCtl,尽管上次编译失败了。hwdb中的基本键定义和自定义XKB选项的组合允许我将额外的键设置为未使用的keysym,这些键可以是宏来使用像xbindkeys这样的工具来启动任何想要的程序。
ApexCtl附带的hwdb用于旧的udev格式,需要更新。我认为ApexCtl使用的方法是相同的,因此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 { [ ISO_Next_Group, ISO_First_Group ] };
key { [ 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 { [ XF86AudioRaiseVolume ] };
key { [ XF86AudioLowerVolume ] };
}; // end of "lkeys_vol"
// for use with Apex300
// Combo arrows mute
partial alphanumeric_keys
xkb_symbols "arrows_mute" {
key { [ XF86AudioMicMute ] };
key { [ 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 { [ XF86Back, XF86Stop ] };
key { [ XF86Forward, XF86Reload ] };
}; // end of "arrows_www"
// for use with Apex300
// MX1-MX5 as media keys
partial alphanumeric_keys
xkb_symbols "mxkeys_media" {
key { [ XF86AudioNext ] };
key { [ XF86AudioPlay, XF86AudioPause ] };
key { [ XF86AudioPrev ] };
key { [ XF86AudioStop, XF86Eject ] };
key { [ XF86AudioRecord ] };
}; // end of "mxkeys_media"
// for use with Apex300
// MX1-MX5 as Launch1-5
partial alphanumeric_keys
xkb_symbols "mxkeys_prog" {
key { [ XF86Launch1 ] };
key { [ XF86Launch2 ] };
key { [ XF86Launch3 ] };
key { [ XF86Launch4 ] };
key { [ XF86Launch5 ] };
}; // end of "mxkeys_prog"
// for use with Apex300
// M1-M4 as F13-F16
partial alphanumeric_keys
xkb_symbols "mkeys1_f13" {
key { [ F13 ] };
key { [ F14 ] };
key { [ F15 ] };
key { [ F16 ] };
}; // end of "mkeys1_f13"
// for use with Apex300
// M5-M8 as F17-F20
partial alphanumeric_keys
xkb_symbols "mkeys5_f17" {
key { [ F17 ] };
key { [ F18 ] };
key { [ F19 ] };
key { [ F20 ] };
}; // end of "mkeys5_f17"
// for use with Apex300
// M9-M12 as F21-F24
partial alphanumeric_keys
xkb_symbols "mkeys9_f21" {
key { [ F21 ] };
key { [ F22 ] };
key { [ F23 ] };
key { [ 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 { [ XF86Launch5 ] };
key { [ XF86Launch6 ] };
key { [ XF86Launch7 ] };
key { [ 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 300几何中有简要说明)。
例如,我在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 stophttps://unix.stackexchange.com/questions/418678
复制相似问题