一、前言
在上一篇STM32MP157的教程中,为大家讲解了STM32MP157 U-Boot中网络相关的配置以及网络命令的使用,我们也学习了如何从网络拉取系统内核并且启动。在编译Uboot时,我们使用“make stm32mp15_trusted_defconfig”命令,将默认的配置加载到.config文件中,这里的.config文件就是我们Uboot编译的核心依据。我们可以通过修改.config文件本身从而来修改配置,但是这样太麻烦并且不够直观。于是就引入了图形化配置Uboot这个概念。不止是在编译Uboot时,我们编译内核时或者学习Linux驱动开发时,可能都会使用到图形化来配置相关项。所以本次教程,我们就来教大家如何图形配置Uboot,如果你准备好了,就让我们开始吧!
二、谁适合本次教程
本次教程需要大家已经编译好Uboot,这是必须的。我们本次只讲解Uboot的图形化配置,不管你使用的开发板是不是正点原子的,都可以看本次教程。Uboot与Linux内核的图形化配置的道理都是一样的。如果你还不会编译Uboot可以看下面的教程:
STM32MP157 Uboot移植:[Linux]从零开始的STM32MP157 U-Boot移植_mp157 移植uboot-优快云博客
三、Uboot图形化配置界面启动
在启动Uboot图形化界面之前,我们需要进行一些简单的配置,这里我们首先需要安装一下Uboot图形化配置所需的软件。
我们可以在编译Uboot或者Linux内核时使用“make menuconfig”命令来启动图形化配置界面。“menuconfig”是一套图形化配置工具,通过读取Kconfig文件来构建菜单。这里我们需要运行“menuconfig”工具需要安装一些依赖,这里我们直接使用下方命令安装所需的库:
sudo apt-get install build-essential libncurses5-dev
不管你之前有没有安装过,这里都执行一下命令,这里一定要确保自己已经安装好了。
当我们使用menuconfig主要会使用到两个文件,一个是.config,另一个是Kconfig文件。Kconfig文件主要用于生成图形化菜单的目录,.config文件我们之前在之前就已经提到过了,它是用于编译Uboot和Linux核心的依据,这些配置文件在编译时就会被使用。
当我们安装好所需的环境以后,就可以准备启动Uboot的图形化配置界面了,这里我们需要将路径切换到之前编译Uboot的路径下面,如果编译过Uboot的小伙伴应该都有这个目录,这里就不多说了,进入Uboot的源码目录以后就能看到以下文件夹了:
这里我们直接在Uboot的源码目录下启动输入下面的命令生成一下".config"文件,这里不管你之前有没有生成过,都使用下面的命令生成一下:
make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabihf- stm32mp15_atk_trusted_defconfig
这里的ARCH表示指定架构,CROSS_COMPILE指定了编译使用的架构,这些在之前就讲过了,这里就不多讲了。命令执行以后,就会出现下面的输出:
这里被提示,已经成功写入“.config”文件了。
在收到这个提示以后,我们就可以直接在Uboot的源码目录下使用下面的命令来启动Uboot的图形化配置界面了:
make menuconfig
如果你在输入命令时,出现下面这样的错误:
这个错误表示终端的像素不够显示图形化界面,这里大家把终端拉大一些就行了。
再次输入命令并且回车以后,我们的Uboot图形化配置界面就启动了:
至此,我们Uboot图像化配置界面的启动就完成了。
四、Uboot图像化配置界面的基础操作
当我们启动了Uboot的图形化配置界面以后,我们就可以来学习来学习一下这个界面的基础操作。这里的操作逻辑其实和Uboot大部分的Linux中的半图形化逻辑都差不多,大家接触这么久Linux了,相信这里的操作应该不会难到大家。下面,我们就来学习一下Uboot的图像化配置的基础操作吧!
在图像化界面中,我们可以通过键盘中的“↑”和“↓”键来切换我们选中的项:
假如一个选项的后面跟着“--->”表示这个选项的下方还有菜单,我们可以按键盘的“回车”进入这个菜单,我这里进入了“API”的相关菜单,如图所示:
当我们想启用一个功能时,我们可以我们可以选中这个功能,我们按下键盘上的“Y”就可以启用这个功能:
当我们看到括号中有“*”以后,我们就启用这个选项了。假如我们要取消选中某个选项,我们可以在选中选项时按下键盘的“N”键,我们就可以看到括号中没有任何标识了:
当我们没有启用这个模块以后,这个模块不会被编译。当我们配置好以后,我们可以按下键盘上的“TAB”键切换下方的选项:
这里当我们每次都配置好以后,我们将下方的选项切换到“Save”,然后点击键盘上的“回车”,这里问我们要不要保存到“.config”文件中,我们选择“OK”,再回车:
这里提示我们配置已经写入到配置文件了:
我们再次回车就会返回我们的上一个界面了:
这里要提醒大家的是,在以后,如果通过图形化配置了Uboot中的什么内容,一定要记得用上面的步骤进行保存。
如果我们想要返回上一级菜单,我们只需要按两次“ESC”:
以上就是Uboot图像化配置工具的基础操作,后面的所有操作都是基于这个基础操作的。
五、menuconfig工具图形化配置原理
menuconfig工具的启动以及图形化配置正点原子的文档中讲得已经很详细了,建议大家去看正点原子的文档。这里我就基于我的理解来简单讲解一下。
1.make menuconfig过程分析
当我们输入make menuconfig命令以后,make会在顶层Makefile中匹配到以下代码:
这里“build”的值为“-f ./scripts/Makefile.build obj”,所以这里的542行展开就是:
@ make -f ./scripts/Makefile.build obj=scripts/kconfig menuconfig
其中“Makefile.build”会读取“scripts/kconfig/Makefile”中的内容,我们在“scripts/kconfig/Makefile”中的差不多34行可以看到下面的代码:
其中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”时会调用Uboot目录下的Kconfig来构建界面。
2.Kconfig 语法简介
知道了执行了命令以后调用的是哪里的Kconfig以后,我们就可以来了解一下Kconfig的语法。当我们执行“make menuconfig”以后会调用Uboot项目目录下的Kconfig来构建图像化界面,这里不妨我们就直接打开这个Kconfig文件看看,打开Kconfig以后就能看到以下的内容了:
这里我们可以看到第6行,也就是“mainmenu "U-Boot $UBOOTVERSION Configuration"”这一行定义了主菜单,并且传入了“$UBOOTVERSION”参数,也就是说,这一行会打印Uboot的版本号以及引号内的内容,这里我们可以直接在图形化界面中找到对应的,也很好找,这里的“mainmenu”不就是主菜单的意思吗?我们很轻松的就定位到了,如下图:
这里我们再往下看,可以看到“source "arch/Kconfig"”这样一行,这表示在这个Kconfig文件中引用了别的目录下的Kconfig文件:
这里我们往下滑就可以看到,在我们顶层的Kconfig中几乎引用了整个Uboot工程的Kconfig,这也是为什么我们只需要启动一个顶层Config就可以完成对整个Uboot的配置:
这里我们再次回到上面,我们可以看到在我们主菜单的下方,在Kconfig文件中,主菜单的描述语句过了以后直接就是“General setup”,并没有最开始两行的描述。这前面的两行就来自我们使用“source”语句引用的“arch/Kconfig”文件得到的:
在Kconfig的语法中,我们规定,一个能够展开的菜单以“menu”语句为开头,例如刚才我们看到的“menu "General setup"”:
并且规定以“endmenu”为一个菜单的结尾,我们来到下面的575行左右就可以看到“General setup”菜单的结尾:
现在还是拿“General setup”来举例,我们可以看到,在“General setup”有很多“config xxxx”的配置条目,这就是“General setup”菜单的具体配置项:
在图像化配置界面中进入“General setup”菜单下,就可以看到具体的配置项了,这里我们可以看到第一条配置名为“Local version - append to U-Boot release”,它来自“config LOCALVERSION”,如图所示:
以此,我们就能找到规律config后面跟着的就是我们配置.config的配置项,例如“LOCALVERSION”,“LOCALVERSION_AUTO”等:
在.config文件中我们能找到这些配置项:
在“config xxxx”语句的下一句就是这个变量的类型,我们可以看到string,bool等:
在数据类型的的后面,跟着的就是这个配置项在菜单中的描述,我们可以对照着看:
这里前面的string表示这个项可以传入一个字符串,我们对着这个菜单直接回车,就会提示我们输入一段字符串:
当然,bool类型就很好理解,直接就是y和n的区别,也就是使不使能的关系:
但是我们也可以看到在“config LOCALVERSION”之前还有两条配置,但是并没有显示在图像化中:
按照正点原子的说法,这两条配置并没有使能,所以没有显示。
以上,就是Kconfig的基础语法。
六、结语
借助menuconfig进行图形化配置是我们学习Linux开发中比较重要的一个环节,在后面的学习中我们也会经常用到图形化配置。那么最后,感谢大家的观看!