Chinaunix首页 | 论坛 | 博客
  • 博客访问: 62310
  • 博文数量: 33
  • 博客积分: 841
  • 博客等级: 准尉
  • 技术积分: 340
  • 用 户 组: 普通用户
  • 注册时间: 2010-03-20 20:54
文章分类

全部博文(33)

文章存档

2011年(33)

分类: LINUX

2011-02-19 12:00:41

Linux驱动程序编写演示----编译驱动程序
1驱动编写:
#include
#include
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文件。
阅读(1382) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~