當(dāng)前位置:首頁 > 嵌入式培訓(xùn) > 嵌入式學(xué)習(xí) > 講師博文 > 嵌入式學(xué)習(xí):Uboot配置文件mkconfig
在主Makefile中定義mkconfig:
在主Makefile中使用mkconfig:
在第2行使用了mkconfig ,在這里使用了Makefile中的替換引用規(guī)則:類似常看到的例子obj=$(srcfile:%.c=%.o) ,將所有的.c文件替換成.o(這里只是替換名字,不涉及其他)。這里的$(@:_config=)是一樣的: @表示目標(biāo)x210_sd_config,那么 $(@:_config=) 就是將x210_sd_config中的_config替換為空,得到x210_sd。
經(jīng)過以上分析可知第2行的轉(zhuǎn)換結(jié)果為:mkconfig x210_sd arm s5pc11x x210 samsung s5pc110,該句話的意思是執(zhí)行mkconfig腳本文件,并被這個(gè)腳本文件傳遞6個(gè)參數(shù)。參數(shù)解析如下:
1. 參數(shù)檢查
代碼:11 ~ 12行
APPEND 表示是否要?jiǎng)?chuàng)建include/config.h文件,在最后有了解。
BOARD_NAME為空。
代碼:14 ~ 21行
進(jìn)入while循環(huán),先判斷條件是否滿足,即$#是否大于0,這里$#為6,滿足條件,因此進(jìn)入循環(huán);然后在循環(huán)內(nèi)$1作為switch的條件選擇執(zhí)行,這里$1=x210_sd,因此匹配到 * ,所以執(zhí)行break語句,直接跳出while循環(huán)。
代碼:23行
如果 BOARD_NAME 為真,則后面的不執(zhí)行,為假,則執(zhí)行 BOARD_NAME="$1",即此時(shí) BOARD_NAME= x210_sd
代碼:25 ~ 26行
如果 $# 小于 4 ,則 exit 1 ( mkconfig 腳本返回 1 ),即退出。
如果 $# 大于 6 ,則也返回 1 。
所以:mkconfig 腳本傳參只能是 4、5、6 ,如果大于 6 或者小于 4 都不行。
2. 創(chuàng)建符號(hào)鏈接
代碼:30 ~ 118行
為什么要?jiǎng)?chuàng)建符號(hào)鏈接?這些符號(hào)鏈接文件的存在就是整個(gè)配置過程的核心,這些符號(hào)鏈接文件(文件夾)的主要作用是給頭文件包含等過程提供指向性連接。根本目的是讓 uboot 具有可移植性。
uboot 可移植性的實(shí)現(xiàn)原理:在 uboot 中有很多彼此平行的代碼,各自屬于各自不同的架構(gòu)/ CPU /開發(fā)板,我們在具體到一個(gè)開發(fā)板的編譯時(shí)用符號(hào)連接的方式提供一個(gè)具體的名字的文件夾供編譯時(shí)使用。這樣就可以在配置的過程中通過不同的配置使用不同的文件,就可以正確的包含正確的文件。
代碼過程
(1)首先判斷源碼目錄和輸出目錄是否是一致的。若一致,則執(zhí)行 then 后的語句;否則,則執(zhí)行 else 后的語句。在這里,不分析 then 后的語句,分析 else 后的語句。創(chuàng)建 include/asm 文件,并鏈接到 include/asm-arm 文件。
(2)刪除 include/asm-arm/arch 文件
(3)執(zhí)行第二個(gè) if 語句,判斷條件是若 $6 字符串的長度為 0 或者 $6 為 NULL,則執(zhí)行 then 后的語句,創(chuàng)建include/asm-arm/arch 文件,并鏈接到 include/asm-arm/arch-s5pc11x;否則,將執(zhí)行 else 后的語句,創(chuàng)建 include/asm-arm/arch 文件,并鏈接到 include/asm-arm/arch-s5pc110 。
(4)執(zhí)行第三個(gè) if 語句,在這里我們只看 "$3" = "s5pc11x" 的選項(xiàng),其他的類似。判斷條件是 $3 為 s5pc11x 的話,則執(zhí)行——創(chuàng)建 include/regs.h 文件,并鏈接到 include/s5pc110.h 文件,刪除 include/asm-arm/arch ,然后再創(chuàng)建 include/asm-arm/arch,并鏈接到 include/arch-s5pc11x 。
總結(jié):一共創(chuàng)建了 4 個(gè)符號(hào)鏈接。這 4 個(gè)符號(hào)鏈接將來在寫代碼過程中,頭文件包含時(shí)非常有用。譬如一個(gè)頭文件包含可能是:#include <asm/xx.h> 。
3. 創(chuàng)建 include/config.mk 文件
代碼:120 ~ 130行
創(chuàng)建 include/config.mk 文件:將 ARCH=arm、CPU=s5pc11x、BOARD=x210、VENDOR=samsung、SOC=s5pc110 寫入到 include/config.mk 文件中。
創(chuàng)建的 include/config.mk 文件是為了讓主 Makefile 在 133 行去包含的。
4. 創(chuàng)建 include/config.h 頭文件
代碼:131 ~ 最后
若 APPEND 為 yes,則將新內(nèi)容追加到 config.h 中,否則創(chuàng)建一個(gè)新的 config.h 文件,最后打印兩行內(nèi)容,追加到 config.h 中,執(zhí)行成功后則退出。
include/config.h 文件里面的內(nèi)容就一行 #include<configs/x210_sd.h>,這個(gè)頭文件是我們移植 x210 開發(fā)板時(shí),對開發(fā)板的宏定義配置文件,這個(gè)文件是移植 x210_sd 時(shí)最主要的文件。
x210_sd.h 文件會(huì)被用來生成一個(gè) autoconfig.mk 文件,這個(gè)文件會(huì)被主 Makefile 引入,指導(dǎo)整個(gè)編譯過程。這里面的這些宏定義會(huì)影響我們 uboot 中大部分的 .c 文件中一些條件編譯的選擇,從而最終實(shí)現(xiàn)可移植性。