0
点赞
收藏
分享

微信扫一扫

《DFZU2EG_4EV MPSoC之嵌入式Linux开发指南》 第十四章 Linux图形化配置及其原理​

Linux图形化配置及其原理​

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



U-Boot图形化配置体验

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

sudo apt-get install build-essential libncurses5 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- zynq_altk_defconfig​
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig

如果显示如下所示错误信息:

Your display is too small to run Menuconfig!​
It must be at least 19 lines by 80 columns.​
scripts/kconfig/Makefile:37: recipe for target 'menuconfig' failed​
make[1]: *** [menuconfig] Error 1​
Makefile:479: recipe for target 'menuconfig' failed​
make: *** [menuconfig] Error 2

这是因为终端窗口有点小了,用鼠标调大点就可以了。

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

《DFZU2EG_4EV MPSoC之嵌入式Linux开发指南》  第十四章   Linux图形化配置及其原理​_配置项


14.1.1图形化配置界面

上图就是主界面,主界面上方的英文就是简单的操作说明,操作方法我们在使用Petalinux时已经介绍过,具体见6.3.4配置petalinux工程

uboot有许多配置项,可通过键盘上的上下键移动到配置项。后面跟着“--->”表示此配置项有子配置项,按回车键就可以进入子配置项。

我们以如何使能dns命令为例,讲解一下如何通过图形化界面来配置uboot。进入“Command line interface --->”这个配置项,此配置项用于配置uboot的命令,进入以后如下图所示:

《DFZU2EG_4EV MPSoC之嵌入式Linux开发指南》  第十四章   Linux图形化配置及其原理​_图形化_02


14.1.2 Command line interface配置项

从上图可以看出,有很多配置项,这些配置项也有子配置项,选择“Network commands --->”,进入网络相关命令配置项,如下图所示:

《DFZU2EG_4EV MPSoC之嵌入式Linux开发指南》  第十四章   Linux图形化配置及其原理​_配置项_03


14.1.3 Network commands配置项

从上图可以看出,uboot中有很多和网络有关的命令,比如bootp、tftpboot、dhcp等等。选中dns,然后按下键盘上的“Y”键,此时dns前面的“[ ]”变成了“[ * ]”,如下图所示:

《DFZU2EG_4EV MPSoC之嵌入式Linux开发指南》  第十四章   Linux图形化配置及其原理​_图形化_04


14.1.4选中dns命令

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

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

《DFZU2EG_4EV MPSoC之嵌入式Linux开发指南》  第十四章   Linux图形化配置及其原理​_图形化_05


14.1.5命令提示信息

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

《DFZU2EG_4EV MPSoC之嵌入式Linux开发指南》  第十四章   Linux图形化配置及其原理​_示例代码_06


14.1.6是否保存新的配置文件对话框

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

《DFZU2EG_4EV MPSoC之嵌入式Linux开发指南》  第十四章   Linux图形化配置及其原理​_示例代码_07


14.1.7.config文件

使用如下命令编译uboot:

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j8

编译完成以后下载到开发板中运行,下载方式见12.3.3。下载完成后输入“?”查看是否有“dns”命令,一般肯定有的。测试一下dns命令工作是否正常,使用dns命令来查看一下百度官网“www.baidu.com”的IP地址。要先设置一下dns服务器的IP地址,也就是设置环境变量dnsip的值,命令如下:

setenv dnsip 114.114.114.114​
saveenv

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

dns www.baidu.com

结果如下图所示:

《DFZU2EG_4EV MPSoC之嵌入式Linux开发指南》  第十四章   Linux图形化配置及其原理​_示例代码_08


14.1.8命令

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

menuconfig图形化配置原理

make menuconfig过程分析

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

示例代码顶层Makefile代码

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

这个在错误!未找到引用源。小节已经详细的讲解过了,其中build=-f ./scripts/Makefile.build obj,将479行的规则展开就是:

@ make -f ./scripts/Makefile.build obj=scripts/kconfig menuconfig //也可以没有@

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

示例代码

36 menuconfig: $(obj)/mconf​
37 $< $(silent) $(Kconfig)

