1. U-Boot图形化配置体验
前面用了mx6ull_alientek_emmc_defconfig和mx6ull_alientek_emmc.h对uboot进行了配置,还有一种方式是图形化配置。后面学习linux驱动开发也需要学会图形配置。
由于Makefile中已经有ARCH和CROSS_COMPILE的值,直接输入以下代码打开图形化配置界面:
make mx6ull_alientek_emmc_defconfig
make menuconfig
以使能dns命令为例:
①选中“Command line interface —>”这个配置项,该主配置项用于配置uboot的命令。
②进入后,选择“Network commands —>”进入网络相关命令配置项。
③选中dns,然后按下"Y",dns前面的[ ]变为[ * ]
④Y表示编译进uboot中;按下N表示不编译,对应“[ ]”;按下M表示编译为模块,一般用于linux内核不用于uboot,对应“[ M ]”
⑤保存退出,打开.config文件,多了一行“CONFIG_CMD_DNS=y”。
⑥输入以下命令编译uboot(千万不能使用.sh,会清除掉.config,导致图形化配置失效,除非删掉.sh里面的distclean):
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j16
⑦打开uboot,设置dns服务器IP地址:
setenv dnsip 114.114.114.114
⑧将开发板直接接到路由器,要访问外部互联网,输入“dns www.xxx.com”即可查看对应网站IP地址。
需要注意的是,menuconfig是通过读取.config文件来判断使用了哪些命令,所以这里dhcp和ping命令是“[ ]”,实际上这两个命令定义在.h的宏中,实际上是会编译的。
2. U-Boot图形化配置原理
2.1 make menuconfig过程分析
输入该命令后,匹配到顶层make的以下代码:
%config: scripts_basic outputmakefile FORCE
$(Q)$(MAKE) $(build)=scripts/kconfig $@
/*展开:@ make -f ./scripts/Makefile.build obj=scripts/kconfig menuconfig*/
这一句命令会读取scripts/kconfig/Makefile的以下代码。
目标menuconfig依赖于scripts/kconfig/mconf,所以mconf.c会编译生成mconf可执行文件。menuconfig对应规则为scripts/kconfig/mconf Kconfig,所以mconf会调用uboot根目录下的Kconfig文件开始构建图形配置界面。
menuconfig: $(obj)/mconf
$< $(silent) $(Kconfig)
/*展开:
menuconfig: scripts/kconfig/mconf
scripts/kconfig/mconf Kconfig
*/
2.2 Kconfig语法简介
打开顶层Kconfig:
/*定义了一个名为“U-Boot $U...”的主菜单*/
mainmenu "U-Boot $UBOOTVERSION Configuration"
/*调用其它子Kconfig*/
source "xxx/Kconfig"
/*meun生成菜单,endmenu结束菜单*/
/*config条目-菜单的具体配置项*/
config xxx
/*如果xxx配置项使能了,就会在.config中生成CONFIG_xxx*/
comment "Generic NAND options" /*图形化界面中注释*/
打开arch/Kconfig:
/*deoends on说明SYS_依赖于HAVE_*/
config SYS_GENERIC_BOARD
bool
depends on HAVE_GENERIC_BOARD
/*select表示方向依赖,选中ARC后,HAVE_也会被选中*/
config ARC
bool "ARC architecture"
select HAVE_PRIVATE_LIBGCC
/*choice/endchoice定义了一组可选择项*/
/*prompt是这个段的提示信息:选择CPU架构*/
choice
prompt "Architecture select"
default SANDBOX
...
endchoice
menuconfig基本用法:
/*定义了一个可选菜单MODULES,只有选中MODULES才会显示if中的内容*/
menuconfig MODULES
bool "菜单"
if MODULES
...
endif # MODULES
2.3 添加自定义菜单
要求如下:
①在主界面中添加一个名为“My test menu”,此菜单内部有一个配置项。
②配置项为“MY_TESTCONFIG”,此配置项处于菜单“My test menu”中。
③配置项的为变量类型为 bool,默认值为 y。
④配置项菜单名字为“This is my test config”
⑤配置项的帮助内容为“This is a empty config, just for tset!”。
在顶层Kconfig加入以下代码:
menu "My test menu"
config MY_TESTCONFIG
bool "This is my test config"
default y
help
This is a empty config, just for test!
endmenu # my test menu
在.config文件中找到了: