|
, P5 A) _# M q3 l6 l1 ^
首先进入顶层Makefile。有很多相对不同板子的配置,如: gec2440_config:unconfig @$(MKCONFIG) $(@:_config=) ARM arm920t gec2440 samsung s3c24x0 3 O4 L, T! @4 t$ D' z
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...% u/ o, K" M) S, o2 W7 h
现在看看有发生那些变化。由于上面的命令相当于执行./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的内容: . W+ Y- _5 V, A3 `9 Z8 k
APPEND=no # 这里记得APPEND初值为no$ F' d- j2 h$ @7 y- y9 V9 ~
BOARD_NAME=""
3 K3 g, ?% Q& t* K! C! PTARGETS=""
2 z6 ?: K5 z+ m8 J% t1 Q
- Q3 J! w/ D) J. \# u \1 d& c#下面一段代码不执行(while---done),由于./mkconfig arm arm920t gec2440 samsung s3c24x0没有--、-a、-n、-t
) f$ q5 t& }. v4 u1 G0 R
* o: {- Z/ L+ @8 h. n" q5 ^* l8 \while [ $# -gt 0 ] ; do
' M& Z3 w3 z2 ~0 Tcase "$1" in, S" \- J+ q. O
--) shift ; break ;;; T4 M' L" A7 e M
-a) shift ; APPEND=yes ;;
! z& m+ h, @+ ^& |- L; G9 n; m- [-n) shift ; BOARD_NAME="${1%%_config}" ; shift ;;
7 u& |8 G( W8 w, Y0 i8 @ F-t) shift ; TARGETS="`echo $1 | sed 's:_: :g'` ${TARGETS}" ; shift ;;7 }' d# E3 l3 O8 Y
*) break ;;7 g( f. ?2 M3 s5 V
esac
) w) h5 n: f' R# wdone
( h/ f$ y9 j9 m& u2 \) y7 {! @! \5 `& G( e, o. {- P
& Q5 \( W* {6 ^: o% F! m
% f6 ]8 e6 E+ ?( v6 y7 u6 X% u9 E: P5 ^! x+ Q7 l
[ "${BOARD_NAME}" ] || BOARD_NAME="$1" //BOARD_NAME=gec2440
6 \# r) B) h8 D: y1 h1 l! \* x) N* Z6 J' x2 L5 I) {6 W3 a6 m8 D, l8 W
+ m2 d7 R0 l' o2 P3 U3 }[ $# -lt 4 ] && exit 1- {* `6 _$ b0 |& K
[ $# -gt 6 ] && exit 1
- M2 `5 j% g! K' ^7 s
7 n( n. T# _+ l7 Y0 Q1 [
4 O% K4 r+ j# G% g* s8 oif [ "${ARCH}" -a "${ARCH}" != "$2" ]; then
) C* U: R6 v: |: Y. a' t) t8 Q% Zecho "FaiLED: \$ARCH=${ARCH}, should be '$2' for ${BOARD_NAME}" 1>&29 l, h7 F4 G9 G4 C) b' P
exit 1
( {1 H$ c/ y. b/ ^' X! F0 Qfi5 n+ p' `3 U u, g4 p A
' q* \, k' q3 j+ i
2 u2 Q4 S! H5 s. E1 ^//在终端打印Config for gec2440 board....2 f5 }) i3 H$ K
echo "Configuring for ${BOARD_NAME} board..."
( t$ N! ]! S, @" n7 G. e
0 l: W1 T3 ^# e; o& A' W* ?: Q+ j2 _# z, J& H7 o
#" f* U& \# j) S) Q( P0 S9 i2 Z
# 产生链接文件
! X7 p( X& M( A. [0 l4 k#
% m! r& {" C+ cif [ "$SRCTREE" != "$OBJTREE" ] ; then //是否在源代码目录下编译Uboot,不是就执行下面,else就是表示是在源代码目录编译% T3 L9 v+ ~4 H8 E
mkdir -p ${OBJTREE}/include r' @9 w1 ^* F) ?& w+ S. m- k) y( ~
mkdir -p ${OBJTREE}/include2
: ^2 e2 d. H+ ecd ${OBJTREE}/include2
1 H9 y C, k! y Z6 t! b7 lrm -f asm& b z1 {$ w4 Y% U ?
ln -s ${SRCTREE}/include/asm-$2 asm
* X) c3 G, [! e* XLNPREFIX="../../include2/asm/"
B7 x" D7 c8 pcd ../include
% x1 o% S. C! v- w& @rm -rf asm-$2
" N$ f/ N7 @+ R5 \1 mrm -f asm
4 U, I% O8 B }+ D; F8 p$ Q Nmkdir asm-$2
7 X. K3 x7 y+ i5 Vln -s asm-$2 asm" D: s, S6 S4 c' \
+ z( j8 {2 S, o* W" K/ F
~' L, y7 ^9 Q; {3 ?" felse. o, ^. u- h4 j _- H
cd ./include //进入include6 ?" V2 ]6 b- u% G/ s$ u F* ~& ~
rm -f asm5 _2 l/ ?/ J0 M1 s M5 b
ln -s asm-$2 asm //ln -s include/asm-arm asm
9 b! {) U' k9 C$ H6 F% T- Ofi0 r& ~; i" l, [; V
- E) e# k$ \3 Q- J, w# H% P% B! L0 S2 h9 y& F9 f0 `
rm -f asm-$2/arch //删除include/asm-arm/arch
1 b' f$ }& I; N5 v0 c% Q4 k9 u4 j7 b% |* |$ g. b
8 t8 Y1 j9 A' V) l! r3 d1 iif [ -z "$6" -o "$6" = "NULL" ] ; then //由于$6=s3c24x0,执行而else下面
5 r( Z. W0 m1 \- j: f. |ln -s ${LNPREFIX}arch-$3 asm-$2/arch . V1 C5 i1 B* h5 g. K3 v5 v
else& S' I& ~' x; q4 z* A# J; c, p
ln -s ${LNPREFIX}arch-$6 asm-$2/arch //ln -s include/arch-s3c24x0 include/asm-arm/arch! _7 z) t" ?& c1 P' _
fi
' t6 Y. G2 y7 Z- h H3 N9 H+ D" Q: r8 m9 E
" O& @1 z' e# \( l" {
if [ "$2" = "arm" ] ; then1 Q# R' B* A; q3 y, r7 [
rm -f asm-$2/proc //删除include/asm-arm/proc4 u# B5 G+ \ B& L7 y
ln -s ${LNPREFIX}proc-armv asm-$2/proc //ln -s include/proc-arm asm-arm/pro
: ?0 I9 l9 R1 o( s( d& j# o" ]fi
, e6 I9 p& i6 y" V- e+ k+ o8 }2 |3 U+ a. s
) N+ U! q0 \/ @
#, ? S' D& @9 K4 l( g4 {/ E0 I* z
# Create include file for Make
8 i" Z2 q/ p6 u! y) f0 l) u- r#. L, i6 ~3 X3 e4 Z2 I$ p+ p1 S x
echo "ARCH = $2" > config.mk //ARCH=arm,放入include/config.mk- Q6 }8 W7 l ^! ^7 v2 @
echo "CPU = $3" >> config.mk //CPU=arm920t,放入includde/config.mk' J5 G; O: m7 F7 J
echo "BOARD = $4" >> config.mk //BOARD=gec2440,放入include/config.mk+ i: q% h2 b y( v" S
0 g' B- O& C0 h( U" ?, J# z
: P% U) V4 i8 Y* J, ~[ "$5" ] && [ "$5" != "NULL" ] && echo "VENDOR = $5" >> config.mk
5 {" {( q+ x5 X2 }5 |6 |7 K//VERDOR=samaung,放入include/config.mk* r% ]$ _- e, I0 C, X9 m$ y
[ "$6" ] && [ "$6" != "NULL" ] && echo "SOC = $6" >> config.mk2 @" X, I8 }) j3 j& X! N
//SOC=s3c24x0,放入include/config.mk
1 X' W% u+ v( ~#/ E1 @6 [4 j+ _
# Create board specific header file2 ~1 f1 Q& i8 T+ Y
#
$ j+ K! F) m6 r' n2 Vif [ "$APPEND" = "yes" ] # 有第一行知道,APPEND=no
7 @% `( r; Z5 Dthen; ^) Z7 e/ p: q5 ]% T
echo >> config.h
. U: o& b2 j. r5 R# |else
- J2 c/ B. ?: I8 r" z> config.h #产生config.h文件,位于include目录下% K3 O2 Q$ W- R& n: U# [; H0 _
echo "/* Automatically generated - do not edit */" >>config.h7 G' N: w& V, b5 O1 V, p
b X! Y% i) ~) |7 x6 w; U# U! P
~$ Q+ B/ ^, r M9 [6 S) A$ y# {for i in ${TARGETS} ; do4 Q$ G" ]8 R1 t8 d& u
echo "#define CONFIG_MK_${i} 1" >>config.h ;( W* v7 m% ?, w# O& B" D
//将"#define CONFIG_MK_${i} 1加入上面产生的config.h文件
* ~* v3 b% z1 G4 e' u4 idone
: f* |# B3 ^- C. ^
4 ]( Q* ~9 d; p; r" Q7 b( I- X, t, p' A. R; k5 g
echo "#include <configs/$1.h>" >>config.h //config.h文件包含头文件"#include <configs/gec2440.h>
c8 Q9 f" J' r0 w vecho "#include <asm/config.h>" >>config.h //config.h文件包含头文件"#include <asm/config.h>5 K/ Q( R0 S4 `% L' \5 _4 S
9 P @! r- h1 p& a# g: B) v9 M
exit 0 3.上面红色部分就是改变部分。到现实中的源代码看看, 大家执行完make gec2440_config之后,到源代码看看。# G% q, N" l. I; s6 {
第一就是ARCH、CPU、BOARD、VERDOR、SOC被赋值, 并加入include/config.mk文件中, 我的config.mk文件内容如下: ARCH = arm
8 N! ~. h# ~0 e8 y$ f$ h V* l- Y CPU = arm920t
: J$ \2 k G3 r* a! } BOARD = gec2440
$ e% u; ]3 K, J' m1 u. w VENDOR = samsung
* U L2 B( ]5 j: Q3 j! b SOC = s3c24x0) T* N* [+ ^$ I2 v* e7 h
第二就是看一下链接文件,我的情况如下: 进入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 */7 x2 a9 m8 P2 K; g4 u( j# K
#include <configs/gec2440.h>
2 I! [* y& n; V+ N G #include <asm/config.h>
8 h1 a7 S' r: p( Z9 d2 N0 J |