 嵌入式學習:Uboot配(pei)置文件(jian)mkconfig
							時間(jian):2019-04-22      來源:華清(qing)遠見
							嵌入式學習:Uboot配(pei)置文件(jian)mkconfig
							時間(jian):2019-04-22      來源:華清(qing)遠見 
							在(zai)主Makefile中定義(yi)mkconfig:
	
在主Makefile中(zhong)使用mkconfig:
	
在第2行使(shi)用了mkconfig ,在這(zhe)里使(shi)用了Makefile中(zhong)的(de)替換(huan)引用規(gui)則(ze):類似(si)常看到(dao)的(de)例子obj=$(srcfile:%.c=%.o) ,將所有的(de).c文件替換(huan)成(cheng).o(這(zhe)里只是(shi)(shi)替換(huan)名字(zi),不涉及其他(ta))。這(zhe)里的(de)$(@:_config=)是(shi)(shi)一(yi)樣(yang)的(de): @表示目標(biao)x210_sd_config,那(nei)么 $(@:_config=) 就是(shi)(shi)將x210_sd_config中(zhong)的(de)_config替換(huan)為空,得到(dao)x210_sd。
經(jing)過以上分(fen)析(xi)可知第(di)2行的轉(zhuan)換結果為(wei):mkconfig x210_sd arm s5pc11x x210 samsung s5pc110,該(gai)句話的意思是執行mkconfig腳本(ben)文件,并被這個(ge)腳本(ben)文件傳(chuan)遞(di)6個(ge)參(can)數(shu)。參(can)數(shu)解析(xi)如(ru)下:
	
1. 參數檢查(cha)
代碼:11 ~ 12行
	
APPEND 表示是否(fou)要(yao)創建include/config.h文件,在最后(hou)有了解(jie)。
BOARD_NAME為空。
代碼:14 ~ 21行
	
進(jin)入(ru)while循(xun)環(huan),先判(pan)斷(duan)條(tiao)件是(shi)否(fou)滿足(zu),即$#是(shi)否(fou)大于0,這(zhe)里$#為(wei)6,滿足(zu)條(tiao)件,因此(ci)進(jin)入(ru)循(xun)環(huan);然后在循(xun)環(huan)內(nei)$1作為(wei)switch的條(tiao)件選(xuan)擇執(zhi)行,這(zhe)里$1=x210_sd,因此(ci)匹配到 * ,所(suo)以執(zhi)行break語(yu)句,直接跳出while循(xun)環(huan)。
代碼:23行
	
如果 BOARD_NAME 為真,則(ze)后面的不執行,為假,則(ze)執行 BOARD_NAME="$1",即此時 BOARD_NAME= x210_sd
代碼:25 ~ 26行
	
如果(guo) $# 小于 4 ,則 exit 1 ( mkconfig 腳本返回(hui) 1 ),即退出。
如果(guo) $# 大于 6 ,則也(ye)返回 1 。
所以:mkconfig 腳本傳參只能是 4、5、6 ,如果大于 6 或者小(xiao)于 4 都不行(xing)。
2. 創建符(fu)號鏈(lian)接(jie)
代碼:30 ~ 118行
	
	
	