其中obj= scripts/kconfig,silent是设置静默编译的,在这里可以忽略不计,Kcnotallow=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文件开始构建图形配置界面。

Kconfig语法简介

上一小节我们已经知道了scripts/kconfig/mconf会调用uboot根目录下的Kconfig文件开始构建图形化配置界面,接下来简单学习一下Kconfig的语法。因为后面学习Linux驱动开发的时候可能会涉及到修改Kconfig,对于Kconfig语法我们不需要太深入的去研究,关于Kconfig的详细语法介绍,可以参考linux内核源码(uboot源码中没有这个文件)中的文件Documentation/kbuild/kconfig-language.txt,本节我们大概了解其原理即可。打开uboot根目录下的Kconfig,这个Kconfig文件就是顶层Kconfig,我们就以这个文件为例来简单学习一下Kconfig语法。

1、mainmenu

故名思议mainmenu就是主菜单,也就是输入“make menuconfig”以后打开的默认界面,在顶层Kconfig中有如下代码:

示例代码顶层Kconfig代码段

6 mainmenu "U-Boot $UBOOTVERSION Configuration"

上述代码就是定义了一个名为“U-Boot $UBOOTVERSION Configuration”的主菜单,其中UBOOTVERSION=2018.01,因此主菜单名为“U-Boot 2018.01 Configuration”,如下图所示:

《DFZU2EG_4EV MPSoC之嵌入式Linux开发指南》  第十四章   Linux图形化配置及其原理​_示例代码_09


14.2.1主菜单名字

2、调用其他目录下的Kconfig文件

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

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

在顶层Kconfig中有如下代码:

示例代码顶层Kconfig代码段source代码

13 source "arch/Kconfig"​
......​
403 source "api/Kconfig"​
404 ​
405 source "common/Kconfig"​
406 ​
407 source "cmd/Kconfig"​
408 ​
409 source "disk/Kconfig"​
410 ​
411 source "dts/Kconfig"​
412 ​
413 source "env/Kconfig"​
414 ​
415 source "net/Kconfig"​
416 ​
417 source "drivers/Kconfig"​
418 ​
419 source "fs/Kconfig"​
420 ​
421 source "lib/Kconfig"​
422 ​
423 source "test/Kconfig"

从上述示例代码中可以看出,顶层Kconfig文件调用了很多其他子目录下的Kcofig文件,这些子目录下的Kconfig文件在主菜单中生成各自的菜单项。

3、menu/endmenu条目

menu用于生成菜单,endmenu就是菜单结束标志,这两个成对出现,用于定义一个拥有若干配置选项或子菜单的配置菜单。在顶层Kconfig中有如下代码:

示例代码顶层Kconfig代码段menu代码

15 menu "General setup"​
16 ​
17 config BROKEN​
18 bool​
19 help​
20 This option cannot be enabled. It is used as dependency​
21 for broken and incomplete features.​
......​
184 endmenu # General setup​
185 ​
186 menu "Boot images"​
187 ​
188 config ANDROID_BOOT_IMAGE​
189 bool "Enable support for Android Boot Images"​
......​
401 endmenu # Boot images

上述示例代码中有两个menu/endmenu代码块,这两个代码块就是两个子菜单。第15行的“menu "General setup"”表示子菜单“General setup”。第186行的“menu "Boot images"”表示子菜单“Boot images”。体现在主菜单界面的效果如下图所示:

《DFZU2EG_4EV MPSoC之嵌入式Linux开发指南》  第十四章   Linux图形化配置及其原理​_配置项_10


14.2.2子菜单

在“General setup”菜单上面还有“Architecture select (ARM architecture)”和“ARM architecture”这两个子菜单,但是在顶层Kconfig中并没有看到这两个子菜单对应的menu/endmenu代码块,那这两个子菜单是怎么来的呢?这两个子菜单就是arch/Kconfig文件生成的。包括主界面中的“Boot timing”、“Console recording”等等这些子菜单,都是分别由顶层Kconfig所调用的common/Kconfigcmd/Kconfig等这些子Kconfig文件来创建的。

3、config条目

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

