Linux 驱动移植之Makefile&Kconfig&defconfig的关系

时间:2021-02-05 08:51:32

向Linux系统中添加外设时,首先第一步即将外设的驱动代码porting,除了直接将外设的驱动源码放在相应目录,还需要编译进kernel,就需要使用到Makefile &Kconfig。

以Led灯的驱动为例

1、一般将驱动文件保存在路径:Kernel/drivers/leds/leds-qpnp.c

如图所示:

Linux 驱动移植之Makefile&Kconfig&defconfig的关系

2、在相同路径下存在Makefile和Kconfig文件(路径:Kernel/drivers/leds/)

Makefile和Kconfig存在系统中的多个子目录中,

xxx_defconfig:在android编译时生成.config文件,系统默认配置文件,里面全是CONFIG_XXXX构成

Kconfig:定义配置项(对xxx_defconfig文件中的配置进行定义)

.config:对配置项进行赋值(由xxx_defconfig文件在android编译时生成)

Makefile:建立配置项的生成法则

Linux的build系统就是通过Makefile将外设的驱动编译进kernel image;涉及到关键的一句makefile命令如下

obj-$( CONFIG_LEDS_QPNP ) += leds-qpnp.o;如果CONFIG_LEDS_QPNP )配置成y,则根据依赖关系生成目标文件leds-qpnp.o(添加新的驱动都可以照抄 obj-$( CONFIG_XXX ) += XX驱动源码文件名XX.o)

(具体的makefile 语法后续遇到再探讨,在/Documentation/kbuild目录下有详细的介绍有关kernel makefile的知识。)

Linux 驱动移植之Makefile&Kconfig&defconfig的关系

再看下同路径下的Kconfig文件,注意这里对应的项一定叫config LEDS_QPNP,与xxx_defconfig文件中的CONFIG_LEDS_QPNP 相对应。

Linux 驱动移植之Makefile&Kconfig&defconfig的关系

Kconfig语法(kconfig的语法,在内核的开发文档中有详细的介绍,具体可以参看\Documentation\kbuild\kconfig-language.txt)
 menu/endmenu     生成一个菜单,以endmenu结束
 menuconfig       定义一个配置选项,在这个选项下面还有一个子菜单
 config           定义一个配置选项
 choice/endchoice 定义一个选择项

 source           调用子目录下的Kconfig,生成一个子菜单

 菜单属性:
 bool     y/n: 
 tristate y/n/M: M表示编译成模块

 string
 hex

 int

 配置选项之间的依赖关系:
 depend on:某选项依赖于另外一个选项生成
 select   :反向依赖关系,该选项选中时,同时选中select后面定义的那一项
 requie
 默认值: default(默认y/n/m等值)
 输入提示:prompt
 帮助信息:help

3、defconfig文件

在Makefile、Kconfig文件中添加了相关的编译命令还差最后一步就将外设的驱动移植进kernel,最后一步就是

修改 XXX_defconfig文件,将配置项打开。路径如下:Kernel/arch/arm64/configs

Linux 驱动移植之Makefile&Kconfig&defconfig的关系

(第523行)

一般在/arm/configs/xxxxxx_defconfig目录下的文件是系统默认配置,android编译的时候会将这个文件生成.config文件,

当您编译内核时,将会读取.config文档,当发现CONFIG_LEDS_QPNP=y,系统在调用/driver/leds下的makefile 时,将会把 leds-qpnp.o 加入到内核中。即可达到编译的目的。