如果我們想快速的移植uboot,那么我們就要先將我們用到的uboot的功能分析透徹,uboot最終目的就是**引導內核**,但是在實際開發中為了方便開發調試,我們將uboot加入了很多功能,比如tftp下載,nfs啟動,串口打印等功能;那么我們先按著執行的順序來分析代碼。
uboot并沒有對2440進行支持,所以我們分析階段先分析smdk2410的相關代碼,分析完成以后我們在根據s3c2440的技術手冊在2410的基礎上進行移植。
Makefile分析
首先我們根據編譯過程進行分析,編譯需要執行命令:
make smdk2410_config
我們查看根目錄下Makefile文件,搜索smdk2410_config得到如下代碼:
smdk2410_config : unconfig
@$(MKCONFIG) $(@:_config=) arm arm920t smdk2410 NULL s3c24x0在Makefile中;
@表示不打印后面的命令。
$(MKCONFIG)我們通過搜索MKCONFIG得到其定義如下:
MKCONFIG := $(SRCTREE)/mkconfig
SRCTREE定義如下:
SRCTREE := $(CURDIR)
CURDIR在Makefile中為內嵌變量,自動設置為當前的目錄。所以$(MKCONFIG)就等于當前目錄下的mkconfig文件;$(@:_config=)表示將目標文件的_config變為空,也就是取消目標文件的_config。
所以命令解析如下
smdk2410_config : unconfig
@mkconfig $(@:_config=) arm arm920t smdk2410 NULL s3c24x0
所以當我們執行make smdk2410_config的時候實際是執行的是:
./mkconfig smdk2410 arm arm920t smdk2410 NULL s3c24x0
$1 $2 $3 $4 $5 $6
分析根目錄下mkconfig
while [ $# -gt 0 ] ; do
case "$1" in
--) shift ; break ;;
-a) shift ; APPEND=yes ;;
-n) shift ; BOARD_NAME="${1%%_config}" ; shift ;;
*) break ;;
esac
done
$#表示了傳遞進來的參數的個數;
-gt表示大于(>)的含義;
首先如果傳遞的參數個數大于0,則執行,然后在判斷$1是不是--、-a、-n、*等符號,如果是則執行相應的分支,否則繼續向下執行。
[ "${BOARD_NAME}" ] || BOARD_NAME="$1"
如果沒有定義BOARD_NAME,則讓BOARD_NAME=$1在這里就是BOARD_NAME=$1=smdk2410
[ $# -lt 4 ] && exit 1
[ $# -gt 6 ] && exit 1
-lt是小于(<)的含義;
也就是判斷傳遞進來的個數是否是小于4個或者是大于6個,如果小于4個或者大于6個則退出。
echo "Configuring for ${BOARD_NAME} board..."
打印信息Configuring for smdk2410 board...
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
上面代碼if [ "$SRCTREE" != "$OBJTREE" ] ; 是判斷SRCTREE 是否等于OBJTREE?
如果不等,則執行if 分支,如果相等等執行else分支,在頂層makefile 下查找可知SRCTREE 和OBJTREE 定義如下:
OBJTREE := $(if $(BUILD_DIR),$(BUILD_DIR),$(CURDIR))
SRCTREE := $(CURDIR)
所以:
OBJTREE := $(if $(BUILD_DIR),$(BUILD_DIR),$(CURDIR))
含義:如果定義BUILD_DIR 則OBJTREE=BUILD_DIR 否則OBJTREE=CURDIR搜索mkconfig 可知:BUILD_DIR 沒有定義,即OBJTREE=CURDIR所以:SRCTREE := $(CURDIR)即SRCTREE=CURDIR,BJTREE=CURDIR 并且SRCTREE=CURDIR 所以SRCTREE=OBJTREE所以執行else 分支;
else 分支作用如下:
執行上面面三句,就相當于建立一個鏈接文件asm,它指向$2(即arm)。
這樣做的原因?
當我們在源碼中包含#include
呢?所以建立這個鏈接是為了不需要我們總是修改代碼,則直接寫#include
rm -f asm-$2/arch
刪除asm-arm/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
如果$6 為空或者為NULL 則執行ln -s ${LNPREFIX}arch-$3 asm-$2/arch而$6=s3c6410 所以if 分支忽略即執行else 分支ln -s ${LNPREFIX}arch-$6 asm-$2/arch
分析ln -s ${LNPREFIX}arch-$6 asm-$2/arch執行上面語句相當于在asm-arm($2)目錄下面建立一個鏈接文件arch而鏈接文件arch 的指向是arch-s3c6410($6)。
if [ "$2" = "arm" ] ; then
rm -f asm-$2/proc
ln -s ${LNPREFIX}proc-armv asm-$2/proc
fi
通過對$2的判斷發現執行此分支。
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
“>”表示新建文件并將內容添加進文件。
“>>”表示只在文件中添加內容。
所以上述的代碼含義就是新建config.mk文件并且將下面內容添加進config.mk文件:
ARCH = arm
CPU = arm920t
BOARD = smdk2410
VENDOR = NULL
SOC = s3c24x0
if [ "$APPEND" = "yes" ] # Append to existing config file
then
echo >> config.h
else
> config.h # Create new config file
fi
判斷APPEND定義是否等于yes開頭定義APPEND等于no,所以執行else分支,新建config.h文件
echo "/* Automatically generated - do not edit */" >>config.h
echo "#include
在config.h里面追加內容:
/* Automatically generated - do not edit */
#include
-
S3C2440
+關注
關注
4文章
132瀏覽量
38743 -
Configured
+關注
關注
0文章
3瀏覽量
7986 -
Uboot
+關注
關注
4文章
124瀏覽量
28053
發布評論請先 登錄
相關推薦
評論