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菜单选项和编译的更多相关文章

  1. 解决vs2013中MVC/WebApi不显示添加区域菜单选项

    在构建项目过程中,安装各种package或者卸载的过程中,导致了添加区域菜单选项不显示,导致后面无法添加区域. 在网上查找各种资料,发现原来是工程文件(项目名.csproj)缺少mvc引用. 工程文件 ...

  2. Linux kernel 2.6下的modules编译与KBuild

    转载:http://blog.sina.com.cn/s/blog_602f87700100dq1u.html Sam之前在Linux kernel 2.4下写过一些driver.但自从转到kerne ...

  3. Linux kernel4.4.12 添加make menuconfig 可选项

    Linux kernel 源码添加可选项 闲来无事,顺便记录一篇在Linux kernel make menuconfig 内添加一个可选项. 说不定将来就要用到这个东西呢. linux kernel ...

  4. kernel——make menuconfig的实现原理【转】

    转自:https://blog.csdn.net/hpr1992/article/details/41048693 .系统移植可以分为配置系统和编译系统两大块,其中通过命令makemenuconfig ...

  5. linux kernel menuconfig【转载】

    原文网址:http://www.cnblogs.com/kulin/archive/2013/01/04/linux-core.html Linux内核裁减 (1)安装新内核: i)将新内核copy到 ...

  6. Linux: 介绍make menuconfig中的每个选项含义【转】

    转自:http://blog.csdn.net/gaoyuanlinkconcept/article/details/8810468 介绍make menuconfig中的每个选项含义 Linux 2 ...

  7. Linux kernel make 常用选项介绍

    Linux kernel 编译方法大全记录 一.这是一个我自己写的自动make脚本: #!/bin/sh export ARCH=arm export CROSS_COMPILE=arm-linux- ...

  8. 深入linux kernel内核配置选项

    ============================================================================== 深入linux kernel内核配置选项 ...

  9. [保姆级教程] 如何在 Linux Kernel (V5.17.7) 中添加一个系统调用(System call)

    最近在学习 <linux Kernel Development>,本书用的linux kernel 是v2.6 版本的.看完"系统调用"一节后,想尝试添加一个系统调用, ...

  10. 为下拉式菜单(DropDownList)添加第一个选项

    很多方法可以为为下拉式菜单(DropDownList)添加第一个选项,下面是Insus.NET小结了几个方法,仅供参考: Html code: <body>    <form id= ...

随机推荐

  1. css flex布局的使用

    felx弹性布局 display:flex; 属性值 flex-direction 属性定义容器要在哪个方向上堆叠 flex 项目.默认为水平方向 row, column 值设置垂直方向.如:flex ...

  2. freeswitch的话单处理

    概述 freeswitch是一款简单好用的VOIP开源软交换平台. 如果对cdr话单要求不高,可以直接使用fs的原始话单文件,使用脚本做一些简单的统计. 环境 CentOS 7.9 freeswitc ...

  3. 如何在Spark键值对数据中,对指定的Key进行输出/筛选/模式匹配

    在用键值对RDD进行操作时,经常会遇到不知道如何筛选出想要数据的情况,这里提供了一些解决方法 目录 1.对固定的Key数据进行查询 2.对不固定的Key数据进行模糊查询 1.对固定的Key数据进行查询 ...

  4. UE4纯C++实现游戏快捷栏之将快捷栏注册到玩家状态

    我们有了UI有了物品信息,接下来我们便需要给每一个玩家绑定一个快捷栏了,我们分以下几部分来注册我们玩家的快捷栏. 1.Types.h:定于ShortcutContainer类,定义快捷栏的单个容器结构 ...

  5. ubuntu20.04手动换源——个人向

    备份你的源,然后替换你的 Linux 主机上 /etc/apt/source.list 即可. 笔者用的源如下: 点击查看代码 # deb cdrom:[Ubuntu 20.04.4 LTS _Foc ...

  6. 接口自动化框架【python+requests+pytest+allure】需要安装的依赖包

    attrs == 23.2.0 certifi == 2024.2.2 cffi == 1.16.0 charset-normalizer == 3.3.2 colorama == 0.4.6 cry ...

  7. golang之fmt格式化

    常用fmt中用于格式化的占位符 普通占位符 占位符 说明 举例 输出 %v 相应值的默认格式. Printf("%v", people) {zhangsan}, %+v 打印结构体 ...

  8. 解决页面隐藏的元素闪现的问题v-cloak

    在v-if处加上v-cloak属性 <div class="sys-changeBox" v-cloak v-if="showTosat" @click. ...

  9. Python 爬虫必备杀器,xpath 解析 HTML

    最近工作上写了个爬虫,要爬取国家标准网上的一些信息,这自然离不了 Python,而在解析 HTML 方面,xpath 则可当仁不让的成为兵器谱第一. 你可能之前听说或用过其它的解析方式,像 Beaut ...

  10. Nginx HttpHeader增加几个关键的安全选项

    针对像德勤这样的专业渗透测试(Pentest)的场景中,为了确保网站的安全性并通过严格的安全审查,需要为这些安全头配置更细致.专业的参数. 以下是对每个选项的建议以及设置值的详细说明: 1. Stri ...