当前位置: 首页 > news >正文

imx6ull-系统移植篇15——U-Boot 图形化配置(下)

目录

前言

配置原理

make menuconfig 过程分析

Kconfig 语法简介

调用其他目录下的 Kconfig 文件

config 条目

depends on 和 select

choice/endchoice

comment

source

添加自定义菜单


前言

在上一讲内容:U-Boot 图形化配置(上),我们已经介绍了U-Boot 图形化配置的操作步骤,简单以启用DNS命令来演示了操作流程。

本讲内容就是,理解U-Boot 图形化配置的原理,然后学会自定义菜单。

配置原理

make menuconfig 过程分析

当输入 make menuconfig 以后会匹配到顶层 Makefile 的如下代码:

%config: scripts_basic outputmakefile FORCE$(Q)$(MAKE) $(build)=scripts/kconfig $@
  • $(build)展开为-f ./scripts/Makefile.build obj

实际执行的命令是:

make -f ./scripts/Makefile.build obj=scripts/kconfig menuconfig

Makefile.build 会读取 scripts/kconfig/Makefile 中的内容,在 scripts/kconfig/Makefile 中可以找到如下代码:

menuconfig: $(obj)/mconf$< $(silent) $(Kconfig)

其中:

  • obj= scripts/kconfig, silent是设置静默编译的,在这里可以忽略不计,
  • Kconfig=Kconfig,

展开后等于:

menuconfig: scripts/kconfig/mconf
scripts/kconfig/mconf Kconfig

目标 menuconfig 依赖 scripts/kconfig/mconf,因此 scripts/kconfig/mconf.c 这个文件会被编译,生成 mconf 这个可执行文件。

目标 menuconfig 对应的规则为 scripts/kconfig/mconf Kconfig,也就是说 mconf 会调用 uboot 根目录下的 Kconfig 文件开始构建图形配置界面。

整个过程可以简化为:

make menuconfig→ 编译配置工具 → 用工具解析Kconfig → 显示配置界面

Kconfig 语法简介

我们已经知道了 scripts/kconfig/mconf 会调用 uboot 根目录下的 Kconfig 文件开始构建图形化配置界面,接下来简单学习一下 Kconfig 的语法。

打开 uboot 根目录下的 Kconfig,这个Kconfig 文件就是顶层Kconfig,我们就以这个文件为例来简单学习一下 Kconfig语法。

mainmenu 就是主菜单,也就是输入“make menuconfig”以后打开的默认界面。

在顶层 Kconfig 中有如下代码:

mainmenu "U-Boot $UBOOTVERSION Configuration"

其中UBOOTVERSION=2016.03,因此主菜单名为“U-Boot 2016.03 Configuration”,如图:

调用其他目录下的 Kconfig 文件

Kconfig 也可以调用其他子目录中的 Kconfig 文件,调用方法如下:

source "xxx/Kconfig" //xxx 为具体的目录名,相对路径

在顶层 Kconfig 中有如下代码:

12 source "arch/Kconfig"                // 加载体系架构相关配置(ARM/X86等CPU架构选项)
......
225                                   // 空行或其它配置项的间隔
226 source "common/Kconfig"           // 通用配置(环境变量、启动参数等基础设置)
227
228 source "cmd/Kconfig"              // 命令行配置(uboot所有可用命令的开关)
229
230 source "dts/Kconfig"               // 设备树配置(控制设备树编译和解析选项)
231
232 source "net/Kconfig"              // 网络协议栈配置(TFTP/NFS/PING等网络功能)
233
234 source "drivers/Kconfig"          // 设备驱动配置(MMC/USB/ETH等硬件驱动开关)
235
236 source "fs/Kconfig"               // 文件系统配置(FAT/EXT4/JFFS2等文件系统支持)
237
238 source "lib/Kconfig"              // 库函数配置(压缩算法、CRC校验等基础库)
239
240 source "test/Kconfig"             // 测试相关配置(单元测试和调试功能选项)

顶层 Kconfig 文件调用了很多其他子目录下的 Kcofig 文件,这些子目录下的 Kconfig 文件在主菜单中生成各自的菜单项。

menu 用于生成菜单, endmenu 就是菜单结束标志,这两个一般是成对出现的。

在顶层Kconfig 中有如下代码:

