Как перехватить необработанный ввод HID на Linux?

Короткая версия того, чего я хочу достичь: у меня есть ножная педаль (INFINITY-IN-USB-1, если это интересно), которая реализована как универсальное устройство HID, и я хотел бы, чтобы она работала как управление и ключи на линуксе. Я ищу что-то на уровне X, то есть не только отдельные программы.

Более длинная версия: у меня эта настройка работает в Windows XP, вызывая dll RegisterRawInputDevices и GetRawInputData и прослушивая ввод в скрытых окнах. Все это выполняется с помощью довольно простого скрипта Autohotkey (можете опубликовать здесь, если кому-то интересно). Дело в том, что нет необходимости в дополнительном драйвере и т. Д.; нужны только родные библиотеки Windows.

Я хочу, чтобы эта настройка работала на Linux (точнее, на Gnome под Ubuntu, но я иногда использую другой менеджер дистрибутивов / окон, поэтому решение на уровне X приветствуется). Эта педаль не регистрируется как клавиатура или даже джойстик, но как устройство HID с UsagePage 12, использование 3. Я замечаю, что последняя версия Ubuntu может обнаруживать и использовать любимые клавиши на клавиатуре Microsoft Natural, которые также регистрируются как устройства 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 ответов

Решение

Ты захочешь uinput, Вы будете слушать ваш /dev/usb/hiddev0, а затем создавать новые события, на которые будете отправлять /dev/input/uinput,

Это объясняет это и дает небольшое руководство: Использование драйвера uinput в Linux-версии 2.6.x для отправки пользовательского ввода {Это публикация EInfochips'Dashboard', январь 2007 г., статья "Совет месяца", упомянутая на этой заархивированной странице}.

Я написал о том, как я получил свой Infinity IN-USB-1 (AKA "VEC USB Footpedal") для отправки произвольных ключевых символов под X в моем блоге:

Используйте педаль VEC/Infinity USB в качестве клавиатуры под Linux

(Он также должен работать для IN-USB-2 и, возможно, некоторых других моделей ножных контроллеров USB, продаваемых VEC и PI Engineering, и их клонов.)

Вот более короткая версия:

Получить X, чтобы распознать педаль

Педаль является HID-совместимым USB-устройством, и ядро ​​без проблем обнаруживает ее и делает ее события доступными для пользователя через /dev/input/eventX узел. Чтобы увидеть, что вы можете запустить evtest программа (в Debian: sudo apt install evtest). Таким образом, вам не нужно переходить на уровень HID, чтобы использовать ножные педали.

Проблема в том, что udev не помечает его как клавиатуру или мышь, поэтому X игнорирует его. Это можно исправить с помощью однострочного файла правил udev (спасибо разработчику Parlatype Габору Карсею за предоставление этого решения в выпуске 28 Parlatype):

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

Наличие педали, которая посылает только щелчки мыши, вероятно, не то, что вы хотите. Эти коды клавиш, отправленные педальными переключателями, можно переназначить с помощью файла 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, но список доступных кодов клавиш определен в https://github.com/torvalds/linux/blob/master/include/uapi/linux/input-event-codes.h; чтобы использовать имена #defined в этом файле в качестве кодов клавиш hwdb, просто преобразуйте их в нижний регистр и удалите key_ префикс.

Раскладка клавиатуры xkb по умолчанию (pc+us) на картах моего компьютера F14, F15, а также F16 к XF86Launch5, XF86Launch6, а также XF86Launch7 кейсим соответственно. Если вы откроете xev Теперь и нажмите на педали, вы должны увидеть, как эти клавиши выдаются. Используя эти ключевые символы, каждый педальный переключатель может быть отображен как горячая клавиша на рабочем столе или в оконном менеджере.

Вы также можете переназначить XF86* keysyms для других ключей, используя что-то вроде xmodmap. Более подробную информацию, в том числе о том, как получить ключи для сопоставления в vim, больше ссылок на документацию, указатели на прямое чтение устройства HID, если хотите, и решение для Mac OS X, см. В моем блоге

Footcontroller

И последнее, что я упомяну, это программа на python, называемая footcontroller, которая считывает события с устройства evdev (/dev/input/eventX) и может быть настроена на выполнение нажатий клавиш (через xdotool) или запуск сценариев в ответ на нажатия на педали. Его можно использовать вместо xmodmap, чтобы заставить вашу педаль отправлять любое нажатие клавиши.

Устройство отображается в /dev/input? если это так, используйте драйвер "evdev" X, чтобы подключить его так же, как и для клавиатуры или мыши.

Вы должны исследовать lircd. Он интерпретирует ввод с пульта дистанционного управления. Некоторые поддерживаемые пульты, по-видимому, представляют собой обычные скрытые устройства, поэтому вы можете получить возможность подключить ваше устройство к lircd.

Та же проблема здесь, но со специальными клавишами на беспроводной клавиатуре. Я чувствую твою боль.

В любом случае, пытаясь заставить это работать, вот мой метод:

  1. sleep 10; killall cat затем быстро в другой терминал: cat /dev/usb/hiddevice0 > key1.usbdump и нажмите / используйте устройство. Это выведет двоичный вывод hiddevice для этого ключа.
  2. Я быстро взломал скрипт на python для чтения событий ввода и запуска hiddevice. Пока он работает впервые, ключ нажал. Это похоже на то, что предложил Адам, но я думаю, что 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 очень помогает определить, какие байты важны для вас.

Итак, если у вас есть клавиатура IBM Sk-8812 и вы хотите использовать специальные клавиши, вы можете поговорить со мной, чтобы получить сценарий, который я использовал.

Я использую для привязки / сокращения комбинацию compiz, easystroke и xmacro.

Для ваших нужд, я думаю, что недостающий кусок xbindkeys. Я нашел эту ссылку для вас, которая, возможно, поможет вам настроить это:

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

В любом случае мне интересно, есть ли способ отличить несколько мышиных устройств.

Другие вопросы по тегам