示例代码顶层Kconfig代码段

15 menu "General setup"​
16 ​
17 config BROKEN​
18 bool​
19 help​
20 This option cannot be enabled. It is used as dependency​
21 for broken and incomplete features.​
22 ​
23 config LOCALVERSION​
24 string "Local version - append to U-Boot release"​
25 help​
......​
86 config SYS_MALLOC_F​
87 bool "Enable malloc() pool before relocation"​
88 default y if DM​
89 help​
......​
95 config SYS_MALLOC_F_LEN​
96 hex "Size of malloc() pool before relocation"​
97 depends on SYS_MALLOC_F​
98 default 0x400​
99 help​
......​
132 menuconfig EXPERT​
133 bool "Configure standard U-Boot features (expert users)"​
134 default y​
135 help​
......​
141 if EXPERT​
142 config SYS_MALLOC_CLEAR_ON_INIT​
143 bool "Init with zeros the memory reserved for malloc (slow)"​
144 default y​
145 help​
......​
166 endif # EXPERT​
......​
184 endmenu # General setup

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

《DFZU2EG_4EV MPSoC之嵌入式Linux开发指南》  第十四章   Linux图形化配置及其原理​_配置项_11


14.2.3 General setup配置项

可以看到“config LOCALVERSION”对应着第一个配置项,“config LOCALVERSION_AUTO”对应着第二个配置项,以此类推,至于为什么没有“config BROKEN”的配置项,后面会说明。我们以“config LOCALVERSION”和“config LOCALVERSION_AUTO”这两个为例来分析一下config配置项的语法:

示例代码顶层Kconfig代码段

23 config LOCALVERSION​
24 string "Local version - append to U-Boot release"​
25 help​
26 Append an extra string to the end of your U-Boot version.​
......​
31 be a maximum of 64 characters.​
32​
33 config LOCALVERSION_AUTO​
34 bool "Automatically append version information to the version string"​
35 default y​
36 help​
37 This will try to automatically determine if the current tree is a​
38 release tree by looking for Git tags that belong to the current​
39 top of tree revision.​
......​
51 which is done within the script "scripts/setlocalversion".)

2333行,这两行都以“config”关键字开头,后面跟着“LOCALVERSION”和“LOCALVERSION_AUTO”,这两个是配置项名字。假如我们使能了LOCALVERSION_AUTO这个功能,那么就会在.config文件中生成CONFIG_LOCALVERSION_AUTO,这个在上一小节讲解如何使能dns命令的时候讲过了。由此可知,.config文件中的“CONFIG_xxx”(xxx是具体的配置项名字)就是Kconfig文件中config关键字后面的配置项名字加上“CONFIG_”前缀。

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

24行的string是变量类型,也就是“CONFIG_ LOCALVERSION”的变量类型。变量类型一共有5种,分别是:bool、tristate、string、hex和int,最常用的是bool、tristate和string这三种。bool类型有两种值:y和n,当为y的时候表示使能该配置项,当为n的时候表示禁止该配置项。tristate类型有三种值:y、m和n,其中y和n的涵义与bool类型一样,m表示将这个配置项编译为模块。string为字符串类型,所以LOCALVERSION是个字符串变量,用来存储本地字符串,选中以后即可输入用户定义的本地版本号,如下图所示:

《DFZU2EG_4EV MPSoC之嵌入式Linux开发指南》  第十四章   Linux图形化配置及其原理​_示例代码_12


14.2.4本地版本号配置

可以在上图中输入本地版本号,此处我们只是演示下,不输入,直接按“OK”退出。

另外,可以看到“string”后面的“Local version - append to U-Boot release”对应该配置项在图形界面上显示出来的标题。也就是说变量类型后面的输入提示会显示在图形配置界面上。由于“config BROKEN”只有“boot”变量类型,没有对应输入提示,所以没有显示在图形配置界面上。

25行,help表示帮助信息,告诉我们配置项的含义,当我们按下“h”或“?”弹出来的帮助界面就是help的内容。

34行,说明“CONFIG_LOCALVERSION_AUTO”是个bool类型,可以通过按下Y或N键来使能或者禁止CONFIG_LOCALVERSION_AUTO

