嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
4 ~) M% y# k" E, c3 J核心板2:DDR2 256M Byte   NAND FLASH 8G bit9 D( f" Z& U- l9 o1 H0 z9 C9 r* Z' l
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
/ d' d+ k4 d4 e$ G8 O! |6 T5 n, R9 K
) {0 j& S) h! ?: O3 E是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?7 T) m# f- U* x; }8 _- _
( J3 H# J, T) h2 L

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:( e% i+ e, C/ Q* S; j/ {; l
/*3 c( d; b% U: M
* Check memory range for valid RAM. A simple memory test determines: U; z! o: B3 N1 I1 ~+ _* {
* the actually available RAM size between addresses `base' and
  ]( N0 x. g% p6 Y! |+ n6 P* b* `base + maxsize'.' _5 V; ?5 K' a5 ]8 o2 B
*/: S  u6 r4 U$ H. E0 w
long get_ram_size(long *base, long maxsize)
  k( F/ \$ k4 }" R{$ n! ]7 N% R& m5 d  h% n% M
        volatile long *addr;
7 O/ _5 G# ^1 r' T        long           save[32];% J7 N% @* W9 |9 E. V+ }
        long           cnt;
% O& |# T' O" A0 t& |6 D        long           val;# N/ P4 `- S1 M
        long           size;% v% ]  a0 X  q9 i5 Y
        int            i = 0;/ _$ {) ?% N1 q$ d  ^1 I3 O3 u1 ^

: ]; ^$ d* l* a3 \* A: w( W/ L# G        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {! e3 I) F2 J4 |; W0 l
                addr = base + cnt;        /* pointer arith! */
, j( c& C# \; D                sync ();" V6 V0 s9 z4 m4 N) Q
                save[i++] = *addr;
' Y, Y. w  T6 A9 W( v                sync ();5 z  `/ ?3 D3 _' C* g" @6 _& I/ N8 w
                *addr = ~cnt;
% m3 r5 @. E4 D% |; ^        }
# Z3 u8 D; J# `  g( L  u3 U& l9 t2 \  c; |6 t
        addr = base;
# ^7 R/ _! }, j) @6 ~        sync ();
" X3 o! R9 L, d0 @! }        save = *addr;
+ M$ T/ a; d7 w* C6 K1 u        sync ();
7 f7 s8 U5 l$ e        *addr = 0;7 y5 ~( t" e+ V; I' g; h! {

5 E+ S5 A# T8 N9 h* g7 d        sync ();
6 g% m& N2 A6 ?( D% M& t" F) Q" W* H        if ((val = *addr) != 0) {4 l/ \7 X: f( T5 l6 w- }, A
                /* Restore the original data before leaving the function.
5 E! H/ H5 s% g, z7 y  s                 */) _# m, X9 d7 }3 W+ x" c; f5 t$ m
                sync ();! M3 i3 W8 o$ ^$ X2 z% u
                *addr = save;/ i  K5 G3 t, `2 f6 C, J) r
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
) ]& m, [) i/ t- G" L0 N2 y0 @                        addr  = base + cnt;& S+ w/ T: z% I
                        sync ();# x% D5 p1 o9 U  G
                        *addr = save[--i];
; u& B0 Y( U( i! |- _+ H+ y: b( A6 y                }
* E7 J5 q" ~4 S$ ]6 R. h                return (0);
: n* j2 O5 N# v, C3 y/ j, y        }, L* K5 [1 |8 E1 |, N

  a+ b% l, |% ~: X        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
$ o2 ~4 n7 h# S9 k1 C9 `) N                addr = base + cnt;        /* pointer arith! */2 G) T% O, H% [# |; Z
                val = *addr;
$ ^9 S. d( H( y, `$ J% `: H                *addr = save[--i];
0 c3 e4 [# y5 t! B& @& i4 W% W. y                if (val != ~cnt) {
# P$ k( V* I0 t% i                        size = cnt * sizeof (long);
* I$ n' L, _/ n                        /* Restore the original data before leaving the function.
4 B( w8 V2 ?2 u1 }                         */
* p/ w# y3 N# ], w& G. ~5 B6 {: U                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
& a( z) u. |6 J  V. j2 {5 A                                addr  = base + cnt;; `% m3 u6 X! Y; w
                                *addr = save[--i];
4 R. p- v# F2 q0 _6 f                        }
2 ~9 z6 F, x( V) j) {- g                        return (size);
+ y, u9 t  v+ y: K0 T                }
7 o( P; y: L2 U; w, i" P        }$ {3 @; l% L% V, u" q* J/ I% i

& J9 |; F" \9 q8 @% y- }        return (maxsize);
2 ]  q: `4 |) ]& k2 R/ c}
' k5 p8 N! P' H0 H: z- X1 t1 Gint dram_init(void)
: E/ u; Z: S& J; u! W{( r1 T( B; N8 ]
        /* dram_init must store complete ramsize in gd->ram_size */- n4 _. h0 N% P% O8 P2 n
        gd->ram_size = get_ram_size(, j, C/ i" s* X+ f
                        (void *)CONFIG_SYS_SDRAM_BASE,
; t9 N- ^. j9 S5 }                        CONFIG_MAX_RAM_BANK_SIZE);! `. h' S3 k$ b" a  P5 A# Z
        return 0;
# _0 Q. N- D" E}
2 `; k5 d( l. _! M' B& n6 A4 G* N1 n4 M9 l  o, r

, M1 u, v2 A4 k; p4 m# \# h" Z3 q& x, _

# w/ K) A6 n7 ?2 zFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!& C. _) f: p4 ]

7 y8 p/ R3 z3 I! N8 i/ s4 |7 b2 e# g. c; l) P
8 b# u1 ?+ I# d4 O" s: r) L





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