Skip to content

LV080-图形化配置

在前面的学习中我们知道 uboot 可以通过 mx6ull_alpha_emmc_defconfig 来配置,或者通过文件 mx6ull_alpha_emmc.h 来配置 uboot。还有另外一种配置 uboot 的方法,就是图形化配置,以前的 uboot 是不支持图形化配置,只有 Linux 内核才支持图形化配置。不过不知道从什么时候开始, uboot 也支持图形化配置了,本章我们就来学习一下如何通过图形化配置 uboot,并且学习一下图形化配置的原理,因为后面学习 Linux 驱动开发的时候可能要修改图形配置文件 .

一、u-boot 图形化配置体验

1. 菜单说明

uboot 或 Linux 内核可以通过输入“make menuconfig”来打开图形化配置界面, menuconfig 是一套图形化的配置工具,需要 ncurses 库支持。 ncurses 库提供了一系列的 API 函数供调用者生成基于文本的图形界面,因此需要先在 Ubuntu 中安装 ncurses 库,命令如下:

shell
sudo apt-get install build-essential
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 根目录,输入如下命令:

shell
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- mx6ull_alpha_emmc_defconfig
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig

打开后的图形化界面如图所示:

image-20230804214007594

这就是主界面,主界面上方的英文就是简单的操作说明,操作方法如下 :

(1)通过键盘上的“ ↑ ”和“ ↓ ”键来选择要配置的菜单,后面跟着“--->”表示此配置项是有子配置项的,按下回车键就可以进入子配置项。 按下“ Enter ”键进入子菜单。

(2)菜单中高亮的字母就是此菜单的热键,在键盘上按下此高亮字母对应的键可以快速选中对应的菜单。

(3)选中子菜单以后按下“ Y ”键就会将相应的代码编译进 uboot 中,菜单前面变为“< * >”。按下“ N ”键不编译相应的代码,按下“ M ”键就会将相应的代码编译为模块,菜单前面变为“< M >”。也可以通过 “ space ” 键进行切换。

(4)按两下 “ Esc ” 键退出,也就是返回到上一级.

(5)按下 “ ? ” 键查看此菜单的帮助信息。

(6)按下“ / ” 键打开搜索框,可以在搜索框输入要搜索的内容。

(7)在配置界面下方会有五个按钮,这五个按钮的功能如下:

md
<Select>:选中按钮,和“Enter”键的功能相同,负责选中并进入某个菜单。
<Exit>  :退出按钮,和按两下“Esc”键功能相同,退出当前菜单,返回到上一级。
<Help>  :帮助按钮,查看选中菜单的帮助信息。
<Save>  :保存按钮,保存修改后的配置文件。
<Load>  :加载按钮,加载指定的配置文件。

2. dns 命令为例

我们进入“Command line interface --->”这个配置项,此配置项用于配置 uboot 的命令,进入以后如图 :

imgimg

从左图中可以看出,有很多配置项,这些配置项也有子配置项,选择“Network commands --->”,进入网络相关命令配置项,会看到右图所示界面。可以看出, uboot 中有很多和网络有关的命令,比如 bootp、 tftpboot、 dhcp 等等。选中 dns,然后按下键盘上的“Y”键,此时 dns 前面的“[ ]”变成了“[ * ]”,如下图所示:

image-20230804223218020

每个选项有 3 种编译选项:编译进 uboot 中(也就是编译进 u-boot.bin 中)、取消编译(也就是不编译这个功能模块)、编译为模块。按下“Y”键表示编译进 uboot 中,此时“[ ]”变成了“[ * ]”;按下“N”表示不编译,“[ ]”默认表示不编译;有些功能模块是支持编译为模块的,这个一般在 Linux 内核里面很常用,后边学习 linux 就会学到, uboot 下面不使用,如果要将某个功能编译为模块,那就按下“M”,此时“[ ]”就会变为“< M >”。

一个小疑问?

