您的位置:首页 > 运维架构 > Linux

转载只为记录经典之<Linux驱动程序编写演示----编译驱动程序 >

2012-05-23 17:08 441 查看
Linux驱动程序编写演示----编译驱动程序

标签linux 

Linux驱动程序编写演示----编译驱动程序
1驱动编写:
#include <linux/init.h>

#include <linux/module.h>

static int __init test_driver_init(void)

{
 /* register this driver */

 printk("Hello test_driver , init this driver");

 return 0;

}
static void __exit test_driver_exit(void)

{

 /* deregister this driver*/

 printk("Good bye test_driver, exit this driver");

}
module_init(test_driver_init);

module_exit(test_driver_exit);
MODULE_LICENSE("GPL");

编译驱动程序

       编译驱动程序,有两种方法,一是在代码目录下,进行单独编译;二是加入内核编译的菜单里。针对我们所写的驱动程序test_driver,分别来使用两种方法进行编译。
 
 
2、单独编译驱动文件

当内核已经稳定的运行后,以模块的方式运行驱动时,可以采用单独编译驱动的方式。

       需要自己动手写Makefile文件,内容如下:

obj-m := test_driver.o    #告诉make在编译的时候,编译成模块,得到test_driver.ko

KERNELDIR := /usr/local/arm/kernel/linux-2.6.30    #把源码的路径设置好

defualt:

       $(MAKE) -C $(KERNELDIR) M=$(shell pwd) modules #make不带参数时,运行这里

install:

       insmod test_driver.ko

uninstall:

       rmmod test_driver.ko

clean:

       $(MAKE) -C $(KERNELDIR) M=$(shell pwd) clean
       这个Makefile文件很简单,保存后,回到命令行,直接键入make回车,就可以编译了。编译完成,得到test_driver.ko文件,和源码是一个路径(这是用M=$(shell pwd)指定的。
错误:

make -C /usr/local/arm/kernel/linux-2.6.30  M=/home/driver_test modules

make[1]: Entering directory `/usr/local/arm/kernel/linux-2.6.30'

  CC [M]  /home/driver_test/test_driver.o

In file included from include/linux/gfp.h:4,

                 from include/linux/kmod.h:22,

                 from include/linux/module.h:13,

                 from /home/driver_test/test_driver.c:2:

include/linux/mmzone.h:18:26: error: linux/bounds.h: No such file or directory

include/linux/mmzone.h:256:5: warning: "MAX_NR_ZONES" is not defined

In file included from include/linux/gfp.h:4,

                 from include/linux/kmod.h:22,

                 from include/linux/module.h:13,

                 from /home/driver_test/test_driver.c:2:

include/linux/mmzone.h:290: error: 'MAX_NR_ZONES' undeclared here (not in a function)

make[2]: *** [/home/driver_test/test_driver.o] 错误 1

make[1]: *** [_module_/home/driver_test] 错误 2

make[1]: Leaving directory `/usr/local/arm/kernel/linux-2.6.30'

make: *** [defualt] 错误 2
解决方法:

在/usr/local/arm/kernel/linux-2.6.30目录下执行

# make prepare

驱动文件与内核一起编译

1、加入到menuconfig中编译

       这个方式,是编译内核时,在源码顶层目录下运行make menuconfig命令时,在菜单中可以看到我们自己的驱动程序,

       这样可以采取与内核及其他驱动程序统一进行编译。采用以下几个步骤来完成:

(1)修改我们自己的Makefile文件
       obj-m := test_driver.o
obj-$(CONFIG_TEST_DRIVER) +=test_driver.o
       在原来的基础上,只保留上面两行内容。
(2)增加一个Kconfig文件
       这个文件在我们自己的源码路径下创建,内容如下:
config TEST_DRIVER

       tristate " Test Driver for Linux"

       default n

       help

              This item is just for linux driver demo and

              test linux menuconfig, do nothing
简单说明:
       config是Kconfig文件语言的关键字,TEST_DRIVER是我们自己定义的变量,它的值是y,n,M三个值中的一个。我们上面缺省的语句,default n,就是默认情况下,CONFIG_TEST_DRIVER=n,前缀CONFIG_,这是系统自己加上的。
       tristate是关键字,其后面是我们自己写的菜单上出现的提示。整句的含义是," Test Driver for Linux "这个选择项,是3态的,即:y,n,M。
 
 
 
(3)修改arch/arm下的Kconfig文件
       经过前面2个步骤的修改,内核配置菜单,还是找不到我们的代码路径,还需要在架构路径下进行添加,方法是在endmenu之前,加入:source "/home/driver_test/kconfig",这样做之后,架构下arm的Kconfig就可以找到我们自己的Kconfig了。类似这样:

#this is test_driver

source "/home/driver_test/Kconfig"

(4)修改drivers/Makefile文件
       Kconfig文件相当于给Makefile文件提供一个目录上路由功能,具体的编译工作,还是必须由Makefile来指定规则的。该Makefile文件上添加一句:
#this is driver_test
obj-$(CONFIG_TEST_DRIVER) +=/home/driver_test
 
       经过上面四个步骤的修改,我们的驱动程序代码就加入了内核统一编译的菜单中去了。如图:

       配置完成后,命令行运行make开始编译,之后可以在我们的源码路径下找到编译成功的test_driver.ko文件。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息