ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

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

2022-07-16 20:35:25  阅读:347  来源: 互联网

标签:kernel 树莓 菜单 make linux defconfig --- scripts config


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

 

标签:kernel,树莓,菜单,make,linux,defconfig,---,scripts,config
来源: https://www.cnblogs.com/pypyn/p/16485152.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有