|
! x' ]- U* N! ?+ Q/ T1 {
随便找个uboot源代码就可以啦。 首先进入顶层Makefile。有很多相对不同板子的配置,如: gec2440_config:unconfig @$(MKCONFIG) $(@:_config=) arm arm920t gec2440 samsung s3c24x0 : Q+ O8 @2 G S; R# [2 [
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...# B$ H5 ^2 A3 C; ?. z+ 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的内容:
! h" E4 N0 F- H3 A0 o& y8 uAPPEND=no # 这里记得APPEND初值为no7 c- R( U, E: {5 A6 t& {. Q
BOARD_NAME="", R4 E3 n; x, P& F7 k2 Z
TARGETS=""6 n7 h5 t Y G! L& T" j7 E
* m( h' |/ u" [, B1 c
#下面一段代码不执行(while---done),由于./mkconfig arm arm920t gec2440 samsung s3c24x0没有--、-a、-n、-t/ o- C" K+ F |
0 B, {4 Q3 {. n2 L6 D5 {while [ $# -gt 0 ] ; do
7 ^/ B7 [# Z$ N# V2 G5 Wcase "$1" in
7 J2 W( U; n5 V4 h3 K: h; l--) shift ; break ;;7 Q9 s J/ [$ [' W$ u' S
-a) shift ; APPEND=yes ;;
6 }; x4 f2 f, X& m, }-n) shift ; BOARD_NAME="${1%%_config}" ; shift ;;
/ _2 H/ w7 x. ?! i! L2 {# K-t) shift ; TARGETS="`echo $1 | sed 's:_: :g'` ${TARGETS}" ; shift ;;
4 I" ^4 B7 ]2 G: D& m: B( y0 n! b1 f*) break ;;
1 X5 D+ }# n: B9 z/ V8 Oesac
: e! o. _$ d/ U8 o8 m: A9 \done/ I8 N, k% n* G1 t5 i9 }8 o+ P+ Z3 [
0 q$ |2 Z: \5 w7 l0 B& g, u
' E" {8 u# H+ \/ b6 J2 s) ^
; m0 o0 Q" c4 O4 A/ J$ A8 e: t* C& R. a8 c" _+ p, q
[ "${BOARD_NAME}" ] || BOARD_NAME="$1" //BOARD_NAME=gec2440
- h. m' C5 p* H( X N* e" o* X1 W- Y" x% a
, E( M( C A3 W8 `3 n' h[ $# -lt 4 ] && exit 1+ E% ]: E8 X2 `5 e* C
[ $# -gt 6 ] && exit 1: \' b# D) N$ B( k* N4 `6 s# |6 b- X
: c& @& ^: g9 T6 f2 U N# } T
4 G k( t! a X8 F9 X& Y' Xif [ "${ARCH}" -a "${ARCH}" != "$2" ]; then: t0 M+ y) _0 K/ A& O
echo "Failed: \$ARCH=${ARCH}, should be '$2' for ${BOARD_NAME}" 1>&2; H6 G- Y2 U$ x' o$ O
exit 1
J$ U0 x& i) s2 u5 Ifi; m$ N; Z; t0 l4 @' u: i6 `
6 W& @; f) _* B: y! S
& ^6 H1 p" ^5 ~) ?//在终端打印Config for gec2440 board....# j2 Q+ R$ k! A% R2 b0 D% J! S
echo "Configuring for ${BOARD_NAME} board..."
7 z3 R# P+ e9 t9 X. v) t4 }" L% L8 b" S9 X3 I
$ X) D6 k: @# B5 j6 L2 F
#9 F( o% u( Y: @" V
# 产生链接文件
' o. Y& F- L" n" e: Q( }( E: R#3 |$ ]8 b% n# I
if [ "$SRCTREE" != "$OBJTREE" ] ; then //是否在源代码目录下编译Uboot,不是就执行下面,else就是表示是在源代码目录编译9 p! }. w! u- _9 F
mkdir -p ${OBJTREE}/include
U( l% S! b# R! Smkdir -p ${OBJTREE}/include2
9 J1 j' }; L5 m6 n$ {* k; scd ${OBJTREE}/include2" F/ n" Q0 K( b+ O% ?6 H
rm -f asm
! r4 Y% s, r7 Q! e4 K. Yln -s ${SRCTREE}/include/asm-$2 asm
" D# b& C4 A0 J. m5 a, V5 c5 hLNPREFIX="../../include2/asm/"
/ Y6 n* l6 i' |# zcd ../include; N6 v1 K' y# ? `9 L6 M) r
rm -rf asm-$2
* X% G8 N& A5 K; y& _8 h7 Brm -f asm
! d( i3 P, M5 {. H& s9 [* C* Vmkdir asm-$28 {% o3 D. D9 @) C' i
ln -s asm-$2 asm# B' O# r9 U- W- v" Q/ ~4 }; i
: x/ a; X" k) P/ H' m. D* B5 s
+ a. @$ o8 r: e( k q
else# ^. A' T- v7 c8 ~
cd ./include //进入include
) u* C0 J0 o/ z+ j# `rm -f asm1 x6 g1 t1 g0 t, U) N6 }
ln -s asm-$2 asm //ln -s include/asm-arm asm& ]" u. Q2 X3 V4 B
fi
3 s$ y; A8 [; D# O6 v0 V# k
" _! ?# F, ?7 I% I2 ]6 h f& p+ I
]! \7 ^' N, c: jrm -f asm-$2/arch //删除include/asm-arm/arch; ^$ X/ b; Q+ a( ^& S7 P2 }% z( y
6 w) q$ |* c; v$ H( F* m* B
0 a, E8 e. E/ O1 p& `# [; _9 Cif [ -z "$6" -o "$6" = "NULL" ] ; then //由于$6=s3c24x0,执行而else下面
- o7 f) Q1 t1 k j- H4 f8 Lln -s ${LNPREFIX}arch-$3 asm-$2/arch
) G% P5 m. H4 h8 Oelse8 L( t4 d) e, r ]6 z# A
ln -s ${LNPREFIX}arch-$6 asm-$2/arch //ln -s include/arch-s3c24x0 include/asm-arm/arch
" p8 U. e' {. z& w% Ifi
, y% V& g* w6 i
2 U8 }% n5 @) e" [- ^, a9 S/ ]- C4 r# K: i( r+ N( \2 e
if [ "$2" = "arm" ] ; then
/ X" K& R: n* G% P, F* [rm -f asm-$2/proc //删除include/asm-arm/proc2 E& G8 w p6 P9 J
ln -s ${LNPREFIX}proc-armv asm-$2/proc //ln -s include/proc-arm asm-arm/pro
+ _! ]+ c4 T+ J6 n7 }5 rfi" R! i$ J+ t7 d! q4 H9 @
( N3 q: ?/ h8 k% V* i7 w, Y) }6 h8 Q% H7 V; N( q
#
9 B7 S7 E3 A: O3 I- h, C# Create include file for Make
% E/ a) n$ a( t& R* k9 n' {#
9 A6 i- Z7 j% W$ ~% [1 gecho "ARCH = $2" > config.mk //ARCH=arm,放入include/config.mk" N5 g' @) a8 a8 |! J
echo "CPU = $3" >> config.mk //CPU=arm920t,放入includde/config.mk
1 _/ a. c& L1 o$ A) ~+ S. Jecho "BOARD = $4" >> config.mk //BOARD=gec2440,放入include/config.mk2 K7 e$ M( K* \1 ~' W3 S
9 }6 h3 _1 F5 K2 C$ k
]" d) Q6 ]' @+ P* E- _7 d[ "$5" ] && [ "$5" != "NULL" ] && echo "VENDOR = $5" >> config.mk
. Q9 ?3 N7 B0 b! o4 Q. ?! G//VERDOR=samaung,放入include/config.mk$ G' O$ h( g- c0 _
[ "$6" ] && [ "$6" != "NULL" ] && echo "SOC = $6" >> config.mk
9 P7 c' f: z% Q6 B//SOC=s3c24x0,放入include/config.mk+ b; G0 Z. b) {6 ]! J1 d
#
8 n/ {+ S1 r6 i5 m+ o, H9 w# Create board specific header file
. Q, @7 C& O, ^6 h( Q0 F#6 L6 D- K" e8 z$ I* I
if [ "$APPEND" = "yes" ] # 有第一行知道,APPEND=no
1 K$ |: ^' A0 u( a% Lthen
& P! l2 d; U- n) y, \echo >> config.h
3 X& w- C( _& C [! Qelse3 K6 x4 e5 a1 u; s8 R
> config.h #产生config.h文件,位于include目录下+ Y- G" T$ m0 o) ~/ m
echo "/* Automatically generated - do not edit */" >>config.h/ X- D) z" E! r9 k7 E
6 p4 o/ Y$ {, X7 K
; J0 [. X2 Z( pfor i in ${TARGETS} ; do
$ w i! S1 y/ `! U% P) k6 e9 ?( T# fecho "#define CONFIG_MK_${i} 1" >>config.h ;
g+ j- z& Z# m2 O- [//将"#define CONFIG_MK_${i} 1加入上面产生的config.h文件- m9 }5 ~& f6 Z; y1 q1 ^
done
3 T$ S, G W! k& q8 P) s6 b5 g7 D% @, |: X/ F) x8 y
5 o5 k9 [+ |- o/ Y; mecho "#include <configs/$1.h>" >>config.h //config.h文件包含头文件"#include <configs/gec2440.h>5 U& T" W' x, g3 k6 l3 ~
echo "#include <asm/config.h>" >>config.h //config.h文件包含头文件"#include <asm/config.h>5 h9 D! _0 S x: u
( i B0 C1 x }* c( H9 J& [: m) ~
exit 0
3.上面红色部分就是改变部分。到现实中的源代码看看, 大家执行完make gec2440_config之后,到源代码看看。9 {- e, q% v9 f$ n& h- M; a
第一就是ARCH、CPU、BOARD、VERDOR、SOC被赋值, 并加入include/config.mk文件中, 我的config.mk文件内容如下: ARCH = arm9 e" a! N" p8 K) N G& ^ V5 _* I; |
CPU = arm920t; M. h$ i, A3 v# n
BOARD = gec2440
]2 y( z8 _* G# _7 ^. Y% e VENDOR = samsung5 ?& d0 d% k0 w }
SOC = s3c24x0
' j+ w) L* T% f/ T/ ?* i$ G 第二就是看一下链接文件,我的情况如下: 进入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 */( P3 y- j, y5 ^7 ]+ {: Y
#include <configs/gec2440.h>
& h$ n0 [2 V/ r* I7 n+ R# ] #include <asm/config.h> - o! Z: M& M6 Y, s
|