繼續 U-Boot編譯過程分析(1) ,上面已經看了頂層Makefile文件下的命令,現在看mkconfig文件的作用:
在文件一開始的註釋中寫了:
# Script to create header files and links to configure
# U-Boot for a specific board.
#
# Parameters: Target Architecture CPU Board [VENDOR] [SOC]
詳細說明了這麼個文件要完成的工作和文件參數傳遞的規則。明顯這個腳本文件適用於創建頭文件和鏈接文件的。而參數中【SOC】是片上系統的含義,一般就是指芯片。下面就逐步分析它的作用:
從U-Boot編譯過程分析(1)這篇文章最後我們已經確定“./mkconfig smdk2410 arm 920t smdk2410 samsung s3c24x0”這條命令.確定了各個變量。
1、確定開發板名稱
11 APPEND=no # Default: Create new config file
12 BOARD_NAME="" # Name to print in make output
13 TARGETS=""
14
15 while [ $# -gt 0 ] ; do
16 case "$1" in
17 --) shift ; break ;;
18 -a) shift ; APPEND=yes ;;
19 -n) shift ; BOARD_NAME="${1%%_config}" ; shift ;;
20 -t) shift ; TARGETS="`echo $1 | sed 's:_: :g'` ${TARGETS}" ; shift ;;
21 *) break ;;
22 esac
23 done
24
25 [ "${BOARD_NAME}" ] || BOARD_NAME="$1"
26
27 [ $# -lt 4 ] && exit 1
28 [ $# -gt 6 ] && exit 1
30 if [ "${ARCH}" -a "${ARCH}" != "$2" ]; then
31 echo "Failed: \$ARCH=${ARCH}, should be '$2' for ${BOARD_NAME}" 1>&2
32 exit 1
33 fi
34
35 echo "Configuring for ${BOARD_NAME} board..."
對第一個參數進行檢查,沒有匹配項,不執行操作。25行,將第一個參數“smdk2410”賦值給BORAD_NAME。27-28行做參數個數檢查,小於4大於7個就退出(個人感覺這個從參數個數檢查的位置是不是太晚了啊)。30-33行做架構變量檢查,ARCH在Makefile文件中定義,當前爲空,如果有值且不匹配則退出。
2、創建架構相關的頭文件的鏈接
37 #
38 # Create link to architecture specific headers
39 #
40 if [ "$SRCTREE" != "$OBJTREE" ] ; then
41 mkdir -p ${OBJTREE}/include
42 mkdir -p ${OBJTREE}/include2
43 cd ${OBJTREE}/include2
44 rm -f asm
45 ln -s ${SRCTREE}/arch/$2/include/asm asm
46 LNPREFIX=${SRCTREE}/arch/$2/include/asm/
47 cd ../include
48 rm -f asm
49 ln -s ${SRCTREE}/arch/$2/include/asm asm
50 else
51 cd ./include
52 rm -f asm
53 ln -s ../arch/$2/include/asm asm
54 fi
55
根據執行Makefile時的文件路徑重新創建平臺/開發板相關的頭文件的鏈接(爲保持源代碼目錄的乾淨,我們可以選擇在其他目錄下編譯U-BOOT,作爲剛開始學習的新人還是先不這麼做吧,儘可能避免不必要的麻煩。等我們足夠了解後,再去嘗試和深入的學習)。
因爲是在頂層目錄下直接編譯,所以執行else分支下的命令。51-53行,進入頂層下include目錄,刪除上次上次建立的鏈接文件,重新建立asm鏈接文件,使指向arch/arm/include/asm。
56 rm -f asm/arch
57
58 if [ -z "$6" -o "$6" = "NULL" ] ; then
59 ln -s ${LNPREFIX}arch-$3 asm/arch
60 else
61 ln -s ${LNPREFIX}arch-$6 asm/arch
62 fi
63
64 if [ "$2" = "arm" ] ; then
65 rm -f asm/proc
66 ln -s ${LNPREFIX}proc-armv asm/proc
67 fi
68
56行,刪除asm/arch目錄。
58行判斷第六個參數是否爲空或者爲NULL,顯然執行else分支。
由於LNPREFIX爲空(在Makefile文件中並沒有定義,在這個文件中也沒有,直接在終端內執行echo ${LNPREFIX}顯示爲空,所以我想應該這是一個爲定義的變量,希望指正)。所以命令執行的是“ln -s arch-s3c24x0 asm/arch”,將arm/ach鏈向arch/arm/include/asm/arch-s3c24x0目錄。
65-66行,重新建立arm/proc鏈接文件並鏈向arch/arm/include/asm/proc-armv目錄。
3、創建頂層Makefile需要的頭文件
69 #
70 # Create include file for Make
71 #
72 echo "ARCH = $2" > config.mk
73 echo "CPU = $3" >> config.mk
74 echo "BOARD = $4" >> config.mk
75
76 [ "$5" ] && [ "$5" != "NULL" ] && echo "VENDOR = $5" >> config.mk
77
78 [ "$6" ] && [ "$6" != "NULL" ] && echo "SOC = $6" >> config.mk
79
80 # Assign board directory to BOARDIR variable
81 if [ -z "$5" -o "$5" = "NULL" ] ; then
82 BOARDDIR=$4
83 else
84 BOARDDIR=$5/$4
85 fi
86
說明下,我們現在仍然在頂層include目錄下。
72-78得到的結果是新建了include/config.mk文件,內容爲
ARCH = arm
CPU = arm920t
BOARD = smdk2410
VENDOR = samsung
SOC = s3c24x0
81-85行因爲vendor變量不爲空,所以執行else 分支。BOARDDIR的值爲samsung/s3c24x0 。
4、創建開發板相關頭文件 config.h
87 #
88 # Create board specific header file
89 #
90 if [ "$APPEND" = "yes" ] # Append to existing config file
91 then
92 echo >> config.h
93 else
94 > config.h # Create new config file
95 fi
96 echo "/* Automatically generated - do not edit */" >>config.h
97
98 for i in ${TARGETS} ; do
99 echo "#define CONFIG_MK_${i} 1" >>config.h ;
100 done
101
102 cat << EOF >> config.h
103 #define CONFIG_BOARDDIR board/$BOARDDIR
104 #include <config_defaults.h>
105 #include <configs/$1.h>
106 #include <asm/config.h>
107 EOF
108
APPEND維持的原值“NO”,執行else分支,創建了config.h。
96-100,由於TARGETS爲空,不執行。
102-107 在config.h中輸入
#define CONFIG_BOARDDIR board/samsung/smdk2410
#include <config_defaults.h>
#include <configs/smdk2410.h>
#include <asm/config.h>
109 exit 0
結束
總結下,mkconfig完成的工作,都是在include/目錄下
1、開發板名稱BOARD_NAME = $1
2、創建架構相關頭文件的鏈接
ln -s ../arch/${arch}/include/asm asm
ln -s ../arch/${arch}/include/asm/arch-${soc} asm/arch
ln -s ../arch/${arch}/include/asm/proc-armv asm/proc
3、創建頂層Makefile包含的頭文件include/config.mk#ARCH = arm
#CPU = arm920t
#BOARD = smdk2410
#VENDOR = samsung
#SOC = s3c24x0
4、創建開發板相關頭文件include/config.h
#define CONFIG_BOARDDIR board/samsung/smdk2410
#include <config_defaults.h>
#include <configs/smdk2410.h>
#include <asm/config.h>
由此可以知道,在移植時如果在board目下新建一個開發板<board_name>的目錄,則在include/configs目錄下新建一個<board_name>.h的頭文件,存放開發板的配置信息。