以前在一个小日本的网站上看见了一篇文章介绍如何将自己的驱动加入内核中,可以在内核配置时,配置
是否以模块或内核方式编译自己的驱动,那篇文章是介绍2.2.x的内核下的,我自己在2.4.x下试验成功,
不过要做一些改动,方法如下:
1.改变:
[code]EXTRAVERSION =
EXTRAVERSION = yfwtest[/code]
这样内核编译完成后的版本号为2.4.0yfwtest(我用的是2.4.0的内核)。
2.修改文件:linux/arch/i386/config.in,此文件中记录各种内核选项,在comment 'Kernel hacking'
一项后加入以下语句:
[code]tristate 'yfw test driver' CONFIG_YFWTEST_DRIVER[/code]
其中,tristate表示这个选项可以有三种选择:y,n,m,表示将此驱动编译为:内核、不编译、模块,
如果不允许此驱动被编译为模块,则可用bool定义,即只能为y,n。
同时,当选择为内核时,定义宏CONFIG_YFWTEST_DRIVER 为 1,选择为模块时定义宏
CONFIG_YFWTEST_DRIVER_MODULE为1,选择为不编译时,不定义任何宏。
3.在linux/Documentation/Configure.help中对应位置加入你自己的注释。
4.在源代码目录中新建目录:yfwtest(同其它mm,arch什么的目录平行)
5.改变linux/Makefile,
改变 CORE_FILES =kernel/kernel.o mm/mm.o fs/fs.o ipc/ipc.o
为:
[code] CORE_FILES =kernel/kernel.o mm/mm.o fs/fs.o ipc/ipc.o yfwtest/yfwtest.o[/code]
改变 SUBDIRS =kernel drivers mm fs net ipc lib
为:
[code] SUBDIRS =kernel drivers mm fs net ipc lib yfwtest[/code]
6.为此驱动选择一个MAJOR值(参考linux/Documentation/devices.txt文件),因为是测试程序
,所以选择42为MAJOR值,在include/linux/major.h中加入:
[code]#ifdef CONFIG_YFWTEST_DRIVER
#define YFWTEST_MAJOR 42
#endif[/code]
7.使用命令mknod /dev/yfwtest c 42 0 建立设备文件
8.在linux/yfwtest目录中建立Makefile,内容如下:
[code]O_TARGET := yfwtestdriver.o
obj-y := yfwtest.o
obj-$(CONFIG_LP_LED) += yfwtest.o
include $(TOPDIR)/Rules.make[/code]
9.将yfwtest.c拷贝到linux/yfwtest目录下。
运行make menuconfig,可以发现在Kernel hacking菜单下多出一个选项:yfw test driver
,可以象其它内核选项那样配置此驱动。
注:如果是将驱动编译进内核,那么需要在一个地方执行此驱动的初始化,一般的,如果char驱动,
可以在linux/driver/char/mem.c的函数chr_dev_init()加入自己char驱动的初始化函数,如果是block
驱动,则加入linux/driver/block/genhd.c的函数device_init()中。