在 mx6ull_alpha_emmc.h 里面我们配置使能了 dhcp 和 ping 命令,但是在上图中 dhcp 和 ping 前面的“[ ]”并不是“[ * ]”,也就是说不编译 dhcp 和 ping 命令,这不是冲突了吗?实际情况是 dhcp 和 ping 命令是会编译的。之所以在图中没有体现出来时因为我们是直接在 mx6ull_alipha_emmc.h 中定义的宏 CONFIG_CMD_PING 和 CONFIG_CMD_DHCP,而 menuconfig 是通过读取.config 文件来判断使能了哪些功能, .config 里面并没有宏 CONFIG_CMD_PING 和 CONFIG_CMD_DHCP,所以 menuconfig 就会识别出错。

选中 dns,然后按下“H”或者“?”键可以打开 dns 命令的提示信息,如图所示:

image-20230804223518517

按两下 ESC 键即可退出提示界面,相当于返回上一层。选择 dns 命令以后,按两下 ESC 键(按两下 ESC 键相当于返回上一层),退出当前配置项,进入到上一层配置项。如果没有要修改的就按两下 ESC 键,退出到主配界面,如果也没有其他要修改的,那就再次按两下 ESC 键退出 menuconfig 配置界面。如果修改过配置的话,在退出主界面的时候会有如图所示提示:

image-20230804223615927

询问是否保存新的配置文件,通过键盘的← 或→ 键来选择“Yes”项,然后按下键盘上的回车键确认保存。至此,我们就完成了通过图形界面使能了 uboot 的 dns 命令,打开.config 文件,会发现多了“CONFIG_CMD_DNS = y”这一行,如图中的 323 行所示:

image-20230804223808025

3. 编译 uboot

使用如下命令编译 uboot:

shell
make V=0 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j16

需要注意的是千万不要使用下边的两个命令

shell
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- disclean
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- mx6ull_alpha_defconfig

上边的 disclean 命令会清理工程,会删除掉.config 文件!通过图形化界面配置所有配置项都会被删除,结果就是竹篮打水一场空。有什么办法避免吗?当然有啦,.我们的 mx6ull_alpha_defconfig 文件内容其实就是一小部分的.config,我们可以直接把.config 重命名,替换掉原来的 mx6ull_alpha_defconfig 文件,这样就可以啦。

4. dns 命令测试

编译完成以后烧写到 SD 卡中,重启开发板进入 uboot 命令模式,输入“?”查看是否有“dns”命令,一般肯定有的。使用 dns 命令来查看一下百度官网“www.baidu.com”的 IP 地址。注意!如果要与外部互联网通信,比如百度官网,这个时候要保证开发板能访问到外部互联网。 如果我们的开发板和电脑直接用网线连接的,那么肯定无法连接到外部网络, 这个时候 dns 命令查看百度官网也会失败!所以开发板一定要连接到路由器上,而且要保证路由器能访问外网,比如手机连接到这个路由器上以后可以正常访问互联网。

要先设置一下 dns 服务器的 IP 地址,也就是设置环境变量 dnsip 的值,命令如下:

shell
=> setenv dnsip 114.114.114.114
=> saveenv

设置好以后就可以使用 dns 命令查看百度官网的 IP 地址了,输入命令:

shell
=> dns www.baidu.com
image-20230804224326123

可以看出,“www.baidu.com” 的 IP 地址为 14.215.177.38,说明 dns 命令工作正常。这个就是通过图形化命令来配置 uboot,一般用来使能一些命令还是很方便的,这样就不需要到处找命令的配置宏是什么,然后在到配置文件里面去定义。

二、menuconfig 图形化配置原理简介

这里简单分析一下,后续分析 Makefile 还会详细学习。

这一部分是 u-boot 源码顶层 Makefile 文件。当输入 make menuconfig 以后会匹配到顶层 Makefile 的如下代码:

makefile
config: scripts_basic outputmakefile FORCE
	$(Q)$(MAKE) $(build)=scripts/kconfig $@

%config: scripts_basic outputmakefile FORCE
	$(Q)$(MAKE) $(build)=scripts/kconfig $@

后面学习 Makefile 的时候会详细分析,这里 build =-f ./scripts/Makefile.build obj,将 Makefile - 447 行 的规则展开就是:

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

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

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

其中 obj = scripts/kconfig, silent 是设置静默编译的,在这里可以忽略不计, Kconfig = Kconfig,因此扩展以后就是:

makefile
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 文件开始构建图形配置界面。