5

Perché questo modulo del kernel non fa nulla quando lo carico?Il codice del driver nel modulo del kernel non viene eseguito?

#include <linux/init.h> 
#include <linux/module.h> 
#include <linux/platform_device.h> 

#define DEVICE_NAME "hello-1.00.a" 
#define DRIVER_NAME "hello" 
MODULE_LICENSE("Dual BSD/GPL"); 

static int hello_init(struct platform_device *pdev){ 
    printk(KERN_ALERT "Hello, world\n"); 
    return 0; 
} 
static int hello_exit(struct platform_device *pdev){ 
    printk(KERN_ALERT "Goodbye, cruel world\n"); 
    return 0; 
} 

static const struct of_device_id myled_of_match[] = 
{ 
    {.compatible = DEVICE_NAME}, 
    {}, 
}; 

MODULE_DEVICE_TABLE(of, myled_of_match); 

static struct platform_driver hello_driver = 
    { 
     .driver = { 
     .name = DRIVER_NAME, 
     .owner = THIS_MODULE, 
     .of_match_table = myled_of_match 
    }, 
    .probe = hello_init, 
    .remove = hello_exit 
}; 

module_platform_driver(hello_driver); 

It mosti stampare Hello, world\n, se faccio lsmod il modulo sembrano essere caricato:

lsmod 
hello_world 1538 0 - Live 0xbf000000 (O) 

ma non viene stampato nulla né nella console né dmesg.

Se utilizzo module_init e module_exit, tutto funziona, ma ho bisogno del puntatore platform_device *pdev sul dispositivo, che cosa posso fare?

EDIT:

il modulo originale assomiglia a questo:

#include <linux/init.h> 
#include <linux/module.h> 

static int hello_init(void){ 
    printk(KERN_ALERT "Hello, world\n"); 
    return 0; 
} 

static void hello_exit(void){ 
    printk(KERN_ALERT "Goodbye, cruel world\n"); 
} 


module_init(hello_init); 
module_exit(hello_exit); 

Nel mio albero dei dispositivi blob è presente questa entrata

hello { 
    compatible = "dglnt,hello-1.00.a"; 
    reg = <0x41220000 0x10000>; 
}; 
+0

* "Se utilizzo module_init e module_exit all works" * - Che aspetto ha quel codice? Questo kernel usa un BLOB di Device Tree? – sawdust

+0

sì, ha usato un dtb, il mio problema è che non viene stampato nulla quando ho inserito il codice sorgente – Luca

+0

ho aggiunto il codice sorgente originale – Luca

risposta

5

se uso module_init e module_exit tutto funziona

Questo breve codice "originale" consiste solo nella struttura del modulo. È garantito che la routine init venga chiamata quando il modulo viene caricato e la routine di uscita viene chiamata prima dello scaricamento. Quel codice "originale" non è un driver.

Il modulo del kernel è più un autista e sempre caricato, ma dal momento che ha l'init di default e codice di uscita che non fa nulla (come generato dall'espansione del module_platform_driver() macro), non ci sono messaggi. Il codice del driver nel modulo caricabile non è garantito per essere chiamato quando il kernel utilizza un albero dei dispositivi.

Perché questo modulo del kernel non fa nulla quando lo carico?

Probabilmente la funzione sonda del driver (che emetterebbe messaggi) non viene richiamata perché nella Struttura dei dispositivi non c'è nulla che indica che questo driver di periferica è necessario.

Il frammento del dispositivo della scheda albero ha

compatible = "dglnt,hello-1.00.a"; 

ma il conducente dichiara che avrebbe specificato come

#define DEVICE_NAME "hello-1.00.a" 
... 
    {.compatible = DEVICE_NAME}, 

Queste stringhe devono corrispondere in modo che il conducente possa legarsi con questo dispositivo si fa riferimento in il nodo Albero dei dispositivi.

anche il nodo dispositivo dovrebbe essere dichiarato come

status = "okay"; 

ignorare qualsiasi stato predefinito in grado di disattivare il dispositivo.

Un nodo configurato correttamente nella struttura dei dispositivi dovrebbe ottenere la funzione della sonda del conducente che deve essere eseguito come previsto.