如何在linux上捕获原始HID输入?

pol*_*lot 31 linux hid hid-device

我想要完成的简短版本:我有一个脚踏板(INFINITY-IN-USB-1,如果有任何兴趣),它是作为通用HID设备实现的,我希望它表现为控制和alt Linux上的密钥.我正在寻找X级别的东西,即不仅仅是单个程序.

更长的版本:我通过调用dll RegisterRawInputDevices和GetRawInputData并在隐藏的窗口中监听输入,在Windows XP中使用此设置.所有这些都是通过相当简单的Autohotkey脚本完成的(如果有人有兴趣可以在这里发布).关键是,不需要任何额外的驱动程序等; 只需要本机Windows dll.

我希望这个设置在linux上工作(更具体地说是Ubuntu下的Gnome,但我偶尔会使用其他发行版/窗口管理器,所以我很感激X级别的解决方案).这个脚踏板不会将自己注册为键盘甚至操纵杆,而是作为具有UsagePage 12,用法3的HID设备.我注意到最新的Ubuntu可以检测并使用Microsoft Natural Keyboard上的收藏夹键,它也可以注册为HID设备*.我使用与使用脚踏板相同的方法在Windows上使用这些键(即没有捆绑软件).所以我认为这个踏板的东西也适用于linux,但问题是如何?

[我是Linux上较低级别的新手,所以请慷慨地提供引言或教程的链接.)

*对于那些不知情的人,Microsoft Natural Keyboard会同时注册为常规键盘和通用HID设备.如果没有某些应用程序(例如捆绑的应用程序)知道如何解释HID输入,常规键将起作用,但是最喜欢的键和特殊功能键是无用的.


为了澄清,linux并没有将踏板压力视为输入.它确实识别USB设备,但xev没有为踏板按下输出.我已经看到有人在WINE下成功使用踏板进行转录软件的报道,但这必须以Windows的方式工作,并没有给出我想要的东西(这使得踏板看起来像所有原生linux应用程序的键盘).我想知道是否需要一些低级linux键盘驱动程序?


这里有更多信息:如果我在终端发出这个

cat /dev/usb/hiddev0
Run Code Online (Sandbox Code Playgroud)

(dev/usb/hiddev0是我的踏板),我得到与我的踏板按下相对应的原始代码.那是一个开始.我知道那些原始代码意味着什么:二进制,0001,0010,0100分别对应每个踏板,踏板按压的组合发送那些二进制数的组合,以及释放任何踏板仍然被按下的踏板触发输入(如果全部踏板向上,0000发送).

如何让X听取dev/usb/hiddev0并将原始代码翻译成可能是一个特殊的键码,以便我可以用xmodmap或其他东西映射它们?

Ada*_*ode 19

你想要的uinput.您将收听/ dev/usb/hiddev0,然后创建您将发送的新事件/dev/input/uinput.

这解释了它并提供了一些教程: 在Linux-2.6.x中使用uinput驱动程序发送用户输入 { 这是EInfochips的"仪表板"出版物问题2007年1月"本月提示"文章在存档页面上提到 }.

  • 这似乎是一篇关于uinput的非常受欢迎的文章.链接到来自整个网络.唉,它已经不存在了,谷歌只发现了一个受损的PDF->文本转换后的副本.有人在可以共享的地方获得原始PDF吗? (5认同)
  • 你能详细说明一下吗?如何以编程方式收听/ dev/usb/hiddev0(你链接的文章只讨论了uinput)?由此产生的程序(监听hiddev并通过uinput发送键盘/鼠标事件)必须作为守护进程运行? (4认同)
  • 是的,我从你的问题中假设你已经知道如何阅读hiddev0.你可能会写一个守护进程.首先编写一个程序,不断读取hiddev0并打印出印刷机.然后你可以修改它以通过uinput发出新事件.这将基本上将这些事件重新注入内核,但作为键盘或鼠标事件(您选择的).不需要对X进行任何更改. (2认同)