14 menu "General setup"               // 开始定义"General setup"菜单分组
15                                   // 空行保持菜单结构清晰
16 config LOCALVERSION                // 定义配置项LOCALVERSION
17 string "Local version - append to U-Boot release"  // 字符串类型配置,显示在界面上的提示文本
18 help                              // help帮助信息开始
19 Append an extra string to the end of your U-Boot version.  // 第一行帮助说明
20 This will show up on your boot log, for example.  // 第二行说明(示例作用)
21 The string you set here will be appended after the contents of  // 第三行说明(拼接规则)
22 any files with a filename matching localversion* in your  // 第四行说明(文件匹配规则)
23 object and source tree, in that order. Your total string can  // 第五行说明(拼接顺序)
24 be a maximum of 64 characters.     // 第六行说明(长度限制)
25......                            // 此处省略其他配置项(保持原文件结构)
100 endmenu # General setup          // 结束"General setup"菜单分组
101                                   // 空行分隔不同菜单
102 menu "Boot images"               // 开始定义"Boot images"菜单分组
103
104 config SUPPORT_SPL               // 定义SPL支持配置项
105 bool                            // 布尔类型配置(无提示文本,通常用于隐藏配置)
106
......                              // 此处省略其他配置项(保持原文件结构)
224 endmenu # Boot images            // 结束"Boot images"菜单分组

这段代码定义了子菜单“General setup”和子菜单“Boot images”。体现在主菜单界面中就如图:


 

在“ General setup”菜单上面还有 “ Architecture select (ARM architecture)”和“ ARM architecture”这两个子菜单,是 arch/Kconfig 文件生成的。

包括主界面中的“Boot timing”、“Console recording”等等这些子菜单,都是分别由顶层Kconfig 所调用的 common/Kconfig、 cmd/Kconfig 等这些子 Kconfig 文件来创建的。

config 条目

顶层 Kconfig 中的“General setup”子菜单内容如下:

menu "General setup"  // 主菜单:通用设置config LOCALVERSION
string "Local version - append to U-Boot release"  // 字符串配置项:自定义版本后缀
helpAppend an extra string to the end of your U-Boot version.  // 帮助信息:添加自定义版本字符串[详细帮助内容省略...]config LOCALVERSION_AUTO
bool "Automatically append version information"  // 布尔配置项:自动版本信息
default y  // 默认启用
help[帮助信息省略...]config CC_OPTIMIZE_FOR_SIZE  
bool "Optimize for size"  // 布尔配置项:代码大小优化
default y  // 默认启用
help[帮助信息省略...]config SYS_MALLOC_F
bool "Enable malloc() pool before relocation"  // 布尔配置项:重定位前内存池
default y if DM  // 条件默认值(依赖DM时启用)
help[帮助信息省略...]config SYS_MALLOC_F_LEN  
hex "Size of malloc() pool before relocation"  // 十六进制配置项:内存池大小
depends on SYS_MALLOC_F  // 依赖关系:需要SYS_MALLOC_F启用
default 0x400  // 默认值1KB
help[帮助信息省略...]menuconfig EXPERT  // 菜单配置项:专家模式开关
bool "Configure standard U-Boot features (expert users)" 
default y  // 默认启用
help[帮助信息省略...]if EXPERT  // 专家模式下的配置项
config SYS_MALLOC_CLEAR_ON_INIT
bool "Init with zeros the memory reserved for malloc (slow)"  // 内存清零初始化
default y  // 默认启用
help[帮助信息省略...]
endifendmenu # General setup  // 菜单结束

可以看出,在 menu/endmenu 代码块中有大量的“config xxxx”的代码块,也就是 config 条目。config 条目就是“General setup”菜单的具体配置项,如图:

config 关键字下面的这几行是配置项属性,属性里面描述了配置项的类型、输入提示、依赖关系、帮助信息和默认值等。

16 config LOCALVERSION
17 string "Local version - append to U-Boot release"  // 配置项显示名称(GUI界面可见)
18 help                                              // 帮助系统标识符
19 Append an extra string to the end of your U-Boot version.  // 核心功能说明
20 This will show up on your boot log, for example.  // 使用场景示例
21 The string you set here will be appended after the contents of  // 字符串拼接规则
22 any files with a filename matching localversion* in your  // 文件匹配规则
23 object and source tree, in that order. Your total string can  // 优先级说明
24 be a maximum of 64 characters.                     // 长度限制(重要参数)
25                                                   // 空行分隔配置项
26 config LOCALVERSION_AUTO
27 bool "Automatically append version information to the version string"  // 布尔类型配置
28 default y                              // 默认启用(重要编译选项)
29 help                                  // 帮助系统标识符
30 This will try to automatically determine if the current tree is a  // 自动检测逻辑
31 release tree by looking for git tags that belong to the current  // Git标签检测
......                                 // 省略中间帮助文本
43 which is done within the script "scripts/setlocalversion".)  // 实现脚本位置(关键路径)

