树莓派linux kernel 添加menuconfig菜单选项和编译


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配置文件,将有关的驱动源码编译成二进制 文件并添加到内核当中

树莓派linux kernel 添加menuconfig菜单选项和编译树莓派linux kernel 添加menuconfig菜单选项和编译

 

原创文章,作者:Carrie001128,如若转载,请注明出处:https://blog.ytso.com/274874.html

(0)
上一篇 2022年7月17日
下一篇 2022年7月17日

相关推荐

发表回复

登录后才能评论