How to write Linux driver module call/use another driver module?

16,329

Solution 1

You will need the EXPORT_SYMBOL (or EXPORT_SYMBOL_GPL) macro. For example:

/* 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();
    ...

This should be plain sailing, but you must of course be careful with the namespace - stomping on somebody else's kernel module symbols would be unfortunate.

Solution 2

You forgot to mention that you should also study try_module_get/module_put/symbol_get/symbol_put/symbol_request, for ensuring loading of the other module, and the fact that it is not unloaded during usage. I don't recall the exact details though; I think that modprobe will ensure the other module is loaded, but I'm not sure if the runtime dependency for unloading will be added. I guess that those APIs might be needed for some other cases, but needs to know about them to check this.

Btw, the free book Linux Device Drivers is available here, and it will answer this question and much more: http://lwn.net/Kernel/LDD3/

Share:
16,329
teerapap
Author by

teerapap

I love programming. I often write Java but I also play with other languages/platforms from time to time if it fits the project and interests me. Currently, I'm playing with nodejs. I'm also a unix guy and shell is my friend.

Updated on June 12, 2022

Comments

  • teerapap
    teerapap almost 2 years

    I'm developing a Linux driver loadable module and I have to use another device in my driver.(kind of driver stacked on another driver)

    How do I call/use another driver in my driver? I think they are both in the kernel so there might be a way that can use another driver directly.

  • Honghe.Wu
    Honghe.Wu over 10 years
    It is needed to add extern <foo> to mod2.c file.