linux hid hid-device

¿Cómo capturar entrada HID sin procesar en linux?



hid-device (6)

Versión corta de lo que quiero lograr : tengo un pedal (INFINITY-IN-USB-1, si es de interés) que se implementa como un dispositivo HID genérico, y me gustaría que se comportara como control y alt Llaves en linux. Estoy buscando algo en el nivel de X, es decir, no solo programas individuales.

Versión más larga : tengo esta configuración funcionando en Windows XP llamando a dll RegisterRawInputDevices y GetRawInputData y escuchando la entrada en una ventana oculta. Todo se logra con un script de Autohotkey bastante sencillo (puede publicar aquí si alguien está interesado). El punto es que no hay necesidad de ningún controlador adicional, etc .; sólo se necesitan los dll nativos de Windows.

Quiero que esta configuración funcione en Linux (más específicamente Gnome en Ubuntu, pero ocasionalmente uso otro administrador de distro / ventana, por lo que se agradece la solución en el nivel de X). Este pedal no se registra como teclado o joystick, sino como un dispositivo HID con UsagePage 12, Usage 3. Observo que el último Ubuntu puede detectar y usar las teclas favoritas en el Microsoft Natural Keyboard, que también se registra como dispositivo HID *. Hago uso de esas teclas en Windows usando el mismo método que uso el pedal (es decir, sin el software incluido). Así que asumo que este pedal también puede funcionar en Linux, pero la pregunta es ¿cómo?

[Soy nuevo en las cosas de nivel inferior en Linux, así que sea generoso con los enlaces de introducción o tutorial cuando corresponda.]

* Para aquellos que no lo saben, el Microsoft Natural Keyboard se registra como un teclado normal y un dispositivo HID genérico. Sin que alguna aplicación (como la aplicación en paquete) sepa cómo interpretar la entrada HID, las teclas normales funcionarán, pero las teclas favoritas y las teclas de función especial son inútiles.

Para aclarar, Linux NO está viendo las presiones del pedal como entrada. Reconoce el dispositivo USB, pero xev no da salida para presionar el pedal. He visto informes de personas que han utilizado con éxito el pedal bajo WINE para el software de transcripción, pero eso debe funcionar de forma Windows y no da lo que quiero (que hace que el pedal se vea como un teclado para todas las aplicaciones nativas de Linux). Me pregunto si se necesita algún controlador de teclado de bajo nivel de Linux?

Aquí hay algo más de información: Si emito esto en el terminal.

cat /dev/usb/hiddev0

( dev/usb/hiddev0 es mi pedal), obtengo los códigos en bruto correspondientes a mis presiones de pedal. Eso es un comienzo. Sé lo que significa ese código en bruto: en binario, 0001, 0010, 0100 corresponde a cada pedal, respectivamente, y la combinación de pulsaciones de pedal envía una combinación de esos números binarios, y libera la entrada del disparador del pedal de cualquier pedal que se esté presionando (si es que todos pedal arriba, se envía 0000).

¿Cómo consigo que X escuche dev/usb/hiddev0 y traduzca los códigos en bruto a un código dev/usb/hiddev0 tal vez especial para poder mapearlos con xmodmap o algo así?


¿Aparece el dispositivo en / dev / input? si lo hace, use el controlador X "evdev" para conectarlo como lo haría con un teclado o un mouse.


Deberías investigar lircd. Interpreta la entrada desde los mandos a distancia. Aparentemente, algunos controles remotos compatibles se presentan como dispositivos ocultos genéricos, por lo que puede hacer que su dispositivo hable con lircd.


El mismo problema aquí, pero con teclas especiales en un teclado inalámbrico. Siento tu dolor.

De todos modos, tratando de hacer que esto funcione, aquí está mi método:

  1. sleep 10; killall cat sleep 10; killall cat luego rápidamente en otra terminal: cat /dev/usb/hiddevice0 > key1.usbdump y presione / use el dispositivo. Esto volcará la salida binaria del hiddevice para esa clave.
  2. Rápidamente pirateé una secuencia de comandos de Python para leer la entrada del dispositivo y disparar eventos. Hasta ahora funciona por primera vez que se pulsa la tecla. Esto es similar a lo que sugirió Adam, pero creo que uinput es más difícil de programar / usar, aunque quizás más elegante, y Python está fácilmente disponible.

Así que este es un trabajo en progreso (solo funciona por primera vez si se pulsa), pero quizás algo como esto podría funcionar para usted:

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.

Si alguien puede ayudarme con mi programa o si lo estoy haciendo mal, por favor, dígame. ;)

Me doy cuenta de que hay algunos encabezados que se incluyen en el volcado inicial del dispositivo. Usando alguna edición de bendición hexadecimal y diferenciación de bits, puede encontrar qué valores son importantes y verificarlos en python. (Por ejemplo, el dígito hexadecimal "B0" significa que se presionó una tecla de función especial en mi teclado, y más adelante hay más información sobre qué tecla se presionó, etc.)

Mi resultado final es el siguiente: hiddevice0 parece colgar y dejar de dar datos después de un tiempo, no estoy seguro de por qué, pero en su lugar, uso / dev / input / event * (También podría funcionar para ti) y eso parece funcionar mejor. Nuevamente, el mismo análisis hexadecimal y bajo conduce al éxito. En el camino encontré que sudo cat /dev/input/event3 | hexdump sudo cat /dev/input/event3 | hexdump es extremadamente útil para determinar qué bytes son importantes para ti.

