2014-04-25 10 views
16

Sto cercando di imparare come scrivere moduli e driver per sistemi Linux. Analogamente alla domanda this sto provando a eseguire un semplice modulo "Hello World" sulla tastiera USB hot-plug (codice seguente). Anche se l'inizializzazione del modulo tramite i comandi insmode e sembra funzionare (dmesg mostra messaggi di debug), il modulo non viene caricato dopo aver collegato la tastiera.Caricamento modulo sulla tastiera hotplug

Quello che ho fatto:

  1. Run make per produrre hellomodule.ko file.
  2. Copiare il file hellomodule.ko in/lib/modules/"my_kernel_version"/
  3. Run depmod -a COMAND.

Dopo quei tre passi che ho il mio modulo aggiunto al modules.alias e modules.dep file. Ancora non funziona.

Questo errore di configurazione dei kernel è qualcosa di completamente diverso?

Sistema: Ubuntu 14.04 LTS; Kernel: 3.14.0

hellomodule.c:

#include <linux/module.h> 
#include <linux/kernel.h> 
#include <linux/init.h> 
#include <linux/usb.h> 
#include <linux/usb/input.h> 
#include <linux/hid.h> 

MODULE_AUTHOR("author"); 
MODULE_DESCRIPTION("helloworld module\n"); 
MODULE_LICENSE("GPL"); 

static struct usb_device_id hello_id_table [] = { 
     { USB_INTERFACE_INFO(USB_INTERFACE_CLASS_HID, 
     USB_INTERFACE_SUBCLASS_BOOT, 
      USB_INTERFACE_PROTOCOL_KEYBOARD) }, 
    { } /* Terminating entry */ 
}; 

MODULE_DEVICE_TABLE (usb, hello_id_table); 

static int hello_probe(struct usb_interface *interface, 
    const struct usb_device_id *id) 
{ 
    pr_debug("HelloModule: USB keyboard probe function called\n"); 
    return 0; 
} 

static void hello_disconnect(struct usb_interface *interface) 
{ 
    pr_debug("HelloModule: USB keyboard disconnect function called\n"); 
} 

static struct usb_driver hello_driver = { 
//.owner = THIS_MODULE, 
.name =  "hello_driver", 
.probe = hello_probe, 
.disconnect = hello_disconnect, 
.id_table = hello_id_table 
}; 

static int __init hello_init(void) 
{ 
    int retval = 0; 

    pr_debug("HelloModule: Hello World!\n"); 
    retval = usb_register(&hello_driver); 
    if (retval) 
     pr_debug("HelloModule: usb_register failed. Error number %d", retval); 

    return 0; 
} 

static void __exit hello_exit(void) 
{ 
    usb_deregister(&hello_driver); 
    pr_debug("HelloModule: exit\n"); 
} 

module_init(hello_init); 
module_exit(hello_exit); 

Makefile:

obj-m := hellomodule.o 
CFLAGS_hellomodule.o := -DDEBUG 

KDIR := /lib/modules/`uname -r`/build 

default: 
    make -C $(KDIR) M=$(PWD) modules 
clean: 
    make -C $(KDIR) M=$(PWD) clean 
+0

Sei riuscito a risolvere questo problema? – bacchus

+0

@bacco Non proprio. Sono passato a un altro computer con lo stesso sistema installato su di esso e senza modificare nulla nel modulo stesso e ha funzionato. Sospetto di avere qualche problema con la configurazione del mio kernel, sebbene non abbia approfondito il problema. –

risposta

12

Ho avuto lo stesso problema. Nel mio caso è stato causato dal fatto che il modulo usbhid è già stato caricato, poiché stavo usando un mouse USB.

Se ho ben capito, in Ubuntu 14.04, la regola udev che carica il modulo corretto (s) quando un nuovo dispositivo viene collegato è la seguente (che si trova in /lib/udev/rules.d/80-drivers.rules):

DRIVER!="?*", ENV{MODALIAS}=="?*", RUN{builtin}="kmod load $env{MODALIAS}" 

come si può vedere, kmod load viene eseguito solo se il nuovo dispositivo non ha driver. Tuttavia, se usbhid è già caricato, la tastiera appena collegata ha già un driver. Pertanto il modulo "ciao mondo" non è caricato.

Una possibile soluzione consiste nel modificare/sostituire la regola udev rimuovendo la condizione DRIVER!="?*", così trasformandolo in:

ENV{MODALIAS}=="?*", RUN{builtin}="kmod load $env{MODALIAS}"`. 

Un'altra soluzione possibile è scaricare il modulo usbhid prima di collegare la tastiera. Ovviamente, ciò causerà l'interruzione del funzionamento di tutte le tastiere USB, mouse e altri dispositivi di classe HID fino a quando non si collega la nuova tastiera.

-1

Usi una macchina virtuale? Se sì, prova l'installazione reale, anche su un live-USB. Ho avuto lo stesso problema con VirtualBox, risolto dopo aver provato l'installazione live-USB di debian.

Modifica dopo Hub risposta: Potrebbe anche essere una configurazione del kernel, vedi http://wiki.sourcemage.org/FrequentlyAskedQuestions%282f%29KernelConfiguration.html#kmodload (domanda "Come devo moduli auto-carico tramite kmod?").

In menuconfig, è possibile abilitare l'opzione "Caricatore modulo kernel", in Supporto modulo caricabile. Ma non ho ancora controllato questa risposta.

Problemi correlati