嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
' f, n  a1 D2 P, |核心板2:DDR2 256M Byte   NAND FLASH 8G bit2 Z  Q! |* L. ]" k% k- p
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?8 e  ?1 v" c: N# _

( J9 i9 Q+ U: A# k是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
/ ^$ r3 L5 w3 R; n  u6 u* L3 N. F7 g

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:4 g# ]: p% Q( @' o" d
/*  c( b2 Q: F, D2 n+ T* d$ L
* Check memory range for valid RAM. A simple memory test determines
5 X2 z3 O/ ~6 f3 W- S& `8 y& e* the actually available RAM size between addresses `base' and8 D: m! O3 j- U% P* ^
* `base + maxsize'.
# i( @) a- d* j( D; Q*/3 Z7 ]; x8 D1 a2 s) L: V: T
long get_ram_size(long *base, long maxsize)
2 s) |7 L5 ^2 |% L2 M* z{
$ i4 y+ r: Q2 f1 X6 T  I        volatile long *addr;
0 }) D- L, @3 u# J0 T+ `        long           save[32];$ M8 v8 p, e1 Q/ m
        long           cnt;& e# J; X, [; j9 g/ ~& d
        long           val;% u: a/ G, C' F- e; ?: U! o& @
        long           size;
8 W3 r% p0 X$ n% X        int            i = 0;
9 o# J8 t5 V+ i  ]7 g' C% C) o; B3 P7 q
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {) I" S/ O$ ^# v( O
                addr = base + cnt;        /* pointer arith! */6 n, B+ t7 j8 J" ?) L
                sync ();
6 C7 Y+ D8 Z! O  d' {                save[i++] = *addr;* d0 c* a* Y. ~
                sync ();
+ z' w! D8 B& Z$ B9 v, z1 b( o3 J                *addr = ~cnt;
  h; |! Z6 n& F7 x9 L( G        }
4 t& a' \, `/ u" [6 J, F$ E1 C" A* L; {
        addr = base;6 l9 F# C9 R6 k5 _+ k6 i2 A
        sync ();
; R' @2 a, |7 H& F( j) R        save = *addr;- M( O4 z. P0 n  F& s$ I$ i0 T3 |
        sync ();
7 m" p% ?1 v" E; l) ]" F        *addr = 0;
' P4 o* \- e) {( v1 ?2 h! ?" H
4 M2 x5 ^" ~5 m& F        sync ();
' o! \1 U% U" `# v0 Y        if ((val = *addr) != 0) {2 h3 k9 p$ _$ ?- R# s0 a
                /* Restore the original data before leaving the function.
$ |" @2 f5 A$ |: I                 */# ^3 }- i$ V4 Y
                sync ();4 x) S' _  o" \; m3 |
                *addr = save;
5 P3 m% _0 `$ I6 ?+ a* i- }4 J                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
! n, B/ D9 V2 r, ^                        addr  = base + cnt;
, t  S; U4 A, O0 H3 q                        sync ();; ]; r$ b) [) f, q" M8 L
                        *addr = save[--i];: B. k# J* J- G! d4 C
                }( C3 N0 R' e8 G  p. H
                return (0);6 I5 ~9 Z. g/ h
        }
( I" l, g: T& O% L
6 |. _/ [, Y  p  \, T        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
2 e3 |; `& D+ \( Y2 v5 @3 P  E8 i1 w$ }4 @                addr = base + cnt;        /* pointer arith! */
, \) b! v! X# {1 I5 h1 _* S2 s. `                val = *addr;
$ q0 A+ {" y% ~3 x4 _8 d, g: H                *addr = save[--i];
3 A$ {, G9 M' ~                if (val != ~cnt) {
6 X; o8 t, n5 }5 @- S                        size = cnt * sizeof (long);5 @2 j, ?! F' E
                        /* Restore the original data before leaving the function.
& D+ i) H& f/ S9 ~6 q) Z                         */
4 Z3 l2 {3 y) ]5 ?) e; J! r$ y- f                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
  q) u- ^3 m- {                                addr  = base + cnt;- p, J8 `" S: b. Q
                                *addr = save[--i];* f. a! c# l& h/ b  g, M
                        }
; L5 z' J. A- a! g                        return (size);
" I) D, \9 x( v5 h" L) K- e                }; v4 Y0 O- L- j
        }) }) m) o& A2 u4 ?- j

! P# W$ G7 `3 N* L( f6 U- \, T. o        return (maxsize);
, E1 V& f- k; n- q. N3 d# J}
& l( a% J. h2 k* U- Eint dram_init(void)2 K6 |7 b( Z" i
{
* v% V% c) p! j% B& u  Z        /* dram_init must store complete ramsize in gd->ram_size */; l" F. r% A5 u1 J1 K$ b
        gd->ram_size = get_ram_size(! ]; M7 J4 e8 e$ A' ~8 a
                        (void *)CONFIG_SYS_SDRAM_BASE,
6 \- r5 O6 X' |9 v$ d8 V                        CONFIG_MAX_RAM_BANK_SIZE);. j, D2 F) G  x, W/ i% a5 O
        return 0;
- \% c+ m- J, n2 S+ K}
- g( A9 O( r* r" y: j# t$ M9 q9 ^) m  U" V& T& r, I
$ p- j; b+ E" q% d- [
7 O) T& y6 n' l! @% w
- U7 y) h: k$ T8 o  |% q- x: v
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!4 T7 y- D4 y  x
  k5 S4 b* o$ F

$ Y6 v( p3 e6 w( a$ R
9 T0 ?9 [& l" J, M) f) _+ [





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