2009-05-17 13 views
25

Versione breve di ciò che voglio ottenere: Ho un pedale (INFINITY-IN-USB-1, se è di qualche interesse) che è implementato come un dispositivo HID generico, e vorrei che si comportasse come controllo e tasti alt su linux. Sto cercando qualcosa al livello di X, cioè non solo singoli programmi.Come catturare l'input HID raw su linux?

Longer versione: Ho questa configurazione funzionante in Windows XP chiamando RegisterRawInputDevices dll e GetRawInputData e ascoltando l'ingresso in un finestre nascoste. Tutto è realizzato con uno script abbastanza semplice Autohotkey (può postare qui se qualcuno è interessato). Il punto è che non è necessario alcun driver aggiuntivo, ecc .; sono necessarie solo le dll di Windows native.

Voglio che questa configurazione funzioni su Linux (in particolare su Gnome con Ubuntu, ma occasionalmente uso altre distro/window manager, quindi la soluzione a livello di X è apprezzata). Questo pedale non si registra come tastiera o come joystick, ma come dispositivo HID con UsagePage 12, Uso 3. Osservo che l'ultima versione di Ubuntu può rilevare e utilizzare i tasti preferiti sulla tastiera Microsoft Natural, che si registra anche come dispositivo HID *. Faccio uso di quei tasti su Windows usando lo stesso metodo che uso il pedale (cioè senza il software in dotazione). Quindi presumo che questa pedaliera possa funzionare anche su linux, ma la domanda è come?

[Sono nuovo al roba di livello inferiore su Linux, quindi si prega di essere generosi con i link ai introduzione o tutorial ogni volta applicabile.]

