|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
9 m. ?- l- G) p. ?U-Boot-1.1.6根目录下的mkconfig同样也具有如同makefile的重要地位。进入mkconfig可以看到它的源代码并不多。- {! }/ K( a* K; i+ p$ n
! n' f+ o7 s S! U 下面红色部分,均为我自己添加的注释,源文件里没有这些注释。1 M, Y$ m) v n* N8 O
; ]5 c$ P; p# s' _) J3 K- S5 v
________________________________________________________________& J; g' `$ N9 b6 @# V4 d$ j
( o( A: s7 E: a" e% c1 b5 u/ Y#!/bin/sh -e //指定执行该脚本所使用的解释器,-e相当于/bin/bash
' U( F9 n6 F" o2 }! o6 J2 b% a( u9 W: {7 c; O% u0 S) S6 y
# Script to create header files and links to configure% j% u3 c" i s) z- i* S1 `
# U-Boot for a specific board.
9 R' |1 K$ h4 W/ I" }% Q& y#! j& a& m4 z# h9 U* K: ^( `4 M& `5 f
# Parameters: Target Architecture CPU Board [VENDOR] [SOC]5 A, u, E! `2 L4 t
#
- \3 a% M- u' x8 x5 K c/ p# (C) 2002-2006 DENX Software Engineering, Wolfgang Denk <wd@denx.de>" ]" F @8 w$ Q# b9 @# o
#; l( ?! v ^2 o" |; n
) M4 Y2 P- F' Z, ~& F: ]( W' U! C
APPEND=no # Default: Create new config file //缺省创建一个新的配置文件,config.h- g/ m- ~9 U0 [
BOARD_NAME="" # Name to print in make output
# |5 P7 u* s5 v. d3 D1 [+ C
9 U% A3 T. U# S& g( Y) V W0 u! Dwhile [ $# -gt 0 ] ; do //$# 是传递给脚本的参数个数( I2 I* ]1 c' s# S6 a
case "$1" in //$1是上文Makefile分析结果里面六个参数的第二个参数,$1=EmbedSky, p/ ^$ A j1 T: o9 l2 n) [
--) shift ; break ;; //脚本case里面的每个模式行都是以双分号;;结束+ B) [. u3 T9 J
-a) shift ; APPEND=yes ;;
6 ?; c( V- T) T2 d0 U9 G/ s2 {' c9 I+ {& P* @1 ~* |% b; l! h# b5 y
/*$(1%%_config)原形为$(string%%substring),从string的右侧删除掉最后匹配substring的字符串*/9 J! i$ w- x3 K4 d5 c" S
-n) shift ; BOARD_NAME="${1%%_config}" ; shift ;;) Q5 c1 ]* Q! k' p0 t& z, z0 j) q
*) break ;;
! V, B; _2 V! ~6 i0 | esac //$1不满足以上条件,跳到done下面语句
9 w! i2 W* `' X5 h2 y% ndone9 U7 K' `$ x% E& b
: C" t6 _) }* o* H/*如果BOARD_NAME非空,则不执行后面语句,否则将参数1赋值给BOARD_NAME*/6 i4 n `, G1 X$ i% U" ?7 x' s
2 w" s) x- J( U/ {
[ "${BOARD_NAME}" ] || BOARD_NAME="$1" //执行完后,BOARD_NAME=EmbedSky+ h, C6 j/ Z2 u- `1 q
: |# b+ L& p+ e
[ $# -lt 4 ] && exit 1 //$#=6,即不小于4也不大于6,故不满足,跳过,然后打印
, Q9 w2 f5 e3 X[ $# -gt 6 ] && exit 1
+ W+ v8 f4 _7 _- }: C9 I3 N
# l; P2 s2 Y A" p+ _+ I; F: z5 n3 Gecho "Configuring for ${BOARD_NAME} board..."
G/ z W# M5 M" |6 a+ g0 k5 h. o$ N( o/ ]- W
#! s- K* K: T- n6 S4 U1 F' o
# Create link to architecture specific headers# `4 R* C' h' F* f" M$ o
#
, K1 Q% B+ D( S& n3 w6 s
0 A$ l2 r+ Z- g1 x! D/*下面一句判断源代码目录和目标目录是否一样,如果不一样则执行else分支语句,我们一般选择在源代码目录下编译,故判断语句不满足,将执行else分支*/
3 M4 D) M, S8 A$ c( hif [ "$SRCTREE" != "$OBJTREE" ] ; then
1 v) R8 G0 Z& c! q" U- S0 \ mkdir -p ${OBJTREE}/include //在目标目录下创建include文件夹
. r( \; [; u1 p0 s& M' R6 F* | mkdir -p ${OBJTREE}/include2$ z+ u O4 t4 u
cd ${OBJTREE}/include2 //进入目标目录下的include2
2 M+ G: s( a9 k# H% L rm -f asm //删除asm链接- X( L9 T' Y4 K4 n! T
ln -s ${SRCTREE}/include/asm-$2 asm //创建asm链接,指向根目录下include/asm-ARM
( p: Q0 x! R% p7 C LNPREFIX="../../include2/asm/" //赋值给变量LNPREFIX
( J1 q8 Q2 M! M1 ]6 s
! j; h }7 r3 `! k1 Z! {; ] L/*下面五句是,进入根目录的include目录,删除asm-arm链接,删除asm,创建asm-arm,重新让asm指向asm-arm*/
Z$ o! g! |# j9 H) P( H cd ../include% G0 m) b& \2 U5 r& ?# L) z) S
rm -RF asm-$2
1 e2 v6 l& u) i- a" m rm -f asm4 K6 u3 M) M% x) U& f
mkdir asm-$2: H9 S& O( r8 ]/ B
ln -s asm-$2 asm
: m7 n. \, ]2 x* `8 Delse
# d6 D" B/ s6 f cd ./include- D) l% [, W: H4 z' a
rm -f asm" ^5 q7 J% E4 h4 `9 H
ln -s asm-$2 asm9 ^. x# j, f* ^8 O! Y- Z
fi* B1 y) @+ S, x# G6 }: _, B
3 \2 ^" }% F/ O; Xrm -f asm-$2/arch //删除include目录asm-arm目录下的arch
0 Y" a" E" c9 s4 h' `3 m+ B$ \7 } w$ @6 C0 g6 ?1 Z3 [
/*-z表示如果 $6 为空则为真,-o表示或运算,$6=s3c24x0,故执行else后面语句*/
- c$ b. E4 U% `; b t- h
' T G8 @" b7 L. n/ A; n) t) S7 vif [ -z "$6" -o "$6" = "NULL" ] ; then0 F! Q" X. D& r! C7 d6 L
ln -s ${LNPREFIX}arch-$3 asm-$2/arch
/ {& b& a- s) G# g1 c# pelse . l* ]/ a9 v3 d: f( a8 K' J8 d6 a
ln -s ${LNPREFIX}arch-$6 asm-$2/arch //asm-arm/arch链接指向asm/arch-s3c24x0! |* O5 ^- \" t7 J" S3 Q
fi5 A& ^% I8 k/ Z, r- U
- H( P* q( j# v3 \- S/*$2=arm,满足条件,删除asm-arm/proc,asm-arm/proc链接指向asm/proc-armv*/
2 ~5 [- f8 y( c$ a, W# K9 M; R: |- |0 C/ k9 Z
if [ "$2" = "arm" ] ; then
3 a3 S0 N( S1 ~9 ]6 w# N rm -f asm-$2/proc* W, j: g$ p' w4 {
ln -s ${LNPREFIX}proc-armv asm-$2/proc" [+ X4 V1 Z8 b/ g& A
fi
+ i% Q4 t5 g% b% |% Z+ _
4 ?5 C9 [8 P0 m& Z#
' ]7 i5 \" m, O* z& O9 g9 j7 q# Create include file for Make
+ f- N9 o2 \; Q) A8 Q$ S+ l#
4 |: e% b- G4 z; k' g0 c* D% e/ y2 }- ~ |% U8 B- Z
/*下面五句是创建顶层Makefile包含的文件 include/config.mk */* N) H* {2 d! O) ]* I9 h
echo "ARCH = $2" > config.mk // >是将内容输出到某个文件的重定向符号
8 w+ {. J$ d. ^1 [7 \echo "CPU = $3" >> config.mk // >>是将内容追加输出到某个文件末尾的重定向符号- N1 R. t; L( Q8 W& i. ^
echo "BOARD = $4" >> config.mk1 O$ c' j& n; S. Q
% o; S8 s3 Y. ^; Q; u" a, Y; r9 U G
[ "$5" ] && [ "$5" != "NULL" ] && echo "VENDOR = $5" >> config.mk //$5=NULL,所以此句不满足
; E0 _; u* T6 {4 A9 z
# X0 _/ f b, }! I$ T4 A, P[ "$6" ] && [ "$6" != "NULL" ] && echo "SOC = $6" >> config.mk
1 P) V; m ^ o V
0 u H1 o$ D) r% `#
& o1 j, l$ i9 t! Q2 G2 x+ Q i& |& w# Create board specific header file
! m' O( L: g- Y: o#0 k6 E- G: k( A, l
if [ "$APPEND" = "yes" ] # Append to existing config file //APPEND缺省为no,故创建一个新的config.h文件
4 |0 E G( n9 x* N( c$ m+ G# Y# Zthen
5 E( _3 _# k4 W( X/ B echo >> config.h- Y% {7 g" `& c4 @/ R
else
" O W. N& Q" `' Q1 f# a1 h > config.h # Create new config file1 h) [- a. a5 H% |8 o# `; T
fi
8 O/ N2 D( t* ^% U( M; R5 X0 _+ k# F3 O2 O% ^+ m
/*config.h文件里面的内容包含以下二句*/9 _+ ]: O$ T1 H0 r" H& }
3 Y! h( O( |( p- f H1 x6 I/* Automatically generated - do not edit/ a; r8 U9 k+ I
7 Y+ \* x. n2 Q3 c #include <configs/$EmbedSky.h> */
! I4 x z* X- v9 R0 f# j4 ?5 gecho "/* Automatically generated - do not edit */" >>config.h( Z+ e Z6 G0 f+ I& v Y
echo "#include <configs/$1.h>" >>config.h
+ q: }4 A5 k' G( o8 o# y8 E4 z) T) v& K( {* [# K
exit 0 //结束,退出7 K+ d2 d& v7 m7 c) w/ @ q
( v' i6 J6 b9 d' v0 p% ?* R x- ?3 F
———————————————————————————————————' B. n5 k: T l' |* C, @2 U- N+ |
0 n6 [& ~ U( L& \总结:& { ~8 K& X. q. r* A
: g+ w6 ?9 w+ D 配置命令“make EmbedSky_config”实际的作用就是执行
! a' ]2 K2 m3 Q O( Q$ }
& k s1 R9 i i1 n./mkconfig EmbedSky arm arm920t EmbedSky NULL s3c24x0 这个命令,将产生以下结果& d5 u6 n" D- _- q
& \1 \* v. [6 V- P3 ^# a# f! ?/ [3 `
(1)、开发板名称BOARD_NAME=$1;8 ?* m5 B* H( _2 z5 }7 s
1 L) M4 V5 p5 `" m% c/ h(2)、创建到平台/开发板相关的头文件的链接,如下:4 T5 ~2 N8 M9 {( a3 J3 V
/ c# |) _: Q0 V3 k6 Z1 \ ln -s asm-arm asm
7 F* p6 ~9 q2 Y4 L% C# F
. [+ @ `/ t% {; _ ln -s arch-s3c24x0 asm-arm/arch
5 m# R' |. N( J' i i% g1 Y
1 F) f H3 j0 t4 T3 @0 N: w ln -s proc-armv asm-arm/proc
/ K# r5 q# S: a/ f5 [( Y# i' h* H) }' S1 o" y; U8 O
(3)创建顶层Makefile 包含的文件 include/config.mk,config.mk内容如下:: F' k0 I/ a U, I
* O& N- V/ ^" v% z- O( p ARCH = arm1 l2 v8 {0 e* X! H0 U( g( d0 o! j
( {7 `# M. O: }# c1 H4 a a CPU = arm920t+ X% V: S* A) s+ ^' {! B9 d: K2 @
& _8 w$ p+ q5 q y) b$ R- n
BOARD = EmbedSky4 f* r# n/ u, q& X# d G. }
' B0 y6 X8 N& h( y: l6 l SOC = s3c24x0
# [- Q6 e$ V7 R& x
4 I* w( D$ q% T; Y# @(4)、创建开发板相关的头文件 include/config.h
+ [9 D+ | C' S1 A- {- ?- S" c: b7 V" M
从以上4个结果可以知道,如果要在board目录下新建一个开发板<board_name>的目录,则在 include/configs 目录下面也要新建一个文件 <board_name>.h,里面存放的就是开发板<board_name>的配置信息,里面包含二种宏定义类一种是CFG类另一种是CONFIG类。
1 H1 r( Q( C% T, ]7 G& |
1 T" L7 d. H1 a; b* b8 n4 ]& i 8 B+ h6 Z7 U9 m( S0 G$ D5 V
9 ? s# A8 E8 F- e* d% z/ @/ h
1 K9 Y+ |; C1 C( _# V6 t2 _3 w) P/ o3 w; f
这节就讲到这里吧,祝大家学习愉快。
) \ G9 s! ?* o$ J% ^3 H: e/ k/ E* t
|
|