Por lo tanto, si tiene un teclado IBM Sk-8812 y desea usar las teclas especiales, puede hablar conmigo para obtener el script que usé.


Escribí sobre cómo conseguí que mi Infinity IN-USB-1 (AKA "VEC USB Footpedal") enviara palabras clave arbitrarias debajo de X en mi weblog:

Utilice el pedal USB VEC / Infinity como teclado bajo Linux

(También debería funcionar para IN-USB-2 y tal vez algunos otros modelos de controlador de pie USB vendidos por VEC y PI Engineering y sus clones).

Aquí está la versión más corta:

Consigue X para reconocer el pedal.

El pedal es un dispositivo USB compatible con HID y el kernel no tiene problemas para descubrirlo y hacer que sus eventos estén disponibles para el espacio del usuario a través de un nodo /dev/input/eventX . Para ver que puede ejecutar el programa evtest (en Debian: sudo apt install evtest ). Así que no necesita ir al nivel HID para usar los pedales.

El problema es que udev no lo etiqueta como un teclado o ratón, por lo que X lo ignora. Esto se puede solucionar con un archivo de reglas udev de una línea (gracias al desarrollador de Parlatype Gabor Karsay, por proporcionar esta solución en el problema 28 de Parlatype ):

ACTION=="add|change", KERNEL=="event[0-9]*", ATTRS{idVendor}=="05f3", ATTRS{idProduct}=="00ff", ENV{ID_INPUT_KEYBOARD}="1"

Coloque esa línea en un archivo llamado /etc/udev/rules.d/10-vec-usb-footpedal.rules . No es necesario reiniciar nada, udev debería detectar automáticamente el archivo.

Ahora, cuando desenchufa y vuelve a enchufar el pedal USB, debe ser reconocido por X (y enviar eventos del botón del mouse). Para verificar, ejecute xev .

Reasignando keyyms con udev hwdb

Tener un pedal que solo envíe clics del mouse probablemente no sea lo que usted desea. Estos códigos de tecla enviados por los interruptores de pedal se pueden volver a asignar con un archivo udev hwdb.

Cree un archivo en /etc/udev/hwdb.d/ (pongo el mío en /etc/udev/hwdb.d/60-usb-footpedal.hwdb ) que contiene estas líneas: /etc/udev/hwdb.d/60- usb-footpedal.hwdb

evdev:input:b*v05F3p00FF* KEYBOARD_KEY_90001=f14 KEYBOARD_KEY_90002=f15 KEYBOARD_KEY_90003=f16

Esta vez necesitamos informar al sistema para actualizar el archivo hwdb binario:

$ sudo systemd-hwdb update

Y luego desenchufe y vuelva a conectar el dispositivo.

La primera línea del archivo hwdb coincide con nuestro dispositivo (proveedor 05F3 , producto 00FF ), y las líneas subsiguientes asignan un scancode (hex) a un código clave. Elegí las teclas de función F14, F15 y F16, pero se define una lista de códigos de clave disponibles en /usr/include/linux/input-event-codes.h ; para usar los nombres # definidos en ese archivo como códigos clave hwdb, simplemente conviértalos a minúsculas y elimine el prefijo key_ .

La distribución de teclado por defecto (pc + us) xkb en mi computadora asigna F14 , F15 y F16 al XF86Launch5 , XF86Launch6 y XF86Launch7, respectivamente. Si abres xev ahora y presionas los pedales, deberías ver los keyyms emitidos. Usando esos sinónimos, cada interruptor de pedal se puede asignar como una tecla de acceso directo en su escritorio o administrador de ventanas.

También puede reasignar los XF86* a otras claves usando algo como xmodmap. Para obtener más detalles, como obtener las claves para ser asignables en vim, más enlaces a la documentación, punteros para leer el dispositivo HID directamente si lo desea y una solución para Mac OS X, consulte la publicación de mi blog.

Controlador de pie

Una última cosa que mencionaré es un programa de python llamado footcontroller que lee eventos del dispositivo evdev (/ dev / input / eventX) y puede configurarse para emitir pulsaciones de teclas (a través de xdotool) o ejecutar scripts en respuesta a los pedales. Se puede usar en lugar de xmodmap para que el pedal envíe cualquier golpe de tecla que desee.


Usted querrá uinput . Escuchará en su / dev / usb / hiddev0 y luego creará nuevos eventos que enviará en /dev/input/uinput .

Esto lo explica y ofrece un pequeño tutorial: Uso del controlador uinput en Linux-2.6.x para enviar comentarios del usuario { Este es el artículo de la publicación "Tablero de instrumentos" de EInfochips Enero de 2007 "Artículo del consejo del mes" mencionado en this página archivada }.


Yo uso para mi enlace / shorcuts una combinación de compiz, easystroke y xmacro.

Para tus necesidades, creo que la pieza que falta es xbindkeys. He encontrado este enlace para usted que tal vez le ayude a configurar esto:

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

De todos modos, me pregunto si hay una manera de distinguir entre varios dispositivos de mouse.