全部博文(298)
分类: LINUX
2011-03-24 12:28:36
(1)初识linux字符设备驱动程序
注:所以文章红色字体代表需要特别注意和有问题还未解决的地方,蓝色字体表示需要注意的地方
1.本文所介绍的程序平台
开发板:arm9-mini2440
虚拟机为:Red Hat Enterprise Linux 5
开发板上系统内核版本:linux-2.6.32.2
2.程序清单
本次实验程序为国嵌培训代码,本人作了改动和较为详细的注释,如有错误请指出。
(1)模块参数传递
gong.h
#define GONG 30
hello.c
#include
#include
#include "gong.h"
MODULE_LICENSE("GPL");
static char *name = "gongzhi";
static int age = GONG;
module_param(age, int, S_IRUGO);
module_param(name, charp, S_IRUGO);
static int hello_init(void)
{
printk(KERN_EMERG" Name : %s \n", name);
printk(KERN_EMERG" Age : %d \n", age);
return 0;
}
static int hello_exit(void)
{
printk(KERN_INFO"module exit \n");
}
module_init(hello_init);
module_exit(hello_exit);
(2)外函数
add.c
int add(int a, int b)
{
return a+b;
}
main.c
#include
#include
MODULE_LICENSE("GPL");
MODULE_AUTHOR("gongzhi");
MODULE_DESCRIPTION("hello world module");
MODULE_ALIAS("a simplest module");
extern int add(int a, int b);
static int __init hello_init()
{
printk("hello world \n");
add(1, 2);
return 0;
}
static void __exit hello_exit()
{
printk("hello exit \n");
}
module_init(hello_init);
module_exit(hello_exit);
Makefile
ifneq ($(KERNELRELEASE),)
obj-m := myadd.o
myadd-objs := main.o add.o
else
KDIR := /lib/modules/2.6.18-194.el5/build
all:
make -C $(KDIR) M=$(PWD) modules
clean:
rm -f *.ko *.o *.mod.o *.mod.c *.symvers
endif
(2)模块函数混合,必须先编译依赖的模块
cal.c
#include
#include
MODULE_LICENSE("GPL");
int add_integar(int a, int b)
{
return a+b;
}
int sub_integar(int a, int b)
{
return a-b;
}
static int __init sym_init()
{
return 0;
}
static void __exit sym_exit()
{
}
module_init(sym_init);
module_exit(sym_exit);
EXPORT_SYMBOL(add_integar);
EXPORT_SYMBOL(sub_integar);
hello.c
#include
#include
MODULE_LICENSE("GPL");
extern int add_integar(int a, int b);
extern int sub_integar(int a, int b);
static int __init hello_init()
{
int res = add_integar(1, 2);
return 0;
}
static void __exit hello_exit()
{
int res = sub_integar(2, 1);
}
module_init(hello_init);
module_exit(hello_exit);