微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > Linux内核驱动程序的配置

Linux内核驱动程序的配置

时间:10-08 来源:互联网 点击:

Linux 2.6 内核的配置系统由以下 3 个部分组成:

> Makefile:分布在 Linux 内核源代码中的 Makefile,定义 Linux 内核的编译规则

> 配置文件 Kconfig:给用户提供配置选择的功能

> 配置工具:包括配置命令解释器(对配置脚本中使用的配置命令进行解释)和配置用户界面(提供字符界面和图形界面)。这些配置工具都是使用脚本语言编写的,如 Tcl/TK、perl 等。

在Linux 内核中增加程序需要完成以下 3 项工作:

> 1. 将编写的源代码复制到 Linux 内核源代码的相应目录

> 2. 在目录的Kconfig 文件中增加新源代码对应项目的编译配置选项

> 3. 在目录的 Makefile 文件中增加对新源代码的编译条目

1. 实例引导:S3C2440 处理器的RTC 与 LED 驱动配置。

首先,在Linux/drivers/char 目录中包含了 S3C2410 处理器的 RTC 设备驱动源代码 s3c2410-rtc.c.而在该目录的 Kconfig 文件中包含 S3C2410_RTC 的配置项目:config S3C2410_RTC bool S3C2410 RTC Driver depends on ARCH_S3C2410 help RTC (Realtime Clock)driver for the clock inbuilt into the Samsung S3C2410. This can provide periodic interrupt rates from 1Hz to 64Hz for user programs, and wakeup from Alarm.上述 Kconfig 文件的这段脚本意味着只有在 ARCH_S3C2410 项目被配置的情况下,才会出现 S3C2410_RTC 配置项目,这个配置项目为布尔型(要么编译入内核,要么不编译,选择 Y 或 N ),菜单撒很难过显示的字符串为 S3C2410 RTC Driver,help 后面的内容为帮助信息。

除了布尔型的配置项目外,还存在一种三态型(tristate)配置选项,它意味着要么编译入内核,要么编译为内核模块,选项为Y、M“ 或N.在目录的Makefile 中关于 S3C2410_RTC 的编译脚本为:obj-$(CONFIG_S3C2410_RTC) += s3c2410-rtc.o上述脚本意味着如果 S3C2410——RTC 配置选项背选择为 Y 或 M,即 obj-$(CONFIG_S3C2410_RTC) 等同于 obj-y 或 obj-m 时,则编译 s3c2410-rtc.c,选择 Y 的情况直接会将生成的目标代码直接连接到内核,为M 的情况则生成模块 s3c2410-rtc.ko(由于 S3C2410_RTC 为布尔型,实际不会为M);如果 S3C2410_RTC 配置选项将选择为 N,即 obj-$(CONFIG_S3C2410_RTC) 等同于 obj-n 时,则不编译 s3c2410-rtc.c.一般而言,驱动工程师在内核源代码的 drviers 目录的相应子目录中增加新设备驱动的源代码,并增加或修改 Kconfig 配置脚本和Makefile 脚本,完全仿照上述过程执行即可。

再如,为S3C2410 的LED 编写了驱动,源代码为 s3c2410-led.c,为使内核能支持对该模块的编译配置,应进行如下 3 项处理。

> 将编写的 s3c2410-led.c 源代码复制到 linux/drivers/char 目录

> 在目录的 Kconfig 文件中增加 LED 的编译配置选项,如下所示:

config S3C2410_LED bool S3C2410 LED Driver depends on ARCH_S3C2410 help LED driver for the Samsung S3C2410.

> 在目录的 Makefile 文件中增加对 s3c2410-led.c 源代码的编译,如下所示:

obj-$(CONFIG_S3C2410_LED) += s3c2410-led.o 2. Makefile下面对内核源代码各级子目录中的 kbuild Makefile 进行介绍,这部分是内核模块或设备驱动的开发者最常接触到的。

kbuild Makefile 的语法包括如下几个方面。

(1)目标定义目标定义用来定义哪些内容要作为模块编译,哪些要编译并连接进内核。

例如:obj-y += foo.o表示要由 foo.c 或者 foo.s 文件编译得到 foo.o 并连接进内核,而 obj-m 则表示该文件要作为模块编译。除了y、m 以外的 obj-x 形式的目标都不会被编译。

而更常见的做法是根据 .config 文件的 CONFIG 变量来决定文件的编译方式,如下表示:obj-$(CONFIG_ISDN) += isdn.o obj-$(CONFIG_ISDN_PPP_BSDCOMP) += isdn_bsdcomp.o除了 obj- 形式的目标以外,还有 lib-y library库、hostprogs-y 主机程序等目标,但是基本都应用在特定的目录和场合下。

(2)多文件模块的定义如果一个模块由多个文件组成,这时候应采用模块名加 -objs 后缀或者 -y 后缀的形式来定义模块的组成文件。如下面的例子所示:obj-$(CONFIG_EXT2_FS) += ext2.o ext2-y := balloc.o bitmap.o ext2-$(CONFIG_EXT2_FS_XATTR) += xattr.o模块的名字为 ext2,由 balloc.o 和 bitmap.o 两个目标文件最终连接生成 ext2.o 直至 ext2.ko 文件,是否包括 xattr.o 取决于内核配置文件的配置情况。如果 CONFIG_EXT2_FS 的值是 y 也没有关系

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top