Linux设备驱动学习-Davinci开发板上运行的hello模块
看了很多个hello world了,自己来写一个在davinci板卡上跑的吧。
主体很简单,就是一个C文件hello_davinci.c。
/*================hello_davinci.c==============*/
#include <linux/module.h> /*所有模块都需要的头文件*/
#include <linux/kernel.h>
#include <linux/init.h> /* init和exit相关宏*/
MODULE_LICENSE("Dual BSD/GPL");
MODULE_AUTHOR("lintax");
static int hello_init(void)
{
printk(KERN_ALERT " Hello Davinci!/n");
return 0;
}
static void hello_exit(void)
{
printk( KERN_ALERT " Goodbye, Davinci./n ");
}
module_init(hello_init);
module_exit(hello_exit);
/*================hello_davinci.c end===========*/
给其配个Makefile文件:
/*================Makefile==================*/
obj-m := hello_davinci.o
KERNELDIR := /opt/ti-davinci/
modules:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules
clean:
rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions
/*================Makefile end===============*/
好了,编译吧。
我的好心情立马被扑灭了,error,又见error:
说找不到/opt/ti-davinci/include/asm/ 下的某个头文件,查了一下,没这个目录嘛,当然找不到了。记得以前是看见过的,并且与asm-arm是一样的,应该是编译时复制的一份。不巧我前几天觉得硬盘空间有些不够,就把好几个内核都make clean了一次。那就再make一次嘛,ok,生成了hello_davinci.ko。
转移到davinci开发板上,执行插入模块命令:
insmod hello_davinci.ko
输出信息:
Hello Davinci!
通过lsmod查看,也有了hello_davinci 模块。
然后执行移除模块命令:
rmmod hello_davinci
输出信息:
Goodbye Davinci.
再用lsmod来查看,就找不到hello_davinci了。
有以下几点要注意:
1,所使用的内核环境必须是编译过的,否则,就等着重蹈我的覆辙吧。
2,对于编译过程中类似于:不能创建hello_davinci.o.tmp文件的错误。说明权限不够,可更改hello_davinci.c Makefile文件所在目录的属性,或者是sudo到根用户。
3,hello_davinci.c文件中调用的头文件的作用:
init.h中的module_init(),module_exit()
kernel.h中的printk(),KERN_ALERT
module.h中的MODULE_LICENSE()
4,Makefile文件分析
obj-m := hello_davinci.o 代表了我们要构造的模块名为hello_davinci.o,make 会在该目录下自动找到hello_davinci.c文件进行编译。如果 hello_davinci.o是由其他的源文件生成(比如file1.c和file2.c)的,则在下面加上:
hello_davinci-objs := file1.o file2.o ......
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules
其中 -C $(KERNELDIR) 指定了内核源代码的位置,其中保存有内核的顶层makefile文件。
M=$(PWD) 指定了模块源代码的位置。
modules目标指向obj-m变量中设定的模块。
5,驱动模块运行在内核空间,运行时不能依赖于任何函数库和模块连接,所以在写驱动时所调用的函数只能是作为内核一部分的函数。