嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit6 Y* F* C# b2 H8 J4 W9 R/ g
核心板2:DDR2 256M Byte   NAND FLASH 8G bit/ }: q( z; }4 _
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
2 G/ L. Q" F6 ~. A( e& a6 f4 j
! F. A9 @; n0 H: y是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?8 C) M  V+ g5 X; w
. W. r" J% z% B2 F

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
: o* V6 K. g& a7 ?) d6 A3 Q% ?' j/*
6 N+ H0 x5 v6 a) c" {* Check memory range for valid RAM. A simple memory test determines
; j) o7 M) s* A+ x2 N- Q: ^  e* the actually available RAM size between addresses `base' and5 ^+ {5 C3 U3 m  r: ^& S- b3 |
* `base + maxsize'.
0 Z1 O/ y5 Q4 ]7 Z*/( i. D1 A* v' {. G0 l8 o
long get_ram_size(long *base, long maxsize)
5 P& [/ r) y& z+ I8 y0 x  O, z{3 |0 s3 P; u* h7 |
        volatile long *addr;9 v( W* {$ ^7 q: @% P  q0 ?) T
        long           save[32];+ A% X* B, i* ]" \$ @' R
        long           cnt;
( v8 q2 ?. b7 i* M        long           val;0 Z! v; L. k* n; j: l5 i
        long           size;
8 B6 R6 z7 U& p- w$ P2 n$ Y        int            i = 0;
7 c# q/ Z' W0 m5 Z5 k- N% Q  n9 H& \6 T6 f6 b: Z: M% R
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
: d, i5 e* r. q/ i" Z                addr = base + cnt;        /* pointer arith! */
2 S+ q% v: c" h  O                sync ();8 w. h( h5 t' X& U, D: a
                save[i++] = *addr;+ {9 y& G; H: F- B. P9 b
                sync ();+ Z! j: i4 N" m( @9 n% P
                *addr = ~cnt;
! s9 V( \4 y7 a- y8 r# {& W        }' q: U9 L2 Q. o& M- ~1 w

$ U7 e4 P) s+ |8 ?5 O- A6 o        addr = base;& E* O' A, a8 K2 a
        sync ();
; e8 \7 U7 }) W, h7 d        save = *addr;- v. F8 g, M6 J; K2 t0 _+ S
        sync ();
2 P7 M$ T% {# k8 V        *addr = 0;
4 |0 {2 I! _4 h2 \. K) b+ h5 r; V) y$ c0 @1 U
        sync ();5 D7 |. e6 _; P2 t+ Q3 Q* N+ N! R$ o4 t
        if ((val = *addr) != 0) {. i8 B" K+ M, Z. C
                /* Restore the original data before leaving the function.% k$ B) F7 L1 Y* e  z& P4 h: k. G
                 */6 b( M2 z) B/ C! b0 e/ I) O
                sync ();6 j/ \; O: M' U4 q8 b9 f8 k( |
                *addr = save;8 T( U3 }; _5 d
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
( Y) D- o8 M6 u# A0 z! {. S2 D& K3 h                        addr  = base + cnt;1 A5 }# t0 O3 ~  X" s
                        sync ();! M( y! q, H2 N$ U
                        *addr = save[--i];
" X" ], ?4 s' \9 ^" p9 B                }# i6 c. |) @5 R* Z
                return (0);
' x! ]2 g* Q6 V) L7 G! G2 ~0 L        }
" _( {' @0 A4 V% ~" U. l! j* t  o' d3 _1 q
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {+ k# F" O: _# C
                addr = base + cnt;        /* pointer arith! *// J0 V* h0 f) k% O2 |; _
                val = *addr;, r5 _) o9 Y2 w* `3 P1 M5 O
                *addr = save[--i];7 @. k* X) t0 a! o
                if (val != ~cnt) {0 q9 d9 `" O0 c5 H& L
                        size = cnt * sizeof (long);
* Z9 K5 o2 ?" ]- [! V* {                        /* Restore the original data before leaving the function.
- b" z, ?1 I0 @/ ~9 T                         */* F  Q- A8 F$ {) @
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {9 T" n5 r6 v3 h; Q+ S5 p+ y
                                addr  = base + cnt;( W; c. }1 g# D
                                *addr = save[--i];2 ^' B1 R! |$ l
                        }( R9 J- n1 d4 g
                        return (size);
6 l$ y% g) g( X+ b                }0 `! t: H' Q9 @0 X1 H. b
        }5 m3 y; `6 a5 {. P4 k
8 |' E4 e/ r# N( J: n, }8 Q; ~
        return (maxsize);
) _- L0 J/ W0 |$ x2 z9 r/ ?0 T" ?}
' ?/ |3 G9 j0 S% nint dram_init(void)
+ j$ N* m8 K! y- N0 v{: O* D7 m, ]' c+ b( s
        /* dram_init must store complete ramsize in gd->ram_size */
& l7 ?" ]6 n4 O5 _' G        gd->ram_size = get_ram_size(
) p0 D( V; }7 y- @                        (void *)CONFIG_SYS_SDRAM_BASE,
# S1 G* r4 H; A4 d                        CONFIG_MAX_RAM_BANK_SIZE);
# Y. }; m  `, I# t- v3 U( S        return 0;8 l! ?; d# d: ?5 P% y( i
}
; A5 ^' B' _: _  n
5 @0 }+ N: v1 q# O( I
+ E& m- O3 b* {6 n6 G0 ?3 l/ B  c
4 d7 k) Q. b' M( Q' A$ F3 p2 ]3 X
( l* S4 B* |* F& _$ m$ @& uFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
8 B8 _% u: k, d: w; U" |; z! h/ s$ K& U3 A4 P

4 \1 w- b; t$ R
9 Q- d/ M8 t- J4 _& r! T6 f$ }





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