Linux设备驱动学习-Davinci开发板上运行的hello模块


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,驱动模块运行在内核空间,运行时不能依赖于任何函数库和模块连接,所以在写驱动时所调用的函数只能是作为内核一部分的函数。

 

你可能感兴趣的:(Linux设备驱动学习-Davinci开发板上运行的hello模块)