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

时间:2009-05-17 05:46:20

标签: linux hid hid-device

我想要完成的短版本:我有一个脚踏板(INFINITY-IN-USB-1,如果有兴趣),它是作为通用HID设备实现的,我希望它在linux上表现为控件和alt键。我正在寻找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

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

如何让X听取dev/usb/hiddev0并将原始代码转换为特殊的密钥代码,以便我可以用xmodmap或其他东西映射它们?

6 个答案:

答案 0 :(得分:19)

你需要uinput。您将收听/ dev / usb / hiddev0,然后创建您将在/dev/input/uinput上发送的新活动。

这解释了它,并提供了一些教程: Using uinput driver in Linux- 2.6.x to send user input {这是EInfochips的“信息中心”出版物问题2007年1月“{3}}归档页面}上提到的”月度提示“文章。

答案 1 :(得分:4)

设备是否显示在/ dev / input中?如果是,请使用“evdev”X驱动程序将其连接起来,就像使用键盘或鼠标一样。

答案 2 :(得分:2)

你应该调查lircd。它解释来自遥控器的输入。一些支持的遥控器显然是通用的隐藏设备,所以你可以让你的设备与lircd交谈。

答案 3 :(得分:2)

此处存在同样的问题,但无线键盘上有特殊键。我感觉到你的痛苦。

无论如何,试图让这个工作,继承我的方法:

  1. sleep 10; killall cat然后快速在另一个终端:cat /dev/usb/hiddevice0 > key1.usbdump并按/使用该设备。这将转储该密钥的hiddevice的二进制输出。
  2. 我很快就将一个python脚本一起攻击,以读取hiddevice输入和触发事件。到目前为止,这是第一次关键被击中。这与Adam建议的类似,但我认为输入更难以编程/使用,尽管可能更优雅,并且python随时可用。
  3. 所以这是一项正在进行中的工作(仅适用于第一次按下),但也许这样的事情对您有用:

    sf1 = open("test.usbdump").read() # read the earlier usb dump from hiddevice
    kb = open("/dev/usb/hiddev0")
    while 1:
        # Prints true if the specific key has been read.
        print (kb.read(len(sf1)) == sf1)
        # Basically all that has to be done is if ^ is true, then fire off the event you want.
    

    如果有人可以帮我解决我的计划,或者我做错了,请告诉我。 ;)

    我意识到在hiddevice的初始转储中包含了一些头文件。使用一些bless十六进制编辑和位差分,您可以找到哪些值很重要,并在python中检查它们。 (例如,十六进制数字“B0”表示我的键盘上已按下一个特殊功能键,稍后会有更多关于按下哪个键的信息等。)

    我的最终结果是:hiddevice0似乎挂起并停止提供数据一段时间后,不知道为什么,但相反,我使用/ dev / input / event *(它也可能适合你),这似乎工作得更好。同样,相同的hexediting和低级解析会导致成功。在此过程中,我发现sudo cat /dev/input/event3 | hexdump对确定哪些字节对您很重要非常有帮助。

    所以,如果你有一个Sk-8812 IBM键盘,并想使用特殊键,你可以跟我说说我得到的脚本。

答案 4 :(得分:1)

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

Use VEC/Infinity USB Foot Pedal as a Keyboard Under Linux

(它也应该适用于IN-USB-2以及也许由VEC和P.I. 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"

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

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

使用udev hwdb重新映射keyyms

拥有只发送鼠标点击的踏板可能不是您想要的。踏板开关发送的这些键代码可以与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

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

$ sudo systemd-hwdb update

然后拔下设备并重新调整设备。

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

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

您还可以使用xmodmap之类的方法将XF86*键符号重新映射到其他键。有关更多详细信息,包括使密钥在vim中可映射,更多文档链接,根据需要直接读取HID设备的指针以及Mac OS X的解决方案,请参阅我的weblog post

Footcontroller

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

答案 5 :(得分:0)

我用我的绑定/ shorcuts compiz,easystroke和xmacro的组合。

根据您的需要,我认为缺少的部分是xbindkeys。我找到了这个链接,可能有助于你设置它:

http://linux-trackball.dreamhosters.com/

我想知道是否有办法区分几种鼠标设备。