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. 解决ValueError: day is out of range for month的问题

    Bug类型 ValueError: day is out of range for month 解决思路 值错误:天超出了月的范围 解决方法 开始日期要早于结束日期 还有一种是 2月最大为28天,如果 ...

  2. att&ack学习笔记4

    初识ATT&CK框架前言:ATT&CK这一概念自2014年提出时起,作为安全分析领域中的前沿研究一直在默默地发挥着自己的影响,但是由于其概念在当时过于超前以至于并没有引起多大反响,直至 ...

  3. 聊聊jvm的内存结构, 以及各种结构的作用

    什么是JVM 定义:Java Virtual Machine,JAVA程序的运行环境(JAVA二进制字节码的运行环境) 内存结构 JVM 内存布局规定了 Java 在运行过程中内存申请.分配.管理的策 ...

  4. 五分钟掌握Python中配置文件解析器configparser的使用

    ---  好的方法很多,我们先掌握一种  --- [背景] 这里描述的配置文件为自动化用例中使用到的信息,非pytest自动化框架中例如pytest.ini, conftest.py等具有特殊意义的配 ...

  5. 初识GO语言--基础命令

  6. 2023NOIP A层联测28 T3 大眼鸹猫

    2023NOIP A层联测28 T3 大眼鸹猫 比赛做出来了,但是文抄-- 思路 分析每一个 \(i\),发现其一定需要上升或下降 \(|a_i-b_i|\). 如果求出最小操作次数,然后在此基础上, ...

  7. TypeScript名词解释系列:tsconfg中的target,module和moduleResolution

    tsconfg中的target,module和moduleResolution target 就是TypeScript文件编译后生成的javascript文件里的语法应该遵循哪个JavaScript的 ...

  8. golang之泛型

    Go 1.18版本增加了对泛型的支持,泛型也是自 Go 语言开源以来所做的最大改变. 泛型允许程序员在强类型程序设计语言中编写代码时使用一些以后才指定的类型,在实例化时作为参数指明这些类型.ーー换句话 ...

  9. 基于python的文件监控watchdog

    实时监控第三方库watchdog,其原理通过操作系统的时间触发的,不需要循环和等待 使用场景: 1.监控文件系统中文件或目录的增删改情况 2.当特定的文件被创建,删除,修改,移动时执行相应的任务 1. ...

  10. Blazor 组件库 BootstrapBlazor 中Carousel组件介绍

    组件介绍 Carousel 走马灯的作用是在有限空间内,循环播放同一类型的图片.文字等内容. 代码如下: <Carousel Images="@Images" Width=& ...