Как перехватить необработанный ввод HID на Linux? - PullRequest
31 голосов
/ 17 мая 2009

Короткая версия того, что я хочу сделать : У меня есть педаль (INFINITY-IN-USB-1, если это интересно), которая реализована как универсальное устройство HID, и я бы хотел нравится вести себя как клавиши управления и alt на linux. Я ищу что-то на уровне 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 ]

19 голосов
/ 24 ноября 2009

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

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

4 голосов
/ 06 ноября 2009

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

2 голосов
/ 02 декабря 2010

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

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

  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 и вы хотите использовать специальные клавиши, вы можете поговорить со мной, чтобы получить сценарий, который я использовал.

2 голосов
/ 21 мая 2009

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

1 голос
/ 28 августа 2018

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

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

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

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

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

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

Проблема в том, что udev не помечает его как клавиатуру или мышь, поэтому X игнорирует его. Это можно исправить с помощью файла правил udev, состоящего из одной строки (спасибо Parlatype разработчику Габору Карсею за предоставление этого решения в 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

Наличие педали, которая посылает только щелчки мышью, вероятно, не то, что вам нужно. Эти коды клавиш, отправленные педальными переключателями, можно переназначить с помощью файла 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 ; чтобы использовать имена #defined в этом файле в качестве кодов клавиш hwdb, просто преобразуйте их в нижний регистр и удалите префикс key_.

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

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

Footcontroller

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

0 голосов
/ 17 мая 2009

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

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

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

Интересно, есть ли способ отличить несколько мышиных устройств?

...