Domanda

Sto sviluppando un modulo caricabile per driver Linux e devo usare un altro dispositivo nel mio driver (tipo di driver impilato su un altro driver)

Come posso chiamare / utilizzare un altro driver nel mio driver? Penso che siano entrambi nel kernel, quindi potrebbe esserci un modo che può usare direttamente un altro driver.

È stato utile?

Soluzione

Devi disporre della macro EXPORT_SYMBOL (o EXPORT_SYMBOL_GPL ). Ad esempio:

/* mod1.c */
#include <linux/module.h>
#include <linux/kernel.h>
#include "mod1.h"
....
void mod1_foo(void)
{
    printk(KERN_ALERT "mod1_foo\n");
}
EXPORT_SYMBOL(mod1_foo);

/* mod2.h */
....
extern void mod1_foo(void);
....

/* mod2.c */
#include <linux/module.h>
#include <linux/kernel.h>
#include "mod1.h"
#include "mod2.h"
int init_module(void)
{
    mod1_foo();
    ...

Questo dovrebbe essere chiaro, ma devi ovviamente stare attento con lo spazio dei nomi - calpestare i simboli del modulo del kernel di qualcun altro sarebbe sfortunato.

Altri suggerimenti

Hai dimenticato di menzionare che dovresti anche studiare try_module_get / module_put / symbol_get / symbol_put / symbol_request, per garantire il caricamento dell'altro modulo e il fatto che non sia scaricato durante l'uso. Non ricordo però i dettagli esatti; Penso che modprobe assicurerà che l'altro modulo sia caricato, ma non sono sicuro se verrà aggiunta la dipendenza di runtime per lo scarico. Immagino che quelle API potrebbero essere necessarie per alcuni altri casi, ma è necessario conoscerle per verificarlo.

A proposito, il libro gratuito Linux Device Driver è disponibile qui e risponderà a questa domanda e molto altro: http://lwn.net/Kernel/LDD3/

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top