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。