U-Boot 图形化配置及其原理

在前两章中我们知道 uboot 可以通过 mx6ull_alientek_emmc_defconfig 来配置,或者通过文
件 mx6ull_alientek_emmc.h 来配置 uboot。还有另外一种配置 uboot 的方法,就是图形化配置,
以前的 uboot 是不支持图形化配置,只有 Linux 内核才支持图形化配置。不过不知道从什么时
候开始, uboot 也支持图形化配置了。

U-Boot 图形化配置体验

uboot 或 Linux 内核可以通过输入“ make menuconfig”来打开图形化配置界面, menuconfig
是一套图形化的配置工具,需要 ncurses 库支持。 ncurses 库提供了一系列的 API 函数供调用者
生成基于文本的图形界面,因此需要先在 Ubuntu 中安装 ncurses 库,命令如下:
sudo apt-get install build-essential
sudo apt-get install libncurses5
sudo apt-get install libncurses5-dev
menuconfig 重点会用到两个文件: .config 和 Kconfig, .config 文件前面已经说了,这个文
件保存着 uboot 的配置项,使用 menuconfig 配置完 uboot 以后肯定要更新.config 文件。 Kconfig
文件是图形界面的描述文件,也就是描述界面应该有什么内容,很多目录下都会有 Kconfig 文
件。
在打开图形化配置界面之前,要先使用“ make xxx_defconfig”对 uboot 进行一次默认配置,
只需要一次即可。如果使用“make clean”清理了工程的话就那就需要重新使用“make
xxx_defconfig”再对 uboot 进行一次配置。进入 uboot 根目录,输入如下命令:
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- mx6ull_alientek_emmc_defconfig
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig
如果已经在 uboot 的顶层 Makefile 中定义了 ARCH 和 CROSS_COMPILE 的值,那么上述
命令可以简化为:
make mx6ull_alientek_emmc_defconfig
make menuconfig
通过键盘上的“↑”和“↓”键来选择要配置的菜单,按下“ Enter”键进入子菜单。菜单
中高亮的字母就是此菜单的热键,在键盘上按下此高亮字母对应的键可以快速选中对应的菜单。
选中子菜单以后按下“ Y”键就会将相应的代码编译进 Uboot 中,菜单前面变为“ < * >”。按下
“ N”键不编译相应的代码,按下“ M”键就会将相应的代码编译为模块,菜单前面变为“ < M >”。
按两下“ Esc”键退出,也就是返回到上一级,按下“ ?”键查看此菜单的帮助信息,按下“ /”
键打开搜索框,可以在搜索框输入要搜索的内容。
在配置界面下方会有五个按钮,这五个按钮的功能如下:
<Select>:选中按钮,和“ Enter”键的功能相同,负责选中并进入某个菜单。
<Exit>:退出按钮,和按两下“ Esc”键功能相同,退出当前菜单,返回到上一级。
<Help>:帮助按钮,查看选中菜单的帮助信息。
<Save>:保存按钮,保存修改后的配置文件。
<Load>:加载按钮,加载指定的配置文件。
细心的朋友应该会发现,在 mx6ull_alientek_emmc.h 里面我们配置使能了 dhcp 和 ping 命
令,但是在图 34.1.3 中 dhcp 和 ping 前面的“ [ ]”并不是“ [ * ]”,也就是说不编译 dhcp 和 ping
命令,这不是冲突了吗?实际情况是 dhcp 和 ping 命令是会编译的。之所以在图 34.1.3 中没有
体现出来时因为我们是直接在 mx6ull_alientek_emmc.h 中定义的宏 CONFIG_CMD_PING 和
CONFIG_CMD_DHCP,而 menuconfig 是通过读取.config 文件来判断使能了哪些功能, .config
里面并没有宏 CONFIG_CMD_PING和 CONFIG_CMD_DHCP,所以 menuconfig就会识别出错。
使用如下命令编译 uboot:
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j16
千万不能使用如下命令:
./mx6ull_alientek_emmc.sh
因为 mx6ull_alientek_emmc.sh 在编译之前会清理工程,会删除掉.config 文件!通过图形化
界面配置所有配置项都会被删除,结果就是竹篮打水一场空。
 dns 命令工作正常。
 这个就是通过图形化命令来配置 uboot,一般用来使能一些命令还是很方便的,这样就不需
要到处找命令的配置宏是什么,然后在到配置文件里面去定义

menuconfig 图形化配置原理

