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