Как захватить необработанный скрытый ввод в Linux?
-
22-08-2019 - |
Вопрос
Краткая версия того, чего я хочу достичь:У меня есть ножная педаль (INFINITY-IN-USB-1, если это вас интересует), которая реализована как универсальное HID-устройство, и я бы хотел, чтобы она вела себя как клавиши control и alt в Linux.Я ищу что-то на уровне X, т. е.не просто отдельные программы.
Более длинная версия:У меня эта настройка работает в Windows XP, вызывая dll RegisterRawInputDevices и GetRawInputData и прослушивая входные данные в скрытой Windows.Все достигается с помощью довольно простого Автоотключение скрипт (могу выложить здесь, если кому-то интересно).Дело в том, что нет необходимости в каком-либо дополнительном драйвере и т.д.;необходимы только собственные библиотеки DLL Windows.
Я хочу, чтобы эта настройка работала в Linux (точнее, Gnome под Ubuntu, но я иногда использую другой дистрибутив / оконный менеджер, поэтому приветствуется решение на уровне X).Эта ножная педаль регистрируется не как клавиатура или даже джойстик, а как скрытое устройство со страницей использования 12, Использование 3.Я замечаю, что последняя версия Ubuntu может обнаруживать и использовать любимые клавиши на естественной клавиатуре Microsoft, которые также регистрируются как HID device *.Я использую эти клавиши в Windows тем же методом, что и ножную педаль (т.е.без прилагаемого программного обеспечения).Итак, я предполагаю, что эта педальная штука может работать и в Linux, но вопрос в том, как?
[Я новичок в низкоуровневых материалах в Linux, поэтому, пожалуйста, будьте щедры на ссылки на введение или учебник, когда это применимо.]
* Для тех, кто не в курсе, Microsoft Natural Keyboard регистрируется как обычная клавиатура, так и универсальное скрытое устройство.Если какое-либо приложение (например, входящее в комплект) не знает, как интерпретировать ввод HID, обычные клавиши будут работать, но избранные клавиши и специальные функциональные клавиши бесполезны.
Чтобы уточнить, Linux НЕ видит нажатия на педаль в качестве входных данных.Он распознает USB-устройство, но xev не выдает никаких выходных данных для нажатий на педали.Я видел сообщения о людях, успешно использующих педаль в программном обеспечении WINE для транскрипции, но это должно работать в стиле Windows и не дает того, что я хочу (то есть делает педаль похожей на клавиатуру для всех родных приложений Linux).Интересно, нужен ли какой-нибудь низкоуровневый драйвер клавиатуры Linux ?
Вот еще немного информации:Если я выдам это в терминале
cat /dev/usb/hiddev0
(dev/usb/hiddev0
это моя педаль), я получаю необработанные коды, соответствующие моим нажатиям на педаль.Это только начало.Я знаю, что означает этот необработанный код:в двоичном формате 0001, 0010, 0100 соответствует каждой педали соответственно, и комбинация нажатий на педали отправляет комбинацию этих двоичных чисел, а отпускания педали запускают ввод любой педали, которая все еще нажата (если все педали подняты, отправляется 0000).
Как мне заставить X слушать dev/usb/hiddev0
и перевести необработанные коды, возможно, в специальный ключевой код, чтобы я мог сопоставить их с помощью xmodmap или что-то в этом роде?
Решение
Вы захотите uinput
.Вы будете прослушивать на своем /dev / usb / hiddev0, а затем создавать новые события, которые будете отправлять на /dev/input/uinput
.
Это объясняет это и дает небольшое руководство:Использование драйвера uinput в Linux- 2.6.x для отправки пользовательского ввода {Это статья "Совет месяца", опубликованная в журнале EInfochips "Dashboard" за январь 2007 года, упомянутая на это заархивированная страница}.
Другие советы
Отображается ли устройство в /dev/input?если это произойдет, используйте драйвер "evdev" X, чтобы подключить его точно так же, как вы бы сделали для клавиатуры или мыши.
Вам следует расследовать lircd.Он интерпретирует входные данные с пультов дистанционного управления.Некоторые поддерживаемые пульты дистанционного управления, по-видимому, представляют себя как обычные устройства hid, поэтому вы можете настроить взаимодействие вашего устройства с 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.
Если кто-нибудь может помочь мне с моей программой или если я делаю это неправильно, пожалуйста, скажите мне.;)
Я понимаю, что в начальный дамп скрытого устройства включены некоторые заголовки.Используя некоторое шестнадцатеричное редактирование bless и разность битов, вы могли бы найти, какие значения важны, и проверить их в python.(Например, шестнадцатеричная цифра "B0" означает, что на моей клавиатуре была нажата специальная функциональная клавиша, а позже появится дополнительная информация о том, какая клавиша была нажата и т.д.)
Мой конечный результат таков:hiddevice0, кажется, зависает и перестает выдавать данные через некоторое время, не уверен почему, но вместо этого я использую /dev/input / event * (это может сработать и для вас), и это, кажется, работает лучше.Опять же, то же самое шестнадцатеричное редактирование и низкоуровневый синтаксический анализ приводят к успеху.По пути я обнаружил, что sudo cat /dev/input/event3 | hexdump
это чрезвычайно полезно при определении того, какие байты важны для вас.
Итак, если у вас есть клавиатура IBM Sk-8812, и вы хотели бы использовать специальные клавиши, вы можете связаться со мной, чтобы получить сценарий, который я использовал.
Я писал в своем блоге о том, как я получил свой Infinity IN-USB-1 (ОН же "VEC USB Footpedal") для отправки произвольных ключевых слов в разделе X:
Используйте ножную педаль VEC / Infinity USB в качестве клавиатуры под Linux
(Это также должно работать для IN-USB-2 и, возможно, для некоторых других моделей ножных контроллеров USB, продаваемых VEC и P.I.Инженерные разработки и их клоны.)
Вот более короткая версия:
Попросите X распознать педаль
Pedal является USB-устройством, совместимым с HID, и ядро без проблем обнаруживает его и делает его события доступными для пользовательского пространства через /dev/input/eventX
узел.Чтобы увидеть, что вы можете запустить evtest
программа (на Debian: sudo apt install evtest
).Так что ты не потребность чтобы перейти на скрытый уровень, используйте ножные педали.
Проблема в том, что udev не помечает его как клавиатуру или мышь, поэтому X игнорирует его.Это можно исправить с помощью однострочного файла правил udev (благодаря Парлатип разработчику Габору Карсаю за предоставление этого решения в Типовой выпуск 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
), а последующие строки сопоставляют scancode (шестнадцатеричный) с keycode.Я выбрал функциональные клавиши F14, F15 и F16, но список доступных кодов клавиш определен в /usr/включить/linux/input-event-codes.h;чтобы использовать имена #, определенные в этом файле, в качестве ключевых кодов hwdb, просто преобразуйте их в нижний регистр и удалите key_
префикс.
Стандартная раскладка клавиатуры xkb (ПК + США) на картах "Мой компьютер" F14
, F15
, и F16
к тому XF86Launch5
, XF86Launch6
, и XF86Launch7
ключевые символы, соответственно.Если вы откроете xev
теперь и нажимайте на педали, вы должны увидеть, как эти клавиши издаются.Используя эти символы клавиш, каждый переключатель педали может быть отображен как горячая клавиша на вашем рабочем столе или в оконном менеджере.
Вы также можете переназначить XF86*
символы ключей для других ключей, используя что-то вроде xmodmap.Для получения более подробной информации, включая отображение ключей в vim, дополнительные ссылки на документацию, указания на прямое считывание HID-устройства, если хотите, и решение для Mac OS X, смотрите Мой сообщение в блоге
Педальный Контроллер
Последнее, о чем я упомяну, - это программа на python под названием педальный контроллер который считывает события с устройства evdev (/dev/input/eventX) и может быть настроен на выдачу нажатий клавиш (через xdotool) или запуск сценариев в ответ на нажатие на педали.Его можно использовать вместо xmodmap, чтобы заставить вашу педаль посылать любое нажатие клавиши, которое вы хотите.
Я использую для своих привязок / сокращений комбинацию compiz, easystroke и xmacro.
Для ваших нужд, я думаю, недостающая часть - это xbindkeys.Я нашел для вас эту ссылку, которая, возможно, поможет вам настроить это:
http://linux-trackball.dreamhosters.com/
В любом случае, мне интересно, есть ли способ различать несколько устройств мыши.