1)实验平台:正点原子STM32MP157开发板
2) 章节摘自【正点原子】《STM32MP157嵌入式Linux驱动开发指南》
3)购买链接:https://item.taobao.com/item.htm?&id=629270721801
4)全套实验源码+手册+视频下载地址:http://www.openedv.com/docs/boards/arm-linux/zdyzmp157.html
5)正点原子官方B站:https://space.bilibili.com/394620890
6)正点原子STM32MP157技术交流群:691905614
第十四章 U-boot图形化配置及其原理
在前两章中我们知道uboot可以通过stm32mp15_trusted_defconfig来配置,或者通过文件stm32mp1.h来配置uboot。还有另外一种配置uboot的方法,就是图形化配置,以前的uboot是不支持图形化配置,只有Linux内核才支持图形化配置。不过不知道从什么时候开始,uboot也支持图形化配置了,本章我们就来学习一下如何通过图形化配置uboot,并且学习一下图形化配置的原理,因为后面学习Linux驱动开发的时候可能要修改图形配置文件。
14.1 U-Boot图形化配置体验
uboot或Linux内核可以通过输入“make menuconfig”来打开图形化配置界面,menuconfig是一套图形化的配置工具,需要ncurses库支持。ncurses库提供了一系列的API函数供调用者生成基于文本的图形界面,因此需要先在Ubuntu中安装ncurses库,命令如下:
- sudo apt-get install build-essential
- sudo apt-get install 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-none-linux-gnueabihf- stm32mp15_atk_trusted_defconfig
- make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabihf- menuconfig
复制代码
如果已经在uboot的顶层Makefile中定义了ARCH和CROSS_COMPILE的值,那么上述命令可以简化为:
- make stm32mp15_atk_trusted_defconfig
- make menuconfig
复制代码
打开后的图形化界面如图14.1.1所示:
图14.1.1 uboot图形化配置界面
图14.1.1就是主界面,主界面上方的英文就是简单的操作说明,操作方法如下:
通过键盘上的“↑”和“↓”键来选择要配置的菜单,按下“Enter”键进入子菜单。菜单中高亮的字母就是此菜单的热键,在键盘上按下此高亮字母对应的键可以快速选中对应的菜单。选中子菜单以后按下“Y”键就会将相应的代码编译进Uboot中,菜单前面变为“。按下“N”键不编译相应的代码,按下“M”键就会将相应的代码编译为模块,菜单前面变为“[M ]”。按两下“Esc”键退出,也就是返回到上一级,按下“?”键查看此菜单的帮助信息,按下“/”键打开搜索框,可以在搜索框输入要搜索的内容。
在配置界面下方会有五个按钮,这五个按钮的功能如下:
<Select>:选中按钮,和“Enter”键的功能相同,负责选中并进入某个菜单。
<Exit>:退出按钮,和按两下“Esc”键功能相同,退出当前菜单,返回到上一级。
<Help>:帮助按钮,查看选中菜单的帮助信息。
<Save>:保存按钮,保存修改后的配置文件。
<Load>:加载按钮,加载指定的配置文件。
在图14.1.1中有很多不同配置的主配置项,通过键盘上的上下键调节配置项。后面跟着“--->”表示此配置项是有子配置项的,按下回车键就可以进入子配置项。
我们就以如何使能dns命令为例,讲解一下如何通过图形化界面来配置uboot。进入“Command line interface --->”这个配置项,此配置项用于配置uboot的命令,进入以后如图14.1.2所示:
图14.1.2 Command line interface配置项
从图14.1.2可以看出,有很多配置项,这些配置项也有子配置项,选择“Network commands --->”,进入网络相关命令配置项,如图14.1.3所示:
图14.1.3 Network commands配置项
从图14.1.3可以看出,uboot中有很多和网络有关的命令,比如bootp、dhcp、tftpboot等等。选中dns,然后按下键盘上的“Y”键,此时dns前面的“[ ]”变成了“[ * ]”,如图34.1.4所示:
图14.1.4 选中dns命令
每个配置项有3种编译选项:编译进uboot中(也就是编译进u-boot.bin中)、取消编译(也就是不编译这个功能模块)、编译为模块。按下“Y”键表示编译进uboot中,此时“[ ]”变成了“[ * ]”;按下“N”表示不编译,“[ ]”默认表示不编译;有些功能模块是支持编译为模块的,这个一般在Linux内核里面很常用,uboot下面不使用,如果要将某个功能编译为模块,那就按下“M”,此时“[ ]”就会变为“< M >”。
选中dns,然后按下“H”或者“?”键可以打开dns命令的提示信息,如图14.1.5所示:
图14.1.5 dns命令提示信息
按两下ESC键即可退出提示界面,相当于返回上一层。选择dns命令以后,按两下ESC键(按两下ESC键相当于返回上一层),退出当前配置项,进入到上一层配置项。如果没有要修改的就按两下ESC键,退出到主配界面,如果也没有其他要修改的,那就再次按两下ESC键退出menuconfig配置界面。如果修改过配置的话,在退出主界面的时候会有如图14.1.6所示提示:
图14.1.6 是否保存新的配置文件对话框
图14.1.6询问是否保存新的配置文件,通过键盘的“←”或“→”键来选择“Yes”项,然后按下键盘上的回车键确认保存。至此,我们就完成了通过图形界面使能了uboot的dns命令,打开.config文件,会发现多了“CONFIG_CMD_DNS=y”这一行,如图14.1.7中的323行所示:
图14.1.7 .config文件
使用如下命令编译uboot:
- make DEVICE_TREE=stm32mp157d-atk all -j12
复制代码
千万不能使用如下命令:
- ./stm32mp157d_alientek.sh
复制代码
因为stm32mp157d_alientek.sh在编译之前会清理工程,会删除掉.config文件!通过图形化界面配置所有配置项都会被删除,结果就是竹篮打水一场空。
编译完成以后烧写到SD卡中,重启开发板进入uboot命令模式,输入“?”查看是否有“dns”命令,如果dns命令存在的话就会输出相应的使用信息,如图14.1.8所示:
图14.1.8 dns帮助信息
测试一下dns命令工作是否正常,使用dns命令来查看一下百度官网“www.baidu.com”的IP地址。
首先用dhcp命令从路由器动态获取一个IP地址,防止我们自己设置的静态IP地址和网段内其他设备冲突,导致dns命令失败,直接输入“dhcp”即可,结果如图14.1.9所示:
图14.1.9 hdcp获取IP地址
从图14.1.9可以看出,此时开发板从路由器获取到的IP地址为192.168.1.200,接下来要设置一下dns服务器的IP地址,也就是设置环境变量dnsip的值,命令如下:
- setenv dnsip 114.114.114.114
- saveenv
复制代码
设置好以后就可以使用dns命令查看百度官网的IP地址了,输入命令:
dns www.baidu.com
结果如图14.1.10所示:
图14.1.10 dns命令
从图14.1.10可以看出,“www.baidu.com地址为14.215.177.38,说明dns命令工作正常。这个就是通过图形化命令来配置uboot,一般用来使能一些命令还是很方便的,这样就不需要到处找命令的配置宏是什么,然后在到配置文件里面去定义。
14.2 menuconfig图形化配置原理
14.2.1 make menuconfig过程分析
当输入make menuconfig以后会匹配到顶层Makefile的如下代码:
示例代码14.2.1.1 顶层Makefile代码段
541 %config: scripts_basic outputmakefile FORCE
542 $(Q)$(MAKE) $(build)=scripts/kconfig $@
这个在前面已经详细的讲解过了,其中build=-f ./scripts/Makefile.build obj,将542行的规则展开就是:
- [url=home.php?mod=space&uid=95564]@[/url] make -f ./scripts/Makefile.build obj=scripts/kconfig menuconfig
复制代码
Makefile.build会读取scripts/kconfig/Makefile中的内容,在scripts/kconfig/Makefile中可以找到如下代码:
示例代码14.2.1.2 scripts/kconfig/Makefile代码段
- 34 menuconfig: $(obj)/mconf
- 35 [ DISCUZ_CODE_263 ]lt; $(silent) $(Kconfig)
复制代码
其中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文件开始构建图形配置界面。
14.2.2 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中有如下代码:
示例代码14.2.2.1 顶层Kconfig代码段
- 5 mainmenu "U-Boot $UBOOTVERSION Configuration"
复制代码
上述代码就是定义了一个名为“U-Boot $UBOOTVERSION Configuration”的主菜单,其中UBOOTVERSION=2020.01-stm32mp-r1,因此主菜单名为“U-Boot 2020.01-stm32mp-r1 Configuration”,如图14.2.2.1所示:
图14.2.2.1 主菜单名字
2、调用其他目录下的Kconfig文件
和makefile一样,Kconfig也可以调用其他子目录中的Kconfig文件,调用方法如下:
- source "xxx/Kconfig" //xxx为具体的目录名,相对路径
复制代码
在顶层Kconfig中有如下代码:
示例代码14.2.2.2 顶层Kconfig代码段
- 13 source "arch/Kconfig"
- ......
- 576
- 577 source "api/Kconfig"
- 578
- 579 source "common/Kconfig"
- 580
- 581 source "cmd/Kconfig"
- 582
- 583 source "disk/Kconfig"
- 584
- 585 source "dts/Kconfig"
- 586
- 587 source "env/Kconfig"
- 588
- 589 source "net/Kconfig"
- 590
- 591 source "drivers/Kconfig"
- 592
- 593 source "fs/Kconfig"
- 594
- 595 source "lib/Kconfig"
- 596
- 597 source "test/Kconfig"
复制代码
从示例代码14.2.2.2中可以看出,顶层Kconfig文件调用了很多其他子目录下的Kcofig文件,这些子目录下的Kconfig文件在主菜单中生成各自的菜单项。
3、menu/endmenu条目
menu用于生成菜单,endmenu就是菜单结束标志,这两个一般是成对出现的。在顶层Kconfig中有如下代码:
示例代码14.2.2.3 顶层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.
- ......
- 298
- 299 endmenu # General setup
- 300
- 301 menu "Boot images"
- 302
- 303 config ANDROID_BOOT_IMAGE
- 304 bool "Enable support for Android Boot Images"
- 305 default y if FASTBOOT
- 306 help
- 307 This enables support for booting images which use the Android
- 308 image format header.
- ......
- 574
- 575 endmenu # Boot images
复制代码
示例代码14.2.2.3中有两个menu/endmenu代码块,这两个代码块就是两个子菜单,第15行的“menu "General setup"”表示子菜单“General setup”。第301行的“menu "Boot images"”表示子菜单“Boot images”。体现在主菜单界面中就如图14.2.2.2所示:
图14.2.2.2 子菜单
在“General setup”菜单上面还有 “Architecture select (ARM architecture)”和“ARM architecture”这两个子菜单,但是在顶层Kconfig中并没有看到这两个子菜单对应的menu/endmenu代码块,那这两个子菜单是怎么来的呢?这两个子菜单就是arch/Kconfig文件生成的。包括主界面中的“API”、“Boot timing”等等这些子菜单,都是分别由顶层Kconfig所调用的api/Kconfig、common/Kconfig等这些子Kconfig文件来创建的。
3、config条目
顶层Kconfig中的“General setup”子菜单内容如下:
示例代码14.2.2.4 顶层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 DEPRECATED
- 24 bool
- 25 help
- ......
- 29
- 30 config LOCALVERSION
- 31 string "Local version - append to U-Boot release"
- 32 help
- ......
- 39
- 40 config LOCALVERSION_AUTO
- 41 bool "Automatically append version information to the version string"
- 42 default y
- 43 help
- ......
- 59
- 60 config CC_OPTIMIZE_FOR_SIZE
- 61 bool "Optimize for size"
- 62 default y
- 63 help
- ......
- 68
- 69 config CC_COVERAGE
- 70 bool "Enable code coverage analysis"
- 71 depends on SANDBOX
- 72 help
- ......
- 75
- 76 config DISTRO_DEFAULTS
- 77 bool "Select defaults suitable for booting general purpose Linux distributions"
- 78 select AUTO_COMPLETE
- ......
- 102
- 103 config ENV_VARS_UBOOT_CONFIG
- 104 bool "Add arch, board, vendor and soc variables to default environment"
- 105 help
- ......
- 285 config ERR_PTR_OFFSET
- 286 hex
- 287 default 0x0
- 288 help
- ......
- 299 endmenu # General setup
复制代码
可以看出,在menu/endmenu代码块中有大量的“config xxxx”的代码块,这就是config条目。config条目就是“General setup”菜单的具体配置项,如图14.2.2.3所示:
图14.2.2.3 General setup配置项
示例代码14.2.2.4中第30行的“config LOCALVERSION”对应着第一个配置项,“config LOCALVERSION_AUTO”对应着第二个配置项,以此类推。信心的朋友可能会发现,示例代码最前面还有“config BROKEN”和“config DEPRECATED”这来个配置项,但是图14.2.2.3中并没有这两个配置项,因为这两个配置项现在不能使能,所以也就看不到。
我们以“config LOCALVERSION”和“config LOCALVERSION_AUTO”这两个为例来分析一下config配置项的语法:
示例代码14.2.2.5 顶层Kconfig代码段
- 30 config LOCALVERSION
- 31 string "Local version - append to U-Boot release"
- 32 help
- 33 Append an extra string to the end of your U-Boot version.
- 34 This will show up in your boot log, for example.
- ......
- 38 be a maximum of 64 characters.
- 39
- 40 config LOCALVERSION_AUTO
- 41 bool "Automatically append version information to the version string"
- 42 default y
- 43 help
- 44 This will try to automatically determine if the current tree is a
- 45 release tree by looking for Git tags that belong to the current
- 46 top of tree revision.
- ......
- 57
- 58 which is done within the script "scripts/setlocalversion".)
复制代码
第30和40行,这两行都以config关键字开头,后面跟着LOCALVERSION和LOCALVERSION_AUTO,这两个就是配置项名字。假如我们使能了LOCALVERSION_AUTO这个功能,那么就会在.config文件中生成CONFIG_LOCALVERSION_AUTO,这个在上一小节讲解如何使能dns命令的时候讲过了。由此可知,.config文件中的“CONFIG_xxx” (xxx就是具体的配置项名字)就是Kconfig文件中config关键字后面的配置项名字加上“CONFIG_”前缀。
config关键字下面的这几行是配置项属性,31~38行是LOCALVERSION的属性,41~58行是LOCALVERSION_AUTO的属性。属性里面描述了配置项的类型、输入提示、依赖关系、帮助信息和默认值等。
第31行的string是变量类型,也就是“CONFIG_ LOCALVERSION”的变量类型。可以为:bool、tristate、string、hex和int,一共5种。最常用的是bool、tristate和string这三种,bool类型有两种值:y和n,当为y的时候表示使能这个配置项,当为n的时候就禁止这个配置项。tristate类型有三种值:y、m和n,其中y和n的涵义与bool类型一样,m表示将这个配置项编译为模块。string为字符串类型,所以LOCALVERSION是个字符串变量,用来存储本地字符串,选中以后即可输入用户定义的本地版本号,如图14.2.2.4所示:
图14.2.2.4 本地版本号配置
string后面的“Local version - append to U-Boot release”就是这个配置项在图形界面上的显示出来的标题。
第32行,help表示帮助信息,告诉我们配置项的含义,当我们按下“h”或“?”弹出来的帮助界面就是help的内容。
第41行,说明“CONFIG_LOCALVERSION_AUTO”是个bool类型,可以通过按下Y或N键来使能或者禁止CONFIG_LOCALVERSION_AUTO。
第42行,“default y”表示CONFIG_LOCALVERSION_AUTO的默认值就是y,所以这一行默认会被选中。
4、depends on和select
打开顶层Kconfig文件,在里面有这如下代码:
示例代码14.2.2.6 arch/Kconfig代码段
- 430 config SPL_FIT_SIGNATURE
- 431 bool "Enable signature verification of FIT firmware within SPL"
- 432 depends on SPL_DM
- 433 select SPL_FIT
- 434 select SPL_RSA
复制代码
第432行,“depends on”说明“SPL_FIT_SIGNATURE”项依赖于“SPL_DM”,也就是说“SPL_DM”被选中以后“SPL_FIT_SIGNATURE”才能被选中。
第433~434行,“select”表示反向依赖,当选中“SPL_FIT_SIGNATURE”以后,“SPL_FIT”和“SPL_RSA”这两个也会被选中。
4、choice/endchoice
在arch/Kconfig文件中有如下代码:
示例代码14.2.2.7 arch/Kconfig代码段
- 7 choice
- 8 prompt "Architecture select"
- 9 default SANDBOX
- 10
- 11 config ARC
- 12 bool "ARC architecture"
- ......
- 19
- 20 config ARM
- 21 bool "ARM architecture"
- ......
- 25
- 26 config M68K
- 27 bool "M68000 architecture"
- ......
- 32
- 33 config MICROBLAZE
- 34 bool "MicroBlaze architecture"
- ......
- 37
- 38 config MIPS
- 39 bool "MIPS architecture"
- ......
- 43
- 44 config NDS32
- 45 bool "NDS32 architecture"
- 46 select SUPPORT_OF_CONTROL
- 47
- 48 config NIOS2
- 49 bool "Nios II architecture"
- ......
- 55
- 56 config PPC
- 57 bool "PowerPC architecture"
- ......
- 62
- 63 config RISCV
- 64 bool "RISC-V architecture"
- ......
- 215
- 216 config XTENSA
- 217 bool "Xtensa architecture"
- 218 select CREATE_ARCH_SYMLINK
- 219 select SUPPORT_OF_CONTROL
- 220
- 221 endchoice
复制代码
choice/endchoice代码段定义了一组可选择项,将多个类似的配置项组合在一起,供用户单选或者多选。示例代码14.2.2.7就是选择处理器架构,可以从ARC、ARM、M68K等这些架构中选择,这里是单选。在uboot图形配置界面上选择“Architecture select”,进入以后如图14.2.2.5所示:
图14.2.2.5 架构选择界面
可以在图14.2.2.5中通过移动光标来选择所使用的CPU架构。第8行的prompt给出这个choice/endchoice段的提示信息为“Architecture select”。
5、menuconfig
menuconfig和menu很类似,但是menuconfig是个带选项的菜单,其一般用法为:
示例代码14.2.2.8 menuconfig用法
- 1 menuconfig MODULES
- 2 bool "菜单"
- 3 if MODULES
- 4 ...
- 5 endif # MODULES
复制代码
第1行,定义了一个可选的菜单MODULES,只有选中了MODULES第3~5行if到endif之间的内容才会显示。在顶层Kconfig中有如下代码:
示例代码14.2.2.9 顶层Kconfig代码段
- 15 menu "General setup"
- ......
- 187 menuconfig EXPERT
- 188 bool "Configure standard U-Boot features (expert users)"
- 189 default y
- 190 help
- 191 This option allows certain base U-Boot options and settings
- 192 to be disabled or tweaked. This is for specialized
- 193 environments which can tolerate a "non-standard" U-Boot.
- 194 Use this only if you really know what you are doing.
- 195
- 196 if EXPERT
- 197 config SYS_MALLOC_CLEAR_ON_INIT
- 198 bool "Init with zeros the memory reserved for malloc (slow)"
- 199 default y
- 200 help
- 201 This setting is enabled by default. The reserved malloc
- ......
- 211 should be replaced by calloc - if one expects zeroed memory.
- 212
- 213 config TOOLS_DEBUG
- 214 bool "Enable debug information for tools"
- 215 help
- 216 Enable generation of debug information for tools such as
- ......
- 220
- 221 endif # EXPERT
- ......
- 298
- 299 endmenu # General setup
复制代码
第187~221行使用menuconfig实现了一个菜单,路径如下:
General setup
-> Configure standard U-Boot features (expert users) --->
如图14.2.2.6所示:
图14.2.2.6 菜单Configure standard U-Boot features (expert users)
从图14.2.2.6可以看到,前面有“[ ]”说明这个菜单是可选的,当选中这个菜单以后就可以进入到子选项中,也就是示例代码14.2.2.9中的第196~221行所描述的菜单,如图14.2.2.7所示:
图14.2.2.7 菜单Init with zeros the memory reserved for malloc (slow)
如果不选择“Configure standard U-Boot features (expert users)”,那么示例代码14.2.2.9中的第196~221行所描述的菜单就不会显示出来,进去以后是空白的。
6、comment
comment用于注释,也就是在图形化界面中显示一行注释,打开文件drivers/mtd/nand/raw/Kconfig,有如下所示代码:
示例代码14.2.2.10 drivers/mtd/nand/raw/Kconfig代码段
- 295 config NAND_STM32_FMC2
- 296 bool "Support for NAND controller on STM32MP SoCs"
- 297 depends on ARCH_STM32MP
- 298 select SYS_NAND_SELF_INIT
- 299 imply CMD_NAND
- 300 help
- 301 Enables support for NAND Flash chips on SoCs containing the
- 302 FMC2 NAND controller. This controller is found on STM32MP
- 303 SoCs. The controller supports a maximum 8k page size and
- 304 supports a maximum 8-bit correction error per sector of 512 bytes.
- 305
- 306 comment "Generic NAND options"
复制代码
第306行使用comment标注了一行注释,注释内容为:“Generic NAND options”,这行注释在配置项NAND_STM32_FMC2的下面。在图形化配置界面中按照如下路径打开:
-> Device Drivers
-> MTD Support
-> Raw NAND Device Support
结果如图14.2.2.8所示:
图14.2.2.8 注释“Generic NAND options”
从图14.2.2.8可以看出,在配置项“Support for NAND controller on STM32MP SoCs”下面有一行注释,注释内容为“*** Generic NAND options ***”。
7、source
source用于读取另一个Kconfig,比如:
source "arch/Kconfig"
这个在前面已经讲过了。
Kconfig语法就讲解到这里,基本上常用的语法就是这些,因为uboot相比Linux内核要小很多,所以配置项也要少很多,所以建议大家使用uboot来学习Kconfig。一般不会修改uboot中的Kconfig文件,甚至都不会使用uboot的图形化界面配置工具,本小节学习Kconfig的目的主要还是为了Linux内核作准备。
14.3 添加自定义菜单
图形化配置工具的主要工作就是在.config下面生成前缀为“CONFIG_”的变量,这些变量一般都有值,为y,m或n,在uboot源码里面会根据这些变量来决定编译哪个文件。本小节我们就来学习一下如何添加自己的自定义菜单,自定义菜单要求如下:
①、在主界面中添加一个名为“My test menu”,此菜单内部有一个配置项。
②、配置项为“MY_TESTCONFIG”,此配置项处于菜单“My test menu”中。
③、配置项的为变量类型为bool,默认值为y。
④、配置项菜单名字为“This is my test config”。
⑤、配置项的帮助内容为“This is a empty config, just for tset!”。
打开顶层Kconfig,在最后面加入如下代码:
示例代码14.3.1 自定义菜单
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
添加完成以后打开图形化配置界面,如图14.3.1所示:
图14.3.1 主界面
从图14.3.1可以看出,主菜单最后面出现了一个名为“My test menu”的子菜单,这个就是我们上面添加进来的子菜单。进入此子菜单,如图14.3.2所示:
图14.3.2 “My test menu”子菜单
从图14.3.2可以看出,配置项添加成功,选中“This is my test config”配置项,然后按下“H”键打开帮助文档,如图14.3.3所示:
图14.3.3 帮助信息
从图14.3.3可以看出,帮助信息也正确。配置项MY_TESTCONFIG默认也是被选中的,因此在.config文件中肯定会有“CONFIG_MY_TESTCONFIG=y”这一行,如图14.3.4所示:
图14.3.4 .config文件
至此,我们在主菜单添加自己的自定义菜单就成功了,以后大家如果去半导体原厂工作的话,如果要编写Linux驱动,那么很有可能需要你来修改甚至编写Kconfig文件。Kconfig语法其实不难,重要的点就是14.2.2小节中的那几个,最主要的是记住:Kconfig文件的最终目的就是在.config文件中生成以“CONFIG_”开头的变量。
|