uboot圖形化配置及其原理
uboot可以通過 mx6ull_xxx_defconfig和 mx6ull_xxx_emmc.h文件來配置;另外還有一種配置uboot的方法,就是圖形化配置
1.uboot圖形化配置
1.1 圖形化配置簡介
uboot或 Linux內(nèi)核可以通過輸入“make menuconfig”命令來打開圖形化配置界面,menuconfig是一套圖形化的配置工具,需要 ncurses庫支持。 ncurses庫提供零一系列的 API函數(shù)供調(diào)用者生成基于文本的圖形界面,因此需要先在 Ubuntu中安裝 ncurses庫
sudo apt-get install build-essential
sudo apt-get install libncurses5-dev
menuconfig重點會用到兩個文件:“.config”和“Kconfig”,.config文件保存著uboot的配置項,使用 menuconfig配置完 uboot后該文件會被更新; Kconfig文件是圖形界面的描述文件,即描述界面應(yīng)該有什么內(nèi)容,很多目錄下都會有Kconfig文件
1.2 uboot圖形化配置體驗
在打開圖形化配置界面前,需要先對 uboot進行一次默認(rèn)配置。 之后使用“make menuconfig”命令打開圖形化界面,打開后的界面如下示:
主界面上方的英文就是簡單的操作說明,操作方法如下:
通過向上和向下按鍵選擇要配置的菜單,“Enter"按鍵進入
選中后按"Y"鍵會將相應(yīng)的代碼編譯進uboot中,菜單前面變?yōu)?*>
選中后按"N"鍵會取消編譯相應(yīng)的代碼
選中后按"M"鍵會將相應(yīng)的代碼編譯為模塊,菜單前面變?yōu)?/p>
按兩下"Esc"鍵退出,也就是返回到上一級
按下"?“ 鍵查看選中菜單的幫助信息
按下”/"鍵打開搜索框,可在搜索框輸入要搜索的內(nèi)容
在配置界面下方有五個按鈕,其功能如下:
Select:選中按鈕,和enter按鍵功能相同
Exit:退出按鈕,和esc按鍵功能相同
Help:幫助按鈕,查看選中菜單的幫助信息
Save:保存按鈕,保存修改后的配置文件
Load:加載按鈕,加載指定的配置文件
下面以使能DNS命令為例,介紹如何通過圖形化界面來配置uboot
進入"Command line interface"配置項
進入"Network commands"網(wǎng)絡(luò)相關(guān)命令配置項
選中dns,按下"Y"鍵將其編譯到uboot中
按兩下esc鍵退出,如果有修改項目,在退出主界面時會提示是否需要保存
保存后可在uboot源碼中的".config"文件中發(fā)現(xiàn)多了"CONFIG_CMD_DNS=y"這一行
使用"make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j16"命令編譯 uboot
注意:此時不能用腳本來編譯,因為腳本文件在編譯之前會清理工程,會刪除掉.config文件,導(dǎo)致通過圖形化界面配置的所有選項都被刪除
編譯完成燒寫到SD卡后,重啟開發(fā)板進入uboot命令模式,設(shè)置dns服務(wù)器的IP地址
setenv dnsip 114.114.114.114
saveenv
設(shè)置好后,使用dns命令即可查看百度官網(wǎng)的IP地址
dns www.baidu.com
2.menuconfig圖形化配置原理
2.1 make menuconfig過程分析
當(dāng)輸入make menuconfig以后會匹配到頂層Makefile中的如下代碼:
%config: scripts_basic outputmakefile FORCE
$(Q)$(MAKE) $(build)=scripts/kconfig $@
#其中build=-f ./scripts/Makefile.build obj
###將上面第二行的規(guī)則展開后:
@make -f ./scripts/Makefile.build obj=scripts/kconfig menuconfig
Makefile.build會讀取scripts/kconfig/Makefile中的內(nèi)容,在scripts/kconfig/Makefile中有如下代碼:
menuconfig: $(obj)/mconf
$< $(silent) $(Kconfig)
#silent是這是靜默編譯的
###展開后###
menuconfig: scripts/kconfig/mconf
scripts/kconfig/mconfKconfig
目標(biāo)menuconfig依賴scripts/kconfig/mconf,因此scripts/kconfig/mconf.c文件會被編譯,生成mconf可執(zhí)行文件;目標(biāo)menuconfig對應(yīng)的規(guī)則為scripts/kconfig/mconfKconfig, 也就是說mconf會調(diào)用uboot根目錄下的Kconfig文件開始構(gòu)建圖形配置界面
2.2 Kconfig語法簡介
對于Kconfig語法不需要太深入的去研究,了解其原理即可。 打開uboot根目錄下的頂層Kconfig,以這個文件為例來簡單學(xué)習(xí)一下Kconfig語法
mainmenu:主菜單
##########頂層Kconfig代碼段##########
mainmenu "U-Boot $UBOOTVERSION Configuration"
source命令調(diào)用其他目錄下的Kconfig文件
##########頂層Kconfig代碼段##########
source "arch/Kconfig"
......
source "common/Kconfig"
source "cmd/Kconfig"
source "dts/Kconfig"
source "net/Kconfig"
source "drivers/Kconfig"
source "fs/Kconfig"
source "lib/Kconfig"
source "test/Kconfig"
##以上子目錄下的Kconfig文件在主菜單中生成各自的菜單項
menu/endmenu條目:menu用于生成菜單,endmenu菜單結(jié)束標(biāo)志
##########頂層Kconfig代碼段##########
menu "General setup"
config LOCALVERSION
string "Local version - append to U-Boot release"
help
Append an extra string to the end of your U-Boot version.
This will show up on your boot log, for example.
The string you set here will be appended after the contents of
any files with a filename matching localversion* in your
object and source tree, in that order. Your total string can
be a maximum of 64 characters.
......
......
endmenu # General setup
menu "Boot images"
config SUPPORT_SPL
bool
......
......
endmenu # Boot images
以上代碼中有兩個menu/endmenu代碼塊,這兩個代碼塊就是兩個子菜單
config條目:是菜單里的具體配置項
##########頂層Kconfig代碼段##########
menu "General setup"
config LOCALVERSION
string "Local version - append to U-Boot release"
help
......
config LOCALVERSION_AUTO
bool "Automatically append version information to the version string"
default y #表示該配置項默認(rèn)值是y,即默認(rèn)被選中
help #表示幫助信息,告知配置項的含義,按下h或?會彈出help的內(nèi)容
......
config CC_OPTIMIZE_FOR_SIZE
bool "Optimize for size"
default y
help
......
config SYS_MALLOC_F
bool "Enable malloc() pool before relocation"
default y if DM
help
......
config SYS_MALLOC_F_LEN
hex "Size of malloc() pool before relocation"
depends on SYS_MALLOC_F
default 0x400
help
......
menuconfig EXPERT
bool "Configure standard U-Boot features (expert users)"
default y
help
......
if EXPERT
config SYS_MALLOC_CLEAR_ON_INIT
bool "Init with zeros the memory reserved for malloc (slow)"
default y
help
......
endif
endmenu # General setup
以上可看出,在menu/endmenu代碼塊中有大量的"config XXX"代碼塊(config條目)。 若使能了XXX功能,就會在 .config文件中生成 CONFIG_XXX
常用的三種變量類型:bool、tristate和string
– bool,有兩種值,y和n
– tristate,有三種值,y、n和m
– string,用來存儲本地字符串
depends on和select
########## arch/Kconfig代碼段 ##########
config SYS_GENERIC_BOARD
bool
depends on HAVE_GENERIC_BOARD
#depends on依賴:依賴項選中后,被依賴項才能被選中
choice
prompt "Architecture select"
default SANDBOX
config ARC
bool "ARC architecture"
select HAVE_PRIVATE_LIBGCC
select HAVE_GENERIC_BOARD
select SYS_GENERIC_BOARD
select SUPPORT_OF_CONTROL
#select方向依賴,“ARC”被選擇后,四個select也會被選中
choice/endchoice:定義一組可選擇項,將多個類似配置項組合在一起,供用戶單選或多選
########## arch/Kconfig代碼段 ##########
choice
prompt "Architecture select"
default SANDBOX
config ARC
bool "ARC architecture"
......
config ARM
bool "ARM architecture"
......
config AVR32
bool "AVR32 architecture"
......
config BLACKFIN
bool "Blackfin architecture"
......
config M68K
bool "M68000 architecture"
......
config MICROBLAZE
bool "MicroBlaze architecture"
......
config MIPS
bool "MIPS architecture"
......
config NDS32
bool "NDS32 architecture"
......
config NIOS2
bool "Nios II architecture"
......
config OPENRISC
bool "OpenRISC architecture"
config PPC
bool "PowerPC architecture"
......
config SANDBOX
bool "Sandbox"
......
config SH
bool "SuperH architecture"
select HAVE_PRIVATE_LIBGCC
config SPARC
bool "SPARC architecture"
......
config X86
bool "x86 architecture"
......
endchoice
menuconfig:和menu類似,但是menuconfig是帶選項的菜單,其一般用法如下
menuconfig MODULES #定義一個可選的菜單MODULES
bool "菜單"
if MODULES #只有選中了,if里面的內(nèi)容才會顯示
......
endif # MODULES
##########頂層Kconfig代碼段##########
menu "General setup"
......
menuconfig EXPERT
bool "Configure standard U-Boot features (expert users)"
default y
help
......
if EXPERT
config SYS_MALLOC_CLEAR_ON_INIT
bool "Init with zeros the memory reserved for malloc (slow)"
default y
help
......
endif
endmenu # General setup
以上代碼實現(xiàn)了一個帶選項的菜單EXPERT,只有被選中了,if/endif里的內(nèi)容才會顯示出來
comment:用于在圖形化界面中顯示一行注釋
########## drviers/mtd/nand/Kconfig代碼段##########
config NAND_ARASAN
bool "Configure Arasan Nand"
help
This enables Nand driver support for Arasan nand flash
controller. This uses the hardware ECC for read and
write operations.
comment "Generic NAND options" #標(biāo)注了一行注釋
3.添加自定義菜單
圖形化配置工具的主要工作就是在.config文件里生成前綴為“CONFIG_”變量,這些變量一般都有值(y/m/n),在uboot源碼里會根據(jù)這些變量來決定編譯哪個文件。 下面介紹如何添加一個自已的自定義菜單,自定義菜單要求:
在主界面中添加名為“My test menu”菜單項,菜單內(nèi)部有一個配置項
配置項為“MY_TESTCONFIG”,處于菜單“My test menu”中
配置項的變量類型為bool,默認(rèn)值為y
配置項菜單名字為“This is my test config”
配置項的幫助內(nèi)容為“This is a empty config, just for testing!”
完成以上菜單要求,只需要在頂層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
添加完成后,打開圖形化配置界面,可見主菜單最后面出現(xiàn)一個名為“My test menu”的子菜單
進入子菜單如下圖示,可見配置項菜單名字
按下help按鍵打開幫助文檔,如下圖示
打開.config文件,可以發(fā)現(xiàn)“CONFIG_MY_TESTCONFIG=y”,如下圖示,至此在主菜單中添加自定義菜單的功能就實現(xiàn)了
-
內(nèi)核
+關(guān)注
關(guān)注
3文章
1373瀏覽量
40310 -
Linux
+關(guān)注
關(guān)注
87文章
11312瀏覽量
209713 -
代碼
+關(guān)注
關(guān)注
30文章
4791瀏覽量
68695 -
圖形化
+關(guān)注
關(guān)注
0文章
56瀏覽量
14220 -
Uboot
+關(guān)注
關(guān)注
4文章
125瀏覽量
28249
發(fā)布評論請先 登錄
相關(guān)推薦
評論