5

Ho imparato la programmazione del kernel e l'assunzione dello Eudyptula challenge e l'attività 5 mi richiede di modificare un modulo Hello World da un'attività precedente per essere caricato automaticamente quando una tastiera USB è collegato e scaricato quando la tastiera è scollegata.modules.usbmap e modules.pcimap mancanti su distro basato su Ubuntu

Ora, per il gusto di farlo, non invierò qui il mio codice, perché sarebbe un enorme spoiler per questo compito e rovinerebbe il divertimento per gli altri. In sostanza, ciò che fa è:

  1. crea una matrice struct usb_device_id con una voce che si lega il mio modulo a qualsiasi tastiera USB
  2. Crea un struct usb_driver e inizializza i campi appropriati; in particolare, fa riferimento all'array di tabella id del dispositivo USB che ho creato in precedenza
  3. Utilizza la macro MODULE_DEVICE_TABLE per registrare il driver.

Il registro/routine deregistrare stanno lavorando. Ottengo i messaggi di debug attesi quando carico e scarica manualmente il modulo.

Ho copiato il modulo su /lib/modules/$(uname -r) e ho eseguito depmod -a. Il modulo viene aggiunto a modules.alias e modules.dep, ma non accade nulla quando collego/scollego la tastiera.

Ulteriori ricerche hanno dimostrato che dovrei avere un file modules.usbmap generato da depmod dove il kernel mantiene una mappatura tra dispositivi e driver da caricare. Non ho questo file da nessuna parte nell'albero delle mie cartelle. Inoltre non ho uno modules.pcimap. Ho controllato la configurazione del kernel per assicurarmi che il supporto del modulo caricabile sia abilitato, così come il supporto hotplugging - lo sono.

Si tratta di Kubuntu 14.04 con il kernel 3.16.0-rc5 auto-compilato. Cosa mi manca? Ho seguito la configurazione del kernel e ho controllato le opzioni più ovvie. Sono un po 'bloccato qui. Qualche idea?

risposta

4

Potrebbe mancare due cose:

1.) Una tastiera USB è in genere non solo un dispositivo USB generica, ma un dispositivo di classe HID. Linux tratta i dispositivi HID USB come una sottoclasse separata. Hai tenuto conto di questo?

2.) modules.usbmap e modules.pcimap esistere con alcune vecchie versioni di solo utilità di modulo/pci/usb. Con le versioni moderne, le informazioni equivalente a quello che era in quei file è incluso nel modules.alias invece. I tuoi materiali di ricerca potrebbero essere stati obsoleti.

+0

Alla fine ce l'ho fatta, anche se non ho mai caricato il modulo ogni volta che ho collegato/scollegato la tastiera. Apparentemente, avevo un problema simile a http://www.linuxquestions.org/questions/programming-9/driver-development-usbhid-is-blocking-custom-device-driver-850287 - se scarico 'usbhid', allora il mio modulo funziona come previsto. –

0

Qui sono i miei suggerimenti ..

  1. Prova a registrarti utilizzando vendor_id, product_id e controllare se si sta registrando la per la periferica hardware corretto.

Si può provare a scrivere una regola in

/etc/udev/rules.d/10-local.rules

assicurarsi che sia identificare l'hardware in modo corretto.Seguenti comandi possono aiutare:

udevadm monitor or udevadm monitor --env 
udevadm info -a -p [/devices/pci0000:00/0000:00:1a.0/usb1/1-1 -> this has to be get from above command] 
  1. Assicurati di rmmod il modulo, puliti tutti i registri [sudo dmesg -c] e collegare l'hardware.