linux驱动开发-模块驱动
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux驱动开发-模块驱动相关的知识,希望对你有一定的参考价值。
linux内核是可以高度定制的,通过配置编译选项达到定制的目的。
在配置kernel编译选项时驱动程序的编译选项一般有三种,不编译、编译为内核驱动、编译为模块驱动。所以linux驱动一般分为两类,内核驱动和模块驱动,当然这两者之间并无绝对区别;当编译为内核驱动时,驱动程序将会随内核一起运行,就相当于内核的固有部分一样;当编译为模块驱动时,每个驱动程序都是独立的个体,在需要的时候安装,用完了再卸载,可以节约硬件资源。以下内容描述的是模块驱动的开发过程。
1、获取内核源码,按照目标器件(PC机或者开发板等等)的参数(ARCH和CROSS_COMPILE)编译源码,一般目标器件都有对应得交叉编译工具链,所以在编译内核源码之前要搭建好编译环境。
2、编写模块驱动代码,此处用最简单的驱动框架做以说明:
①、驱动程序源文件:tsetDriver.c
1 #include <linux/init.h> 2 #include <linux/module.h> 3 4 int static hello_init(void) //入口函数 5 { 6 printk(KERN_ALERT"install tsetDriver.ko\n"); 7 return 0; 8 } 9 10 void static hello_exit(void) //出口函数 11 { 12 printk(KERN_ALERT" exit tsetDriver.ko\n"); 13 } 14 15 module_init(hello_init); 16 module_exit(hello_exit);
②、Makefile (tips内核程序的Makefile首字母必须大写):
1 obj-m := tsetDriver.o 2 3 KDIR := ~/opt/linux-2.6 //编译后的内核源码所在路径 4 5 all: 6 make -C $(KDIR) M=$(PWD) ARCH=arm CROSS_COMPILE=linux-fsl-linux-gnueabi- modules //交叉编译前缀,根据自己的修改 7 8 clean: 9 rm -rf .*.cmd *.o *.mod.c *.ko .tmp_versions
3、编译、安装、测试:
①、编译驱动:(生成*.ko文件)
make
②、安装驱动、卸载驱动:
将*.ko拷贝到目标板,测试安装卸载操作
[email protected] /home# insmod tsetDriver.ko
install tsetDriver.ko
[email protected] /home# rmmod tsetDriver.ko
exit tsetDriver.ko
4、结语:
驱动开发不同于应用程序开发,驱动程序的入口函数由宏module_init()指定,参数为入口参数,在入口函数中完成资源申请、硬件设备初始化等操作;出口函数由宏module_exit()指定,完成资源释放等操作,以上内容是驱动程序最基本的框架。
以上是关于linux驱动开发-模块驱动的主要内容,如果未能解决你的问题,请参考以下文章