為什么要(yao)創(chuang)建符號鏈接?這(zhe)些(xie)符號鏈接文件(jian)(jian)的存(cun)在就是整(zheng)個配置過程的核心,這(zhe)些(xie)符號鏈接文件(jian)(jian)(文件(jian)(jian)夾)的主(zhu)要(yao)作用是給頭文件(jian)(jian)包含等過程提供指向性連接。根(gen)本目的是讓 uboot 具有可移植性。
uboot 可移植性的(de)(de)實(shi)現(xian)原理:在 uboot 中有很多彼此平行的(de)(de)代碼,各自屬于各自不同的(de)(de)架構(gou)/ CPU /開發(fa)板,我們(men)在具(ju)體到一個(ge)(ge)開發(fa)板的(de)(de)編譯時用符號連接的(de)(de)方(fang)式提供(gong)一個(ge)(ge)具(ju)體的(de)(de)名字(zi)的(de)(de)文(wen)(wen)件(jian)夾供(gong)編譯時使用。這樣就可以在配置(zhi)的(de)(de)過程中通(tong)過不同的(de)(de)配置(zhi)使用不同的(de)(de)文(wen)(wen)件(jian),就可以正確的(de)(de)包含(han)正確的(de)(de)文(wen)(wen)件(jian)。
代碼過程
(1)首先判斷源碼目(mu)錄和輸出目(mu)錄是否(fou)是一致的(de)。若一致,則(ze)(ze)執(zhi)行(xing) then 后(hou)的(de)語(yu)(yu)句;否(fou)則(ze)(ze),則(ze)(ze)執(zhi)行(xing) else 后(hou)的(de)語(yu)(yu)句。在這里(li),不分(fen)析 then 后(hou)的(de)語(yu)(yu)句,分(fen)析 else 后(hou)的(de)語(yu)(yu)句。創建 include/asm 文件(jian),并(bing)鏈接到 include/asm-arm 文件(jian)。
(2)刪除(chu) include/asm-arm/arch 文件
(3)執(zhi)行(xing)第二個 if 語(yu)句(ju),判(pan)斷條件是若 $6 字符串的(de)(de)長(chang)度為 0 或者 $6 為 NULL,則(ze)執(zhi)行(xing) then 后(hou)的(de)(de)語(yu)句(ju),創建include/asm-arm/arch 文件,并鏈接(jie)到(dao) include/asm-arm/arch-s5pc11x;否則(ze),將執(zhi)行(xing) else 后(hou)的(de)(de)語(yu)句(ju),創建 include/asm-arm/arch 文件,并鏈接(jie)到(dao) include/asm-arm/arch-s5pc110 。
(4)執行第三個 if 語句(ju),在這里我們只看 "$3" = "s5pc11x" 的選(xuan)項,其他的類(lei)似。判斷條件(jian)是 $3 為 s5pc11x 的話,則(ze)執行——創(chuang)(chuang)建 include/regs.h 文件(jian),并鏈接到 include/s5pc110.h 文件(jian),刪(shan)除 include/asm-arm/arch ,然后(hou)再創(chuang)(chuang)建 include/asm-arm/arch,并鏈接到 include/arch-s5pc11x 。
總結(jie):一(yi)共(gong)創建了 4 個(ge)符號鏈接。這 4 個(ge)符號鏈接將來在寫代碼過程中,頭文(wen)件(jian)包含時非(fei)常有用。譬如一(yi)個(ge)頭文(wen)件(jian)包含可(ke)能(neng)是:#include <asm/xx.h> 。
3. 創建 include/config.mk 文件
代(dai)碼:120 ~ 130行
	
創建 include/config.mk 文(wen)件:將 ARCH=arm、CPU=s5pc11x、BOARD=x210、VENDOR=samsung、SOC=s5pc110 寫入到 include/config.mk 文(wen)件中。
創(chuang)建的 include/config.mk 文(wen)件是為了讓主 Makefile 在 133 行去包含的。
4. 創建 include/config.h 頭文(wen)件(jian)
代碼:131 ~ 最后
	
若 APPEND 為 yes,則(ze)將新(xin)(xin)內容(rong)追(zhui)(zhui)加到(dao) config.h 中,否則(ze)創(chuang)建(jian)一個新(xin)(xin)的 config.h 文件,最后(hou)打印兩行(xing)內容(rong),追(zhui)(zhui)加到(dao) config.h 中,執行(xing)成(cheng)功后(hou)則(ze)退出。
include/config.h 文(wen)(wen)件(jian)里面的(de)內容就一行 #include<configs/x210_sd.h>,這個(ge)頭文(wen)(wen)件(jian)是我們(men)移植(zhi)(zhi) x210 開(kai)發(fa)板時(shi),對開(kai)發(fa)板的(de)宏定義配置文(wen)(wen)件(jian),這個(ge)文(wen)(wen)件(jian)是移植(zhi)(zhi) x210_sd 時(shi)最主要的(de)文(wen)(wen)件(jian)。
x210_sd.h 文(wen)件(jian)會被(bei)用來生成(cheng)一個 autoconfig.mk 文(wen)件(jian),這個文(wen)件(jian)會被(bei)主(zhu) Makefile 引入(ru),指導整個編(bian)譯過程。這里(li)面的這些(xie)宏定義會影響我們 uboot 中(zhong)大部分的 .c 文(wen)件(jian)中(zhong)一些(xie)條件(jian)編(bian)譯的選擇(ze),從而最終實現可移植性(xing)。

