i.MX8MM处理器采用了先进的14LPCFinFET工艺,提供更快的速度和更高的电源效率;四核Cortex-A53,单核Cortex-M4,多达五个内核 ,主频高达1.8GHz,2G DDR4内存、8G EMMC存储。千兆工业级以太网、MIPI-DSI、USB HOST、WIFI/BT、4G模块、CAN、RS485等接口一应俱全。H264、VP8视频硬编码,H.264、H.265、VP8、VP9视频硬解码,并提供相关历程,支持8路PDM接口、5路SAI接口、2路Speaker。系统支持Android9.0(支持获取root限)Linux4.14.78+Qt5.10.1、Yocto、Ubuntu20、Debian9系统。适用于智能充电桩,物联网,工业控制,医疗,智能交通等,可用于任何通用工业和物联网应用、
【公众号】迅为电子
【粉丝群】258811263(加群获取驱动文档+例程)
第六十八章u-boot图形化配置
68.1 uboot图形化配置初体验
不仅Linux内核源码有图形化配置功能,u-boot也有自己的图形化配置功能,它的目录格式和编译形式和 Linux很相似,而且部分源码也是参考的Linux。
主要依靠Makefile,.config,Kconfig,Makefile负责管理整个工程的文件。
.config负责配置那些功能模块编译进目标文件
Kconfig负责图形化配置菜单。在图形化界面选中某个功能后
源码顶层目录的.config会增加此配置选项。
使用Makefile编译u-boot镜像时会将此功能添加到u-boot。
U-Boot使用“make imx8mm_ddr4_evk_defconfig”可以对 uboot 进行一次默认配置,make distclean后默认配置就已经清除,需要重新使用“make imx8mm_ddr4_evk_defconfig”再对 uboot 进行配置。
在源码顶层目录执行make menuconfig后进入菜单配置界面,通过键盘上的“↑”和“↓”键来选择要配置的菜单,按下空格可进行选中和取消操作,按“Y”选中,菜单选项前显示“<*>”为选中;使用“N”取消,菜单选项前显示“< >”;按“M”为将相应的代码编译为模块,菜单前显示“<M>”。按下“Enter”键进入子菜单。配置界面下方有五个按钮,<Select>为选中并进入,<Exit>为返回上一层或退出,<Help>帮助,<Save>保存,<Load>加载指定的配置文件。
上一章节我们编译完成后,Makefile会生成我们需要的工程文件,在uboot源码下执行make menuconfig,会看到如下图所示:
成功打开后如下图所示:
主要的选项含义如下:
Architecture select (ARM architecture) —> 选择处理器架构,包含各种处理器架构子选项。
ARM architecture —> ARM 架构子选项(依赖于上面的Architecture select)
General setup —> 通用的配置,包含版本号,malloc池等子选项。
Boot images —> boot镜像
Command line interface —> 命令行接口,可以添加uboot命令和一些功能。
Device Tree Control —> 设备树控制
Networking support —> 网络配置
Device Drivers —> 设备驱动
File systems —> 文件系统
Library routines —> 库程序
选中<Save>保存图形化配置界面,然后就将配置信息写入到了源码根目录的configs/imx8mm_ddr4_evk_defconfig,然后点击“OK”“Exit”,如下图所示:
然后将选项移动到“Exit”,退出配置界面,如下图所示:
配置好便可以编译uboot源码了。
68.2 Kconfig语法简介
Uboot中的Kconfig语法与内核中的Kconfig语法类似,所以在学习完驱动的教程以后,我们再来看这个语法会发现十分的简单,同样,uboot中的Kconfig语法我们也不用特别的去深入研究,我们只要掌握到可以自行往uboot中添加自己的配置即可。那么接下来我们就简单的来学下下Kconfig语法。
我们进到uboot源码下,打开顶层Kconfig文件,如下图所示:
打开完成后如下图所示:
上图中的第一行代码mainmenu顾名思义就是主菜单,如下图所示,也就是我们输入完make menuconfig以后默认打开的界面,
mainmenu "U-Boot $UBOOTVERSION Configuration"
从这句代码中我们可以看出主菜单的名字为“U-Boot $UBOOTVERSION Configuration”,其中$UBOOTVERSION为2018.03,如下图所示:
我们接着往下看这个Kconfig文件,我们可以发现有很多source "xxx/Kconfig"的代码,如下图所示:
source "xxx/Kconfig"的代码的意思是调用其他目录下的Kconfig文件,比如source "arch/Kconfig"就是调用arch目录下的Kconfig文件(arch/Kconfig为相对路径)。
source "xxx/Kconfig"代码下面是以menu "General setup"开头,以endmenu结尾的一大段代码,如下图所示:
我们可以把这一大段代码称为menu到endmenu代码块。那么这个代码块的作用是什么呢?其实每一个代码块代表都是一个子菜单,比如上图中的menu到endmenu代码块,代表的是General setup子菜单。也就是make menuconfig中的General setup。如下图所示:
看到这里我们其实就已经可以发现make menuconfig的架构形式了,make menuconfig中的每一级界面都是有一个Kconfig描述的,上一级的Kconfig又会包含下一节的Kconfig,这样一级一级的组织起来。
然后我们来看menu到endmenu代码块里面的config代码,如下图所示:
在一个menu到endmenu代码块里面有很多config条目,我们就以上图中的给大家举例子,刚才我们说了,menu到endmenu代码块就是子菜单,所以menu到endmenu代码块里面的config条目就是子菜单中的配置选项。make menuconfig中的体现如下图所示:
config条目中的config LOCALVERSION对应子菜单中的Local version - append to U-Boot release,第二个依次类推。注意:如果配置选项不描述是看不到的,比如menu到endmenu代码块中的BROKEN,那么我们要怎么描述呢,比如我们在BROKEN下面写上string “test”(string表示类型是string),如下图所示:
然后我们打开make menuconfig界面,进到General setup子菜单,我们就可以看到BROKEN选项了,如下图所示:
config条目中的config LOCALVERSION后面跟着的 LOCALVERSION对应的就是u-boot目录下的.config文件中的CONFIG_LOCALVERSION,如下图所示:
由此我们可知,每一个menu到endmenu代码块中的config条目,在.config中都会有一个一个对应的选项,对应关系为config条目中的config XXXX后面跟着的 XXXX对应.config文件中的CONFIG_XXXX(其中XXXX就是配置文件的名字,也就是例子中的LOCALVERSION)
menu到endmenu代码块中的config条目除了以上内容,还有一些其他的属性,比如string代表的就是变量类型,如下图所示:
变量类型可以为上图中的boot或者string,也可以为tristate或者hex和int。其中boot类型俩的值有俩种,也就是y和n,也就是说,如果我们使用了这个类型,在make menuconfig对应的选项中我们可以选择y和n,tristate的值类型有三种,分别是y,n,m。如果我们使用了这个类型,在make menuconfig对应的选项中我们可以选择y和n还有m,String就是字符串类型,如果我们使用了这个类型,在make menuconfig对应的选项中我们可以输入字符串,我们最常用的就是boot和sting。
最后,menu到endmenu代码块中的config条目的help代码的就是帮助信息,如下图所示:
我们在make menuconfig中使用?弹出来的就是这个信息,如下图所示:
在Kconfig文件中,我们看到以下代码:
其中的depends on说明FIT_SIGNATURE要依赖于DM,换句话说,也就是DM选中后FIT_SIGNATURE才可以选中,select表示反向依赖,当FIT_SIGNATURE被选中以后,RSA和CONSOLE_DISABLE_CLI也会被选中。
除了depends on和select,在Kconfig文件中我们也可以看到menuconfig,如下图所示:
图中的menuconfig是一个带菜单的选项,其结构为以menuconfig开头,以endif结尾。上图中我们定义了一个菜单EXPERT,也就是说,只有我们选中了EXPERT,if EXPERT到 endif的内容才可以显示。
在make menuconfig 中的体现如下:
还有一个比较多见的就是注释了,但是此注释非彼注释,Kconfig里面comment用于注释,但是这个注释并不是把某一行代码注释的意思,而是在图形化界面中显示一行注释,比如我们在u-boot文件夹下的顶层Kconfig中config LOCALVERSION条目下添加以下代码
comment“test”
添加完如下图所示:
在make menuconfig的表现如下:
68.3 自定义菜单
上一小节,我们了解了uboot中的Kconfig文件,那么这一小节我们就来实战一下,我们在make menuconfig中自定义一个自己选项。
1.在u-boot目录下创建一个名为toppet的文件夹,如下图所示:
2.打开u-boot下的Kconfig文件,在里面加入一下代码
source "topeet/Kconfig"
添加完成如下图所示:
3.然后进到我们在u-boot下创建的topeet文件夹,并在此文件下创建一个Kconfig文件,创建完成如下图所示:
4.我们打开创建好的这个Kconfig文件,在里面填入一下代码:
menu "test menu"
config TEST_CONFIG
bool "test"
default y
help
just test
comment "just test"
endmenu
在上面的代码中,我们在主菜单中添加了一个名为test menu的子菜单,然后在这个子菜单里面我们添加了一个名为TEST_CONFIG的配置项,这个配置项变量类型为bool,默认配置为Y,帮助信息为just test,注释为just test。
添加完成如下图所示:
添加完成以后在图形化配置界面表现如下:
在主菜单中添加的子菜单
子菜单中的配置项,默认为y,注释信息为just test。
在此界面输入?,显示帮助信息为just test,如下图所示:
然后我们打开u-boot下的.config文件,如下图所示:
我们可以在这个.config文件中找到我们添加的TEST_CONFIG(注意,我们需要在make menuconfig中保存才可以看到,否则是看不到我们添加的这个选项的)