向Linux系统中添加外设时,首先第一步即将外设的驱动代码porting,除了直接将外设的驱动源码放在相应目录,还需要编译进kernel,就需要使用到Makefile &Kconfig。
以Led灯的驱动为例
1、一般将驱动文件保存在路径:Kernel/drivers/leds/leds-qpnp.c
如图所示:
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的知识。)
再看下同路径下的Kconfig文件,注意这里对应的项一定叫config LEDS_QPNP,与xxx_defconfig文件中的CONFIG_LEDS_QPNP 相对应。
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
(第523行)
一般在/arm/configs/xxxxxx_defconfig目录下的文件是系统默认配置,android编译的时候会将这个文件生成.config文件,
当您编译内核时,将会读取.config文档,当发现CONFIG_LEDS_QPNP=y,系统在调用/driver/leds下的makefile 时,将会把 leds-qpnp.o 加入到内核中。即可达到编译的目的。