Come utilizzare l'interfaccia bind / unbind del driver del kernel Linux per i dispositivi USB-HID?


26

Primo sfondo Sto sviluppando un driver per i dispositivi del pannello di gioco Logitech. È una tastiera con uno schermo. Il driver funziona bene, ma per impostazione predefinita il dispositivo è gestito da HID. Per impedire a HID di prendere il controllo del dispositivo prima del mio driver, posso inserirlo nella lista nera in hid-core.c. Funziona ma non è la soluzione migliore, dato che sto lavorando con diverse persone e tutti dobbiamo continuare a patchare il nostro modulo HID che sta diventando un lavoro ingrato, soprattutto perché spesso comporta la ricostruzione di initramfs e simili.

Ho fatto qualche ricerca su questo problema e ho trovato questo post della mailing list , che alla fine mi ha portato a questo articolo su LWN . Descrive un meccanismo per l'associazione di dispositivi a driver specifici in fase di esecuzione. Sembra esattamente quello di cui ho bisogno.

Quindi l'ho provato. Sono stato in grado di separare la tastiera da HID. Funzionava e, come previsto, non potevo più scriverci sopra. Ma quando ho provato a collegarlo al nostro driver ho ricevuto "errore: nessun dispositivo del genere" e l'operazione non riesce.

Quindi la mia domanda è: come posso usare le operazioni di bind / unbind del kernel per replicare cosa succede quando si inserisce nella blacklist un dispositivo HID in hid-core e si fornisce il proprio driver? - cioè - per sostituire la necessità di patchare hid-core.c in ogni momento?

La fonte del nostro driver è qui: https://github.com/ali1234/lg4l

Risposte:


27

Ok, risulta che la risposta mi stava fissando in faccia.

In primo luogo, se si utilizza il nostro driver personalizzato o quello generico che normalmente prende il controllo del dispositivo, alla fine è ancora tutto controllato da HID e non da USB.

In precedenza ho provato a separarlo da HID, che non è la strada da percorrere. HID ha dei driver secondari, quello che rileva i dispositivi che non hanno driver specializzati è chiamato generico-usb. Questo è ciò di cui avevo bisogno per separarmi, prima di legarmi a hid-g19. Inoltre, dovevo usare l'indirizzo HID che assomiglia a "0003: 046d: c229.0036" e non l'indirizzo USB che assomiglia a "1-1.1: 1.1".

Quindi, prima di effettuare il rebinding, vedrei questo su dmesg:

generic-usb 0003:046D:C229.0036: input,hiddev0,hidraw4: USB HID v1.11 Keypad [Logitech G19 Gaming Keyboard] on usb-0000:00:13.2-3.2/input1

Quindi faccio:

echo -n "0003:046D:C229.0036" > /sys/bus/hid/drivers/generic-usb/unbind
echo -n "0003:046D:C229.0036" > /sys/bus/hid/drivers/hid-g19/bind

E poi vedo su dmesg:

hid-g19 0003:046D:C229.0036: input,hiddev0,hidraw4: USB HID v1.11 Keypad [Logitech G19 Gaming Keyboard] on usb-0000:00:13.2-3.2/input1

Quindi, come ho detto, guardandomi in faccia, perché le due informazioni chiave sono le prime due cose sulla linea quando il dispositivo si lega ...


Hai dovuto specificare nel tuo driver che quel fornitore / prodotto è compatibile con il tuo driver? O il "vincolo" forza semplicemente il problema. Ricevo "nessun dispositivo del genere" per un dispositivo che è stato inserito nella lista nera ma voglio forzarlo ad essere associato, e sto immaginando che la lista nera non sia solo un pensiero "impedisce l'associazione automatica", ma un "impedisce l'associazione dei nomi che "tipo di cosa.
Dmansfield,

Bind lo impone, quindi non è necessario richiedere gli ID nell'origine driver. È se si desidera che si carichi automaticamente comunque.
ali1234,

Due motivi per cui ho avuto problemi: primo - il dispositivo è elencato nella hid_ignore_list del kernel e quindi non verrà "nascosto" come nomatter. Ho dovuto aggiungere "usbhid.quirks = 0x0b0e: 0x0412: 0x40000000" alla riga di comando del kernel e riavviare. Flag 0x40000000 è "non ignorare". In secondo luogo, l'ultima parte dell'id "0003: 046D: C229.0036" è "0036". Cosa rappresenta questo? Non sono sicuro. L'unico modo per trovarlo (sembra) è di averlo già legato, quindi scioglierlo e ricollegarlo.
dmansfield,

Hai trovato un modo per ricollegarti automaticamente?
Vladius l'

Aggiunta la mia soluzione di auto- associazione
Vladius
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.