变量类型可以为: bool、 tristate、 string、 hex 和 int,一共 5 种。最常用的是 bool、 tristate 和 string 这三种。

  • bool 类型有两种值: y 和 n,当为 y 的时候表示使能这个配置项,当为 n 的时候就禁止这个配置项。
  • tristate 类型有三种值: y、 m 和 n,其中 y 和 n 的涵义与 bool 类型一样, m 表示将这个配置项编译为模块。
  • string 为字符串类型,所以 LOCALVERSION 是个字符串变量,用来存储本地字符串,选中以后即可输入用户定义的本地版本号。

这段代码的关键点如下:

  1. string 后面的“Local version - append to U-Boot release”就是这个配置项在图形界面上的显示出来的标题。
  2. help 表示帮助信息,告诉我们配置项的含义,当我们按下“h”或“?”弹出来的帮助界面就是 help 的内容。
  3. “CONFIG_LOCALVERSION_AUTO”是个 bool 类型,可以通过按下 Y 或N 键来使能或者禁止 CONFIG_LOCALVERSION_AUTO。
  4. “default y”表示 CONFIG_LOCALVERSION_AUTO 的默认值就是 y,所以这一行默认会被选中。

depends on 和 select

打开 arch/Kconfig 文件,在里面有这如下代码:

7 config SYS_GENERIC_BOARD
8 bool                           
9 depends on HAVE_GENERIC_BOARD   // 依赖条件:需HAVE_GENERIC_BOARD启用
10                                
11 choice                          // 开始选择组(单选)
12 prompt "Architecture select"    // 选择组标题(界面显示)
13 default SANDBOX                // 默认选中SANDBOX架构
14                                
15 config ARC                     // 子选项:ARC架构配置
16 bool "ARC architecture"        // 带显示标签的布尔选项
17 select HAVE_PRIVATE_LIBGCC     // 选中时自动启用关联配置
18 select HAVE_GENERIC_BOARD      // 级联选择依赖项
19 select SYS_GENERIC_BOARD       // 级联选择核心配置
20 select SUPPORT_OF_CONTROL      // 启用设备树支持
  • select:强制启用其他配置(反向依赖),当选中“ARC”以后,“HAVE_PRIVATE_LIBGCC”、“HAVE_GENERIC_BOARD”、“SYS_GENERIC_BOARD”和“SUPPORT_OF_CONTROL”这四个也会被选中。

  • depends on:正向依赖约束,HAVE_GENERIC_BOARD”被选中以后“SYS_GENERIC_BOARD”才能被选中。

choice/endchoice

在 arch/Kconfig 文件中有如下代码:

11 choice
12 prompt "Architecture select"
13 default SANDBOX
14
15 config ARC
16 bool "ARC architecture"
......
21
22 config ARM
23 bool "ARM architecture"
......
29
30 config AVR32
31 bool "AVR32 architecture"
......
35
36 config BLACKFIN
37 bool "Blackfin architecture"
......
40
41 config M68K
42 bool "M68000 architecture"
......
117
118 endchoice

choice/endchoice 代码段定义了一组可选择项,将多个类似的配置项组合在一起,供用户单选或者多选。

在 uboot 图形配置界面上选择“Architecture select”,进入以后如图:

menuconfig 是个带选项的菜单,其一般用法为:

menuconfig MODULESbool "菜单"if MODULES
...endif # MODULES

举个例子:

menuconfig CMD_DFU  // 这是一个带选项的菜单配置项bool "DFU (Device Firmware Update) support"  // 菜单标题和开关选项depends on USB_FUNCTION_DFU  // 依赖USB DFU功能支持helpThis enables the DFU (Device Firmware Update) command, whichallows updating firmware via USB. Enabling this will showadditional DFU configuration options.if CMD_DFU  // 当DFU命令启用时显示子选项config DFU_ALTstring "DFU alternate settings"default ""helpDefine the alternate settings for DFU, specifying whichmemory areas should be made available for firmware updates.config DFU_OVER_USBbool "Enable DFU over USB"default yhelpAllow firmware updates via USB interface.
endif

使用 menuconfig 实现了一个菜单,路径如下:

[ ] DFU (Device Firmware Update) support --->

  • --->表示有子菜单

  • 子选项的显示/隐藏由父菜单的选中状态控制

comment

comment 用 于 注 释 , 也 就 是 在 图 形 化 界 面 中 显 示 一 行 注 释 。

打 开 文 件drivers/mtd/nand/Kconfig,有如下所示代码:

config NAND_ARASANbool "Configure Arasan Nand"help
......comment "Generic NAND options"

