首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何从键盘读取额外的键(Steelseries APEX 300)

如何从键盘读取额外的键(Steelseries APEX 300)
EN

Unix & Linux用户
提问于 2018-01-21 18:48:22
回答 2查看 1.3K关注 0票数 2

我试着让钢铁系列APEX 300的额外密钥正常工作。主键和标准专用键正确工作。

最后,我想编写一个小应用程序(C/C++ Qt),为这些键分配一些命令。

为此,我做了一些研究:

  1. 查找设备:$ lsusb总线003设备004: ID 1038:1208 SteelSeries ApS
  2. 查看内核日志:USB3-1.1:新的全速usb设备编号13使用xhci_hcd 3-1.1:新的usb设备找到,idVendor=1038,idProduct=1208 USB 3-1.1:新的usb设备字符串: Mfr=1,Product=2,SerialNumber=0 usb 3-1.1:产品: SteelSeries Apex 300游戏键盘USB3-1.1:制造商: SteelSeries 0003:1038:1208.000D: hiddev0,/devices/pci0000:00/0000:00:14.0/usb3/3-1/3-1.1/3-1.1:1.1/0003:1038:1208.000E/input/input32 hidraw0: USB v1.11设备在USB0000:00:14.0-1.1/input0输入: SteelSeries SteelSeries Apex 300游戏键盘作为SteelSeries HID -泛型0003:1038:1208.000E:输入,/devices/pci0000:00/0000:00:14.0/usb3/3-1/3-1.1/3-1.1:1.2/0003:1038:1208.000F/input/input33 hidraw2: USB v1.11键盘在USB -0000:00:14.0-1.1/ input 1输入: SteelSeries SteelSeries Apex 300游戏键盘作为SteelSeries HID -泛型0003:1038:1208.000F:输入,hidraw3: usb v1.11在usb-0000:00:14.0-1.1/input 2上
  3. 我看到了,那个hidraw0hidraw2hidraw3在那里加了。因此,我最终查看了所有hidraw*的输出,并使用sudo cat:找到了
    • hidraw0 =?
    • hidraw1 =鼠标
    • hidraw2 = std键盘键
    • hidraw3 =特殊函数键(卷.)
    • hidraw4 =鼠标
    • hidraw5 =?

可能hidraw0是关键。

  1. 在/dev/input/by-id/我找到了关于APEX:$ls $ls的两个合适的条目,我尝试再次使用cat
    • *-event-if02:没什么
    • *-if01-event-kbd:标准键盘输入

我找到了一个关于这个键盘的帖子(识别额外键盘键:钢系列Apex),但是我的Haskell知识太差了。我只知道APEX需要接收一个命令来启用键。

你能告诉我从哪里开始吗?

EN

回答 2

Unix & Linux用户

发布于 2018-01-21 20:17:01

只需浏览链接的Haskell代码:

代码语言:javascript
运行
复制
put (CmdEnableExtraKeys) = do
  put32 [0x02, 0x00, 0x02]

是需要发送的报告(3个字节),

代码语言:javascript
运行
复制
withDevice 0x1038 [0x1200, 0x1202, 0x1208] $ \dev -> do
  withDeviceHandle dev $ \devHndl ->
  withDetachedKernelDriver devHndl 0 $
  withClaimedInterface devHndl 0 $ do ...

查找具有供应商id 1038和设备id 120012021208的设备,分离内核驱动程序并在其上工作。

代码语言:javascript
运行
复制
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层。

代码语言:javascript
运行
复制
mount -t debugfs none /sys/kernel/debug
cat /sys/kernel/debug/hid/YOUR_DEVICE/rdesc
票数 0
EN

Unix & Linux用户

发布于 2018-01-21 21:54:48

顶点-宏是另一个启用额外密钥的程序。它是用C编写的,如果您不习惯Haskell,可能会更清楚。

我怀疑这个功能应该添加到内核驱动程序中,作为一种设备怪癖。

这个键盘目前起作用的是额外键的基本功能。ApexCtrl和ApexCtrl程序只需向键盘发送命令,就可以像普通键一样报告键。发送此命令后,内核将接收L/M/MX密钥的扫描代码,并且可以正常定义:

  • hwdb可以覆盖扫描码到特定密钥码的映射。
  • XKB可以覆盖密钥代码到特定keysym的映射。
  • 可以将应用程序配置为对这些键进行操作。

我使用了一个旧版本的ApexCtl,尽管上次编译失败了。hwdb中的基本键定义和自定义XKB选项的组合允许我将额外的键设置为未使用的keysym,这些键可以是宏来使用像xbindkeys这样的工具来启动任何想要的程序。

ApexCtl附带的hwdb用于旧的udev格式,需要更新。我认为ApexCtl使用的方法是相同的,因此ApexCtl的hwdb也应该对该工具有效。请参阅ApexCtl文件中哪些扫描代码属于哪个硬件键,然后您可以相应地调整定义。

代码语言:javascript
运行
复制
# 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拉几个选项。实际的重写是在一次处理一组键的小选项中完成的,这样就可以在不影响其他键组的情况下重写它们。

代码语言:javascript
运行
复制
// 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

代码语言:javascript
运行
复制
#$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
票数 0
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/418678

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档