|
. O3 ? L l0 }
随便找个uboot源代码就可以啦。 首先进入顶层Makefile。有很多相对不同板子的配置,如: gec2440_config:unconfig @$(MKCONFIG) $(@:_config=) arm arm920t gec2440 samsung s3c24x0
) W6 g5 ^8 j& T1.配置编译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...4 t- r) G0 m( m9 @& D! m
现在看看有发生那些变化。由于上面的命令相当于执行./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的内容:
0 i$ ?/ l% P- _3 ^ a0 D& S8 e) vAPPEND=no # 这里记得APPEND初值为no
9 c% x F; E! r$ d2 @BOARD_NAME=""
. P4 B" m/ b. y% `TARGETS=""
- F" q1 h" M9 A$ V5 z$ M2 M4 q% ~! D6 z: U7 P0 a$ P! x H1 ~
#下面一段代码不执行(while---done),由于./mkconfig arm arm920t gec2440 samsung s3c24x0没有--、-a、-n、-t2 p3 I1 J' T3 G) g
& V: v/ J6 C4 F% B: W
while [ $# -gt 0 ] ; do: f+ R. {. n6 y, \5 ~- t
case "$1" in
, d% m& I! t9 u4 ]+ ^6 ^7 g+ m--) shift ; break ;;
* @- ~2 L# A# S-a) shift ; APPEND=yes ;;
; O. [! B9 i: M: g- v I/ b-n) shift ; BOARD_NAME="${1%%_config}" ; shift ;;
3 p, T5 y+ X: E' k7 Z0 U+ C-t) shift ; TARGETS="`echo $1 | sed 's:_: :g'` ${TARGETS}" ; shift ;;
0 X) |% t9 H/ N0 t7 v& C*) break ;;
0 R% U9 j; w) fesac- r. m) M, a: _% N
done6 o1 Z1 Q6 d1 |" y
; g6 @3 A* ~7 Q: ^" u) G5 j- `1 Q. w. M8 U
9 n2 E: c( j' M0 {* U
& t( u1 ^. e( E2 {0 M2 Z[ "${BOARD_NAME}" ] || BOARD_NAME="$1" //BOARD_NAME=gec2440
+ B4 C- j5 U& B. Z U' Q
6 x/ o7 ]" |8 S# r$ d' I+ m2 Z# M/ y+ L+ S
[ $# -lt 4 ] && exit 13 Y# b; \7 L5 I. v0 F1 B1 u) O
[ $# -gt 6 ] && exit 1
' g+ D, H4 S5 j* o. U; D2 y! w" z- Q& G/ ?9 \, h2 X c' |$ j
; M, k6 _* s: C* G- dif [ "${ARCH}" -a "${ARCH}" != "$2" ]; then2 a0 G0 M8 j" j2 y
echo "Failed: \$ARCH=${ARCH}, should be '$2' for ${BOARD_NAME}" 1>&2
1 w- }" d4 _8 R6 oexit 1
$ D0 e4 b! Z( L( ]" T* Zfi
6 F U- C- N C9 i( ~0 c# Z9 U* y; ?. l7 s
n5 H c, k/ {9 G8 }- e F* O; I
//在终端打印Config for gec2440 board....
! H" l; y7 \& a' U6 secho "Configuring for ${BOARD_NAME} board..."
. R+ ~0 k3 j, i; M5 _; K' b' C
4 v7 `, H# I4 F ^$ }! T- f6 Y4 A: b* X1 w: ?$ `8 `. P
#) a9 j# ~& `, J) l f; w
# 产生链接文件% G* ]+ ]; w! k9 ]9 h* A
#
, Z, F9 }, L1 g2 S! N+ a2 Dif [ "$SRCTREE" != "$OBJTREE" ] ; then //是否在源代码目录下编译Uboot,不是就执行下面,else就是表示是在源代码目录编译
P( B, r& t; N2 v! ymkdir -p ${OBJTREE}/include
$ E z( Z$ L+ R3 |mkdir -p ${OBJTREE}/include24 t! \ t) |/ X$ b
cd ${OBJTREE}/include2, c( y# w' T; Z1 W1 p, M% J7 \
rm -f asm
$ h, R4 \: E& J+ V+ x N- H6 Lln -s ${SRCTREE}/include/asm-$2 asm
; @4 r; }* @4 Q8 ]" iLNPREFIX="../../include2/asm/"
. w9 q9 ^, K) y0 K6 {7 y4 _cd ../include
; M* Q' X$ {$ A/ N0 Irm -rf asm-$2& F$ O7 T8 Z9 T; ]! W
rm -f asm
' N7 b7 c7 r$ [9 p; Dmkdir asm-$2
* L+ Y( a3 v) ~7 l! ^( k- Gln -s asm-$2 asm
, i0 \* w7 s& \7 O7 O8 b; d5 P" [
8 p: \/ ?3 @, `. @5 W
" H) a8 C5 g( o9 m0 P9 g- u: h/ {else2 y! C( P. S% B( O9 f" ]# Q
cd ./include //进入include1 D$ w8 K- G& C- A7 t: } t9 Y3 P
rm -f asm8 D6 A0 H4 c7 i4 m
ln -s asm-$2 asm //ln -s include/asm-arm asm
$ |6 ?3 L* _+ f5 l5 h Tfi
0 ^" r, a5 t* ~9 r
4 N8 x! ^$ `4 L9 e* h3 Q6 c6 h1 S. N: u0 A/ O1 Y
rm -f asm-$2/arch //删除include/asm-arm/arch
1 v& f8 e- o o* ?1 M! t/ R, k7 j/ F5 D. w2 y, C& {& m
i3 H( ]( o: z* v8 o2 |' f
if [ -z "$6" -o "$6" = "NULL" ] ; then //由于$6=s3c24x0,执行而else下面8 B, ~) P! F% V+ `
ln -s ${LNPREFIX}arch-$3 asm-$2/arch
# g; Z/ J- ]% x+ x- gelse
9 W! }1 m* b2 ?- x+ h c9 dln -s ${LNPREFIX}arch-$6 asm-$2/arch //ln -s include/arch-s3c24x0 include/asm-arm/arch
: C3 T. [4 V5 J! L0 cfi
# [% X7 c9 r$ ^9 f; H8 @; w
; i: ~* r3 Q# @. O; d
$ W8 ]3 t$ d% d( \if [ "$2" = "arm" ] ; then
; @. a2 J( L* ? I9 W& arm -f asm-$2/proc //删除include/asm-arm/proc
5 D% _# l2 H; ?: D7 K0 b; @: vln -s ${LNPREFIX}proc-armv asm-$2/proc //ln -s include/proc-arm asm-arm/pro0 i- w J5 }; b7 J( M" j3 H$ v& k* h
fi
+ E' Q0 s9 Q+ |, W6 T' n& r0 V; U, J
G2 d# F% ]3 e
: T. h. g+ G2 @9 d#
9 z% O& B, l* V* V5 j& C# Create include file for Make5 H0 K# X* J1 _0 m4 h
#
8 P/ A( F) s/ b+ K0 Y5 V' Secho "ARCH = $2" > config.mk //ARCH=arm,放入include/config.mk$ b* ]( N6 U8 K$ | `% U
echo "CPU = $3" >> config.mk //CPU=arm920t,放入includde/config.mk
; E# y, }- E5 `' p' E3 o& \echo "BOARD = $4" >> config.mk //BOARD=gec2440,放入include/config.mk
, r1 t7 `9 P7 u8 d5 ]: K* m7 N( T0 s- G/ b
/ x' f; F* N1 F' I5 {) ~) K" Q
[ "$5" ] && [ "$5" != "NULL" ] && echo "VENDOR = $5" >> config.mk
; E' A0 g* u9 O0 z. p" m//VERDOR=samaung,放入include/config.mk$ |4 i8 q% R* [
[ "$6" ] && [ "$6" != "NULL" ] && echo "SOC = $6" >> config.mk) A6 A; ?1 m/ x }
//SOC=s3c24x0,放入include/config.mk
9 f3 x9 J6 L3 ] p. X) C#' D- O2 \4 E/ r& z
# Create board specific header file
: K- B8 J- j3 E4 S3 P5 U9 Q#
: J0 P; P+ j) l$ Y7 G' F; Xif [ "$APPEND" = "yes" ] # 有第一行知道,APPEND=no
% @& ~# X/ @" y8 L5 Jthen8 Q/ A% c t* A9 ~- k
echo >> config.h) A- _) {! L& ^: }. ]
else4 ~9 E5 ?+ I4 l: y5 l& u: e9 @
> config.h #产生config.h文件,位于include目录下
5 W( K6 `- ~* Z+ ^: J6 e2 j2 oecho "/* Automatically generated - do not edit */" >>config.h& t5 L7 e0 y+ ~) e6 I5 J! _1 C
' a6 f: X. N/ U$ B, c ]' Z
! x9 X- J0 k( {, Ifor i in ${TARGETS} ; do% U r3 k6 \. W- l
echo "#define CONFIG_MK_${i} 1" >>config.h ;
% ~8 u* @. B. N+ {0 h//将"#define CONFIG_MK_${i} 1加入上面产生的config.h文件
* U- i' S* Z7 f/ [7 @. [( r/ T$ f) Fdone- M; r3 Z% b& k& v, [2 b) w
- B3 S2 S# d3 {# b' H* b
( Y9 G) _/ d" T* v7 Fecho "#include <configs/$1.h>" >>config.h //config.h文件包含头文件"#include <configs/gec2440.h>4 B5 g1 X5 u5 i, {3 N1 }
echo "#include <asm/config.h>" >>config.h //config.h文件包含头文件"#include <asm/config.h>$ k& H5 ?8 c4 S% F% p+ W, L
4 \4 `5 F! M8 i% Y" p3 dexit 0
3.上面红色部分就是改变部分。到现实中的源代码看看, 大家执行完make gec2440_config之后,到源代码看看。
1 n6 p3 U% S2 f7 V6 r7 e( d 第一就是ARCH、CPU、BOARD、VERDOR、SOC被赋值, 并加入include/config.mk文件中, 我的config.mk文件内容如下: ARCH = arm1 `, V. W s/ X: ^1 ~ V, d7 ]
CPU = arm920t
' Q8 ?+ A# z1 y" ` BOARD = gec2440! h1 ] t! R2 R" A4 m* @! W
VENDOR = samsung
3 q, G" f- \. q$ L SOC = s3c24x0
& V: G- e5 u/ ^+ D* R 第二就是看一下链接文件,我的情况如下: 进入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 */
) h5 N$ q, `% j/ R #include <configs/gec2440.h>
, U6 o# ?% E, {, D #include <asm/config.h> + ^/ L$ [4 i) s( D7 R+ o
|