嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
0 b6 _2 M. F% n" N核心板2:DDR2 256M Byte   NAND FLASH 8G bit
  {( G- K9 @+ |5 f9 }5 G  _& j/ d  R这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?6 u5 [. |2 s5 R
) J  u# C; _( B
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?' Y( e- s1 T( Z& P$ T* T

  [" G) \. c6 a% R7 B" K; ]
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:/ R# h. }  [( s; j( t9 G
/*
' P- W8 n% j* H# o) ^* Check memory range for valid RAM. A simple memory test determines
' c* r6 q# \# G' v7 E+ e1 M* the actually available RAM size between addresses `base' and
: m  B1 h; M: W' v4 n& w* o* `base + maxsize'.. |' r8 E/ ~0 ]
*/, t, M8 k4 {$ |+ V
long get_ram_size(long *base, long maxsize)* L& X* Z( _5 l3 q/ X
{
9 A: T0 \6 ?8 y( \        volatile long *addr;
3 \/ K9 Q! N' E9 J        long           save[32];- |- a' k& B/ F8 A9 X" h. U
        long           cnt;( P) C0 \: V& m/ @5 T+ [# D
        long           val;
" z" s! @+ H( Z( M8 r6 e        long           size;0 T& F3 R# L, j  Y7 m
        int            i = 0;* F3 \% a) A9 F+ b) [5 Q/ Z

( S6 L3 d3 L( C        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {/ n0 z, |/ s* `! @) r  I
                addr = base + cnt;        /* pointer arith! */( J! _) ]( a' \7 @# }7 o: a
                sync ();
. h/ b- Q3 O! J4 T2 X' y6 [3 g7 h$ j                save[i++] = *addr;
' D: ~% ~) @" K                sync ();
! f: [" m; S4 Y7 h. k. c( `                *addr = ~cnt;6 [' l& r' y. o$ y: {% C9 y
        }- H8 D+ z' Q( Z; T! b* s5 h8 H
# R1 n% \  Y% f( ]6 s3 p% P) G
        addr = base;
/ j, `2 {6 a7 v; ~1 X9 j8 t        sync ();% Q! x3 L& H: C. k
        save = *addr;
8 i. x' O9 u$ w: q; P' F        sync ();/ q# v; a8 j" S* M' Q) c) t
        *addr = 0;
6 n6 ?5 H3 J. U- V# r
) q7 O% w% o1 v3 m& z' J        sync ();$ c" \4 c/ b) A- G" J6 S$ B: M
        if ((val = *addr) != 0) {" ^& @  g3 D% J
                /* Restore the original data before leaving the function.+ J2 v, Y/ ~, Z$ B/ d! s
                 */; B/ Z! V1 B4 ^  F$ J
                sync ();) i! P& I/ B. e  F
                *addr = save;
; m0 ~3 A& }! x' a8 N, y                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
$ R: I! o! l/ h4 z8 x8 @                        addr  = base + cnt;
( q# k2 E" r0 s3 b+ B                        sync ();
& s+ E$ g, `+ N% z) Q4 e6 U                        *addr = save[--i];
# S- _/ w3 p; a% _                }
" @  n& ?$ Y& ?( h8 D' A                return (0);" X" v  C, J3 i, Y6 X/ x9 {
        }9 c, c. |' {' O& J
) j. |: W2 k1 t/ t. H# H& Z
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
% a0 X3 b: V% e5 V                addr = base + cnt;        /* pointer arith! */9 |8 K2 d& ^3 u- I+ j9 W% p; }
                val = *addr;
3 M; |5 L0 T  m# T; F. J4 a                *addr = save[--i];0 c) O8 \" h% C
                if (val != ~cnt) {( @7 p8 k! o# f6 l" }$ c
                        size = cnt * sizeof (long);) e: I  v8 n6 S% ^( ]9 X
                        /* Restore the original data before leaving the function.3 i' l( U8 [, m( _+ }: H* G; I
                         */& @7 J9 |: F1 [0 M
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {5 c) P  m0 x1 f9 V% g; a
                                addr  = base + cnt;
) h) D7 y0 t( \+ C                                *addr = save[--i];
, x$ \; ^4 u3 Z/ t) a                        }
1 Y( z+ e8 j; ?% x" V! P                        return (size);
' a: E8 Y+ _- J" C- p; R# M                }
% \1 J3 }! ~' c1 A7 [( e- N        }
) d1 h) E  u7 Z8 z2 @% M
: S: a. g' H: H! p        return (maxsize);6 w" ~- u$ n, j% K3 W/ m0 o
}& x+ B9 b  h, v. @8 z
int dram_init(void)
/ M- Q) A5 q( \! \6 z; q0 g{
+ O" w: \" k+ _# R        /* dram_init must store complete ramsize in gd->ram_size */, E0 Y& u+ c, Z! `8 ~+ I
        gd->ram_size = get_ram_size(
5 B6 W( F* r: c! m* d1 f8 T                        (void *)CONFIG_SYS_SDRAM_BASE,  b) m& ~6 q2 d& L: M8 `
                        CONFIG_MAX_RAM_BANK_SIZE);
( S3 X" b" S+ z, l8 Q4 D        return 0;
3 X+ p# _! |" p& |; l) y1 W* W( D}) w( e  Z. G  o% d) D
$ w. v6 I' P, I6 X) l
, H) B) [' x( y& ]* r; k

/ n2 A+ d8 K" W! i5 B& N: q% o" n  M9 H9 ~3 g. \6 ?. Z$ o) f
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
: }8 K  ?6 }5 a, o: k( X% J+ ?7 c+ }( F2 W, N. t

4 W9 _3 ?# r( H8 m$ S1 y

$ i1 n! q; b5 L( R9 I! H& s6 C




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