设备驱动程序有时候需要接受参数,例如当模块可以实现两种相似功能时,可以传递一个参数到驱动模块以决定其使用哪种功能,例如在加载模块时指定 insmod xxx.ko param=1
可以使用 “module_param(参数名,参数数据类型,参数读写权限)” 来为模块定义个参数,例如下列代码定一个了一个长整形和整形参数
static long a=1;
static int b=1;
module_param(a,long,S_IRUGO);
module_param(a,long,S_IRUGO);
参数数据类型可以有 : byte、short、ushort、int、uint、long、ulong、bool、和charp(字符指针类型)
内核对浮点支持不完美,printk()函数也不支持浮点类型。
使用 file 命令可以知道模块使用的是ELF文件格式
add_sub模块
//add_sub.c
#include
#include
#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("DUAL BSD/GPL");
EXPORT_SYMBOL 导出宏,让内核知道其定义的函数可以被其他函数使用,但是,千万不要随便使用,很容易出现同名函数
//add_sub.h
#ifndef _ADD_SUB_H_
#define _ADD_SUB_H_
long add_integer(int a,int b);
long sub_integer(int a,int b);
#endif
测试所用 test模块
通过参数决定调用add_integer()还是sub_integer()函数
#include
#include
#include "Add_Sub.h"
static int a=1;
static int b=1;
static int AddOrSub=1;
static int test_init(void)
{
long result=0;
printk(KERN_ALERT "test init\n");
if(1==AddOrSub)
result = add_integer(a,b);
else
result = sub_integer(a,b);
printk(KERN_ALERT "the %s result is %ld\n",AddOrSub==1?"add":"sub",result);
return 0;
}
static void test_exit(void)
{
printk(KERN_ALERT "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("Dual BSD/GPL");
MODULE_AUTHOR("ChuncanL");
MODULE_DESCRIPTION("test module for AddOrSUB");
MODULE_VERSION("V1.0");
Add_Sub Makefile
obj-m := Add_Sub.o
KDIR :=/home/can/tiny4412/linux-3.8
all:
make -I $(PWD) -C $(KDIR) M=$(PWD) modules ARCH=arm CROSS_COMPILE=arm-linux-
clean:
rm -f *.ko *.o *.mod.o *.mod.c *.symvers modul* *oper
test Makefile
obj-m := test.o
KDIR :=/home/can/tiny4412/linux-3.8 # arm
SYMBOL_INC = $(PWD)/../Add_Sub/
all:
make -C $(KDIR) M=$(PWD) modules ARCH=arm CROSS_COMPILE=arm-linux-
clean:
rm -f *.ko *.o *.mod.o *.mod.c *.symvers modul* *oper
测试test模块前需要先加载Add_Sub模块
root@NanoPC:~/a# insmod Add_Sub.ko
root@NanoPC:~/a# insmod test.ko a=2 b=3 AddOrSub=0
root@NanoPC:~/a# dmesg |tail
[51429.564912] test init
[51429.564949] the sub result is -1