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. Vulhub 安装运行

    前言 vulhub是利用docker技术做的一个漏洞复现平台,可以一键搭建对应的配置.在下载好对应的代码包后,不需要安装,只需要解压并利用3条命令,就可以简单的创建关闭对应漏洞环境.最好是购买一台阿里 ...

  2. Linux利用scp命令上传下载文件

    scp是secure copy的简写,用于在 Linux 下进行远程拷贝文件的命令,和它类似的命令有cp,不过cp只是在本机进行拷贝不能跨服务器. scp传输是加密的,可能会稍微影响一下速度.当你服务 ...

  3. 基于wxpython的跨平台桌面应用系统开发

    我曾在随笔<基于Python后端构建多种不同的系统终端界面研究>介绍了多种系统终端界面开发的处理,其中涉及到的wxpython,是一个非常不错的原生界面效果组件,我们可以通过利用其各种界面 ...

  4. debug指南-基础bug

    基础Bug 本章节主要阐述一些最基本的bug. 虽然这些bug看起来很弱智简单,但正是因为这些小bug,让我们调代码的时间增加至少 \(2,3\) 个小时. 本系列的宗旨就是综合这些小bug极其对应解 ...

  5. 基于Java+SpringBoot心理测评心理测试系统功能实现一

    一.前言介绍: 1.1 项目摘要 心理测评和心理测试系统在当代社会中扮演着越来越重要的角色.随着心理健康问题日益受到重视,心理测评和心理测试系统作为评估个体心理状态.诊断心理问题.制定心理治疗方案的工 ...

  6. 接口自动化AES对称加密为什么密钥key是16位的?

    对称加密AES,加密和解密的密钥是同一个 AES是一个分组加密算法,AES有三种密钥长度(128.192.256)比特,常用的是128比特,也就是16位 AES常用的加密模式有:ECB,ECB是将明文 ...

  7. CodeForces Round 898 (div 4) H题解析

    CodeForces Round 898 (div 4)H. Mad  City 大致思路    对于有n条边和n个点,说明这个图里面只有一个环 并且两人同时开始和结束移动,所以可以得到当Valeri ...

  8. VMware使用及CentOS 7安装配置

    本文是在VMware虚拟机下安装CentOS 7的,并不是在物理机下直接安装.无论是在学习上还是工作上都建议在虚拟机安装Linux系统来进行实验.这样就算实验失败,或者系统崩溃.只需要使用虚拟机的快照 ...

  9. 使用sqlparse解析table_name,支持子查询, left join等

    import sqlparse from sqlparse.sql import IdentifierList, Identifier from sqlparse.tokens import Keyw ...

  10. 点击Popover外区域自动关闭Popover (popover close when click outside)

    $(document).on('click', function (e) { $('[data-toggle="popover"],[data-original-title]'). ...