|
9 \: J; s2 P$ `* P
首先进入顶层Makefile。有很多相对不同板子的配置,如: gec2440_config:unconfig @$(MKCONFIG) $(@:_config=) ARM arm920t gec2440 samsung s3c24x0 4 |( ~* ]9 r) C9 }* c+ u) q' ~
1.配置编译uboot第一步都是make *****_config。既然是make就得执行Makefile。makefile就包括很多上面的语句,make *****_config,首先执行的就是上面的配置信息。 @$(MKCONFIG)啥意思,其实在Makefile前面就有定义 @$(MKCONFIG) := $(SRCTREE)/mkconfig,也就是根目录的mkconfig文件。$(@:_config=)的意思就是吧make *****_config的_config给去到。所以gec2440_config执行./mkconfig gec2440 arm arm920t gec2440 samsung s3c24x0。而unconfig的作用在于去除原先的配置信息,即make ***_config与make unconfig互逆关系。 2.OK,现在执行make gec2440_config,那么就会出现: Configuring for gec2440 board...8 I ?, _5 A- J2 S
现在看看有发生那些变化。由于上面的命令相当于执行./mkconfig arm arm920t gec2440 samsung s3c24x0。所以先进去根目录的mkconfig文件看看。 首先,要明确一点:./mkconfig gec2440 arm arm920t gec2440 samsung s3c24x0使得$0=./mkconfig,$1=arm,$2=arm920t,$3=gec2440, $4=samsung, $5=s3c24x0 下面是mkconfig的内容:
; t( x& W+ Y# U6 A3 l) }APPEND=no # 这里记得APPEND初值为no
0 @( U' G" z& M! G5 h. sBOARD_NAME="". L- ?' A3 q9 ?& F. i
TARGETS=""+ N6 i$ H5 c% z$ w1 {: q k
8 N G( G& L6 s0 B* Q8 f* V1 R8 l#下面一段代码不执行(while---done),由于./mkconfig arm arm920t gec2440 samsung s3c24x0没有--、-a、-n、-t
+ {) G9 |. f+ c4 ?% }/ Y' |1 l0 `
& t+ @; T/ Z! M8 z; w) V7 kwhile [ $# -gt 0 ] ; do
* B# H( C3 k7 Z0 e3 ^; Ocase "$1" in' ^' {) V, X( {- p% p
--) shift ; break ;;
" ^, i2 @5 g0 a7 N" h3 j7 F-a) shift ; APPEND=yes ;;
; E4 a) w8 i1 N-n) shift ; BOARD_NAME="${1%%_config}" ; shift ;;$ G4 [5 ?7 g6 y4 |3 A7 t; [
-t) shift ; TARGETS="`echo $1 | sed 's:_: :g'` ${TARGETS}" ; shift ;;7 T+ s: y$ Y$ _; d% f1 J% u9 k0 K
*) break ;;
: {/ l2 T6 A. V" S+ l4 ]5 \esac
3 q) X- `& [# o! a" x# o l; Udone6 N& ~* H5 @( Q# _. E/ @
3 E' Z$ J: {! P. }% x; B: \% G9 c* V9 A. A
: X ~& b( l3 U
& S) ]1 ]9 {2 x% A+ p9 M5 s[ "${BOARD_NAME}" ] || BOARD_NAME="$1" //BOARD_NAME=gec2440 H. J( }* L1 q% Q2 j/ O
. E8 b8 I* y& I; l% K/ Y
; k9 h M: G# ?9 t5 j9 Z! W
[ $# -lt 4 ] && exit 17 q# d7 c" g" `5 m
[ $# -gt 6 ] && exit 17 p; Z/ X3 r( L: q* F7 I$ t
( ]: ^2 a: q$ e- `. J9 s+ f
: x& B( G" A# c4 N( J2 Yif [ "${ARCH}" -a "${ARCH}" != "$2" ]; then
+ B2 r6 C; ?. @) Z, w5 @echo "FaiLED: \$ARCH=${ARCH}, should be '$2' for ${BOARD_NAME}" 1>&2
' L4 K, m# V2 e" P y- sexit 1& Z4 X* V4 {5 U
fi5 l0 _* ^" _* X
( N: U+ p- Z" c: ]) m( \7 y/ n5 p- T# I& e0 a; U" Z/ C
//在终端打印Config for gec2440 board....
0 h1 l7 R, }; {8 E" Z6 m2 eecho "Configuring for ${BOARD_NAME} board..."" j* i( g T/ o- {( C
; n/ j( U1 K$ V3 f [0 A$ L( P1 _' z! |+ G: o. L" N' z
#
; @) q: u* }/ E3 s# 产生链接文件
: O1 M- ?' R, @#9 q- `0 }; g2 V1 h1 e) W: P, J
if [ "$SRCTREE" != "$OBJTREE" ] ; then //是否在源代码目录下编译Uboot,不是就执行下面,else就是表示是在源代码目录编译7 X, T' {5 x7 K& u/ J8 y3 O) [' |# w
mkdir -p ${OBJTREE}/include7 m0 J1 P2 }+ j( a0 J
mkdir -p ${OBJTREE}/include2/ V* h6 b& [" w: n
cd ${OBJTREE}/include20 D. k( o. o8 D- F2 @7 W
rm -f asm
5 t M0 p( ~! R, y$ J, Q" K. _+ dln -s ${SRCTREE}/include/asm-$2 asm1 k; z! e& P: N$ q1 |
LNPREFIX="../../include2/asm/"
( k( c& A$ K! H) i" M% }cd ../include
( {+ Z6 ^# Y4 l' Irm -rf asm-$2
P) M3 M+ H- arm -f asm) n: W7 z- X# B8 \- L
mkdir asm-$2
7 D; N" |7 n) j; {& Jln -s asm-$2 asm
]9 r6 L7 E: E6 ~7 L# C& D7 W7 y4 s: B2 W3 Y: S. i
: V9 B6 D* R2 f. Y# U; [
else
7 |7 k! W1 Q: Y, t; E. acd ./include //进入include; w/ k5 J7 Q+ x& i9 l' O
rm -f asm
9 N, H5 @. [1 ^* Z& \ln -s asm-$2 asm //ln -s include/asm-arm asm! [. @' M: ~$ }
fi( U6 B8 D% a( n- h v* B
. m" E' y, W) e0 h$ v: I
4 o& i9 x$ f/ g1 }$ A' [) z
rm -f asm-$2/arch //删除include/asm-arm/arch
/ w7 K" }! u0 B' F: D
& \' \* F4 Y V3 k: m
1 N; [/ W; j: u- Q% E# R+ Aif [ -z "$6" -o "$6" = "NULL" ] ; then //由于$6=s3c24x0,执行而else下面
; _1 J7 v+ J! L- F" Y& U& kln -s ${LNPREFIX}arch-$3 asm-$2/arch
( p7 t# K0 B, oelse$ F3 P& X7 e I* g, a1 q; Y" X
ln -s ${LNPREFIX}arch-$6 asm-$2/arch //ln -s include/arch-s3c24x0 include/asm-arm/arch: j4 j8 d( d) u) Q2 L' k; y- L K2 n
fi- r e6 F3 n" Z' h# m9 \4 p
9 k2 z/ l/ a3 K I
& [3 H5 D9 r2 b2 E7 fif [ "$2" = "arm" ] ; then
2 h+ ? X9 O: ]rm -f asm-$2/proc //删除include/asm-arm/proc
9 `; z. H$ f9 L8 s$ ]3 eln -s ${LNPREFIX}proc-armv asm-$2/proc //ln -s include/proc-arm asm-arm/pro( S; x$ k7 F& }9 x, s6 G/ ~
fi, }) N# |* a b& A9 L
/ ~3 e; J5 y; A; ^( K
6 e5 l* v/ V& j6 \8 y
#
6 L6 Q7 H6 q% G2 z$ `$ V% R# Create include file for Make8 ]9 `6 p# k+ e. F6 E3 m& P0 ?- t0 f8 h
#0 b' f$ q8 v+ `& K l: H @
echo "ARCH = $2" > config.mk //ARCH=arm,放入include/config.mk
- q& c2 ^! k+ e5 N4 e- e4 Recho "CPU = $3" >> config.mk //CPU=arm920t,放入includde/config.mk: U' q7 O% A: d T I/ o$ k) T
echo "BOARD = $4" >> config.mk //BOARD=gec2440,放入include/config.mk
& y6 B8 @/ p/ ~, l7 y2 ^5 a/ E( U- B9 ^2 q3 x1 d9 l
5 `- U2 e$ ^ ^1 w s[ "$5" ] && [ "$5" != "NULL" ] && echo "VENDOR = $5" >> config.mk
0 | \- V7 M) K. V- f$ y//VERDOR=samaung,放入include/config.mk, h4 ~6 `+ [4 c5 [
[ "$6" ] && [ "$6" != "NULL" ] && echo "SOC = $6" >> config.mk: F6 C8 d' a& }* `0 f% V' M1 i
//SOC=s3c24x0,放入include/config.mk
3 d1 S- r) k, A4 N% a& B6 U, C#
( ~5 h/ f; ^; G( `8 I/ J* R2 b# Create board specific header file4 e8 ~% ` ]) ^% g
#, J+ R! I- b; c2 o
if [ "$APPEND" = "yes" ] # 有第一行知道,APPEND=no
% {8 E% Y" f+ o/ J- Y. s/ M. Gthen$ M0 g7 H! j& R( L1 E' @2 I
echo >> config.h6 Q) e7 L* L) ~' M
else
* b. ~' L% M4 I2 V- S4 Y> config.h #产生config.h文件,位于include目录下
6 {+ e$ e5 U( c% Oecho "/* Automatically generated - do not edit */" >>config.h
% E% b H! ~& b# R6 {- k6 Z1 G
. |' p i2 F; a! @* E( q+ P; w' L, X z
for i in ${TARGETS} ; do
% ]2 V5 \9 [( b. c6 U) eecho "#define CONFIG_MK_${i} 1" >>config.h ;
7 H. D2 }: `( w2 |2 ?: T//将"#define CONFIG_MK_${i} 1加入上面产生的config.h文件
) }" e6 W, y7 o' Y! L, s2 Xdone* R9 f7 L( v; I
- }, w6 ]5 Z' W) o
# w1 j9 p+ Q+ {( Secho "#include <configs/$1.h>" >>config.h //config.h文件包含头文件"#include <configs/gec2440.h>) _. v3 z1 p; i: {0 r
echo "#include <asm/config.h>" >>config.h //config.h文件包含头文件"#include <asm/config.h>
- J& m& g& V3 M2 v6 K1 b6 U. U/ G- ^7 I
exit 03.上面红色部分就是改变部分。到现实中的源代码看看, 大家执行完make gec2440_config之后,到源代码看看。
% J* b, r& r/ t( J9 h* ` 第一就是ARCH、CPU、BOARD、VERDOR、SOC被赋值, 并加入include/config.mk文件中, 我的config.mk文件内容如下: ARCH = arm$ I+ a' a2 L1 f9 X
CPU = arm920t) ~) m0 L2 |5 e4 O
BOARD = gec24404 T+ d1 `$ x# f& Y
VENDOR = samsung
' a/ s: u+ F( u( b# j! t' k SOC = s3c24x0
. y. c, x% f S% j/ q; R$ T 第二就是看一下链接文件,我的情况如下: 进入include目录下: #ll lrwxrwxrwx 1 root root 7 04-01 21:36 asm -> asm-arm 进入include/asm-arm目录下: lrwxrwxrwx 1 root root 12 04-01 21:36 arch -> arch-s3c24x0 ............ lrwxrwxrwx 1 root root 9 04-01 21:36 proc -> proc-armv 第三就是在include目录下产生新文件:config.h.里面包含几个头文件,我的是: /* Automatically generated - do not edit */
6 _+ t& L0 Q3 G& ` #include <configs/gec2440.h>
' Q- p- j1 U( J& S) l: w #include <asm/config.h>
( [! R2 s+ x& b S* ]6 P% Z- h4 ~4 K |