35行,“default y”表示CONFIG_LOCALVERSION_AUTO的默认值就是y,所以这一行默认会被选中。

4、depends on和select

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

示例代码

1 menu "ARM architecture"​
2 depends on ARM​
3 ​
4 config SYS_ARCH​
5 default "arm"​
6 ​
7 config ARM64​
8 bool​
9 select PHYS_64BIT​
10 select SYS_CACHE_SHIFT_6

2行的“depends on”说明“ARM architecture”项依赖于“ARM”,也就是说“ARM”被选中以后“ARM architecture”才会显示。

9~10行的“select”表示反向依赖,当选中“ARM64”以后,“PHYS_64BIT”、“SYS_CACHE_SHIFT_6”这两个也会被选中。

4、choice/endchoice

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

示例代码

7 choice​
8 prompt "Architecture select"​
9 default SANDBOX​
10 ​
11 config ARC​
12 bool "ARC architecture"​
......​
20 config ARM​
21 bool "ARM architecture"​
......​
30 config MICROBLAZE​
31 bool "MicroBlaze architecture"​
......​
1156 ​
1157 endchoice

choice/endchoice代码段用来定义一组可选择项,将多个类似的配置项组合在一起,供用户单选或者多选。上述示例代码就是选择处理器架构,可以从ARC、ARMMICROBLAZE等这些架构中选择,这里是单选。在uboot图形配置界面上选择“Architecture select”,进入以后如下图所示:

《DFZU2EG_4EV MPSoC之嵌入式Linux开发指南》  第十四章   Linux图形化配置及其原理​_图形化_13


14.2.5架构选择界面

可以在上图中通过移动光标来选择所使用的CPU架构。第8行的prompt给出这个choice/endchoice段的提示信息为“Architecture select”。

5、menuconfig

menuconfig和menu很类似,但是menuconfig是个带选项的菜单,其一般用法为:

示例代码

1 menuconfig MODULES ​
2 bool "菜单"​
3 if MODULES​
4 ...​
5 endif # MODULES

第1行,定义了一个可选的菜单MODULES,只有选中了MODULES后第3~5行的if到endif之间的内容才会显示。在顶层Kconfig中有如下代码:

示例代码顶层Kconfig代码段

15 menu "General setup"​
......​
132 menuconfig EXPERT​
133 bool "Configure standard U-Boot features (expert users)"​
134 default y​
135 help​
136 This option allows certain base U-Boot options and settings​
137 to be disabled or tweaked. This is for specialized​
138 environments which can tolerate a "non-standard" U-Boot.​
139 Use this only if you really know what you are doing.​
140 ​
141 if EXPERT​
142 config SYS_MALLOC_CLEAR_ON_INIT​
143 bool "Init with zeros the memory reserved for malloc (slow)"​
144 default y​
145 help​
146 This setting is enabled by default. The reserved malloc​
147 memory is initialized with zeros, so first malloc calls​
......​
157 ​
158 config TOOLS_DEBUG​
159 bool "Enable debug information for tools"​
160 help​
161 Enable generation of debug information for tools such as mkimage.​
162 This can be used for debugging purposes. With debug information​
163 it is possible to set breakpoints on particular lines, single-step​
164 debug through the source code, etc.​
165 ​
166 endif # EXPERT​
......​
184 endmenu # General setup

第132~166行使用menuconfig实现了一个菜单,路径如下:

General setup ​
-> Configure standard U-Boot features (expert users) --->

如下图所示:

《DFZU2EG_4EV MPSoC之嵌入式Linux开发指南》  第十四章   Linux图形化配置及其原理​_配置项_14


14.2.6菜单Configure standard U-Boot features (expert users)

从上图可以看到,前面有“[ ]”说明这个菜单是可选的,当选中这个菜单以后就可以进入到子选项中,也就是示例代码“menuconfig EXPERT”的第141~166行所描述的配置项,如下图所示:

《DFZU2EG_4EV MPSoC之嵌入式Linux开发指南》  第十四章   Linux图形化配置及其原理​_图形化_15


