嵌入式开发者社区

标题: TL138 uboot是怎么区分配置两款核心板的 [打印本页]

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
2 ?7 v# q" W3 \0 [3 ]! \核心板2:DDR2 256M Byte   NAND FLASH 8G bit  i  J, B8 t/ y0 k
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
: N& {% U! c) p0 x) Z% k
! W4 V6 _6 O; X$ M; d是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?3 m) ~" n% X% r

1 t, z4 \7 d5 P" \  m
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:& j* I3 W4 b- @7 m
/*
7 B/ }5 y2 W. y5 W. e/ x* \* Check memory range for valid RAM. A simple memory test determines
% ]; m3 `, Y. @& D! G4 u4 T+ t* the actually available RAM size between addresses `base' and
! i0 R4 ?. l+ [  ]6 \* `base + maxsize'.* V+ w( A/ t: A! R' P
*/) N( }7 B9 y$ C2 Y
long get_ram_size(long *base, long maxsize)
9 G) n3 ]+ `/ a8 m9 g2 J$ z+ b{) ?  ?2 C  s6 g7 d  w
        volatile long *addr;
* V% C* x* P1 X        long           save[32];; T% B% v" v5 a
        long           cnt;) V9 a/ s+ ]- n% G  x9 A: g
        long           val;
" ^( U; `6 r. u2 c4 Q- n, Z: |        long           size;7 S& ~5 Z% y0 v
        int            i = 0;
2 K1 z, z4 `& R% v7 W1 u0 f" [; T+ l' h
1 U7 L9 }8 m8 u  c0 g: c- S9 r        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {  h' ]. K0 X7 d; C: o7 L
                addr = base + cnt;        /* pointer arith! */7 {. z; i1 H* ?$ A8 N1 \& d
                sync ();( w- \8 K/ \& ]
                save[i++] = *addr;# f5 V; l7 O8 s% g* f( H
                sync ();/ `. u% e3 b3 ~. G" f" V3 K
                *addr = ~cnt;
6 l% t# S/ Q8 P$ p- Y* J9 E6 v8 \/ R        }1 k+ `+ E# P- u& y6 t4 ~5 p- X
, g, H! {8 H$ D& K& Z
        addr = base;( U4 L3 I9 r0 t
        sync ();
8 Y- d% J/ F9 e' E! D        save = *addr;
$ j; D3 K. o7 }: Z; r* N% d% y        sync ();
$ S; }  ]4 m# |7 A" w        *addr = 0;, A0 G' }% O, U5 S' ]7 k4 Y  o! ]8 z
$ b  b) [8 s( b1 U9 {; f9 [% `7 _0 Q
        sync ();
8 w4 }) T9 P5 d- E& z9 H        if ((val = *addr) != 0) {( j7 L' ?5 e2 x3 P* }! Z7 u
                /* Restore the original data before leaving the function.3 u7 o. Y1 S- ?0 `
                 */" a. @' h! {& y' B, Q& ~
                sync ();
3 Y7 A9 q8 t, {/ ]8 G                *addr = save;5 j$ ]' ~4 A  |1 C
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {2 N6 @( i% t5 F6 w9 ~8 C, L
                        addr  = base + cnt;
$ T1 g0 O$ B9 A  F8 _                        sync ();
1 E( Y0 b! P0 t9 U* l                        *addr = save[--i];/ I. w* T" n8 ~) L1 B0 c: _
                }; R' [4 Q: }& ~! V( f8 @) G( w4 l5 L
                return (0);
5 x7 [$ j7 v( Q3 B, [  }' ~6 K, p        }$ {: `; V9 V  d. o" }
: \$ X& k0 g& Y  u6 H# |/ a
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {% o; X  w" @+ s. T
                addr = base + cnt;        /* pointer arith! */
# B. v; P# h+ H( J& H                val = *addr;
$ F( S- P- N5 p0 t- p2 J                *addr = save[--i];
9 ?& ^2 V" c3 F0 |                if (val != ~cnt) {7 i: ~5 l& _: a( g/ v
                        size = cnt * sizeof (long);
4 T$ `8 C. m# E                        /* Restore the original data before leaving the function.
) P6 D: @# U# R                         */- E; M& }: R. ^* g
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {& a2 v/ [; k7 `
                                addr  = base + cnt;6 J% |- ]; A% e0 U7 L
                                *addr = save[--i];
/ S' x9 a- v8 m" f3 C                        }
; T& x  F1 k$ k/ i/ {& ]; M0 O5 h8 L                        return (size);
; ~  M/ y3 A; O1 |) l* J                }+ b+ \  v* m2 z! r5 Q- I$ a" _+ O
        }
* `  \$ H; v: E  o1 G$ D+ ^& K' ?3 y" k# ?+ v" X  S
        return (maxsize);- J& U, L0 R( @- h  e
}; r; X/ C# y+ ~- r0 i% l! Z) s
int dram_init(void)
6 X% M" n9 [) @" }* s{
# T1 R( x5 J* J3 m/ f* k% i. ~+ m        /* dram_init must store complete ramsize in gd->ram_size */4 X; l" ?0 _. B- p
        gd->ram_size = get_ram_size(
8 g- d" N8 v, }: C; I) ]' i. T                        (void *)CONFIG_SYS_SDRAM_BASE,
. j6 u& P, u. L, D                        CONFIG_MAX_RAM_BANK_SIZE);3 [: `$ @. S5 l7 T% K
        return 0;
( o# B# |9 p$ F# \}9 u) H- v) ^& y# q% ^: |( k5 D  n

, c& {  y* C6 T+ S4 }, W2 T7 z" V/ G
/ [- E3 T7 i) p% y
8 N5 p0 `0 U) O/ C
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!8 b9 ^# s. g  @6 [' g- a

: M& ?+ L& G! S: l
6 I2 V; x9 u, m4 y5 ?

5 r1 [5 y0 p8 r8 r6 R




欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) Powered by Discuz! X3.4