嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
$ H" t1 g, ]9 \( n! p核心板2:DDR2 256M Byte   NAND FLASH 8G bit; h0 c+ y  u; B9 t2 G& e3 A
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?  h) ^6 w: V( k; j2 H
6 F6 ]5 L# X; U2 I% o4 r, _# ]; J+ }
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?- T) P" F9 V% u: |. P
& m( y3 t! \' s5 s4 B% [1 n* @

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
8 M0 W0 g6 P. H$ N7 p/*
- t, |! x. H/ J* Check memory range for valid RAM. A simple memory test determines
" p* ]- ?; `, X" {4 {% R* the actually available RAM size between addresses `base' and0 i0 J, H; N' k6 `5 A$ `
* `base + maxsize'.3 }9 P" C4 Q! ]5 B1 \% I' i
*/
" J% o4 M+ s0 U* Llong get_ram_size(long *base, long maxsize)
2 h; Q; q. J: G7 M: ?; x* d- B# e' W{; J! @7 Z2 ]5 M5 d
        volatile long *addr;" x+ s$ [4 S9 a- \# }% R' o
        long           save[32];
, w4 b6 {6 W; ~+ T" L3 l2 B        long           cnt;0 l- x0 f+ {9 F; v
        long           val;2 L$ O7 J4 z) l2 w
        long           size;1 q& [: Q& m( @2 s+ v' z% k
        int            i = 0;; G  r  _+ Q* H  h$ Q% f; j

5 ~! ^# X1 b6 a- x        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {6 P% K* k; e2 [* w  T6 `; J7 `
                addr = base + cnt;        /* pointer arith! */- v5 z+ h. D+ `0 S& P; k
                sync ();, A( k+ [) ?( K. m1 ]3 V& S
                save[i++] = *addr;2 \4 Y: n! }2 y% o6 l" u* C+ a
                sync ();) g. ~4 H$ a+ M3 N
                *addr = ~cnt;
+ r; V7 _* q. K# x; B4 H% k0 X        }
$ R# g- B2 r* Z# e  \5 m5 l$ L9 h4 {' l3 \: s9 V/ x% _
        addr = base;
) p- [: ^, {. y( f4 M+ |. I( r! {        sync ();
! [& E3 |$ a  `; {) b0 s        save = *addr;
) k) h+ T5 j, L7 G- \. L5 q4 ~        sync ();0 e' g. I9 [' N' k- U3 C: q* {8 P
        *addr = 0;
1 b+ ]5 A( o0 w0 G% e' C! B
0 F% A3 @$ E! K, m$ {; J        sync ();9 h3 ^/ o  Z7 s: {5 g" p" @& c+ F
        if ((val = *addr) != 0) {
3 [, H1 I5 w4 s' v6 ^                /* Restore the original data before leaving the function.
, B( I$ f( [$ `5 g                 */) ~+ P) V  t7 c3 H+ h& W4 s( X
                sync ();
3 y" e7 R- a% }* ^: }3 s                *addr = save;
1 I/ M% Q$ ^2 `/ S                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
1 W9 _3 ]1 X( K. Y                        addr  = base + cnt;
' r6 S6 L8 k8 V8 C2 Z2 Z9 q2 x- e                        sync ();2 v5 s0 t: r! H& k8 Y# S4 S
                        *addr = save[--i];  {+ Q. S! N. G& H* Q1 c2 d
                }( Z# R/ \! }; q1 n# s
                return (0);- D0 O* P) O; B) D5 h6 p$ M: d, {( k
        }
8 n' _9 y8 z# H6 v
/ k" U9 q# n/ B5 f; ^, I# X9 n        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
* b: W! ?0 E, ^, Y. b                addr = base + cnt;        /* pointer arith! */, X5 [8 F8 [3 X% T
                val = *addr;. t- S2 X( P- ]+ l
                *addr = save[--i];6 v: ~* `9 N0 q, d" W1 d5 H9 ?
                if (val != ~cnt) {: A, F- w" r1 N
                        size = cnt * sizeof (long);; l- Y; c* A. X: |% x
                        /* Restore the original data before leaving the function.
; {5 s, x: ~( L: o. u                         */) g5 U# p+ h1 S& \0 z9 C$ @
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {7 |$ `) x# [+ r( p: M
                                addr  = base + cnt;$ M* u3 `7 T% M) o: _2 A& l7 c
                                *addr = save[--i];( A4 j6 K, c' _! n9 n
                        }
+ k4 g- i3 @6 Z: y5 G: o                        return (size);, ^3 G. N" E0 {0 i% R& Q  h  c
                }
! J* J# {  K* F( U! W: c- U        }
; o1 l* k$ W$ l: }$ V/ a" T/ a. B
        return (maxsize);* O$ D2 b9 }- U+ {/ r3 U' y
}3 ?( e3 Y3 [' V  Y
int dram_init(void)
; L3 Z5 p+ |9 N! ~" F{
4 U6 p0 j0 ^4 z7 E% w7 [        /* dram_init must store complete ramsize in gd->ram_size */( o/ z+ p! Q/ F
        gd->ram_size = get_ram_size(6 J" `8 k' x2 Y: K4 b  q
                        (void *)CONFIG_SYS_SDRAM_BASE,5 o( V! I0 H/ p- X. w+ W( G; h1 C6 G
                        CONFIG_MAX_RAM_BANK_SIZE);: s( h) r3 L7 l5 r
        return 0;
0 e: U/ n3 D8 F! F# v2 o}+ G" d+ u- F; L. u/ Z8 d) }

- G3 j# z& l" H6 k3 a  l4 `. P3 _
; s6 T3 j  J! R
" p. P3 x! R; ?8 ]! U4 s; Z7 n5 B8 |( k0 M& Y
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!" l3 }/ Z( h+ s3 D' K

. N8 u  N) U3 Y/ u: ~( M. I3 |& J% M  R4 P: H
1 `, W2 U" Y9 P, y1 x" Z1 G( L0 a





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