|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
3 {1 d0 ]3 I' n5 ^, K; A* vU-Boot-1.1.6根目录下的mkconfig同样也具有如同makefile的重要地位。进入mkconfig可以看到它的源代码并不多。
- `9 R: Y- b$ }7 ^( b, V
9 L3 j9 s3 `- v- `, M# f$ v 下面红色部分,均为我自己添加的注释,源文件里没有这些注释。
1 l( Z# [1 n7 H
, E6 h4 m" f& t________________________________________________________________: T4 n8 ^" J: u
( Y* O. y/ X" R% K8 P
#!/bin/sh -e //指定执行该脚本所使用的解释器,-e相当于/bin/bash) O$ I' A8 \$ a( t
4 Y. o# T- h |# Script to create header files and links to configure- W" W6 z3 e: C& M/ V' T6 f
# U-Boot for a specific board.: E7 l, A1 V$ F/ b; y: T
#1 |5 a& K# h3 [4 I
# Parameters: Target Architecture CPU Board [VENDOR] [SOC]3 H' z# D g& A8 c- \2 r
#8 T5 j5 H& v/ o
# (C) 2002-2006 DENX Software Engineering, Wolfgang Denk <wd@denx.de>4 h/ T) k& |2 N/ G6 y5 Q9 U) [
#! u U) e' ~& V S. |9 T
( l8 v* l( H% [; I3 D9 N0 c: p7 UAPPEND=no # Default: Create new config file //缺省创建一个新的配置文件,config.h
5 O: f6 U3 h2 K9 kBOARD_NAME="" # Name to print in make output
) p) H3 y& E N b' _
# G* [ @0 T$ Z0 Y) ]2 Nwhile [ $# -gt 0 ] ; do //$# 是传递给脚本的参数个数
9 i8 p- a# R$ D, S& W9 w case "$1" in //$1是上文Makefile分析结果里面六个参数的第二个参数,$1=EmbedSky" Y, J9 N* Q K: H7 |
--) shift ; break ;; //脚本case里面的每个模式行都是以双分号;;结束7 _* e1 |) ?" B. j
-a) shift ; APPEND=yes ;;8 U4 _& R+ x2 u* J2 F
& t" b0 Z" i6 o2 M/ ~% I2 @
/*$(1%%_config)原形为$(string%%substring),从string的右侧删除掉最后匹配substring的字符串*/
5 a! {* ~' G* y2 A$ v# j -n) shift ; BOARD_NAME="${1%%_config}" ; shift ;;6 Q, d$ {" D5 A2 H' y
*) break ;;. D' F8 o( K7 w7 z+ T
esac //$1不满足以上条件,跳到done下面语句% q9 ^* K* m, S y( C) z* w" r
done( u! y; b) ~- ^* \
# H7 y5 i* G& W3 `' g8 W0 Q
/*如果BOARD_NAME非空,则不执行后面语句,否则将参数1赋值给BOARD_NAME*/
/ n1 c, I p( n7 t
d" o O% K4 C ]3 s[ "${BOARD_NAME}" ] || BOARD_NAME="$1" //执行完后,BOARD_NAME=EmbedSky
$ T4 K5 x/ _' y) J$ F7 M1 T' L
+ P3 K& h0 ^% A[ $# -lt 4 ] && exit 1 //$#=6,即不小于4也不大于6,故不满足,跳过,然后打印2 S+ b3 q* j$ E6 R i; f8 ?7 O
[ $# -gt 6 ] && exit 1
8 ?" H+ b( B' V# n4 w9 M
7 a e! Z& D* A) q, i/ hecho "Configuring for ${BOARD_NAME} board..."6 R0 l/ [% a3 T; L+ i& m
2 M, h6 T% ^! k2 c#
3 U6 o/ a: a. x( F ~* i! ^- {$ m# Create link to architecture specific headers! K& d0 A& S( B, N4 s% | W+ k
#
4 T9 k% e& L$ N4 x- }/ _$ `% L, ] }+ D. G
/*下面一句判断源代码目录和目标目录是否一样,如果不一样则执行else分支语句,我们一般选择在源代码目录下编译,故判断语句不满足,将执行else分支*/6 [" p- b; y2 p8 I4 g
if [ "$SRCTREE" != "$OBJTREE" ] ; then
7 B. v) W3 a. W- K4 {' o mkdir -p ${OBJTREE}/include //在目标目录下创建include文件夹
7 d( _5 L" _, h; B. ^, w1 a: R) y mkdir -p ${OBJTREE}/include2$ G4 ^. Z5 A' c! s' x$ z
cd ${OBJTREE}/include2 //进入目标目录下的include2
1 j$ J( K" O C3 j: ^8 x rm -f asm //删除asm链接) P! {$ u: Y5 C1 }
ln -s ${SRCTREE}/include/asm-$2 asm //创建asm链接,指向根目录下include/asm-ARM
% z; D' H6 K% N# p& x, X LNPREFIX="../../include2/asm/" //赋值给变量LNPREFIX
$ k! `% Y! I' u) X
& y( P( G! [" R0 f- M/*下面五句是,进入根目录的include目录,删除asm-arm链接,删除asm,创建asm-arm,重新让asm指向asm-arm*/) `0 g/ b' m6 g( I6 L! U! g
cd ../include
% x- Y# l! r: B7 u' ^ rm -RF asm-$2
: j) u8 @, B. k& q rm -f asm
8 Z; U. l8 [; O& E mkdir asm-$2
1 m4 A1 b" b2 @6 |; y& Q# Y, Z ln -s asm-$2 asm; E" {' d- C" ?, p1 K
else; V p. W9 \1 B7 O! Z
cd ./include6 I' g! e% n- X4 p/ ]$ @
rm -f asm) Z# u$ m- \! U
ln -s asm-$2 asm6 u% @3 N. t4 c6 i
fi
0 d/ D" p+ l: {0 w' o+ A9 b7 @8 }; ]( ]2 H: R
rm -f asm-$2/arch //删除include目录asm-arm目录下的arch
; j# P+ C/ Y3 G) w q. t F! J6 |& x6 k7 `; D) u. e9 A
/*-z表示如果 $6 为空则为真,-o表示或运算,$6=s3c24x0,故执行else后面语句*/
7 T* n2 Z3 |9 {; B. R3 }- ]+ l8 {, L N* Y. L4 l# T# b7 @0 n8 h* \
if [ -z "$6" -o "$6" = "NULL" ] ; then
; ~5 A0 K) W. [4 f( H ln -s ${LNPREFIX}arch-$3 asm-$2/arch
9 d# U4 S$ |1 Z4 J/ a; Aelse # I# W& R% H/ e: C! e
ln -s ${LNPREFIX}arch-$6 asm-$2/arch //asm-arm/arch链接指向asm/arch-s3c24x01 n1 b+ ~" K' r1 `
fi0 ^0 n8 P# h. y; l
0 g% w7 j# W7 D6 a. J/*$2=arm,满足条件,删除asm-arm/proc,asm-arm/proc链接指向asm/proc-armv*/5 |+ s5 {: \0 D5 }0 D+ H( @' c8 [
, \0 d! O; h; ^$ P" |& _4 eif [ "$2" = "arm" ] ; then7 G2 f6 a5 [ a# ^2 r, O, h
rm -f asm-$2/proc
3 g4 y, N1 B0 W9 I3 c7 k ln -s ${LNPREFIX}proc-armv asm-$2/proc }, R/ g3 S0 R% H
fi& @: }, t# i& U& n+ Y$ j4 E5 w
3 ]# L$ e5 o% g#5 ^9 Z% w1 B& H4 H4 V
# Create include file for Make p9 ^. L4 v/ i7 { h
#; y! _# r* B: o8 t. U2 @
+ ~7 M& n6 ?! \2 ?" P, E; `/*下面五句是创建顶层Makefile包含的文件 include/config.mk */
3 r7 t( q L5 y4 l& Q) eecho "ARCH = $2" > config.mk // >是将内容输出到某个文件的重定向符号
+ b% z: z. K0 G- Xecho "CPU = $3" >> config.mk // >>是将内容追加输出到某个文件末尾的重定向符号( Y( w$ n; R3 a( S
echo "BOARD = $4" >> config.mk, |& n' a0 W1 X" P+ ^+ o: G. P* M
; o( u' _3 |6 Q* g[ "$5" ] && [ "$5" != "NULL" ] && echo "VENDOR = $5" >> config.mk //$5=NULL,所以此句不满足
4 ~! e# Y2 l9 q" @ K
* n# [4 u0 g; F) h3 ][ "$6" ] && [ "$6" != "NULL" ] && echo "SOC = $6" >> config.mk! \! T* z7 o( W- f7 Y
% E) N8 }% Q( I) r& G& |; [( i
#. D) V0 [2 _* D8 r
# Create board specific header file
4 e) |$ o' l" o#% D: _* E! f4 \
if [ "$APPEND" = "yes" ] # Append to existing config file //APPEND缺省为no,故创建一个新的config.h文件, `5 w$ n; L, `: K, m% D
then3 I! A" j4 K! K9 @& c1 y
echo >> config.h$ c( L# W/ `% I- i* o5 e7 U
else
- s9 M, e: V# p9 w > config.h # Create new config file1 G+ @" q/ W \% P. q% V
fi; }/ B0 [! c& r. ^& o
, E, H& A/ ]& |, N/*config.h文件里面的内容包含以下二句*/
$ m F$ x& x2 ~: |3 k
) r4 f2 I8 J6 W0 w6 n9 j( B1 ]$ A- o4 a/* Automatically generated - do not edit
- X1 M! r8 S/ N4 z" S: l: q. n, r& Z7 [: r
#include <configs/$EmbedSky.h> */
) M: f0 }' s- c4 D* A) P' z9 ?echo "/* Automatically generated - do not edit */" >>config.h+ M3 s( x7 `. N- M. v# G, ?2 a
echo "#include <configs/$1.h>" >>config.h
! v: e- S" ] J0 x4 i+ d* z/ ]/ }$ O( x! y2 G# n
exit 0 //结束,退出
# M! l2 g0 I; m6 o& S( X* k& n" C7 T3 F
———————————————————————————————————
' o8 h" M5 f- @; |! ^0 z; {) K7 A: {
' p" {+ T2 ~% L O _总结:
3 G0 n# P7 q g, t- Y4 L5 q6 @& e+ u: M) ?
配置命令“make EmbedSky_config”实际的作用就是执行
5 R. H9 N9 v$ Q* D/ r5 U+ P/ n$ b4 q9 `% Z& \# l( x
./mkconfig EmbedSky arm arm920t EmbedSky NULL s3c24x0 这个命令,将产生以下结果* }$ G' `1 ?/ E- g" R6 } \
t& B6 L: J; g" U$ q. v6 p" n
(1)、开发板名称BOARD_NAME=$1;
9 ~! Q' d9 z$ r; H, W- x; O* V; g8 g& Y( Q# y
(2)、创建到平台/开发板相关的头文件的链接,如下: t7 V ^0 \. Q3 Z% B' k
; m/ P% I) Q9 ]' I2 R- f' \ ln -s asm-arm asm
. q4 S* F9 d3 {! y
$ }4 ~/ _/ f1 |/ {+ g) e4 o ln -s arch-s3c24x0 asm-arm/arch
0 E5 x" O7 t4 b" G5 ?. q
# H y. l# `6 H. E; z/ j0 N3 H ln -s proc-armv asm-arm/proc
z: r& C9 i5 ?5 m+ l. m. M, w+ U3 {2 T$ H) i
(3)创建顶层Makefile 包含的文件 include/config.mk,config.mk内容如下:& u( `8 `5 D4 a; x, [- a( T2 h8 j
$ `$ R) Z) E; ]# Q5 F. } ARCH = arm
* o) ~! z0 I: P$ u* O3 J" g! k2 G: h m i
CPU = arm920t b' ^& y" L+ T
0 \4 ?( S4 b0 g6 L- c2 X3 H
BOARD = EmbedSky
+ w% k5 G6 w' T% k( s- k
) `3 x: q8 n$ n) g SOC = s3c24x0
; r6 t! G- |2 f
! U" G* v( Y; D! J+ S) |(4)、创建开发板相关的头文件 include/config.h- L5 U( x; a$ i/ I
$ Z, s7 y6 v3 O4 j( i% ] 从以上4个结果可以知道,如果要在board目录下新建一个开发板<board_name>的目录,则在 include/configs 目录下面也要新建一个文件 <board_name>.h,里面存放的就是开发板<board_name>的配置信息,里面包含二种宏定义类一种是CFG类另一种是CONFIG类。
4 b+ Q, U% r5 `4 V0 Q* x
- q8 h- v- P( Z9 j9 C& ]; K
4 M( E1 w4 i/ u. Q# h
# b: g0 V0 ?) F2 X& A4 {3 O% P 9 ^' S8 X( h* R& J
0 P& Z: u; |7 }6 q& V- k8 _这节就讲到这里吧,祝大家学习愉快。( B& E/ ^# [0 K1 J: F+ p
) l$ K) U$ w0 {2 o" C |
|