第一种:直接把驱动程序编译进内核,最终连接成zIMage uImage文件。
举个例子来说明如何把驱动程序文件编译进内核:
在这里先说明一下,驱动程序分类很多,char(字符设备) block(块设备) input(输入设备) network(网络接口) 等等……
eg:我们要在/home/mykernel/linux-3.0.1/drivers/input 输入设备的驱动添加一个新的输入设备的驱动程序zhenmingyang.c
需要修改2个文件:Kconfig 和 Makefile
1、touch zhenmingyang.c
2、vi Kconfig //配置Kconfig的目的是为了在make menuconfig时,在对应的选择目录下有新增的zhenmingyang-menuconfig选项。 Kconfig 所在目录: /home/mykernel/linux-3.0.1/drivers/input
修改Kconfig 仿照其他config xxxxxxx 增加一个配置项
config ZHENMINGYANG
bool "zhenmingyang-menuconfig"
3.make menuconfig ARCH=arm
在menuconfig中把新增的zhenmingyang-menuconfig选上。
说明:大写的ZHENMINGYANG是配置结果显示在linux内核的根目录/home/mykernel/linux-3.0.1 下的.config文件里。
.config 文件内容
# Input device support
#
CONFIG_INPUT=y
CONFIG_INPUT_FF_MEMLESS=y
CONFIG_ZHENMINGYANG=y // 在。config中通过make menuconfig选择zhenmingyang-menuconfig它后自动生成的配置、
# CONFIG_INPUT_POLLDEV is not set
4、修改Makefile
makefile所在目录:/home/mykernel/linux-3.0.1/drivers/input
仿照其他新增如下内容:
obj-$(CONFIG_ZHENMINGYANG) += zhenmingyang.o //$(CONFIG_ZHENMINGYANG) 是在make menuconfig后生成的。config文件中生成的,见步骤3
obj-$(CONFIG_INPUT_FF_MEMLESS) += ff-memless.o
5、make zImage ARCH=arm CROSS_COMPILE=arm-linux-
第二种:驱动程序编译成modules模块,通过insmod 、rmmod等命令安装、卸载等操作
1、touch hello.c
2、编写Makefile (关键),内容如下:
ifneq ($(KERNELRELEASE),)
obj-m := hello.o //-m 编译为模块 -y 编译进内核 -n不编译 hello。o指定编译生成的目标文件名
else
KDIR :=/lib/modules/3.2.0-48-generic-pae/build //KDIR 这个路径很重要不能弄错,
all:
make -C $(KDIR) M=$(PWD) modules ARCH=arm CROSS_COMPILE=arm-linux- //在板子上运行模块需指定ARCH和交叉编译前缀arm-linux-
clean:
rm -f *.ko *.o *.mod.o *.mod.c *.symvers
endif
3、make
生成hello。ko的内核模块文件。
insmod hello。ko //安装模块
lsmod //查看模块
rmmod hello //卸载模块 直接指定模块名,不需要扩展名!
上面的例子是单文件的Makefile,在编译多文件的内核模块时只需要改一个地方即可。
obj-m := hello.o //-m 编译为模块 -y 编译进内核 -n不编译 hello。o指定编译生成的目标文件名
hello-objs :=a.o b.o c.o
其他不变。
hello.c源文件, 模块的源文件没有main函数的
#include
#include
static int hello_init(void)
{
printk(KERN_WARNING"helle world inti\n");
return 0;
}
static void hello_exit(void)
{
printk(KERN_INFO"Goog bye,heelo\n");
}
module_init(hello_init);
module_exit(hello_exit);