/ [. h8 z' O3 a6 z0 h) }# y
首先进入顶层Makefile。有很多相对不同板子的配置,如: gec2440_config:unconfig @$(MKCONFIG) $(@:_config=) ARM arm920t gec2440 samsung s3c24x0 # M) A6 A* \4 w6 N
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...
6 P8 q5 O# {4 L# V3 t/ K2 ] 现在看看有发生那些变化。由于上面的命令相当于执行./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的内容:
- r* S) J. S( pAPPEND=no # 这里记得APPEND初值为no0 K! ^7 X g) ?! ]* P/ J
BOARD_NAME="") t( R5 T {# i1 I3 w# I5 G9 f9 m
TARGETS=""; ?! \. ?$ p( E8 v. j0 @2 j6 D5 _
" @# v/ U% J. E5 R6 v; q: Z5 A
#下面一段代码不执行(while---done),由于./mkconfig arm arm920t gec2440 samsung s3c24x0没有--、-a、-n、-t
& m* L3 f6 r% Q0 x9 X# O+ i; G; q0 Q; _7 v7 P: U' c" b- u6 u
while [ $# -gt 0 ] ; do6 P g2 H% z/ }- v
case "$1" in: J; t/ ^) r1 v$ R/ ?
--) shift ; break ;;3 g, m9 V3 Q i
-a) shift ; APPEND=yes ;;
4 e; ?4 ^: R$ T# q6 v i. f-n) shift ; BOARD_NAME="${1%%_config}" ; shift ;;
$ _: w; \; _5 \' M/ ~* d-t) shift ; TARGETS="`echo $1 | sed 's:_: :g'` ${TARGETS}" ; shift ;;
/ [* M) y" n4 l: f9 [! y*) break ;;+ X4 _3 t! C( N2 H0 T$ [8 ?
esac
% C! j& ]: B* a8 gdone
/ K5 [1 @ R j7 K) k! p; V; m1 }# K. Z. ?! N9 n
, y+ n- j. T2 j. H6 c7 W" M% T# _" O
5 r: E( ^# {4 m
[ "${BOARD_NAME}" ] || BOARD_NAME="$1" //BOARD_NAME=gec24400 H; y, y4 d0 h* u2 h; O6 p
. Q Y/ D5 |) y! F" L6 b0 l
& {% c- i" z7 w3 f" B[ $# -lt 4 ] && exit 1
' |, ?3 ?- n$ V0 _8 L2 i" f5 F* K[ $# -gt 6 ] && exit 1- T; p; L3 X- z# q+ L
! H; a- A3 {5 k( Z. Y
& t( k5 p+ i9 X4 Q- B# b5 f! y5 U
if [ "${ARCH}" -a "${ARCH}" != "$2" ]; then
7 b" P" {( V# `: z P hecho "FaiLED: \$ARCH=${ARCH}, should be '$2' for ${BOARD_NAME}" 1>&2
3 E' C* {% ~8 Y( Oexit 1
% G% s2 K+ r4 Yfi2 S# K8 e# x1 Y2 Q0 N( Z2 f9 c
, N8 o0 Y" {/ }, U+ V. {
. I- L! V5 R' `) O9 v3 t2 S# h' [5 G
//在终端打印Config for gec2440 board....* }$ R; w+ o/ ^8 }4 x
echo "Configuring for ${BOARD_NAME} board...") [6 f# ?! t# W3 p# u
2 `2 n0 `( }* U. n# j2 \- C5 ^, J d
- o }& F! }) \! h2 U# B- _
#
( h" W4 I; O3 Q. ~# 产生链接文件/ {2 A& E6 k; X1 ]% q. w8 c' r
#6 s: i( k q1 ]. O/ Q
if [ "$SRCTREE" != "$OBJTREE" ] ; then //是否在源代码目录下编译Uboot,不是就执行下面,else就是表示是在源代码目录编译
$ @! s) ~; J8 \, P& umkdir -p ${OBJTREE}/include: R& b1 b- r" u; [, \) I- o8 N
mkdir -p ${OBJTREE}/include2
( e" L& f1 I/ R9 r0 g$ O \cd ${OBJTREE}/include2
1 i0 V+ D1 e. Q/ _9 g9 Frm -f asm/ K( ~2 s, w% S/ @
ln -s ${SRCTREE}/include/asm-$2 asm( q; R! E& d9 n
LNPREFIX="../../include2/asm/"
% D9 p) l/ e5 L+ E/ T8 C% P. Ycd ../include
5 x% @2 p; v8 X% n+ drm -rf asm-$2
8 |1 a0 ]1 b7 G5 k: h- ]% k" c2 w+ [0 wrm -f asm
" M7 I( i4 J& R1 O# {9 i1 M+ Q2 Qmkdir asm-$2
8 f& a, r* `- j. _ln -s asm-$2 asm# k. }, L. l9 u( V! n& j6 Y4 w7 d# X5 e! c
`; [2 ^2 e! d1 w/ F. H
- z! K* k/ J& Z% q; R: R$ qelse$ ^4 R! v! T d7 N
cd ./include //进入include' A2 h Y. z7 S: {) B. P5 o+ J& @
rm -f asm
- v) C- F/ Q9 [, n, x5 C v% }ln -s asm-$2 asm //ln -s include/asm-arm asm( C# [% q5 ]' g' r: Z
fi2 d& g! `" \/ N5 O
0 f# E, V1 w2 ^
; U# p# o/ u5 b7 _! U5 ?: J/ qrm -f asm-$2/arch //删除include/asm-arm/arch
: i5 f( O# |1 \0 A1 r
/ V! _' F) c) s" Y( \) H" Z; \" @( E$ ?
if [ -z "$6" -o "$6" = "NULL" ] ; then //由于$6=s3c24x0,执行而else下面
0 @. o- @- q! D. f* E+ \! K: {ln -s ${LNPREFIX}arch-$3 asm-$2/arch
& ]+ U' Q' c- L; W* C2 Telse9 V2 E1 U# m$ i* S, e: F
ln -s ${LNPREFIX}arch-$6 asm-$2/arch //ln -s include/arch-s3c24x0 include/asm-arm/arch
, n" v0 |, P$ Ofi! f) O1 J! [; p/ w: F
: T. P7 _# ?$ w
) S3 O5 _4 j1 ?+ K5 Y
if [ "$2" = "arm" ] ; then
; B* e( ^* T/ D/ V8 g1 O& |1 q3 mrm -f asm-$2/proc //删除include/asm-arm/proc
) A+ F9 ~2 q" s" H, V `ln -s ${LNPREFIX}proc-armv asm-$2/proc //ln -s include/proc-arm asm-arm/pro2 w- ^) y; m& T& {& _
fi6 m1 l7 Y! h2 H, q
; u" p. A$ s% C9 b$ p0 {* G4 j# T/ }5 g" f# `$ q3 e
#( A6 ~: L$ B7 c% f n3 V- E
# Create include file for Make
& R- N1 C7 s) L1 ]" ~4 Y' S% u#
$ ~+ m/ Z4 l8 n2 `* X* n* Zecho "ARCH = $2" > config.mk //ARCH=arm,放入include/config.mk6 W9 j* L9 O* V7 D6 k! X
echo "CPU = $3" >> config.mk //CPU=arm920t,放入includde/config.mk
5 I; w4 K% t0 h/ |# l% lecho "BOARD = $4" >> config.mk //BOARD=gec2440,放入include/config.mk
F& L& q' d# T% P& ~# ^" ^2 d5 X" l" y- T9 J! m* m
8 \. o2 T3 ]& K) T# {% m% G
[ "$5" ] && [ "$5" != "NULL" ] && echo "VENDOR = $5" >> config.mk
: X( c% j l4 p( U1 b5 e- K//VERDOR=samaung,放入include/config.mk
4 _2 p; z1 m! l[ "$6" ] && [ "$6" != "NULL" ] && echo "SOC = $6" >> config.mk$ N! _3 T4 }9 P2 H L3 y3 [" e$ {; }- `
//SOC=s3c24x0,放入include/config.mk
1 o3 G7 Z1 A! D1 B#
! R' m% u6 Q, `0 N( P: @1 Q( m; K. @7 H# Create board specific header file
K1 @4 Y. `: R1 P1 J* f2 w#( Z, U0 l. i8 f
if [ "$APPEND" = "yes" ] # 有第一行知道,APPEND=no
+ Q) o8 \9 ~: Fthen
v$ J$ a$ |- b% e2 C0 n3 becho >> config.h
& z3 A2 E5 W& S7 e9 S, S( B7 O$ S. I+ }else( h0 y+ g7 I; d3 w
> config.h #产生config.h文件,位于include目录下
& ~8 s# |2 B& F mecho "/* Automatically generated - do not edit */" >>config.h) m8 Z- Z: P- R; n6 @
- v8 E' d. Z+ q6 |: e
# s+ w. v; Z9 m, N3 w* I/ e( I7 [for i in ${TARGETS} ; do
8 h9 p4 H% i+ R/ o, e1 M- t% A4 u$ K# `; qecho "#define CONFIG_MK_${i} 1" >>config.h ;
$ E2 n6 m* z: b k- o//将"#define CONFIG_MK_${i} 1加入上面产生的config.h文件
/ W6 N) f. D( v, E @done! X9 E/ u; ?* b2 ?5 S/ [# i9 d
& |4 g! ^0 Q( m9 z4 z9 F( A: I/ Q. N3 l1 w! i
echo "#include <configs/$1.h>" >>config.h //config.h文件包含头文件"#include <configs/gec2440.h>2 k6 e0 a1 X- x1 W2 A' M+ R, ]
echo "#include <asm/config.h>" >>config.h //config.h文件包含头文件"#include <asm/config.h>
3 M, {/ {2 e E7 H, R) P$ q# I2 V
exit 03.上面红色部分就是改变部分。到现实中的源代码看看, 大家执行完make gec2440_config之后,到源代码看看。! D5 o0 w \( ~/ ^4 |5 \0 q' n
第一就是ARCH、CPU、BOARD、VERDOR、SOC被赋值, 并加入include/config.mk文件中, 我的config.mk文件内容如下: ARCH = arm
$ s1 o1 ?8 S# T" |# W1 o CPU = arm920t: }8 t5 }8 X0 O: ^7 r- s
BOARD = gec24409 a1 O1 q) T X ?: l! q
VENDOR = samsung
* z( M6 A- t( V+ u. p. T% E4 b SOC = s3c24x0
( Q; ~ R( T& d" C; B 第二就是看一下链接文件,我的情况如下: 进入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 */" u/ P# e6 |3 a
#include <configs/gec2440.h>8 S! ~7 B* m3 Y- h: \
#include <asm/config.h> 7 n% ~( G" M7 @8 H( E' _, u( Z- V
|