嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
$ g' n5 S  o# `5 Q核心板2:DDR2 256M Byte   NAND FLASH 8G bit, l& j$ A+ k5 t# y; n
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?7 w. u. c  ^5 ]) @

. Y" z8 H5 _+ S是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?* |1 G3 {$ [* |  k

4 V4 ^8 o  W: y
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:( K; t9 ]1 ?4 Q( w5 _
/*$ i8 v1 \* ~7 d7 ~& ?/ I1 Z
* Check memory range for valid RAM. A simple memory test determines
. W+ L/ ^, t: ]; f1 Y/ N. V* the actually available RAM size between addresses `base' and
& p3 X+ S0 a8 \4 B& H' K* `base + maxsize'.
7 {/ B6 s, f$ L9 I3 p* p1 ]*/  i; }/ u# D  m( Q* C
long get_ram_size(long *base, long maxsize)* a$ p0 y) H& C. m& r9 [
{+ F: `, c2 e0 b7 \8 n/ x
        volatile long *addr;
5 J" U: h) E7 D' c; v6 P' A: g        long           save[32];
5 b* _; o6 E, q0 V        long           cnt;6 x- X* o4 g) l( a0 `/ d
        long           val;
6 _! w4 Z- [( H5 L        long           size;
+ ]* _6 q8 r( l7 Z        int            i = 0;: N0 L7 h% v* b2 p5 D* |. B
. D6 h# y4 n. ]8 G9 e
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
/ O% @7 g3 D, w. J                addr = base + cnt;        /* pointer arith! */' S: A$ Z/ V: B. S4 f7 O
                sync ();
+ o& W$ W% z% F) a+ }                save[i++] = *addr;
5 h! G/ E- P2 s  p' X) c( i                sync ();0 r9 |0 u5 B" K2 A" Z, W) ?
                *addr = ~cnt;( v  P. J- F6 p# x" W
        }
3 _6 O1 C  q) Q5 b( k7 E, |
7 A$ @  A' _* ~+ X5 f. F$ V6 @        addr = base;, l; `; S$ i% a
        sync ();
9 v8 w$ i+ _1 g2 f7 ?; v* Y        save = *addr;$ L5 ^$ O# U& T) g
        sync ();
6 d) q2 l; Z" G) y        *addr = 0;
. D( |2 A- R4 x
- K* `: f4 k5 D        sync ();7 @3 D4 o. b5 ]0 @4 m% @
        if ((val = *addr) != 0) {  j3 Q0 ]& h& I3 V. s8 N
                /* Restore the original data before leaving the function.
/ [) R; j9 Y7 i0 R1 v8 x  {                 */3 e: \$ X. p- \0 ?) {( x
                sync ();0 f6 U2 k9 t, J6 ?. c  c+ j- n
                *addr = save;2 s: j: U8 C& n+ W6 o5 G% V( L
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {. J/ t( C" b' i4 |. W
                        addr  = base + cnt;- a5 r) e: n- P- L" C
                        sync ();0 h, D* V6 X0 w% T9 p# Q+ ~+ z: g' g
                        *addr = save[--i];# b3 H+ m4 k( Y3 R: Q; L
                }
0 H9 U* }; P1 x/ ^/ y7 i% y                return (0);0 u1 J( Z/ G! B2 i9 N; A/ X
        }
9 M( w  w  _* u- a) w2 r4 A. V' |3 U7 X0 |5 U7 K7 s; n
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {! m& ?3 R5 ^4 G3 F: k& Z
                addr = base + cnt;        /* pointer arith! */
5 B1 q, q4 J. n/ T& q8 |- N5 D                val = *addr;9 g; {" r# S; g* p
                *addr = save[--i];% D3 R4 U8 O# S7 F, b/ n  ]
                if (val != ~cnt) {
8 m! W+ g, Z: J                        size = cnt * sizeof (long);
( s2 u, c" T$ L% |: W: e; ~; G& K                        /* Restore the original data before leaving the function.
' E$ R: y0 a8 {+ y, ^                         */
# A9 L, Q1 v) |+ H% v                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {$ x9 s, M, X, K5 Q
                                addr  = base + cnt;
$ R3 \/ G8 N& I# }                                *addr = save[--i];- O6 t- ~8 I. ^6 p# F5 }' K
                        }
! w' k+ l* t& t7 ~2 a5 Q2 ~                        return (size);# `2 |% y/ R; n+ B  ]
                }
# u7 g5 f( w: x$ o8 _# v/ ]4 x        }
6 e  a4 t4 t0 s# p/ ?3 |/ s
0 V7 }6 m1 l, l$ h        return (maxsize);
+ [2 u8 m* l0 z# y' y- x}
# X5 F7 w: H7 Y6 eint dram_init(void)
( s6 e4 P$ q1 z- q. D1 F2 h{
& w9 ^* T- j# Y) Y: Z        /* dram_init must store complete ramsize in gd->ram_size */, F8 b; O" D) M( \% W) _
        gd->ram_size = get_ram_size(
9 k0 g0 y  E( h                        (void *)CONFIG_SYS_SDRAM_BASE,
  X9 n. d, _  D% Q, A+ J                        CONFIG_MAX_RAM_BANK_SIZE);9 C' G- v$ c8 Z  m" C
        return 0;/ q2 ^9 S3 g; @+ g, {% v6 N9 ^* K# ?
}
5 F3 b' N3 u5 i4 C; L3 U0 a+ k+ Y
" b9 A$ x9 x2 B$ X
1 I7 _4 [: p) u5 ]+ L
) t) C8 |  \5 j$ l7 z4 E. R* C; P9 E
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
0 m4 e$ C6 H% e, G0 j
3 T! @' T9 K3 R; e. k: }: a' H
" v& K6 @3 |2 W% c, ?1 V

& s+ k/ l( y% F




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