最新在做Sensor驱动移植的时候,发现了Android driver 中有Kconfig,Makefile文件。在查看编译后的文件时,又发现还存在.config文件。自己对这几个文件不明白,用度娘来整理下网友对这几个文件的理解。
分布在各目录下的Kconfig构成了一个分布式的内核配置数据库,每个Kconfig分别描述了所属目录源文件相关的内核配置菜单。在内核配置make menuconfig(或xconfig等)时,从Kconfig中读出配置菜单,用户配置完后保存到.config(在顶层目录下生成)中。在内核编译 时,主Makefile调用这个.config,就知道了用户对内核的配置情况。Kconfig就是对应着内核的配置菜单。假如要想添加新的驱动到内核的 源码中,可以通过修改Kconfig来增加对我们驱动的配置菜单,这样就有途径选择我们的驱动,假如想使这个驱动被编译,还要修改该驱动所在目录下的 Makefile。
Kconfig
先来看下一个相对完整的Kconfig文件:
点击(此处)折叠或打开
-
menuconfig MISC_DEVICES
-
bool "Misc devices"
-
---help---
-
Say Y here to get to see options for device drivers from various
-
different categories. This option alone does not add any kernel code.
-
-
If you say N, all options in this submenu will be skipped and disabled.
-
-
if MISC_DEVICES
-
-
config ST_L3GD20_GYR
-
tristate "L3GD20_GYR gyroscope sensor support"
-
depends on I2C=y
-
help
- If you say yes here you get support for ST
config symbol
options
symbol是一个新的标记的菜单项,options是在这个新的菜单项下的属性和选项。
2.菜单结构:
配置文件描述了菜单选项,每行都是以一关键字开头(除了帮助信息)。下面的关键字结束一菜单选项:
- config
- menuconfig
- choice/endchoice
- comment
- menu/endmenu
- if/endif
- source
2.options类型定义:
每个config菜单项都要有类型定义:bool布尔类型、 tristate三态(内建、模块、移除)、 string字符串、 hex十六进制、 integer整型。
例如:
点击(此处)折叠或打开
-
config CALI_NONE
- bool "None"
指此菜单的出现与否依赖于另一个定义
点击(此处)折叠或打开
-
config SENSORS_LSM303D
-
tristate "LSM303 sensor driver"
- depends on I2C=y
这个例子表明SENSORS_LSM303D这个菜单项只I2C有效。
4.select与depends on是相反的逻辑关系。
A depends on B
那么只有在B选中才能选A
A select B
那么只要选中A就会选中B
5.帮助性定义
只是增加帮助用关键字help或者---help---,"---help---" 和 "help" 在实现的作用上没有区别,"---help---" 有助于将文件中的配置逻辑与给开发人员的提示分开。
6.prompt --输入提示
Makefile
1.顶层的Makefile文档读取 .config文档的内容,并总体上负责build内核和模块。
2.Arch Makefile则提供补充体系结构相关的信息。
3.scripts目录下的Makefile文档包含了任何用来根据kbuild Makefile 构建内核所需的定义和规则。
其中.config的内容是在make menuconfig的时候,通过Kconfig文档配置的结果,在/Documentation/kbuild目录下有详细的介绍有关kernel makefile的知识。
举个例子:
假设想把G-sensor LSM303D驱动code加载到工程中,配置内核时该怎么办呢?
1:将您写的lsm303d.c 文档添加到/driver/misc/ 目录下。
2:修改/driver/misc/ 目录下的kconfig文档:
点击(此处)折叠或打开
-
config SENSORS_LSM303D
-
tristate "LSM303 sensor driver"
-
depends on I2C=y
-
help
- Say yes here to support the sensor
3:修改该目录下makefile文档。
添加code:
点击(此处)折叠或打开
- obj-$(CONFIG_SENSORS_LSM303D) += lsm303d.o
从上述分析知道CONFIG_SENSORS_LSM303D 是从.config 中读出的。
4.配置kernel下configs/XXXX_defconfig文件
添加code:
点击(此处)折叠或打开
- CONFIG_SENSORS_LSM303D=y
当您编译内核时,将会读取.config文档,当发现CONFIG_SENSORS_LSM303D=y,系统在调用/driver/misc下的makefile 时,将会把 lsm303d.o 加入到内核中。即可达到您的目的。