嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
: w- r8 N" ?! l5 b+ i核心板2:DDR2 256M Byte   NAND FLASH 8G bit
# H, e$ b' }6 a1 z+ {这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?! O4 X2 L; ^, o5 \  `, p% [  G
( a: M% M& S* ]2 ?' M
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
$ R% x* g4 [8 a/ m8 e& K0 E# w% [6 J* o4 T

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
2 }+ p7 U  U; I/*
; u3 U' B+ o( F: {* Check memory range for valid RAM. A simple memory test determines+ ?- v" c' y* q; _% u( _- O( q! S
* the actually available RAM size between addresses `base' and) C8 q6 K9 h8 t% g; o# X
* `base + maxsize'.$ H0 r' n4 W5 z: a* G9 w
*/
; `5 M; P+ Q5 \- Flong get_ram_size(long *base, long maxsize). r$ q7 g/ Y! \) z7 i
{- s; o5 p6 ?  Z) O9 `8 E( F
        volatile long *addr;
7 H# ]+ F( s- _( V" y. f        long           save[32];% v* J0 K& A5 j' I  B
        long           cnt;' v* Z, ?2 l4 v7 C9 n  u: ~
        long           val;. m9 q; o; M" A# B  o9 ^/ f
        long           size;0 t( x- U% {! a- b
        int            i = 0;1 r  f* g( c% G0 J& F4 l6 I1 f' [

) D2 Q% B& w. @; }$ T        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {: S9 V( K3 i3 r
                addr = base + cnt;        /* pointer arith! */: O; t) j$ j% n3 B% u
                sync ();
. o1 q% p* x  \- m                save[i++] = *addr;) S( ?1 i" o, j
                sync ();
) I' v3 @" @& J! y3 B                *addr = ~cnt;/ Z$ E& K+ F# ]: q
        }
) I9 ]3 e3 c2 g# N; [
( W* V  ?& H' ~        addr = base;& u6 E4 A9 g1 @3 }0 a, A: P+ a5 B
        sync ();! |. w3 T* h1 ]
        save = *addr;
  u. `/ [( u1 I- l2 i        sync ();
; c. w# O# s1 t' ^8 b' n8 L8 v# e        *addr = 0;
# h9 W. _9 @; o; `* `& b+ Z2 R7 |3 @8 N  a: h
        sync ();( X& Y% ?' L& l  D# @9 b
        if ((val = *addr) != 0) {" @9 F3 ?* B" w, E3 k
                /* Restore the original data before leaving the function.
% n" m/ Z5 c; f3 E                 */
7 T. w: l# H: ~3 k. m                sync ();: G9 \( O5 m* M
                *addr = save;: H! Z! k& R/ H0 I# K7 x. j* ]
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
* ]! S/ z) e/ I! w2 o9 ?4 ]3 q* e                        addr  = base + cnt;
0 P. s, r- R/ i. n% J                        sync ();, Q* I- h3 e# c0 Q9 j3 S0 y4 X
                        *addr = save[--i];
3 h, q1 z- O1 y' F5 L  @& p1 O8 S                }
$ ^, n3 ]. @0 {: D- Z/ x                return (0);/ Q  p  I6 m+ A7 S+ J
        }3 v% ]# W! H- U3 k0 R

) Y2 ~0 h! D) C4 `# \9 m" I        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {0 O6 L) s7 m, B5 _0 A% ]  @
                addr = base + cnt;        /* pointer arith! */# _, h% ~* C" R( U
                val = *addr;  Z4 w. E5 w3 [7 }" @# Q
                *addr = save[--i];8 ?3 q9 @) n, U# v+ M4 p6 @4 [
                if (val != ~cnt) {
) Y4 F9 D9 E' [: b- Z                        size = cnt * sizeof (long);
0 E0 J! f+ Q: N! h2 N. S' D# G8 c                        /* Restore the original data before leaving the function.
' ^% J. N7 K5 }                         */
: J  F' ]2 [2 }1 ~8 U                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {1 W! \5 H; \1 E" r* V
                                addr  = base + cnt;+ M4 j( z+ s# o7 C) b
                                *addr = save[--i];
$ b2 ?% J7 J% v                        }* D6 Y, G! B- W- F" X
                        return (size);3 i: L& x) F' h" {; [0 f
                }5 \+ i% ?/ l% C$ s0 W/ k
        }, \9 V$ _: S. g9 Z, g1 q

' f- X& Z; h- K- Y0 I  l: ]        return (maxsize);+ G! T# A, h8 O: h( B: ]
}
. w; V8 G+ s: ]. Mint dram_init(void)
. m+ K, R# }! c3 ?: [0 ~! r% i/ |6 u0 v{
7 b: Z* R; [: q7 A6 B) g& a        /* dram_init must store complete ramsize in gd->ram_size */
0 X- x* g7 x1 }$ M- w        gd->ram_size = get_ram_size(3 `" T3 K* m4 y4 l3 u* [# a
                        (void *)CONFIG_SYS_SDRAM_BASE,
1 I! Z6 [6 H7 q                        CONFIG_MAX_RAM_BANK_SIZE);
) n8 H. P; O! M        return 0;4 M* {3 X: u; j  K$ T2 o$ z1 }
}
9 m1 A( }2 d4 x) e! ]. n) a, u* }7 c6 S6 i. o
0 ?; y* ^' k6 ~% v/ O% ^, V

; T  i, p6 s7 o; R' H6 I% e9 }$ ~
/ l4 F! g! `* ~, NFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
' C* b  S3 M6 G8 t. z5 B, d! u" U0 |) O0 o" t7 S, j6 K

7 Y4 Y/ C9 b& \8 k
! \: X& f8 o7 h3 X: S( p$ d3 K1 C





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