1)实验平台:正点原子Linux开发板
2)摘自《正点原子I.MX6U嵌入式Linux驱动开发指南》
关注官方微信号公众号,获取更多资料:正点原子
![0d1f4c091ab06f35fe788af061728b8d.png](https://i-blog.csdnimg.cn/blog_migrate/42aa5c58ba10ad1ce73f71fdf6660faf.jpeg)
在前两章中我们知道uboot可以通过mx6ull_alientek_emmc_defconfig来配置,或者通过文件mx6ull_alientek_emmc.h来配置uboot。还有另外一种配置uboot的方法,就是图形化配置,以前的uboot是不支持图形化配置,只有Linux内核才支持图像化配置。不过不知道从什么时候开始,uboot也支持图形化配置了,本章我们就来学习一下如何通过图形化配置uboot,并且学习一下图形化配置的原理,因为后面学习Linux驱动开发的时候可能要修改图形配置文件。
34.1 U-Boot图形化配置体验
uboot或Linux内核可以通过输入"makemenuconfig"来打开图形化配置界面,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文件。
在打开图形化配置界面之前,要先使用"makexxx_defconfig"对uboot进行一次默认配置,只需要一次即可。如果使用"makeclean"清理了工程的话就那就需要重新使用"makexxx_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的值,那么上述命令可以简化为:
makemx6ull_alientek_emmc_defconfig
makemenuconfig
打开后的图形化界面如图34.1.1所示:
![bbfc1d5c1765abded57f3cd681b914b6.png](https://i-blog.csdnimg.cn/blog_migrate/e8348a8cbfd7fcdd6afe91a2d4c694bc.jpeg)
图34.1.1 uboot图形化配置界面
图34.1.1就是主界面,主界面上方的英文就是简单的操作说明,操作方法如下:
通过键盘上的"↑"和"↓"键来选择要配置的菜单,按下"Enter"键进入子菜单。菜单中高亮的字母就是此菜单的热键,在键盘上按下此高亮字母对应的键可以快速选中对应的菜单。选中子菜单以后按下"Y"键就会将相应的代码编译进Uboot中,菜单前面变为"< * >"。按下"N"键不编译相应的代码,按下"M"键就会将相应的代码编译为模块,菜单前面变为"< M >"。按两下"Esc"键退出,也就是返回到上一级,按下"?"键查看此菜单的帮助信息,按下"/"键打开搜索框,可以在搜索框输入要搜索的内容。
在配置界面下方会有五个按钮,这五个按钮的功能如下:
:选中按钮,和"Enter"键的功能相同,负责选中并进入某个菜单。
:退出按钮,和按两下"Esc"键功能相同,退出当前菜单,返回到上一级。
:帮助按钮,查看选中菜单的帮助信息。
:保存按钮,保存修改后的配置文件。
:加载按钮,加载指定的配置文件。
在图34.1.1中共有13个配置主配置项,通过键盘上的上下键调节配置项。后面跟着"--->"表示此配置项是有子配置项的,按下回车键就可以进入子配置项。
我们就以如何使能dns命令为例,讲解一下如何通过图形化界面来配置uboot。进入"Command line interface --->"这个配置项,此配置项用于配置uboot的命令,进入以后如图34.1.2所示:
![ed012457ea1df215b06c50e3dda63352.png](https://i-blog.csdnimg.cn/blog_migrate/f9b24418f963ed65fbd3220596659497.jpeg)
图34.1.2 Command line interface配置项
从图34.1.2可以看出,有很多配置项,这些配置项也有子配置项,选择"Network commands --->",进入网络相关命令配置项,如图34.1.3所示:
![6a61da49866950ab528fdc562bc49471.png](https://i-blog.csdnimg.cn/blog_migrate/c54b4e311567a0c2f87b000fee868ba7.jpeg)
图34.1.3 Network commands配置项
从图34.1.3可以看出,uboot中有很多和网络有关的命令,比如bootp、tftpboot、dhcp等等。选中dns,然后按下键盘上的"Y"键,此时dns前面的"[ ]"变成了"[ * ]",如图34.1.4所示:
![6dc5fc6e4529de2c13b21cfc8bedbcc8.png](https://i-blog.csdnimg.cn/blog_migrate/35a9ca8ea8a66603e1df052b8ebb12fc.jpeg)
图34.1.4 选中dns命令
每个选项有3种编译选项:编译进uboot中(也就是编译进u-boot.bin中)、取消编译(也就是不编译这个功能模块)、编译为模块。按下"Y"键表示编译进uboot中,此时"[ ]"变成了"[ * ]";按下"N"表示不编译,"[ ]"默认表示不编译;有些功能模块是支持编译为模块的,这个一般在Linux内核里面很常用,uboot下面不使用,如果要将某个功能编译为模块,那就按下"M",此时"[ ]"就会变为"< M >"。
细心的朋友应该会发现,在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就会识别出错。
选中dns,然后按下"H"或者"?"键可以打开dns命令的提示信息,如图34.1.5所示:
![b1756c36a1f953feba538b361cd3c24b.png](https://i-blog.csdnimg.cn/blog_migrate/33a4f6d91732c8d2b28f86d8d97e07ab.jpeg)
图34.1.5 dns命令提示信息
按两下ESC键即可退出提示界面,相当于返回上一层。选择dns命令以后,按两下ESC键(按两下ESC键相当于返回上一层),退出当前