|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
4 I/ L. ~3 N6 k( o- k r& mU-Boot-1.1.6根目录下的mkconfig同样也具有如同makefile的重要地位。进入mkconfig可以看到它的源代码并不多。; u/ ^7 j: \! Q/ S) i; \* F
. W2 }0 {; K8 q& A 下面红色部分,均为我自己添加的注释,源文件里没有这些注释。
6 r# _$ r6 E, [4 a2 V6 q) a$ z# x f6 n
________________________________________________________________
4 L2 i# O5 L- @6 b, D- N; J
% x/ E! M- p2 s! ?4 I#!/bin/sh -e //指定执行该脚本所使用的解释器,-e相当于/bin/bash
! m: v- \0 d6 k9 y
. [1 C0 E1 y1 ~$ _- @# j# Script to create header files and links to configure0 E7 v& u- \6 a
# U-Boot for a specific board. `) k% I0 O# C1 U& ?- S
#7 x) w" C P1 g* X
# Parameters: Target Architecture CPU Board [VENDOR] [SOC]" t1 k, V- r$ ~+ w- U- N
#" E9 x" D e2 Z o1 p0 V4 v
# (C) 2002-2006 DENX Software Engineering, Wolfgang Denk <wd@denx.de>
) [) N8 G( Y' I/ U. b) @2 C3 e#; d6 U% N o5 M# H4 o) w
8 o$ n. k* N* h
APPEND=no # Default: Create new config file //缺省创建一个新的配置文件,config.h9 y" T0 C m Q" I6 J- O
BOARD_NAME="" # Name to print in make output' X- l% w* n! V5 e
" h3 @, m# @7 S" _' A& pwhile [ $# -gt 0 ] ; do //$# 是传递给脚本的参数个数
~& I, J0 u: E- o i- @ case "$1" in //$1是上文Makefile分析结果里面六个参数的第二个参数,$1=EmbedSky
5 j5 C& L. B1 v' t, J; N --) shift ; break ;; //脚本case里面的每个模式行都是以双分号;;结束
' S/ G+ i# z0 T% }1 G -a) shift ; APPEND=yes ;;
' h' c# Z. E: }" j* s' h2 d: C, W% @2 w5 c, C
/*$(1%%_config)原形为$(string%%substring),从string的右侧删除掉最后匹配substring的字符串*/: r6 D1 W1 Z- U! R' c
-n) shift ; BOARD_NAME="${1%%_config}" ; shift ;;
+ R) D- U. z3 | *) break ;;% B! v7 r) W1 F( l0 y
esac //$1不满足以上条件,跳到done下面语句
% h4 e$ n9 E* ?% Y! m3 Fdone8 F7 f0 B) h0 `2 _* W: O
* q; `! | H4 e/ ^4 S/ h j& D/*如果BOARD_NAME非空,则不执行后面语句,否则将参数1赋值给BOARD_NAME*/
0 q/ G8 g g3 l0 `
* J! V9 O6 _& G; e[ "${BOARD_NAME}" ] || BOARD_NAME="$1" //执行完后,BOARD_NAME=EmbedSky4 H' y% ^& k7 z3 @! }" @
+ e& @( o6 S! x: J8 u; Z, {2 v! N[ $# -lt 4 ] && exit 1 //$#=6,即不小于4也不大于6,故不满足,跳过,然后打印
3 h; t/ T) _, I$ d; O[ $# -gt 6 ] && exit 1' N3 j& E/ [7 N) b; e M# O/ v- j
3 Y' S- a7 ]+ Y
echo "Configuring for ${BOARD_NAME} board..."
# ~" k& n/ y* g2 b
% M N+ B, T/ m+ X( W* i#: e4 a) F" ?* W$ T( k+ B
# Create link to architecture specific headers+ v: g4 F+ A+ r! Z6 \% F
#
6 D F3 J B* }9 b! I. y) _& i8 P& [- _1 W5 E" z
/*下面一句判断源代码目录和目标目录是否一样,如果不一样则执行else分支语句,我们一般选择在源代码目录下编译,故判断语句不满足,将执行else分支*/
+ U2 R. N, }5 e6 Y6 r, A$ Iif [ "$SRCTREE" != "$OBJTREE" ] ; then9 t% U. r$ n( ~7 {
mkdir -p ${OBJTREE}/include //在目标目录下创建include文件夹
5 j+ h. e7 K# L mkdir -p ${OBJTREE}/include20 X7 i/ |* G' `8 ]4 l" B5 Q4 y
cd ${OBJTREE}/include2 //进入目标目录下的include2
( V/ J/ ~! ?2 Z9 ?! n0 ?8 m. p5 S rm -f asm //删除asm链接: D8 z! n5 F7 x6 N! J
ln -s ${SRCTREE}/include/asm-$2 asm //创建asm链接,指向根目录下include/asm-ARM
9 c" x4 `- s& h% ]' A y LNPREFIX="../../include2/asm/" //赋值给变量LNPREFIX" c% a9 `3 i/ [; L
- N$ T* q% Q8 h" D/*下面五句是,进入根目录的include目录,删除asm-arm链接,删除asm,创建asm-arm,重新让asm指向asm-arm*/6 R+ g2 t! m8 ]5 s$ s& \
cd ../include1 J0 r; ~% r( g" J) e3 o$ H
rm -RF asm-$2% I$ ~& p: y7 z" o6 W
rm -f asm, K- c9 [7 |7 l; d& ]
mkdir asm-$2
. p: w; P8 |, z4 y0 ` ln -s asm-$2 asm
; _" w% i# Y! X, o/ c( D! Aelse8 u( t' N& M8 ]+ D/ c" t& L+ N% _
cd ./include" q! K% ~$ ^" w0 ?9 W/ F
rm -f asm+ |$ T8 b7 m U
ln -s asm-$2 asm
$ l0 K7 v7 S2 I/ ^) Q+ }5 Efi
$ M5 t- v4 G- F1 W) L) i, m3 H# Z! [
rm -f asm-$2/arch //删除include目录asm-arm目录下的arch: O* z! w5 U. q1 W% i7 {* |; Q1 u
- A R7 |7 L, A& @) z/*-z表示如果 $6 为空则为真,-o表示或运算,$6=s3c24x0,故执行else后面语句*/
1 d3 y/ G+ M1 }! [9 C: n& _* B: o$ G8 Z
if [ -z "$6" -o "$6" = "NULL" ] ; then
& p' s7 j# S2 `4 ~ ln -s ${LNPREFIX}arch-$3 asm-$2/arch
8 f X: a$ Y N |* Felse
7 o2 g D% R% x( C1 ?, |+ [. P5 ^9 j ln -s ${LNPREFIX}arch-$6 asm-$2/arch //asm-arm/arch链接指向asm/arch-s3c24x0
0 q( t( q- c+ k* O6 q! l, p, Nfi- h) J; z) S+ u: I. _( ]
' Z/ i0 o3 q0 G9 v- g
/*$2=arm,满足条件,删除asm-arm/proc,asm-arm/proc链接指向asm/proc-armv*/
! I; c5 Y6 l' `" R/ H' i3 B
% Q4 [8 A7 v7 k) Jif [ "$2" = "arm" ] ; then
+ n: Y) y: }/ q7 U3 g' X rm -f asm-$2/proc
3 n) ?, Z! r+ X ln -s ${LNPREFIX}proc-armv asm-$2/proc
6 [' ]/ b9 t) [1 x; } \( |fi7 H; m& E4 x$ ?, T# q2 k; E( E
0 \$ t, } c5 J6 e$ } h7 s
#
4 B/ V% {' l c# Create include file for Make) Z+ J7 f& ]: u/ l6 P& L& @1 I
#* M2 O0 \) c3 p
' h' N" |' E1 r$ i3 t
/*下面五句是创建顶层Makefile包含的文件 include/config.mk */
T& S( A6 V" H- N0 E0 D0 Jecho "ARCH = $2" > config.mk // >是将内容输出到某个文件的重定向符号
, `' J0 s, W7 x0 k3 Z, I% o2 fecho "CPU = $3" >> config.mk // >>是将内容追加输出到某个文件末尾的重定向符号 s. T+ Y D, V+ J$ b
echo "BOARD = $4" >> config.mk
: m* w6 C. m, B6 Y6 n: t* n) Z& O5 |0 T _! W& a* z
[ "$5" ] && [ "$5" != "NULL" ] && echo "VENDOR = $5" >> config.mk //$5=NULL,所以此句不满足
! C) x Y' T, b5 b; G6 g
% h1 i0 f* O- B[ "$6" ] && [ "$6" != "NULL" ] && echo "SOC = $6" >> config.mk
, C6 M+ R U+ N0 p4 B
% [) p; L6 U0 z0 W" q$ |9 j#
! l5 M4 @% O: A# Create board specific header file
4 Z9 [4 q% T9 B! a6 O" |#; M# _1 K1 e( v" S' D
if [ "$APPEND" = "yes" ] # Append to existing config file //APPEND缺省为no,故创建一个新的config.h文件1 n& i( s& M4 u
then% |0 N9 }" F9 s0 v: n: `
echo >> config.h
) q" A, i" ]7 e1 {- O( G+ belse
, T+ z6 y& g3 I4 j5 p: Q b > config.h # Create new config file
+ W; O" u% a/ v! e2 e& P4 X5 ofi
$ b6 c& n7 p2 m% q( n& g* k( w
5 V$ I* M! n6 }' I3 m; x/*config.h文件里面的内容包含以下二句*/
+ X+ o; M9 O9 v0 ~; J, |! z
) P2 m1 b4 |( T/ {4 l, ^/* Automatically generated - do not edit6 D+ H( J1 ^* U' A! I) U9 e
# c) o5 N# R1 p; d9 o7 _ #include <configs/$EmbedSky.h> */. e0 Y" L3 b7 F$ G. W7 k
echo "/* Automatically generated - do not edit */" >>config.h) I3 P& v4 u1 Y! _% R
echo "#include <configs/$1.h>" >>config.h6 q( F, z+ q: o
1 [- a2 }, ?8 e# T3 D
exit 0 //结束,退出
, ?6 N$ C4 g7 k* o( @
* d Z- v8 c: g' K———————————————————————————————————
' S$ e9 M% M8 W/ J: ~8 \' [ p6 w: \8 K' ?) y$ R& E
总结:
- h8 J" Z [2 A. K# @9 z# Z8 F8 J$ ^: K* [2 Q$ X6 J
配置命令“make EmbedSky_config”实际的作用就是执行
2 `7 M, W0 o+ d" r( o# k& C1 x3 a+ Y& v9 P
. i1 g) N- `; t/ ^- A: h2 E./mkconfig EmbedSky arm arm920t EmbedSky NULL s3c24x0 这个命令,将产生以下结果
) O5 V$ r! A& r. J0 F* I0 }" p* G, J
(1)、开发板名称BOARD_NAME=$1;& Z, j/ X; s5 ^2 q x/ B
4 I9 n- S. }3 S
(2)、创建到平台/开发板相关的头文件的链接,如下:
: @: h1 |" a- g, c4 L) b' a( e' y# u" U1 B
ln -s asm-arm asm' g. n9 N/ }) o% ]
+ A# H4 Y" A% b$ }8 M ln -s arch-s3c24x0 asm-arm/arch
: R9 }" E) \# K4 l" n" Q
1 D; j9 @; B W% g ln -s proc-armv asm-arm/proc
5 p: i1 R% e8 [6 T
# H( L3 o/ E9 L' _(3)创建顶层Makefile 包含的文件 include/config.mk,config.mk内容如下:# f: _0 m5 Q% b# M. Q8 _1 \5 s t' z
0 v& `$ G: A- H2 i& I5 B ARCH = arm
5 K8 Y) G x: u0 C4 N$ ~* Y1 a( D/ @- ~* `, y. w9 I
CPU = arm920t
1 g6 R' A4 \* Z& r, ?. G3 f1 G6 ]7 X! p
BOARD = EmbedSky+ {, Q5 s$ j3 D
$ i2 M: C/ P- J4 m4 G$ U SOC = s3c24x07 l2 e2 H+ A4 D
& E( Z% M% c1 F8 `3 i7 E% o(4)、创建开发板相关的头文件 include/config.h S3 N5 E8 M6 ~4 ^& i2 F3 ^1 O P
( K6 v+ o( N9 D9 V* P9 } H1 D 从以上4个结果可以知道,如果要在board目录下新建一个开发板<board_name>的目录,则在 include/configs 目录下面也要新建一个文件 <board_name>.h,里面存放的就是开发板<board_name>的配置信息,里面包含二种宏定义类一种是CFG类另一种是CONFIG类。
4 X+ K! a' o- ]9 F
/ Y; d* P. V6 R/ f
! H \' H6 f# `2 ^% t u6 S/ c3 Z5 {/ x% `: G+ N+ B. ~* s
9 a0 e/ [$ X5 `; T! ^. `; C
) E, z2 R' Z, v1 D
这节就讲到这里吧,祝大家学习愉快。
) q9 r5 w i/ y$ D0 Y7 n1 f
# v; I' `- Z8 R3 ^& `$ ` |
|