使用 comment 标注了一行注释,注释内容为:“Generic NAND options”

在图形化配置界面中按照如下路径打开:-> Device Drivers -> NAND Device Support

source

source 用于读取另一个 Kconfig,比如:

# 文件:./Kconfig (顶层配置文件)
source "arch/Kconfig"          # 包含架构相关配置
source "drivers/Kconfig"       # 包含所有驱动配置
source "fs/Kconfig"           # 包含文件系统配置
source "net/Kconfig"          # 包含网络协议栈配置

Kconfig 语法就讲解到这里,基本上常用的语法就是这些。

添加自定义菜单

图形化配置工具的主要工作就是在.config 下面生成前缀为“CONFIG_”的变量,这些变量一般都要值,为 y, m 或 n,在 uboot 源码里面会根据这些变量来决定编译哪个文件。

我们就来学习一下如何添加自己的自定义菜单。

自定义菜单要求如下:

①、在主界面中添加一个名为“My test menu”,此菜单内部有一个配置项。

②、配置项为“MY_TESTCONFIG”,此配置项处于菜单“My test menu”中。

③、配置项的为变量类型为 bool,默认值为 y。

④、配置项菜单名字为“This is my test config”。

⑤、配置项的帮助内容为“This is a empty config, just for tset!”。

那么,对应的代码应该怎么写呢?那当然是模仿。

打开顶层 Kconfig,在最后面加入如下代码:

menu "My test menu"config MY_TESTCONFIGbool "This is my test config"default yhelpThis is a empty config, just for test!endmenu # my test menu

添加完成以后打开图形化配置界面,如图:

主菜单最后面出现了一个名为“My test menu”的子菜单,进入子菜单:

配置项添加成功,选中“This is my test config”配置项,然后按下“H”键打开帮助文档,如图:

显示的帮助信息和我们代码里help后面的语句一致。

配置项 MY_TESTCONFIG 默认也是被选中的,因此在.config 文件中肯定会有“CONFIG_MY_TESTCONFIG=y”这一行,如图:

至此,我们在主菜单添加自己的自定义菜单就成功了。大家可以多尝试一下啊。

最主要的是记住: Kconfig 文件的最终目的就是在.config 文件中生成以“CONFIG_”开头的变量。

http://www.dtcms.com/a/290346.html

相关文章:

  • 蚂蚁数科AI数据产业基地正式投产,携手苏州推进AI产业落地
  • 使用Python绘制专业柱状图:Matplotlib完全指南
  • 《Linux服务与安全管理》| 安装拼音输入法
  • 【NLP舆情分析】基于python微博舆情分析可视化系统(flask+pandas+echarts) 视频教程 - 主页布局实现
  • “hidden act“:“gelu“在bert中作用
  • 经典神经网络(vgg resnet googlenet)
  • 家庭网络怎么进行公网IP获取,及内网端口映射外网访问配置,附无公网IP提供互联网连接方案
  • 03-虚幻引擎蓝图类的各父类作用讲解
  • el-table固定高度,数据多出现滚动条,表头和内容对不齐
  • Eltable tree形式,序号列实现左对齐,并且每下一层都跟上一层的错位距离拉大
  • 深入解析Hadoop MapReduce Shuffle过程:从环形缓冲区溢写到Sort与Merge源码
  • VMware Workstation Pro克隆虚拟机导致网络异常解决方法
  • 深度学习 pytorch图像分类(详细版)
  • 【设计模式】观察者模式 (发布-订阅模式,模型-视图模式,源-监听器模式,从属者模式)
  • HTTP性能优化:打造极速Web体验的关键策略
  • 从实践出发--探究C/C++空类的大小,真的是1吗?
  • 西门子 S7-1500 信号模块硬件配置全解析:从选型到实战
  • 如何快速比较excel两列,拿出不同的数据
  • 在.NET Core API 微服务中使用 gRPC:从通信模式到场景选型
  • 用 STM32 的 SYSTICK 定时器与端口复用重映射玩转嵌入式开发
  • 大模型高效适配:软提示调优 Prompt Tuning
  • The Survey of Few-shot Prompt Learning on Graph
  • AI Agent开发学习系列 - langchain之LCEL(3):Prompt+LLM
  • JavaScript Promise全解析
  • Prompt Engineering(提示词工程)基础了解
  • 【PTA数据结构 | C语言版】列出连通集
  • 归并排序:优雅的分治排序算法(C语言实现)
  • 什么是商业智能BI数据分析的指标爆炸?
  • Leetcode 3624. Number of Integers With Popcount-Depth Equal to K II
  • nerf-2020