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

StackOverflow https://stackoverflow.com/questions/873975

  •  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.

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

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

  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.

Если кто-нибудь может помочь мне с моей программой или если я делаю это неправильно, пожалуйста, скажите мне.;)

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top