14.2.7 EXPERT子菜单

如果不使能“Configure standard U-Boot features (expert users)”菜单,那么示例代码“menuconfig EXPERT”的第141~166行所描述的配置项就不会显示出来,进去以后是空白的,不显示配置项。

6、comment

comment用于注释,也就是在图形化界面中显示一行注释,打开文件cmd/Kconfig,有如下所示代码:

示例代码cmd/Kconfig代码段

117 source "cmd/fastboot/Kconfig"​
118 ​
119 config BUILD_BIN2C​
120 bool​
121 ​
122 comment "Commands"

122行使用comment标注了一行注释,注释内容为:“Commands”,该行注释在配置项Command line interface的下面。在uboot图形配置界面上选择“Command line interface --->”,进入后如下图所示:

《DFZU2EG_4EV MPSoC之嵌入式Linux开发指南》  第十四章   Linux图形化配置及其原理​_示例代码_16


14.2.8注释“Generic NAND options

从上图可以看出,在配置项“Fastboot support”下面有一行注释,注释内容为“*** Commands ***”。

7、source

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

source "arch/Kconfig"

这个在前面已经讲过了。

Kconfig语法就讲解到这里,基本上常用的语法就是这些,因为uboot相比Linux内核要小很多,所以配置项也要少很多,所以建议大家使用uboot来学习Kconfig。一般无需修改uboot中的Kconfig文件,甚至都不会去使用uboot的图形化界面配置工具,本小节学习Kconfig的目的主要还是为了Linux内核作准备。

添加自定义菜单

图形化配置工具的主要工作是在.config文件下面生成前缀为“CONFIG_”的变量,这些变量一般都有对应的值,为y、m、字符串或数字,在uboot源码里面会根据这些变量来决定编译哪些文件。本小节我们就来学习一下如何添加自定义菜单。添加的自定义菜单需求如下:

  1. 在主界面中添加一个名为“My test menu”的菜单,此菜单内部有一个配置项。
  2. 配置项为“MY_TESTCONFIG”,此配置项处于菜单“My test menu”中。
  3. 配置项的变量类型为bool,默认值为y。
  4. 配置项标题名(变量名)为“This is my test config”。
  5. 配置项的帮助信息为“This is a empty config, just for tset!”。

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

示例代码自定义菜单

1 menu "My test menu"​
2 ​
3 config MY_TESTCONFIG​
4 bool "This is my test config"​
5 default y​
6 help​
7 This is a empty config, just for tset!​
8 ​
9 endmenu # my test menu

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

《DFZU2EG_4EV MPSoC之嵌入式Linux开发指南》  第十四章   Linux图形化配置及其原理​_配置项_17


14.3.1主界面

从上图可以看出,主配置界面最后面出现了一个名为“My test menu”的菜单,这个就是我们添加进来的自定义菜单。进入此菜单,如下图所示:

《DFZU2EG_4EV MPSoC之嵌入式Linux开发指南》  第十四章   Linux图形化配置及其原理​_图形化_18


14.3.2“My test menu”子菜单

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

《DFZU2EG_4EV MPSoC之嵌入式Linux开发指南》  第十四章   Linux图形化配置及其原理​_配置项_19


14.3.3帮助信息

从上图可以看出,帮助信息也显示正确。配置项“MY_TESTCONFIG”默认也是被选中的,因此在图形界面点击“Save”后退出,在.config文件中会有“CONFIG_MY_TESTCONFIG=y”这一行,如下图所示:

《DFZU2EG_4EV MPSoC之嵌入式Linux开发指南》  第十四章   Linux图形化配置及其原理​_图形化_20


14.3.4.config文件

至此,我们成功的在主菜单添加的自定义菜单。以后大家如果去半导体原厂工作的话,如果要编写Linux驱动,那么很有可能需要你来修改甚至编写Kconfig文件。Kconfig语法其实不难,重要的点就是14.2.2小节中的那几个,最主要的是记住:Kconfig文件的最终目的是在.config文件中生成以“CONFIG_”开头的变量。


举报

相关推荐

0 条评论