U-boot根目錄下的mkconfig分析
原文地址:http://blog.csdn.net/qq_28992301/article/details/51812103
U-boot根目錄下的mkconfig分析
此檔案位於uboot原始碼的根目錄下,是原始碼自帶的shell指令碼檔案,主要功能是建立符號連結以及一些標頭檔案(擁有符號連結的功能)。
輸入make x210_sd_config時,本指令碼將會被主Makefile呼叫執行。
其內容主要結構為:
1.解析輸入引數
2.建立符號連結及一些標頭檔案
需要注意的是,結構順序不代表程式碼執行順序,關於程式碼的執行順序以及推薦閱讀順序請移步
1.解析輸入引數
這個指令碼在主makefile中被執行前,會被傳入6個引數,分別是:x210_sd,arm,s5pc11x,x210,samsung,s5pc110。所以和引數有關的變數為$#=6($#的值是輸入引數個數),$1=x210_sd $2=arm $3=s5pc11x $4=x210 $5=samsung $6=s5pc110
- 本段程式碼的功能為解析傳入本指令碼的引數,首先利用了一個while迴圈,判斷$#的值(即引數個數),是否大於0,如果大於0則進入迴圈
- shell的switch case語法中是不需要break的,故此處的switch case是為了跳出外面的while迴圈
- 此外每個case的結束都需要加’;’執行語句結束也要加’;’,所以在每行case的最後都會有兩個分號
- 這段程式碼上來先判斷$1的值(即第一個引數),如果為一些特定的值,那麼會進行shift操作,即向左移動引數列表一次,將第一個引數移出引數列表
- 但由於我們第一個引數為x210_sd,故只符合最後一個case即*,也就是萬用字元,直接break跳出了while迴圈。其實這整段程式碼對我們沒有產生什麼作用。
APPEND=no # Default: Create new config file
BOARD_NAME="" # Name to print in make output
while [ $# -gt 0 ] ; do
case "$1" in
--) shift ; break ;;
-a) shift ; APPEND=yes ;;
-n) shift ; BOARD_NAME="${1%%_config}" ; shift ;;
*) break ;;
esac
done
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 本句是縮寫的if判斷語句,判斷變數BOARD_NAME是否不為空,由於在12行處對其賦為空值,所以此處將它的值賦為第一個引數的值,即x210_sd
[ "${BOARD_NAME}" ] || BOARD_NAME="$1"
- 1
- 2
- 開頭兩句是縮寫的if判斷語句,如果引數個數小於4,則這個指令碼程式將退出,並返回1(表示出錯);同樣,如果引數個數大於6,則這個指令碼程式將退出,並返回1(表示出錯)
- 最後一句為列印配置資訊
[ $# -lt 4 ] && exit 1
[ $# -gt 6 ] && exit 1
echo "Configuring for ${BOARD_NAME} board..."
- 1
- 2
- 3
2.建立符號連結及一些標頭檔案
從這裡開始的程式碼便是建立符號連結及一些標頭檔案,其根本目的是使uboot具有可移植性。uboot中有很多功能平行的程式碼檔案,各自屬於各自不同的平臺/開發板/cpu。通過傳入此shell指令碼的引數,來建立指向我們需要的檔案的符號連結。但uboot並不直接與這些功能平行的程式碼建立聯絡,符號連結幫助uboot遮蔽了許多用不到的程式碼。比如某原始檔中包含了一個 #include “asm/xx.h”,其中asm為本指令碼檔案建立的符號連結,它指向的地址為根目錄下include/asm-arm,由此便可以定位到真正的路徑,即”根目錄下include/asm-arm/xx.h”。綜上所述,建立符號連結的本質是通過不同的引數,令原始碼檔案包含特定的檔案
- 本段程式碼功能是確定和彙編指令集相關資料夾
- 首先判斷是否使用了“外部輸出資料夾編譯”功能,如果未使用則進入原始碼目錄下的include目錄,刪除原本存在的符號連結asm
- 最後建立符號連結asm,使其連結到asm-arm資料夾
if [ "$SRCTREE" != "$OBJTREE" ] ; then
mkdir -p ${OBJTREE}/include
mkdir -p ${OBJTREE}/include2
cd ${OBJTREE}/include2
rm -f asm
ln -s ${SRCTREE}/include/asm-$2 asm
LNPREFIX="../../include2/asm/"
cd ../include
rm -rf asm-$2
rm -f asm
mkdir asm-$2
ln -s asm-$2 asm
else
cd ./include
rm -f asm
ln -s asm-$2 asm
fi
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 刪除指令集資料夾下原本存在的符號連結arch
- 然後確定指令集資料夾下的架構資料夾,但是這段程式碼其實是歷史遺留程式碼,建立的是有問題的,真正的確定架構資料夾是在後面
rm -f asm-$2/arch
if [ -z "$6" -o "$6" = "NULL" ] ; then
ln -s ${LNPREFIX}arch-$3 asm-$2/arch
else
ln -s ${LNPREFIX}arch-$6 asm-$2/arch
fi
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 本段程式碼旨在確定cpu的暫存器標頭檔案,和確定指令集資料夾下的架構資料夾
- 首先判斷第三個引數是不是s5pc11x,然後刪除原本存在的符號連結regs.h,再建立regs.h連結到s5pc110.h
- 最後刪除原本./include/asm-arm目錄下的存在的符號連結arch,再在./include/asm-arm目錄下建立arch連結到arch-s5pc110這個架構資料夾
這裡省略了一堆和其他soc有關的程式碼,只保留了我們的s5pv210
if [ "$3" = "s5pc11x" ] ; then
rm -f regs.h
ln -s $6.h regs.h
rm -f asm-$2/arch
ln -s arch-$3 asm-$2/arch
fi
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 本段程式碼旨在確定指令集資料夾下的proc資料夾。在./include/asm-arm目錄下建立proc,指向proc-armv資料夾
if [ "$2" = "arm" ] ; then
rm -f asm-$2/proc
ln -s ${LNPREFIX}proc-armv asm-$2/proc
fi
- 1
- 2
- 3
- 4
- 5
- 本段是建立include/config.mk,由於之前所停留的目錄一直是include目錄下,故config.mk將被建立在include目錄下
- bash語法中的>功能是建立檔案並填充內容,>>功能是額外新增內容,所以第2,3,4個引數都被新增到這個檔案中去了,當5,6存在且不為0時,第5,6個引數才被新增
echo "ARCH = $2" > config.mk
echo "CPU = $3" >> config.mk
echo "BOARD = $4" >> config.mk
[ "$5" ] && [ "$5" != "NULL" ] && echo "VENDOR = $5" >> config.mk
[ "$6" ] && [ "$6" != "NULL" ] && echo "SOC = $6" >> config.mk
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 本段的功能主要是建立根目錄下include/config.h這個檔案,這個.h檔案內只有一句話,即#include “configs/x210_sd.h”
- 從某種意義上來說,./include/config.h這個檔案的功能就是符號連結,它指向了真正的配置標頭檔案
./include/configs/x210_sd.h - APPEND變數是在本檔案一開始的地方定義的,值預設是no,當本指令碼檔案被傳引數-a時,它會被賦值yes(具體程式碼大概在25行左右)
- 建立完config.h之後,再向其填充入內容,最後shell結束,返回值0(表示正常)
if [ "$APPEND" = "yes" ] # Append to existing config file
then
echo >> config.h
else
> config.h # Create new config file
fi
echo "/* Automatically generated - do not edit */" >>config.h
echo "#include <configs/$1.h>" >>config.h
exit 0