嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit. Z3 e* r1 g8 h/ f/ Y* w1 l/ r+ ]
核心板2:DDR2 256M Byte   NAND FLASH 8G bit% Y# w3 ^; t4 _
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
$ I( U5 x) L" E5 F
# z  j& f9 k# q3 e7 ]8 y! ]是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
8 i& {$ B! h8 I# X( l9 k, `# T! w: |0 D0 T8 [9 _

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:8 ^  w6 T1 R3 p; |  @2 |
/*6 @( C" p. v: I( h/ {
* Check memory range for valid RAM. A simple memory test determines  C! ^$ X' `1 H0 d, ^; N
* the actually available RAM size between addresses `base' and
3 |# o8 n: }6 C1 K0 U* `base + maxsize'.6 R  q8 e' e4 s
*/
( V& @& m* @" V; ?) O2 }long get_ram_size(long *base, long maxsize)
, S; P' y' r# q{! o# `+ o7 H. q2 V7 ?1 Q' Y
        volatile long *addr;, W7 p% }5 T- d
        long           save[32];" d. y) ~" ~5 y4 e  j
        long           cnt;6 j& ]8 N/ ~& d8 x4 H% \
        long           val;# E6 ^  ]- A$ p* B* r+ v- @: f
        long           size;* C. s$ L7 U6 p& X
        int            i = 0;
6 f; R1 b0 i, T9 M9 o- i9 s, q  r9 o+ V
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
( {1 U& `; Q) K$ Q                addr = base + cnt;        /* pointer arith! */: |+ u  k2 M' ]* W% x
                sync ();6 _8 u% W4 Q  }, g) o+ Z) O4 y& l: T
                save[i++] = *addr;$ @# ~, x$ }$ x6 B& t* W9 P* I
                sync ();! p" h0 k1 W2 a+ W6 G  w
                *addr = ~cnt;- V4 ~6 @; N  |2 K- J& U5 @. u
        }- I$ R# g7 j* c
/ `- \& Q$ w' S. i. q
        addr = base;
5 w& P) c3 x( g" u' I7 ^4 F        sync ();  w, h; t7 x$ E% i7 a5 X# U
        save = *addr;  w/ i( m( d( n0 u  J
        sync ();
" ]: u' B3 R8 T5 K        *addr = 0;, C6 R. G& Z" w0 f  k2 {

% F6 T& b5 ^/ H9 ?        sync ();: K6 N6 D7 z3 \3 \
        if ((val = *addr) != 0) {7 T' l5 d, m/ d* d7 a6 T3 M
                /* Restore the original data before leaving the function.
9 C# M( c/ B7 Y8 [& u, e' N  [( Z                 */
( A0 a' x, P4 P1 {                sync ();9 a" ]" B2 y0 r. K% B; x
                *addr = save;
6 P" A/ o; y' F6 M, ~4 z                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {$ I9 W0 h/ t7 _- P( `5 K5 G+ _/ ?
                        addr  = base + cnt;! t2 [, F* c: U% }9 i" x
                        sync ();
# R' p( s0 v6 u2 O0 T                        *addr = save[--i];7 B- D. g$ \9 B2 \* i/ X; e: Q4 K% H% y
                }
# o/ \9 y" z, `; H/ x# W4 D$ j" i                return (0);
" g+ _4 L9 w5 i0 X: m. m% Q6 q$ t        }: F1 J- K5 X% p5 [$ u% }8 C

2 V, y4 @1 f1 K6 @        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
1 p8 s& l) S* M" ?; w                addr = base + cnt;        /* pointer arith! */
) z7 W6 r6 `2 O5 B# A5 ]# o" U% O                val = *addr;
7 r& ?! }. p" m% d. {1 I* f. ^                *addr = save[--i];
* O! P8 |, a) N- b' a                if (val != ~cnt) {+ @4 H4 i( Z& z5 g6 \4 I4 H
                        size = cnt * sizeof (long);  y$ d, p8 Y0 ]  n8 J7 v- w
                        /* Restore the original data before leaving the function.
8 p) W5 @; w; V1 T+ @                         */6 B1 g( w; }, D( Y7 A; @9 G; l
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {7 b& E# }0 c0 j) t3 I" {  }
                                addr  = base + cnt;" A! }! [3 J; n+ \
                                *addr = save[--i];
% ]+ y5 d, _! a! o8 O                        }
5 @0 o) n3 c3 D5 A                        return (size);3 ~+ r) l# V  [- m. K6 o. J
                }( `5 m' h5 y! `& Y+ y# L. n
        }& _. z7 w# A) M

: o$ D) _9 b1 J# A8 u        return (maxsize);
! r) A# ~9 B. r4 r% E1 q. R}
, {% B0 O7 O7 ~5 D2 b0 F' K% Iint dram_init(void)3 h6 e2 ?9 M8 r% e$ o
{1 Q) P0 Z+ b! y% B! C) ]9 j
        /* dram_init must store complete ramsize in gd->ram_size */+ J0 v! l# }9 v2 u9 F- A
        gd->ram_size = get_ram_size(5 h. A8 S% ]  J' e4 Z
                        (void *)CONFIG_SYS_SDRAM_BASE,+ F; n  o9 q+ N5 H
                        CONFIG_MAX_RAM_BANK_SIZE);
9 v* `' `" G7 z        return 0;
; N' S! M) Q& _- ]5 C}' k8 e* {* b0 _  k8 X7 F
) _  B0 d( ^! P  m5 w

; Y7 t9 y1 m: |9 A, I: D
6 j: u) ~1 r7 X' x5 e  B' ~: a- S  C/ @2 Y' x& `+ u( |% _4 B0 f
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!" p" g5 J7 B& K; y( @

$ C. l9 t2 r4 v2 N; D
8 q/ G5 w8 @6 ?4 T+ ?& e
$ k3 z6 h# ^1 }0 |% C8 @# w





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