嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
% y  I* o+ p  \1 f8 [核心板2:DDR2 256M Byte   NAND FLASH 8G bit1 {$ s/ ?( ~3 @* b
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?& p5 D/ l* a! @" v: r7 i3 \
8 x  K# Q5 m8 H7 w8 i8 l
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
' x( E7 I4 a$ ~( ]( l) v2 U+ E7 y
7 z' u% l; Y6 Z! Q& ?2 y+ y
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
- C* X$ ]/ H, ^7 B+ e! B# ?/*( M* r7 [% k; L: O, G
* Check memory range for valid RAM. A simple memory test determines% z/ s+ d' `+ |3 ]
* the actually available RAM size between addresses `base' and
* p/ p! P1 Q# J% g2 L4 v* `base + maxsize'.
9 ]- q) ^1 {+ Y3 L- \, `*/3 c7 r! ]9 z8 g0 a$ E$ w
long get_ram_size(long *base, long maxsize)
( x3 h4 q! J7 O) n; x$ R" M{4 C* V' ]' i. T+ |  h
        volatile long *addr;2 k- x1 W: D3 W1 t+ \
        long           save[32];& `9 O1 c  |6 K0 W% ]5 X/ j6 q! A
        long           cnt;& k9 T+ B: _8 [1 ]
        long           val;
* [# I# [( ^3 O        long           size;
( q/ Z8 o' r# J        int            i = 0;  Z+ K' H- O" o2 ?
. i2 E% I2 |, T5 P' {9 V& f) t
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
& G# C8 w2 F! T  V& g6 e; ?                addr = base + cnt;        /* pointer arith! */
4 b& O, L( [! J+ N                sync ();
: b: R: T' S! `( x                save[i++] = *addr;
9 r6 T: S$ F3 C; j, Q5 Y                sync ();
& U7 |4 a6 p! }! P% x                *addr = ~cnt;
9 C: U8 S. E0 }8 M) M        }
3 b' c& i' ?+ r  w  A7 J9 p
6 O  \2 h$ l! @' ]        addr = base;# K9 s7 E/ Q9 W6 U
        sync ();8 g: Z2 M- u8 }+ f/ n
        save = *addr;7 A) I( x& |1 }
        sync ();
- C- }3 Z, J% e/ w        *addr = 0;1 }8 @: G7 l2 {# a! ?' ]
9 A0 C/ S+ d- M! n/ g+ q; h
        sync ();
! h, m% v+ Q4 {2 }8 p( p9 e        if ((val = *addr) != 0) {
" C# z3 L  K0 l6 H- G                /* Restore the original data before leaving the function.2 z  h) ?% I) W" m# _+ C
                 */
: ^% [- m  H/ s: V/ b' h8 o3 T                sync ();
5 H3 f/ h- U- c# t7 x! L* `. y4 v                *addr = save;! T5 d) J/ O. ~# K
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
+ U  o3 U' i- X, e1 x$ n% a                        addr  = base + cnt;$ E5 }' c2 K) k$ G% q( n
                        sync ();
+ {+ d" h, F2 V; F& v) J                        *addr = save[--i];7 E- G3 I8 j7 Q- z& x5 ^7 [
                }* `% f: e1 K. z; I8 c' G. ?
                return (0);* W8 l3 A6 W/ C6 h$ ]7 ?+ E
        }
) ?1 o. B' G( D
% `- |2 N' y7 f! ^' x2 `* M        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {2 _2 Z# a$ U5 V& V
                addr = base + cnt;        /* pointer arith! */- b0 H6 F. Z2 D$ c3 m: {1 R3 Q
                val = *addr;
6 O2 @. g/ l' i1 O7 K+ _+ f$ A9 s" B/ U                *addr = save[--i];/ j/ F- h9 w" \4 ^3 O( M1 Z! j
                if (val != ~cnt) {
6 i( p" l; F+ a* M: }5 q9 R                        size = cnt * sizeof (long);2 w/ ]; I/ P8 V0 @/ l
                        /* Restore the original data before leaving the function.9 l. }2 Q. }' w& r9 o9 o3 L
                         */; v4 A2 m# {* C! Q* @
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
) `2 L! c  H# n% Q, n" a9 v                                addr  = base + cnt;% V, w" n# u/ Q, ~
                                *addr = save[--i];
1 `9 H) R5 x, K" ]& O9 C' p# e0 o+ c                        }& p; T: Y5 H% R; d# j* W2 K) N
                        return (size);
2 g7 b4 _8 s. d% ^                }- Q6 H- x, @7 ?: t0 x
        }9 A! `; \, Y! h) ]- Q

+ H! y$ H7 {+ q        return (maxsize);
) D) ^& n) V% ]0 x% K}2 M, G9 B3 @# h
int dram_init(void)
4 t" R8 g0 j0 L2 b; l: ^: Q* h{
$ U; \( a( p5 J        /* dram_init must store complete ramsize in gd->ram_size */
5 Z$ g$ N* ]" [& W        gd->ram_size = get_ram_size(/ F! B( @# h# w1 j
                        (void *)CONFIG_SYS_SDRAM_BASE,9 D, I% @9 d2 y, _4 s
                        CONFIG_MAX_RAM_BANK_SIZE);* t& i3 F& V% G. P
        return 0;1 Y% @- A* t6 q$ ?9 l4 K
}/ X* s2 e" e4 e/ a; S0 @

' L" c: V+ G8 {% u
' j3 _+ @1 g1 X" s: t) R% x% ]- j1 z
' r/ T, f4 E! H( L, N0 p
6 k5 Y5 u# U3 B2 T# K; _FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!' H9 n4 ]' M' G1 d+ G& k# m2 j  x
' X1 U8 @/ [1 G. c- J

8 e' y2 M$ C8 S* V. I1 w! s3 J8 m

  I% ]! a& N3 ]- n1 F8 E




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