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