一乐电子

 找回密码
 请使用微信账号登录和注册会员

QQ登录

只需一步,快速开始

微信扫码登录

搜索
查看: 3490|回复: 0

uboot之---make smdk2410_config命令详细解析

[复制链接]
发表于 2017-5-2 16:49 | 显示全部楼层 |阅读模式

9 \: J; s2 P$ `* P
随便找个uboot源代码就可以啦。
  首先进入顶层Makefile。有很多相对不同板子的配置,如:
gec2440_config:unconfig
@$(MKCONFIG) $(@:_config=) ARM arm920t gec2440 samsung s3c24x0
4 |( ~* ]9 r) C9 }* c+ u) q' ~
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...8 I  ?, _5 A- J2 S
     现在看看有发生那些变化。由于上面的命令相当于执行./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的内容:

; t( x& W+ Y# U6 A3 l) }APPEND=no # 这里记得APPEND初值为no
0 @( U' G" z& M! G5 h. sBOARD_NAME="". L- ?' A3 q9 ?& F. i
TARGETS=""+ N6 i$ H5 c% z$ w1 {: q  k

8 N  G( G& L6 s0 B* Q8 f* V1 R8 l#下面一段代码不执行(while---done),由于./mkconfig  arm arm920t gec2440 samsung s3c24x0没有--、-a、-n、-t
+ {) G9 |. f+ c4 ?% }/ Y' |1 l0 `
& t+ @; T/ Z! M8 z; w) V7 kwhile [ $# -gt 0 ] ; do
* B# H( C3 k7 Z0 e3 ^; Ocase "$1" in' ^' {) V, X( {- p% p
--) shift ; break ;;
" ^, i2 @5 g0 a7 N" h3 j7 F-a) shift ; APPEND=yes ;;
; E4 a) w8 i1 N-n) shift ; BOARD_NAME="${1%%_config}" ; shift ;;$ G4 [5 ?7 g6 y4 |3 A7 t; [
-t) shift ; TARGETS="`echo $1 | sed 's:_: :g'` ${TARGETS}" ; shift ;;7 T+ s: y$ Y$ _; d% f1 J% u9 k0 K
*)  break ;;
: {/ l2 T6 A. V" S+ l4 ]5 \esac
3 q) X- `& [# o! a" x# o  l; Udone6 N& ~* H5 @( Q# _. E/ @

3 E' Z$ J: {! P. }% x; B: \% G9 c* V9 A. A

: X  ~& b( l3 U
& S) ]1 ]9 {2 x% A+ p9 M5 s[ "${BOARD_NAME}" ] || BOARD_NAME="$1"  //BOARD_NAME=gec2440  H. J( }* L1 q% Q2 j/ O
. E8 b8 I* y& I; l% K/ Y
; k9 h  M: G# ?9 t5 j9 Z! W
[ $# -lt 4 ] && exit 17 q# d7 c" g" `5 m
[ $# -gt 6 ] && exit 17 p; Z/ X3 r( L: q* F7 I$ t
( ]: ^2 a: q$ e- `. J9 s+ f

: x& B( G" A# c4 N( J2 Yif [ "${ARCH}" -a "${ARCH}" != "$2" ]; then
+ B2 r6 C; ?. @) Z, w5 @echo "FaiLED: \$ARCH=${ARCH}, should be '$2' for ${BOARD_NAME}" 1>&2
' L4 K, m# V2 e" P  y- sexit 1& Z4 X* V4 {5 U
fi5 l0 _* ^" _* X

( N: U+ p- Z" c: ]) m( \7 y/ n5 p- T# I& e0 a; U" Z/ C
//在终端打印Config  for gec2440  board....
0 h1 l7 R, }; {8 E" Z6 m2 eecho "Configuring for ${BOARD_NAME} board..."" j* i( g  T/ o- {( C

; n/ j( U1 K$ V3 f  [0 A$ L( P1 _' z! |+ G: o. L" N' z
#
; @) q: u* }/ E3 s# 产生链接文件
: O1 M- ?' R, @#9 q- `0 }; g2 V1 h1 e) W: P, J
if [ "$SRCTREE" != "$OBJTREE" ] ; then   //是否在源代码目录下编译Uboot,不是就执行下面,else就是表示是在源代码目录编译7 X, T' {5 x7 K& u/ J8 y3 O) [' |# w
mkdir -p ${OBJTREE}/include7 m0 J1 P2 }+ j( a0 J
mkdir -p ${OBJTREE}/include2/ V* h6 b& [" w: n
cd ${OBJTREE}/include20 D. k( o. o8 D- F2 @7 W
rm -f asm
5 t  M0 p( ~! R, y$ J, Q" K. _+ dln -s ${SRCTREE}/include/asm-$2 asm1 k; z! e& P: N$ q1 |
LNPREFIX="../../include2/asm/"
( k( c& A$ K! H) i" M% }cd ../include
( {+ Z6 ^# Y4 l' Irm -rf asm-$2
  P) M3 M+ H- arm -f asm) n: W7 z- X# B8 \- L
mkdir asm-$2
7 D; N" |7 n) j; {& Jln -s asm-$2 asm
  ]9 r6 L7 E: E6 ~7 L# C& D7 W7 y4 s: B2 W3 Y: S. i
: V9 B6 D* R2 f. Y# U; [
else
7 |7 k! W1 Q: Y, t; E. acd ./include    //进入include; w/ k5 J7 Q+ x& i9 l' O
rm -f asm
9 N, H5 @. [1 ^* Z& \ln -s asm-$2 asm    //ln -s  include/asm-arm   asm! [. @' M: ~$ }
fi( U6 B8 D% a( n- h  v* B
. m" E' y, W) e0 h$ v: I
4 o& i9 x$ f/ g1 }$ A' [) z
rm -f asm-$2/arch            //删除include/asm-arm/arch
/ w7 K" }! u0 B' F: D
& \' \* F4 Y  V3 k: m
1 N; [/ W; j: u- Q% E# R+ Aif [ -z "$6" -o "$6" = "NULL" ] ; then   //由于$6=s3c24x0,执行而else下面
; _1 J7 v+ J! L- F" Y& U& kln -s ${LNPREFIX}arch-$3 asm-$2/arch   
( p7 t# K0 B, oelse$ F3 P& X7 e  I* g, a1 q; Y" X
ln -s ${LNPREFIX}arch-$6 asm-$2/arch  //ln -s include/arch-s3c24x0  include/asm-arm/arch: j4 j8 d( d) u) Q2 L' k; y- L  K2 n
fi- r  e6 F3 n" Z' h# m9 \4 p

9 k2 z/ l/ a3 K  I
& [3 H5 D9 r2 b2 E7 fif [ "$2" = "arm" ] ; then
2 h+ ?  X9 O: ]rm -f asm-$2/proc  //删除include/asm-arm/proc
9 `; z. H$ f9 L8 s$ ]3 eln -s ${LNPREFIX}proc-armv asm-$2/proc  //ln -s include/proc-arm asm-arm/pro( S; x$ k7 F& }9 x, s6 G/ ~
fi, }) N# |* a  b& A9 L
/ ~3 e; J5 y; A; ^( K
6 e5 l* v/ V& j6 \8 y
#
6 L6 Q7 H6 q% G2 z$ `$ V% R# Create include file for Make8 ]9 `6 p# k+ e. F6 E3 m& P0 ?- t0 f8 h
#0 b' f$ q8 v+ `& K  l: H  @
echo "ARCH   = $2" >  config.mk   //ARCH=arm,放入include/config.mk
- q& c2 ^! k+ e5 N4 e- e4 Recho "CPU    = $3" >> config.mk  //CPU=arm920t,放入includde/config.mk: U' q7 O% A: d  T  I/ o$ k) T
echo "BOARD  = $4" >> config.mk //BOARD=gec2440,放入include/config.mk
& y6 B8 @/ p/ ~, l7 y2 ^5 a/ E( U- B9 ^2 q3 x1 d9 l

5 `- U2 e$ ^  ^1 w  s[ "$5" ] && [ "$5" != "NULL" ] && echo "VENDOR = $5" >> config.mk
0 |  \- V7 M) K. V- f$ y//VERDOR=samaung,放入include/config.mk, h4 ~6 `+ [4 c5 [
[ "$6" ] && [ "$6" != "NULL" ] && echo "SOC    = $6" >> config.mk: F6 C8 d' a& }* `0 f% V' M1 i
//SOC=s3c24x0,放入include/config.mk
3 d1 S- r) k, A4 N% a& B6 U, C#
( ~5 h/ f; ^; G( `8 I/ J* R2 b# Create board specific header file4 e8 ~% `  ]) ^% g
#, J+ R! I- b; c2 o
if [ "$APPEND" = "yes" ] # 有第一行知道,APPEND=no
% {8 E% Y" f+ o/ J- Y. s/ M. Gthen$ M0 g7 H! j& R( L1 E' @2 I
echo >> config.h6 Q) e7 L* L) ~' M
else
* b. ~' L% M4 I2 V- S4 Y> config.h  #产生config.h文件,位于include目录下
6 {+ e$ e5 U( c% Oecho "/* Automatically generated - do not edit */" >>config.h
% E% b  H! ~& b# R6 {- k6 Z1 G
. |' p  i2 F; a! @* E( q+ P; w' L, X  z
for i in ${TARGETS} ; do
% ]2 V5 \9 [( b. c6 U) eecho "#define CONFIG_MK_${i} 1" >>config.h ;
7 H. D2 }: `( w2 |2 ?: T//将"#define CONFIG_MK_${i} 1加入上面产生的config.h文件
) }" e6 W, y7 o' Y! L, s2 Xdone* R9 f7 L( v; I
- }, w6 ]5 Z' W) o

# w1 j9 p+ Q+ {( Secho "#include <configs/$1.h>" >>config.h  //config.h文件包含头文件"#include <configs/gec2440.h>) _. v3 z1 p; i: {0 r
echo "#include <asm/config.h>" >>config.h //config.h文件包含头文件"#include <asm/config.h>
- J& m& g& V3 M2 v6 K1 b6 U. U/ G- ^7 I
exit 0
3.上面红色部分就是改变部分。到现实中的源代码看看,
大家执行完make gec2440_config之后,到源代码看看。
% J* b, r& r/ t( J9 h* `
第一就是ARCH、CPU、BOARD、VERDOR、SOC被赋值,
并加入include/config.mk文件中,
我的config.mk文件内容如下:
ARCH   = arm$ I+ a' a2 L1 f9 X
  CPU    = arm920t) ~) m0 L2 |5 e4 O
  BOARD  = gec24404 T+ d1 `$ x# f& Y
  VENDOR = samsung
' a/ s: u+ F( u( b# j! t' k  SOC    = s3c24x0
. y. c, x% f  S% j/ q; R$ T
第二就是看一下链接文件,我的情况如下:
进入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 */
6 _+ t& L0 Q3 G& `  #include <configs/gec2440.h>
' Q- p- j1 U( J& S) l: w  #include <asm/config.h>         

( [! R2 s+ x& b  S* ]6 P% Z- h4 ~4 K

本版积分规则

QQ|一淘宝店|手机版|商店|一乐电子 ( 粤ICP备09076165号 ) 公安备案粤公网安备 44522102000183号

GMT+8, 2025-8-20 09:02 , Processed in 0.033942 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表