一 :移植设备驱动两种方式 二:Kconfig文档与Makefile的作用
linux允许设备驱动在编译时候静态的连接在内核中,一如传统的驱动程序;也允许动态地在运行时安装,被称为模块;还允许在运行状态下当需要某模块时候,有系统自动安装。故而做驱动移植时候,有两种方式:一种是直接加到kernel 中编译,另一种是以模块的形式挂接。
如果把驱动编译到内核,会涉及到Kconfig 和Makefile 两文件的修改。
Kconfig对应着内核的配置菜单。假如要想添加新的驱动到内核的源码中,需要修改Kconfig来增加对我们驱动的配置菜单,这样就有途径选择我们的驱动,假如想使这个驱动被编译,还要修改该驱动所在目录下的Makefile。
因此,一般添加新的驱动时需要修改的文件有两种(注意不只是两个)
*Kconfig
*Makefile
要想知道怎么修改这两种文件,就要知道两种文档的语法结构。
First: Kconfig
语法:
config symbol
options
<!--[if !supportLineBreakNewLine]-->
<!--[endif]-->
symbol就是新的菜单项,options是在这个新的菜单项下的属性和选项
其中options部分有:
1、类型定义:
每个config菜单项都要有类型定义,bool:布尔类型, tristate三态:内建、模块、移除, string:字符串, hex:十六进制, integer:整型
例如config HELLO_MODULE
bool "hello test module"
bool类型的只能选中或不选中,tristate 有三态 :假如选择编译成内核模块,则会在.config中生成一个CONFIG_HELLO_MODULE=m的配置;假如选择内建,就是直接编译成内核影响,就会在.config中生成一个CONFIG_HELLO_MODULE=y的配置;tristate 没有对选项做任何限定,默认它是不选的,为 "n" 。
2、依赖型定义depends on或requires
指此菜单的出现是否依赖于另一个定义
config HELLO_MODULE
bool "hello test module"
depends on ARCH_PXA
这个例子表明HELLO_MODULE这个菜单项只对XScale处理器有效,即只有在选择了ARCH_PXA,该菜单才可见(可配置)。
3、帮助性定义只是增加帮助用关键字help或---help---
例如: config HAVE_IDE
bool
menuconfig IDE
tristate "ATA/ATAPI/MFM/RLL support"
depends on HAVE_IDE
depends on BLOCK
---help---
This provides a 'mapping' driver which supports the way in
which user-programmable flash chips are .......
Second: 内核的Makefile
内核的Makefile分为5个组成部分:
Makefile 最顶层的Makefile
.config 内核的当前配置文档,编译时成为顶层Makefile的一部分
arch/$(ARCH)/Makefile 和体系结构相关的Makefile
s/ Makefile.* 一些Makefile的通用规则
kbuild Makefile 各级目录下的大概约500个文档,编译时根据上层Makefile传下来的宏定义和其他编译规则,将源代码编译成模块或编入内核。
顶层的Makefile文档读取 .config文档的内容,并总体上负责build内核和模块。Arch Makefile则提供补充体系结构相关的信息。 s目录下的Makefile文档包含了任何用来根据kbuild Makefile 构建内核所需的定义和规则。
(其中.config的内容是在make menuconfig的时候,通过Kconfig文档配置的结果)
在linux2.6.x/Documentation/kbuild目录下有详细的介绍有关kernel makefile的知识。