代码之家  ›  专栏  ›  技术社区  ›  polyglot

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

  •  30
  • polyglot  · 技术社区  · 16 年前

    我想要完成的工作的简短版本 :我有一个脚踏板(Infinity-in-USB-1,如果有兴趣的话),它是作为一个通用的hid设备实现的,我希望它在Linux上表现为控制键和alt键。我在找X级别的东西,不仅仅是个人项目。

    较长版本 :我在Windows XP中使用此安装程序,方法是调用dll registerrawinputdevices和getrawinputdata,并在隐藏窗口中侦听输入。一切都是以相当直接的方式完成的 Autohotkey 脚本(如果有人感兴趣,可以在这里发布)。关键是,不需要任何额外的驱动程序等;只需要本机Windows DLL。

    我希望这个设置可以在Linux上工作(更具体地说,是Ubuntu下的gnome,但我偶尔也会使用其他的disro/window管理器,所以非常感谢X级别的解决方案)。此脚踏板本身不注册为键盘或操纵杆,而是作为HID设备与用途第12页,用法3。我注意到最新的Ubuntu可以检测和使用Microsoft自然键盘上的常用键,该键盘也注册为HID设备*。我使用这些键在窗口上使用的方法与我使用脚踏板的方法相同(即,不使用捆绑软件)。所以我假设这个踏板也可以在Linux上工作,但问题是如何工作?

    [我刚接触到Linux的底层内容,因此请在适当的时候提供有关简介或教程的链接。]

    *对于那些不知道,微软自然键盘注册为普通键盘和通用的HID设备。如果某些应用程序(如捆绑应用程序)不知道如何解释HID输入,常规键将工作,但常用键和特殊功能键是无用的。


    要澄清的是,Linux没有将踏板按下视为输入。它可以识别USB设备,但XEV不提供踏板踩下的输出。我已经看到有报道说人们成功地使用了Wine下的踏板进行转录,但这必须以Windows的方式工作,不能满足我的需要(这使得踏板看起来像是所有本地Linux应用程序的键盘)。我想知道是否有一些低级的Linux键盘驱动程序 需要吗?


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

    cat /dev/usb/hiddev0
    

    ( dev/usb/hiddev0 是我的踏板),我得到与我的踏板踩下对应的原始代码。这是一个开始。我知道这些原始代码的含义:在二进制代码中,0001、0010、0100分别对应于每一个踏板,踏板按压组合发送这些二进制数的组合,并释放仍在踩下的任何踏板的踏板触发输入(如果所有踏板都踩起,则发送0000)。

    如何让X听 DEV/USB/HIDEV0 把原始代码翻译成一个特殊的键码,这样我就可以用xmodmap或其他东西来映射它们了?

    6 回复  |  直到 6 年前
        1
  •  18
  •   SlySven    8 年前

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

    这解释了它,并给出了一个小教程: Using uinput driver in Linux- 2.6.x to send user input { 这是Einfochips的“Dashboard”出版物2007年1月的“Tip of the Month”文章 this 归档页面 }。

        2
  •  4
  •   Alexey Feldgendler    15 年前

    设备是否显示在/dev/input中?如果是这样,使用“evdev”x驱动程序将其连接起来,就像对键盘或鼠标所做的那样。

        3
  •  2
  •   joeforker    16 年前

    你应该调查一下Lircd。它解释来自遥控器的输入。一些受支持的遥控器显然表现为通用的HID设备,因此您可以让您的设备与LIRCD通信。

        4
  •  2
  •   kapace    14 年前

    这里也有同样的问题,但是无线键盘上有特殊的按键。我感觉到你的痛苦。

    不管怎样,我的方法是:

    1. sleep 10; killall cat 然后快速进入另一个终端: cat /dev/usb/hiddevice0 > key1.usbdump 按下/使用设备。这将为该键转储hiddevice的二进制输出。
    2. 我很快破解了一个python脚本来读取hiddevice输入和fire事件。到目前为止,这是第一次按这个键。这与Adam的建议类似,但我认为uinput更难编程/使用,尽管可能更优雅,而且python很容易获得。

    所以这是一个正在进行中的工作(只在第一次按下时有效),但是这样的事情可能对你有用:

    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的初始转储中包含一些头文件。使用一些祝福的十六进制编辑和位差异,您可以找到哪些值是重要的,并在python中对它们进行检查。(例如,十六进制数字“b0”表示在我的键盘上按下了一个特殊的功能键,之后还有更多关于按下哪个键的信息等。)

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

    所以,如果您有一个sk-8812 IBM键盘,并且想使用这些特殊的键,您可以和我交谈以获得我使用的脚本。

        5
  •  0
  •   bitozoid    16 年前

    我使用compiz、easystroke和xmacro组合进行装订/剪边。

    为了您的需要,我想丢失的是XbindKeys。我已经为您找到了这个链接,也许可以帮助您设置:

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

    不管怎样,我想知道是否有办法区分几种鼠标设备。

        6
  •  0
  •   cristoper    6 年前

    我写过我如何让我的无限in-usb-1(又称“vec-usb footedal”)在我的日志中发送x下的任意密钥符号:

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

    (它也适用于in-usb-2和一些其他的usb-foot控制器型号,这些型号由vec和p.i.工程公司及其克隆产品销售。)

    以下是较短的版本:

    让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重新映射keysyms

    拥有一个只发送鼠标点击的踏板可能不是你想要的。踏板开关发送的这个键码可以用udev hwdb文件重新映射。

    在下创建文件 /etc/udev/hwdb.d/ (我把我的 /etc/udev/hwdb.d/60-usb-footpedal.hwdb )包含这些行: /等/udev/hwdb.d/60-usb-footedal.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 )和随后的行将scancode(hex)映射到keycode。我选择了F14、F15和F16功能键,但在 /usr/include/linux/input-event-codes.h ;要使用该文件中定义为hwdb keycodes的名称,只需将其转换为小写并删除 key_ 前缀。

    我的电脑地图上的默认(PC+US)xkb键盘布局 F14 , F15 F16 XF86Launch5 , XF86Launch6 XF86Launch7 分别是keysyms。如果你打开 XEV 现在踩下踏板,您将看到这些按键符号发出。使用这些keysyms,每个踏板开关都可以映射为桌面或窗口管理器中的热键。

    您也可以重新映射 XF86* keysyms使用类似xmodmap的东西传递给其他键。有关更多详细信息,包括获取VIM中可映射的密钥、更多到文档的链接、指向直接读取HID设备的指针(如果需要)以及针对Mac OS X的解决方案,请参见 weblog post

    脚踏控制器

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