1、make menuconfig 过程分析
当输入 make menuconfig 以后会匹配到顶层 Makefile 的如下代码:
示例代码 34.2.1.1 顶层 Makefile 代码段
489 %config: scripts_basic outputmakefile FORCE
490 $(Q)$(MAKE) $(build)=scripts/kconfig $@
这个在 31.3.13 小节已经详细的讲解过了,其中 build=-f ./scripts/Makefile.build obj,将 490
行的规则展开就是:
@ make -f ./scripts/Makefile.build obj=scripts/kconfig menuconfig
Makefile.build 会读取 scripts/kconfig/Makefile 中的内容,在 scripts/kconfig/Makefile 中可以
找到如下代码:
示例代码 34.2.1.2 scripts/kconfig/Makefile 代码段
36 menuconfig: $(obj)/mconf
37 $< $(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 文件开始构建图形配置界面。

2、 Kconfig 语法简介
因为后面学习 Linux 驱动开发的
时候可能会涉及到修改 Kconfig,对于 Kconfig 语法我们不需要太深入的去研究,关于 Kconfig
的详细语法介绍,可以参考 linux 内核源码(不知为何 uboot 源码中没有这个文件)中的文件
Documentation/kbuild/kconfig-language.txt,本节我们大概了解其原理即可。打开 uboot 根目录下
的 Kconfig,这个 Kconfig 文件就是顶层 Kconfig,我们就以这个文件为例来简单学习一下 Kconfig
语法。
1>、 mainmenu
顾名思义 mainmenu 就是主菜单,也就是输入“ make menuconfig”以后打开的默认界面,
在顶层 Kconfig 中有如下代码:
示例代码 34.2.2.1 顶层 Kconfig 代码段
5 mainmenu "U-Boot $UBOOTVERSION Configuration"
上述代码就是定义了一个名为“ U-Boot $UBOOTVERSION Configuration”的主菜单,其中
UBOOTVERSION=2016.03,因此主菜单名为“ U-Boot 2016.03 Configuration”
2>、调用其他目录下的 Kconfig 文件
和 makefile 一样, Kconfig 也可以调用其他子目录中的 Kconfig 文件,调用方法如下:
source "xxx/Kconfig" //xxx 为具体的目录名,相对路径
在顶层 Kconfig 中有如下代码:
示例代码 34.2.2.2 顶层 Kconfig 代码段
12 source "arch/Kconfig"
......
225
226 source "common/Kconfig"
227
228 source "cmd/Kconfig"
229
230 source "dts/Kconfig"
231
232 source "net/Kconfig"
233
234 source "drivers/Kconfig"
235
236 source "fs/Kconfig"
237
238 source "lib/Kconfig"
239
240 source "test/Kconfig"
顶层 Kconfig 文件调用了很多其他子目录下的 Kcofig 文
件,这些子目录下的 Kconfig 文件在主菜单中生成各自的菜单项。
3>、 menu/endmenu 条目
menu 用于生成菜单, endmenu 就是菜单结束标志,这两个一般是成对出现的。在顶层
Kconfig 中有如下代码:
示例代码 34.2.2.3 顶层 Kconfig 代码段
14 menu "General setup"
15
16 config LOCALVERSION
17 string "Local version - append to U-Boot release"
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
......
100 endmenu # General setup
在“ General setup”菜单上面还有 “ Architecture select (ARM architecture)”和“ ARM
architecture”这两个子菜单,但是在顶层 Kconfig 中并没有看到这两个子菜单对应的
menu/endmenu 代码块,那这两个子菜单是怎么来的呢?这两个子菜单就是 arch/Kconfig 文件生
成的。包括主界面中的“ Boot timing”、“ Console recording”等等这些子菜单,都是分别由顶层
Kconfig 所调用的 common/Kconfig、 cmd/Kconfig 等这些子 Kconfig 文件来创建的。
4>、 config 条目
在 menu/endmenu 代码块中有大量的“ config xxxx”的代码块,也就是 config 条
目。 config 条目就是“ General setup”菜单的具体配置项
我 们 以 “config LOCALVERSION ” 和 “config
LOCALVERSION_AUTO”这两个为例来分析一下 config 配置项的语法:
示例代码 34.2.2.5 顶层 Kconfig 代码段
16 config LOCALVERSION
17 string "Local version - append to U-Boot release"
18 help
19 Append an extra string to the end of your U-Boot version.
......
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
......
43
44 which is done within the script "scripts/setlocalversion".)1626 行,这两行都以 config 关键字开头,后面跟着 LOCALVERSION 和
LOCALVERSION_AUTO,这两个就是配置项名字。 .config 文件中的“ CONFIG_xxx” (xxx 就是
具体的配置项名字)就是 Kconfig 文件中 config 关键字后面的配置项名字加上“ CONFIG_”前
缀。
config 关键字下面的这几行是配置项属性, 17~24 行是 LOCALVERSION 的属性, 27~44 行
是 LOCALVERSION_AUTO 的属性。属性里面描述了配置项的类型、输入提示、依赖关系、帮
助信息和默认值等。
第 17 行的 string 是变量类型,也就是“ CONFIG_ LOCALVERSION”的变量类型。可以为:
bool、 tristate、 string、 hex 和 int,一共 5 种。最常用的是 bool、 tristate 和 string 这三种, bool 类
型有两种值: y 和 n,当为 y 的时候表示使能这个配置项,当为 n 的时候就禁止这个配置项。
tristate 类型有三种值: y、 m 和 n,其中 y 和 n 的涵义与 bool 类型一样, m 表示将这个配置项编
译为模块。 string 为字符串类型,所以 LOCALVERSION 是个字符
string 后面的“ Local version - append to U-Boot release”就是这个配置项在图形界面上的显
示出来的标题。
第 18 行, help 表示帮助信息,告诉我们配置项的含义,当我们按下“ h”或“ ?”弹出来的
帮助界面就是 help 的内容。
第 27 行,说明“ CONFIG_LOCALVERSION_AUTO”是个 bool 类型,可以通过按下 Y 或
N 键来使能或者禁止 CONFIG_LOCALVERSION_AUTO。
第 28 行,“ default y”表示 CONFIG_LOCALVERSION_AUTO 的默认值就是 y,所以这一
行默认会被选中。
4>、 depends on 和 select
打开 arch/Kconfig 文件,在里面有这如下代码:
示例代码 34.2.2.6 arch/Kconfig 代码段
7 config SYS_GENERIC_BOARD
8 bool
9 depends on HAVE_GENERIC_BOARD
10
11 choice
12 prompt "Architecture select"
13 default SANDBOX
14
15 config 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
第 9 行,“ depends on”说明“ SYS_GENERIC_BOARD”项依赖于“ HAVE_GENERIC_BOARD”,
也就是说“ HAVE_GENERIC_BOARD”被选中以后“ SYS_GENERIC_BOARD”才能被选中。
第 17~20 行,“ select”表示方向依赖,当选中“ ARC”以后,“ HAVE_PRIVATE_LIBGCC”、
“ HAVE_GENERIC_BOARD”、“ SYS_GENERIC_BOARD”和“ SUPPORT_OF_CONTROL”这
四个也会被选中。
4>、 choice/endchoice
在 arch/Kconfig 文件中有如下代码:
示例代码 34.2.2.7 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 代码段定义了一组可选择项,将多个类似的配置项组合在一起,供用户单
选或者多选。
示例代码 34.2.2.7 就是选择处理器架构,可以从 ARC、 ARM、 AVR32 等这些架构
中选择,这里是单选。
5>、 menuconfig
menuconfig 和 menu 很类似,但是 menuconfig 是个带选项的菜单,其一般用法为:
示例代码 34.2.2.8 menuconfig 用法
1 menuconfig MODULES
2 bool "菜单"
3 if MODULES
4 ...
5 endif # MODULES
第 1 行,定义了一个可选的菜单 MODULES,只有选中了 MODULES 第 3~5if 到 endif
之间的内容才会显示。在顶层 Kconfig 中有如下代码:
示例代码 34.2.2.9 顶层 Kconfig 代码段
14 menu "General setup"
......
74 menuconfig EXPERT
75 bool "Configure standard U-Boot features (expert users)"
76 default y
77 help
78 This option allows certain base U-Boot options and settings
79 to be disabled or tweaked. This is for specialized
80 environments which can tolerate a "non-standard" U-Boot.
81 Only use this if you really know what you are doing.
82
83 if EXPERT
84 config SYS_MALLOC_CLEAR_ON_INIT
85 bool "Init with zeros the memory reserved for malloc (slow)"
86 default y
87 help
88 This setting is enabled by default. The reserved malloc
89 memory is initialized with zeros, so first malloc calls
......
98 should be replaced by calloc - if expects zeroed memory.
99 endif
100 endmenu # General setup
第 74~99 行使用 menuconfig 实现了一个菜单,路径如下:
General setup
-> Configure standard U-Boot features (expert users) --->
前面有“ [ ]”说明这个菜单是可选的,当选中这个菜单以后就可以
进入到子选项中,也就是示例代码 34.2.2.9 中的第 83~99 行所描述的菜单
如果不选择“ Configure standard U-Boot features (expert users)”,那么示例代码 34.2.2.9 中的
第 83~99 行所描述的菜单就不会显示出来,进去以后是空白的。
6>、 comment
comment 用 于 注 释 , 也 就 是 在 图 形 化 界 面 中 显 示 一 行 注 释 , 打 开 文 件
drivers/mtd/nand/Kconfig,有如下所示代码:
示例代码 34.2.2.10 drivers/mtd/nand/Kconfig 代码段
74 config NAND_ARASAN
75 bool "Configure Arasan Nand"
76 help
......
80
81 comment "Generic NAND options"81 行使用 comment 标注了一行注释,注释内容为:“ Generic NAND options”,这行注释
在配置项 NAND_ARASAN 的下面。在图形化配置界面中按照如下路径打开:
-> Device Drivers
-> NAND Device Support
在配置项“ Configure Arasan Nand”下面有一行注释,注释内容为
“ *** Generic NAND options ***”。
7>、 source
source 用于读取另一个 Kconfig,比如:
source "arch/Kconfig"

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

参考文献

【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.3.pdf

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值