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>;
};
* "Se utilizzo module_init e module_exit all works" * - Che aspetto ha quel codice? Questo kernel usa un BLOB di Device Tree? – sawdust
sì, ha usato un dtb, il mio problema è che non viene stampato nulla quando ho inserito il codice sorgente – Luca
ho aggiunto il codice sorgente originale – Luca