cri*_*per 7

我在博客上写了如何让 Infinity IN-USB-1(又名“VEC USB Footpedal”)在 X 下发送任意键盘符号:

Linux下使用VEC/Infinity USB脚踏板作为键盘

(它也应该适用于 IN-USB-2,也许还适用于 VEC 和 PI Engineering 及其克隆产品销售的其他一些 USB 脚踏控制器型号。)

这是较短的版本:

让 X 识别踏板

踏板是符合 HID 标准的 USB 设备,内核可以毫无问题地发现它并通过节点将其事件提供给用户空间/dev/input/eventX。查看是否可以运行该evtest程序(在 Debian 上:)sudo apt install evtest。因此您无需前往HID 层即可使用脚踏板。

问题是 udev 没有将其标记为键盘或鼠标,因此 X 忽略它。这可以通过一行 udev 规则文件来修复(感谢Parlatype开发人员 Gabor Karsay 在Parlatype Issue 28中提供了此解决方案):

ACTION=="add|change", KERNEL=="event[0-9]*", ATTRS{idVendor}=="05f3", ATTRS{idProduct}=="00ff", ENV{ID_INPUT_KEYBOARD}="1"
Run Code Online (Sandbox Code Playgroud)

将该行放入名为 的文件中/etc/udev/rules.d/10-vec-usb-footpedal.rules。无需重新启动任何东西,udev 应该自动检测该文件。

现在,当您拔下并重新插入 USB 踏板时,X 应该可以识别它(并发送鼠标按钮事件)。要验证,请运行xev.

使用 udev hwdb 重新映射键符号

拥有一个仅发送鼠标点击的踏板可能不是您想要的。这些由踏板开关发送的按键代码可以使用 udev hwdb 文件重新映射。

/etc/udev/hwdb.d/在(我把我的放在/etc/udev/hwdb.d/60-usb-footpedal.hwdb)下创建一个包含以下行的文件: /etc/udev/hwdb.d/60-usb-footpedal.hwdb

evdev:input:b*v05F3p00FF*
 KEYBOARD_KEY_90001=f14
 KEYBOARD_KEY_90002=f15
 KEYBOARD_KEY_90003=f16
Run Code Online (Sandbox Code Playgroud)

这次我们确实需要通知系统更新二进制 hwdb 文件:

sudo systemd-hwdb update
Run Code Online (Sandbox Code Playgroud)

然后拔下并重新插入设备。

hwdb 文件的第一行与我们的设备匹配(USB 供应商 ID 0x05F3、USB 产品 ID 0x00FF),后续行将扫描码(十六进制)映射到键码。我选择了 F14、F15 和 F16 功能键,但可用键码列表在/usr/include/linux/input-event-codes.h中定义;要使用该文件中 #define 的名称作为 hwdb 键码,只需将它们转换为小写并删除前缀即可key_

我的计算机上的默认 (pc+us) xkb 键盘布局分别将F14F15和映射F16XF86Launch5XF86Launch6XF86Launch7键符号。如果您xev现在打开并踩下踏板,您应该会看到发出这些按键符号。使用这些键符号,每个踏板开关都可以映射为桌面或窗口管理器中的热键。

您还可以XF86*使用 xmodmap 之类的工具将键符号重新映射到其他键。有关更多详细信息,包括让按键在 vim 中可映射、更多文档链接、直接读取 HID 设备的指针(如果需要)以及 Mac OS X 的解决方案,请参阅我的博客文章

脚踏控制器

我要提到的最后一件事是一个名为footcontroller的 Python 程序,它从 evdev 设备 (/dev/input/eventX) 读取事件,并且可以配置为发出击键(通过 xdotool)或运行脚本以响应踩踏板。它可以用来代替 xmodmap 让你的踏板发送你想要的任何击键。


Ale*_*ler 5

如果设备出现在/dev/input 中,请使用“evdev”X 驱动程序将其连接起来,就像您对键盘或鼠标所做的一样。