2009-05-17 21 views
25

Versión corta de lo que quiero lograr: Tengo un pedal (INFINITY-IN-USB-1, si tiene algún interés) que se implementa como un dispositivo HID genérico, y me gustaría que se comportara como control y teclas alt en Linux. Estoy buscando algo en el nivel de X, es decir, no solo programas individuales.Cómo capturar la entrada HID sin procesar en Linux?

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 bastante sencillo Autohotkey (puede publicar aquí si alguien está interesado). El punto es que no hay necesidad de ningún controlador adicional, etc .; solo se necesitan los dll nativos de Windows.

Quiero que esta configuración funcione en Linux (más específicamente Gnome en Ubuntu, pero de vez en cuando uso otro gestor de distribución/ventanas, por lo que la solución en el nivel de X es apreciada). Este pedal no se registra como teclado o joystick, sino como dispositivo HID con UsagePage 12, Uso 3. Noté que el último Ubuntu puede detectar y usar las teclas favoritas en el teclado natural de Microsoft, que también se registra como dispositivo HID. *. Utilizo esas teclas en Windows utilizando el mismo método que el que uso el pedal (es decir, sin el software incluido). Así que supongo que este pedal también puede funcionar en Linux, pero la pregunta es ¿cómo?

[Soy nuevo en la materia de nivel inferior en Linux, así que por favor sea generoso con enlaces a la introducción o tutorial siempre que sea aplicable.]

* Para aquellos que no lo sepan, los registros de teclado Microsoft Natural como un teclado regular y un dispositivo HID genérico. Sin alguna aplicación (como la aplicación incluida) que sepa cómo interpretar la entrada HID, las teclas normales funcionarán, pero las teclas favoritas y las teclas de funciones especiales son inútiles.


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


Aquí hay más información: Si expido el presente en el terminal

cat /dev/usb/hiddev0 

(dev/usb/hiddev0 es mi pedal), consigo los códigos de primas correspondientes a mis prensas 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 prensas de pedal envía una combinación de esos números binarios, y liberaciones de entrada de pedal de cualquier pedal que se esté presionando (si todo el pedal está arriba, se envía 0000).

¿Cómo consigo que X escuche dev/usb/hiddev0 y traduzca los códigos brutos a un código clave especial tal que pueda mapearlos con xmodmap o algo así?

Respuesta

16

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

Esto explica y le da un pequeño tutorial: Using uinput driver in Linux- 2.6.x to send user input {Esto es tema de la publicación 'tablero de instrumentos' los eInfochips' enero de 2007 'Consejo del mes' en el artículo mencionado this archivado}.

+2

¿Puedes elaborar un poco más? ¿Cómo escucha uno/dev/usb/hiddev0 programáticamente (el artículo que enlazó solo habla de uinput)? El programa resultante (que escucha en hiddev y envía eventos de teclado/mouse a través de uinput) tendría que ejecutarse como daemon, supongo? – polyglot

+2

Sí, supongo por su pregunta que ya sabe cómo leer hiddev0. Probablemente estarás escribiendo un daemon. Comience por escribir un programa que lea continuamente hiddev0 e imprima impresiones. Luego puede modificarlo para emitir nuevos eventos a través de uinput. Esto básicamente reinyectará estos eventos nuevamente en el kernel, pero como eventos de teclado o mouse (de su elección). No serán necesarios cambios a X. –

+5

Ese parece ser un artículo muy popular sobre uinput. Vinculado a de toda la web. Por desgracia, ya no está allí y Google solo encontró una copia modificada de PDF-> texto convertido. ¿Alguien tiene el PDF original en un lugar donde se puede compartir? –

0

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

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

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

todos modos me pregunto si hay una manera de distinguir entre varios dispositivos de ratón.

+3

Ya sé sobre xbindkeys etc., pero el problema es que X NO reconoce mis prensas de pedal, por lo que xbindkeys a partir de ahora es inútil.Incluso el autor del enlace que diste tiene algunos botones en su trackball que aún no funcionan. Mi pregunta es sobre cómo hacer funcionar esas teclas que no funcionan, no sobre cómo hacer uso de las claves que ya funcionan. Lo siento por la confusión. – polyglot

2

Debe investigar lircd. Interpreta la entrada de los controles remotos. Algunos controles remotos compatibles aparentemente se presentan como dispositivos genéricos ocultos, por lo que es posible que pueda hacer que su dispositivo hable con lircd.

2

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

2

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

De todas formas, tratando de conseguir que esto funcione, aquí está mi método:

  1. sleep 10; killall cat luego rápidamente en otro terminal: cat /dev/usb/hiddevice0 > key1.usbdump y pulse/utilizar el dispositivo. Esto descargará la salida binaria del dispositivo oculto para esa clave.
  2. Rápidamente pirateé un script de python para leer la entrada del dispositivo oculto y los eventos de disparo. Hasta ahora funciona por primera vez que se golpea la tecla. Esto es similar a lo que Adam sugirió, pero creo que uinput es más difícil de programar/usar aunque quizás sea más elegante, y python está disponible.

Así que este es un trabajo en progreso (sólo funciona por primera vez pulsado), pero tal vez 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 me puede ayudar con mi programa o si estoy haciendo esto mal, por favor dígame. ;)

Me doy cuenta de que hay algunos encabezados incluidos en el volcado inicial del dispositivo oculto. Usando algunas bendiciones de edició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 ha presionado una tecla de función especial en mi teclado, y luego hay más información sobre qué tecla se presionó, etc.)

Mi resultado final es este: hiddevice0 parece Cuelga y deja de dar datos después de un tiempo, no estoy seguro de por qué, pero en su lugar, uso/dev/input/event * (Puede que también funcione para ti) y parece funcionar mejor. De nuevo, el mismo análisis de hexediting y de bajo nivel conduce al éxito. En el camino encontré que sudo cat /dev/input/event3 | hexdump es extremadamente útil para determinar qué bytes son importantes para usted.

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

+0

En la misma terminal, puede escribir (sleep 10; killall cat) & cat/usb/dev/hiddev0> key1.usbdump –

Cuestiones relacionadas