https://www.bilibili.com/video/av91990721?zw
bcmrpi_defconfig
打开顶层目录下的 Makefile,搜索 %config 找到如下内容:
# ===========================================================================
521 # *config targets only - make sure prerequisites are updated, and descend
522 # in scripts/kconfig to make the *config target
523
524 # Read arch specific Makefile to set KBUILD_DEFCONfig as needed.
525 # KBUILD_DEFCONfig may point out an alternative default configuration
526 # used for 'make defconfig'
527 include arch/$(SRCARCH)/Makefile
528 export KBUILD_DEFCONfig KBUILD_KCONfig CC_VERSION_TEXT
529
530 config: scripts_basic outputmakefile FORCE
531 $(Q)$(MAKE) $(build)=scripts/kconfig $@
532
533 %config: scripts_basic outputmakefile FORCE
534 $(Q)$(MAKE) $(build)=scripts/kconfig $@
注:vim搜索方法
进入底行模式输入 "/搜索内容" 回车, 按键盘 n 下一个, shift + n 上一个
makefile语法备注:
$@ :目标
$^ :所有的依赖
$< :第一个依赖
@ :隐藏回显
[1] 运行$make -p Makefile >> makefile.txt 导出宏定义到指定文件
参数备注:
-p:输出所有宏定义和目标文件描述
-f:指定"makefile"文件
在makefile.txt文件中搜索 "Q",找到:
145 Q = @
可知 $(Q) = @,也就是说 $(Q) 这个宏定义的作用就是关闭这两句话的回显
[2] 删除 $(Q),再次运行$make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- bcmrpi_defconfig
出现如下内容:
make -f ./scripts/Makefile.build obj=scripts/kconfig bcmrpi_defconfig
#
# configuration written to .config
#
那么我们猜测$(MAKE)是什么呢? $(build)又是什么呢?
我们再在makefile.txt文件中搜索 "MAKE",找到:
937 MAKE = make
所以 $(MAKE) = make,那么$(build) = -f ./scripts/Makefile.build obj 而 $@ = bcmrpi_defconfig
也就是说这条命令的作用是指定makefile文件"./scripts/Makefile.build" ,进入 "scripts/kconfig" 目录,
调用该目录下的 Makefile 执行 "make bcmrpi_defconfig"
[3] 分析 scripts/kconfig/ 中的 Makefile
打开 scripts/kconfig/Makefile, 搜索 "%_defconfig",找到:
103 %_defconfig: $(obj)/conf
104 $(Q)$< $(silent) --defconfig=arch/$(SRCARCH)/configs/$@ $(Kconfig)
里面的宏定义太多了不好分析,我们先删除回显,再次执行$make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- bcmrpi_defconfig
出现如下内容:
make -f ./scripts/Makefile.build obj=scripts/kconfig bcmrpi_defconfig
scripts/kconfig/conf --defconfig=arch/arm/configs/bcmrpi_defconfig Kconfig
#
# configuration written to .config
#
其他的内容前面已经看过了,我们看第二行:
scripts/kconfig/conf --defconfig=arch/arm/configs/bcmrpi_defconfig Kconfig
显然
$(obj) = scripts/kconfig
$< = $(obj)/conf = scripts/kconfig/conf
$(silent) = 空
$(SRCARCH) = arm
$@ = bcmrpi_defconfig
$(Kconfig) = Kconfig
通过file conf 查看conf文件,发现其中scripts/kconfig/conf的conf其实是一个可执行文件,
所以后面两个都是参数的作用是根据 arch/arm/configs/bcmrpi_defconfig 文件和顶层目录下
的 Kconfig 文件 在顶层目录下生成.config文件!
[4] 总结
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- bcmrpi_defconfig 命令以下简化成:
make bcmrpi_defconfig 命令. 通过内核源码顶层目录下的Makefile ,然后这个Makefile调用
当前目录下的 ./scripts/kconfig/Makefile, 然后./scripts/kconfig/Makefile这个 Makefile
再调用./scripts/kconfig/conf
conf 可执行程序根据传参 将arch/arm/configs/bcmrpi_defconfig 文件和顶层目录下的 Kconfig
文件,从而在顶层目录下生成.config文件!
解析:make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig
[1] make menuconfig 的步骤和 make bcmrpi_defconfig 相似
也是通过顶层目录下的 Makefile 调用 ./scripts/kconfig/Makefile.
这里的第一步和之前一样,所以不再分析.
[2] 分析 ./scripts/kconfig/Makefile
打开这个文件,搜索menuconfig ,找到如下内容:
28 menuconfig: $(obj)/mconf
29 $< $(silent) $(Kconfig)
我们之前已经分析出部分宏所代表的参数
$(obj) = scripts/kconfig
$< = $(obj)/mconf = scripts/kconfig/mconf
$(silent) = 空
$(Kconfig) = Kconfig
所以把这些参数代入就能得出这条完整的命令
scripts/kconfig/mconf Kconfig
[3] 分析 scripts/kconfig/mconf
通过file mconf 发现mconf也是一个可执行文件.
mconf 的作用是根据Kconfig中的信息生成菜单选项的图形化配置界面.
[4] 总结
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig 命令以下简化成:
make menuconfig 命令. 通过内核源码顶层目录下的Makefile ,然后这个Makefile调用
当前目录下的 ./scripts/kconfig/Makefile, 然后./scripts/kconfig/Makefile这个 Makefile
再调用./scripts/kconfig/mconf
mconf 根据Kconfig中的信息生成菜单选项的图形化配置界面.
解析:将内核驱动代码编译选项添加到menuconfig
[1] Kconfig 文件的作用
Kconfig 文件中保存了 menuconfig 菜单的配置项的信息.
[2] Kconfig 中配置菜单的语法格式
复制两段 menuconfig 界面
1> 主界面
=========================================================
[*] Networking support --->
Device Drivers --->
File systems --->
Security options --->
2> Device Drivers的界面
=========================================================
Character devices --->
I2C support --->
[*] SPI support --->
< > SPMI support ----
< > HSI support ----
<M> PPS support --->
复制一段./drivers/char/Kconfig 的代码
=========================================================
14 menu "Character devices"
15
16 source "drivers/char/broadcom/Kconfig"
17
18 source "drivers/tty/Kconfig"
19
20 config DEVMEM
21 bool "/dev/mem virtual device support"
22 default y
23 help
24 Say Y here if you want to support the /dev/mem device.
25 The /dev/mem device is used to access areas of physical
26 memory.
27 When in doubt, say "Y".
... ... #此处省略N行
endmenu
=========================================================
menu 关键字的作用:主菜单名字
用法:menu "主菜单名字"
source 关键字的作用:包含下级子菜单文件
用法:souce "驱动顶层目录下的 Kconfig 文件的路径"
bool 关键字的作用:菜单选项类型(bool只有 y 和 n)
用法: bool "子菜单的名字"
default 关键字的作用:菜单默认值
用法: default 默认值
help 关键字的作用:提供更多帮助信息
用法: help 换行 帮助信息 直到下一个子菜单或者endmenu或者文件末尾
endmenu 关键字的作用:结束子菜单
用法: 在子菜单后加endmenu
config 关键字的作用:添加到.config文件的菜单信息
用法: config 菜单信息(自己起个名字)
[3] 自己写一个菜单
在drivers/char/broadcom/Kconfig 中添加如下内容
=========================================================
menu "My_Char_Device" #主菜单名字
config MY_CHDEV #保存到.config中的信息
bool "Do not enable this" #子菜单名字
default n #默认值
help #帮助说明
This is a demo of add a device menu.
Please do not enable it!
endmenu #结束主菜单(注意!主菜单中不能再包含一个主菜单)
添加效果
=========================================================
[*] Network device support --->
Input device support --->
My_Char_Device ---> #这是我添加的
Character devices --->
I2C support --->
[*] SPI support --->
打开之后
=========================================================
[ ] Do not enable this (NEW)
如果我将这个选项选启用 .config 中就会出现:
#
# My_Char_Device
#
CONfig_Char_Device=y
如果我将这个选项选禁用 .config 中就会出现:
#
# My_Char_Device
#
# CONfig_Char_Device is not set
[4] 自己添加一个驱动并编译进去
拷贝 "chrdev.c" 驱动源码到/devices/char/
打开该目录下的Makefile,添加一行
obj-$(CONfig_Char_Device) += chrdev.o
CONfig_Char_Device 就是.config中的驱动信息(名字,自己定义在Kconfig菜单的congfig关键字中)
chrdev.o 就是编译源码生成的二进制文件名称(名称一定要和源码对应, xxx.c 一定是 xxx.o)
[5] Kconfig .config Makefile 的关系.
1> .config保存了通过make xxx_defconfig 和 make menuconfig 两种设置方式的配置信息.
2> make xxx_defconfig 通过scripts/kconfig/中的conf把Kconfig和xxx_defconfig生成.config
3> make menuconfig 通过./scripts/kconfig/中的mconf读取Kconfig保存的菜单信息生成图形界面,
再将更改的参数保存到.config
4> make uImage 通过各个驱动文件夹下的Makefile和.config配置文件,将有关的驱动源码编译成二进制
文件并添加到内核当中