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驱动开发-模块驱动的主要内容,如果未能解决你的问题,请参考以下文章

5Linux内核模块开发

linux驱动开发-模块驱动

Linux设备驱动开发学习:构造和运行模块(未完)

Linux驱动linux内核模块简介

Linux/安卓驱动入门视频

树莓派基于Linux内核驱动开发详解