如何在kconfig中添加驱支持 其作用是什么

如何在kconfig中添加驱支持 其作用是什么,第1张

2.6内核的源码树目录下一般都会有两个文文:Kconfig和Makefile。分布在各目录下的Kconfig构成了一个分布式的内核配置数据库,每个Kconfig分别描述了所属目录源文件相关的内核配置菜单。在内核配置make menuconfig(或xconfig等)时,从Kconfig中读出配置菜单,用户配置完后保存到。config(在顶层目录下生成)中。在内核编译时,主Makefile调用这个。config,就知道了用户对内核的配置情况。

上面的内容说明:Kconfig就是对应着内核的配置菜单。假如要想添加新的驱动到内核的源码中,可以通过修改Kconfig来增加对我们驱动的配置菜单,这样就有途径选择我们的驱动,假如想使这个驱动被编译,还要修改该驱动所在目录下的Makefile。

因此,一般添加新的驱动时需要修改的文件有两种(注意不只是两个)

*Kconfig

*Makefile

要想知道怎么修改这两种文件,就要知道两种文档的语法结构。

First: Kconfig

每个菜单项都有一个关键字标识,最常见的就是config。

语法:

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的配置。

2、依赖型定义depends on或requires

指此菜单的出现是否依赖于另一个定义

config HELLO_MODULE

bool "hello test module"

depends on ARCH_PXA

这个例子表明HELLO_MODULE这个菜单项只对XScale处理器有效,即只有在选择了ARCH_PXA,该菜单才可见(可配置)。

3、帮助性定义

只是增加帮助用关键字help或---help---

<!--[if !supportLineBreakNewLine]-->

<!--[endif]-->

更多详细的Kconfigconfig语法可参考:

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的知识。

最后举个例子:

假设想把自己写的一个flash的驱动程式加载到工程中,而且能够通过menuconfig配置内核时选择该驱动该怎么办呢?能够分三步:

第一:将您写的flashtest.c 文档添加到/driver/mtd/maps/ 目录下。

第二:修改/driver/mtd/maps目录下的kconfig文档:

config MTD_flashtest

tristate “ap71 flash"

这样当make menuconfig时 ,将会出现 ap71 flash选项。

第三:修改该目录下makefile文档。

添加如下内容:obj-$(CONFIG_MTD_flashtest)+= flashtest.o

这样,当您运行make menucofnig时,您将发现ap71 flash选项,假如您选择了此项。该选择就会保存在。config文档中。当您编译内核时,将会读取。config文档,当发现ap71 flash 选项为yes 时,系统在调用/driver/mtd/maps/下的makefile 时,将会把 flashtest.o 加入到内核中。即可达到您的目的。

如何把设备驱动文件添加到Linux内核编译选项配置的menuconfig中:

【目的】

把一个字符设备驱动文件,添加到内核中,希望编译成模块,而非build-in。

【具体步骤】

1.首先保证已经有驱动源文件了:as352x_afe_charger.c

放在和其他你所要添加的模块放在一个目录下,此处是drivers\i2c\chips下。

2.在drivers\i2c\chips\makefile中,添加:

obj-$(CONFIG_AS352X_AFE_CHG) += as352x_afe_charger.o

3.在drivers\i2c\chips\Kconfig

中,添加如下内容:

---------------------无敌分割线-------------------------

config AS352X_AFE_CHG

tristate "AS352X AFE Charger Driver"

depends on I2C_AS352X &&AS352X_AFE

help

If you say yes here you get support for AS352X AFE Charger.

This driver can also be built as a module. If so, the module

will be called AS352X AFE Charger.

---------------------无敌分割线-------------------------

解释如下:

(1)AS352X_AFE_CHG是自己定义的名字,当然要尽量保证有意义。

同时,你会注意到,在上面的makefile中添加的

obj-$(CONFIG_AS352X_AFE_CHG) += as352x_afe_charger.o

中的CONFIG_AS352X_AFE_CHG,是CONFIG_加上我们在kconfig下写的config变量。

这两个要匹配,才能实现你在menconfig定义的结果,传递到makefile中,

以便决定编译的时候是如何编译:不编译/编译进内核/编译成模块

(2)tristate 表示我此处添加的模块,可以

在make ARCH=arm menuconfig中看到的,选择之后:

* 编译到内核中

M 编译成模块,即生成XXX.ko

不选中,就不编译该文件

(3)depends on I2C_AS352X &&AS352X_AFE

是前面自己找到的,表示此编译选项只有当I2C_AS352X 和AS352X_AFE都选中,才会出现。

当然,如果此模块不依赖于其他模块,则不需要加上这个depends on了。

【附录】

1.如果设置成M,module模式,则要用

make ARCH=arm

编译出as352x_afe_charger.ko

make ARCH=arm uImage

只能编译内核,而不编译模块。


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/bake/11630497.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-17
下一篇2023-05-17

发表评论

登录后才能评论

评论列表(0条)

    保存