当前位置:文档之家› 设备驱动加到Linux内核中

设备驱动加到Linux内核中

7.2.3 设备驱动加到Linux内核中
设备驱动程序编写完后将该驱动程序加到内核中。

这需要修改Linux 的源代码,然后重新编译内核。

①将设备驱动程序文件(比如mydriver.c)复制到/Linux/drivers/char目录下。

该目录保存了Linux下字符设备的设备驱动程序。

修改该目录下mem.c 文件,在int chr_dev_init()函数中增加如下代码:
#ifdef CONFIG_MYDRIVER
device_init();
#endif
其中CONFIG_MYDRIVER是在配置Linux内核时赋值。

②在/linux/drivers/char目录下Makefile中增加如下代码:
ifeq ($(CONFIG_MYDRIVER),y)
L_OBJ + = mydriver.o
endif
如果在配置Linux内核时选择了支持新定义的设备,则在编译内核时会编译mydriver.c生成mydriver.o文件。

③修改/linux/drivers/char目录下config.in文件,在
comment Character devices
语句下面加上
bool suppot for mydriver CONFIG_MYDRIVER
这样,若编译内核,运行make config,make menuconfig或make xconfig,那么在配置字符设备时就会有选项:
Support for mydriver
当选中这个设备时,设备驱动就加到了内核中了。

重新编译内核,在shell中将当前目录cd 到Linux目录下,然后执行以下代码:
# make menuconfig
# make dep
# make
在配置选项时要注意选择支持用户添加的设备。

这样得到的内核就包含用户的设备驱动程序。

Linux通过设备文件来提供应用程序和设备驱动的接口,应用程序通过标准的文件操作函数来打开、关闭、读取和控制设备。

查看Linux文件系统下的/proc/devices,可以看到当前的设备信息。

如果设备驱动程序已被成功加进,这里应该由该设备对应的项。

/proc/interrupts纪录了当时中断情况,可以用来查看中断申请是否正常;对于DMA和I/O口的使用,在/proc下都有相应的文件进行记录;还可以在设备驱动程序中申请在/proc 文件系统下创建一个文件,该文件用来存放设备相关信息。

这样通过查看该文件就可以了解设备的使用情况。

总之,/proc文件系统为用户提供了查
看设备状况的途径。

以KEY驱动程序为例说明该过程。

①修改驱动源代码。

(a)将如下内容
# define _KERNEL_
# define MODULE
# include<linux/module.h>
# include<linux/version.h>
加注释(也可以加上ifdef来选择编译,这样可以编译进Kernel,也可以方便地编译成动态加载的模块)。

添加宏定义:
# define MOD_INC_USE_COUNT
# define MOD_DEC_USE_COUNT
(b) 将如下内容:
module_init(init_key);
module_exit(cleanup_key);
加注释。

(c)将void_exit cleanup_key(void)函数加注释,函数原型也加注释。

(d)将int_init init_key(void)及其函数原型改为void_init key_init(void)。

②因为KEY是字符驱动,要修改/Drivers/char目录下的相关文件。

(a) 在Drivers/char目录下编辑config.in文件。

找到“comment ’character devices’”,在该行的后面根据KEY驱动的所属分类,寻找合适的位置添加以下内容:
bool Adding KEY driver to kernel(TEST!)CONFiG_KEY
(b) 在Doucumentation目录下编辑configure.help文件,在最后添加如下内容:
Adding KEY driver to kernel(TEST!)
CONFI_KEY
only a test!
(c) 在/drivers/char目录下mem.c文件的开始部分添加如下内容:
# if defined(CONFIG_KEY)
extern void key_init(void);
# endif
在mem.c文件的chr_dev_init函数中添加以下内容:
# if defined(CONFIG_KEY)
printk(“chr_dev_init -->_init_key (START)\n”);
key_init();
printk(“chr_dev_init -->_init_key (END)\n”);
#endif
(d) 在/drivers/char/目录下Makefile文件中添加一行:
obj - $ (CONFIG_KEY) +=key.o
注意:key.o的名称来源于KEY驱动的源文件名。

③回到源码目录make menuconfig 即可看到添加的选项。

对于2.4版内核,驱动程序写法如下:
(a) static int _init yourname()
{ }
module_init(yourname)
(b) 修改config.in加入
bool ‘comments’CONFIG_XX
(c) 修改Makefile加入
obj $ (CONFIG_XX) += xx.o
不必理会mem.c。

只要有_init,内核初始化时便会执行它。

相关主题