以Mini2440为例,其Linux内核目录为/opt/FriendlyARM/mini2440/linux-2.6.32.2,在linux-2.6.32.2(Linux内核目录)下的drivers目录下新建目录名为add_sub_Kconfig。
在add_sub_Kconfig目录下新建文件add_sub.c,add_sub.h,test_communication.c,代码如下:(例子来自《Linux驱动开发入门与实践 第2版》)
#ifndef ADD_SUB_H
#define ADD_SUB_H long add_integer(int a, int b); long sub_integer(int a, int b); #endif
#include <linux/init.h>
#include <linux/module.h> #include "add_sub.h" long add_integer(int a, int b)
{
return a + b;
} long sub_integer(int a, int b)
{
return a - b;
} EXPORT_SYMBOL(add_integer);
EXPORT_SYMBOL(sub_integer); MODULE_LICENSE("GPL");
在add_sub.c中通过EXPORT_SYMBOL导出宏,是内核知道其定义的函数可以被其他函数使用。
#include <linux/init.h>
#include <linux/module.h> #include "add_sub.h" static int a = ;
static int b = ;
static int AddOrSub = ; static int test_init(void)
{
int result = ;
printk("test init\n"); if(AddOrSub == )
{
result = add_integer(a, b);
}
else
{
result = sub_integer(a, b);
}
printk("The %s result is %d\n", AddOrSub == ? "Add" : "Sub", result); return ;
} static void test_exit(void)
{
printk("test exit\n");
} module_init(test_init);
module_exit(test_exit); module_param(a, int, S_IRUGO);
module_param(b, int, S_IRUGO);
module_param(AddOrSub, int, S_IRUGO); MODULE_LICENSE("GPL");
在test_communication.c中通过包含add_sub.h文件引入函数,即可使用。而module_param是模块加载是引入的参数。
在add_sub_Kconfig目录下新建Kconfig文件,有两个模块,这里构造一个菜单把它们包含进来。tristate表示模块可以选择编译进内核还是作为独立的模块,默认值m表示独立的模块。如果希望直接编译进内核可以使用boolean,然后默认值改为y。
menu "ADD_SUB_FUNCTION"
comment "ADD_SUB_FUNCTION" config ADD_SUB
tristate "ADD_SUB support"
default m config TEST_COMMUNICATIONA
tristate "ADD_SUB test support"
depends on ADD_SUB
default m endmenu
在add_sub_Kconfig目录下新建Makefile文件,在Kconfig中的config后写了ADD_SUB和TEST_COMMUNICATION,此处则写CONFIG_ADD_SUB和CONFIG_TEST_COMMUNICATION:
obj-$(CONFIG_ADD_SUB) += add_sub.o
obj-$(CONFIG_TEST_COMMUNICATION) += test_communication.o
在drivers目录下的Kconfig文件中添加:
source "drivers/add_sub_Kconfig/Kconfig"
在drivers目录下的Makefile文件中添加:
obj-$(CONFIG_ADD_SUB) += add_sub_Kconfig/
obj-$(CONFIG_TEST_COMMUNICATION) += add_sub_Kconfig/
回到/opt/FriendlyARM/mini2440/linux-2.6.32.2目录,执行:
make menuconfig,然后确认添加的模块已经打开。(此处选m编译为ko模块)
make modules,即可看到在add_sub_Kconfig目录下编译出的两个ko文件。
将两个ko文件下载到Mini2440上测试。