* Per chi non lo sapesse, i registri Microsoft Natural Keyboard sia come tastiera normale che come dispositivo HID generico. Senza alcune applicazioni (come l'applicazione in bundle) che sanno come interpretare l'input HID, i tasti normali funzioneranno ma i tasti preferiti e i tasti funzione speciali sono inutili.


Per chiarire, Linux non vede il pedale pigiato come input. Riconosce il dispositivo USB, ma xev non fornisce output per le presse a pedale. Ho visto resoconti di persone che usano con successo il pedale sotto WINE per il software di trascrizione, ma che deve funzionare in un modo Windows e non dare quello che voglio (il che sta facendo sembrare il pedale una tastiera per tutte le app native di Linux). Mi chiedo se sia necessario un driver per tastiera linux di basso livello ?


Ecco qualche informazione: Se immette questo nel terminale

cat /dev/usb/hiddev0 

(dev/usb/hiddev0 è il mio pedale), ottengo codici grezzi corrispondenti agli presse pedale. Questo è un inizio. So che cosa significa quel codice grezzo: in binario, 0001, 0010, 0100 corrisponde a ciascun pedale, rispettivamente, e la combinazione di pedali preme la combinazione di quei numeri binari, e rilascia l'ingresso di trigger del pedale di qualsiasi pedale ancora premuto (se tutto il pedale è attivo, viene inviato 0000).

Come ottenere X per ascoltare dev/usb/hiddev0 e tradurre i codici grezzi in forse un codice di accesso speciale in modo che sia possibile mapparli con xmodmap o qualcosa del genere?

risposta

16

Si desidera uinput. Ascolterai su/dev/usb/hiddev0 e poi creerai nuovi eventi che invierai su /dev/input/uinput.

Questo spiega e dà un piccolo tutorial: Using uinput driver in Linux- 2.6.x to send user input {Questo è 'Dashboard' questione pubblicazione dei EInfochips' gennaio 2007 'Suggerimento del mese' articolo citato sul this archiviati pagina}.

+2

Puoi approfondire un po 'di più? Come si ascolta/dev/usb/hiddev0 in modo programmatico (l'articolo che hai collegato parla solo di uinput)? Il programma risultante (che ascolta hiddev e invia eventi tastiera/mouse tramite uinput) dovrebbe essere eseguito come demone, presumo? – polyglot

+2

Sì, presumo dalla tua domanda che sai già come leggere hiddev0. Probabilmente starai scrivendo un demone. Inizia scrivendo un programma che legge continuamente hiddev0 e stampa le stampe. Quindi puoi modificarlo per emettere nuovi eventi tramite uinput. Questo fondamentalmente re-iniettera questi eventi nel kernel, ma come eventi di tastiera o mouse (di tua scelta). Non saranno necessarie modifiche a X. –

+5

Sembra un articolo molto popolare su uinput. Collegato da tutto il web. Ahimè, non c'è più e Google ha trovato solo una copia convertita in PDF-> testo convertito. Qualcuno ha ottenuto il PDF originale in un posto che può essere condiviso? –

0

Io uso per le mie rilegature/shorcuts una combinazione di compiz, easystroke e xmacro.

Per le tue esigenze, penso che il pezzo mancante sia xbindkeys.Ho trovato questo link per voi che forse vi aiuta a impostare questa funzione:

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

Mi chiedo comunque se c'è un modo per distinguere tra diversi dispositivi di mouse.

+3

Conosco già xbindkeys ecc. Ma il problema è che X NON riconosce le mie presse a pedale, quindi xbindkeys è inutile.Anche l'autore del link che hai dato ha alcuni pulsanti sulla sua trackball che non funzionano ancora. La mia domanda è su come far funzionare quelle chiavi non funzionanti, non su come utilizzare le chiavi che già funzionano. Mi dispiace per la confusione. – polyglot

2

Si dovrebbe indagare su lircd. Interpreta l'input dai telecomandi. Alcuni telecomandi supportati apparentemente si presentano come dispositivi generici nascosti, quindi potresti essere in grado di far parlare il tuo dispositivo con lircd.

2

Il dispositivo viene visualizzato in/dev/input? se lo fa, usa il driver "evdev" X per collegarlo come faresti per una tastiera o un mouse.

2

Lo stesso problema qui, ma con tasti speciali su una tastiera wireless. Condivido il tuo dolore.

In ogni modo, cercando di arrivare a questo lavoro, ecco il mio metodo:

  1. sleep 10; killall cat poi rapidamente in un altro terminale: cat /dev/usb/hiddevice0 > key1.usbdump e premere/utilizzare il dispositivo. Questo scaricherà l'output binario di hiddevice per quella chiave.
  2. Ho rapidamente violato uno script python per leggere l'input di hiddevice e gli eventi di attivazione. Finora funziona per la prima volta che la chiave viene colpita. Questo è simile a quello suggerito da Adam, ma penso che l'uinput sia più difficile da programmare/usare anche se forse è più elegante, e python è prontamente disponibile.

quindi questo è un work in progress (funziona solo per la prima volta premuto), ma forse qualcosa di simile potrebbe funzionare per voi:

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. 

Se qualcuno mi può aiutare con il mio programma o se sto sbagliando, per favore dimmelo ;)

Mi rendo conto che ci sono alcune intestazioni incluse nella discarica iniziale del hiddevice. Usando un po 'di blessing hex editing e bit di differenziazione, potresti trovare quali valori sono importanti e fare un controllo per loro in python. (Ad esempio, la cifra esadecimale "B0" significa che sulla mia tastiera è stato premuto un tasto funzione speciale e in seguito ci sono più informazioni su quale tasto è stato premuto ecc.)

Il mio risultato finale è questo: hiddevice0 sembra bloccati e smetti di dare dati dopo un po ', non so perché, ma invece, io uso/dev/input/event * (Potrebbe funzionare anche per te) e sembra funzionare meglio. Di nuovo, la stessa analisi esadecimale e di basso livello porta al successo. Lungo la strada ho trovato che sudo cat /dev/input/event3 | hexdump è estremamente utile nel determinare quali byte sono importanti per voi.

Quindi, se si dispone di una tastiera IBM Sk-8812 e si desidera utilizzare i tasti speciali, è possibile parlare con me per ottenere lo script che ho utilizzato.

+0

Nello stesso terminale, puoi digitare (sleep 10; killall cat) e cat/usb/dev/hiddev0> key1.usbdump –