嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit% f! z, [; `  ^3 R. Z4 a8 a1 |3 ~( W
核心板2:DDR2 256M Byte   NAND FLASH 8G bit
. |$ U- a7 N4 [8 I9 R7 C) t) K! G这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?8 {1 J0 L; X7 U" ]. t% h; k( \' C- G

& z5 R8 v0 M9 X4 @+ E5 y9 i是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
5 h0 U7 y' Q1 _& b( f* X$ Y8 I( C# M2 Y" a0 x2 {% L

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
) ?+ o, X1 Q, ?4 |" I$ W  k/*. n! j* s3 P5 \
* Check memory range for valid RAM. A simple memory test determines
7 J5 d9 U# l4 S" v3 X7 z( i* the actually available RAM size between addresses `base' and  \' w3 |# ?7 d1 e, f
* `base + maxsize'.4 P! Y3 G8 h7 T8 J- D* `! k5 W
*/
" n" X2 ^* n0 Q" vlong get_ram_size(long *base, long maxsize)( U6 N! a9 t& n& ]* _) T$ e7 v
{# a2 ~+ u6 K! o5 J: l3 _+ z9 m% }
        volatile long *addr;: N3 P3 Q7 z  g$ n
        long           save[32];1 e* ^. n6 I7 Y/ M1 m5 E1 \, C2 O
        long           cnt;$ P, }4 \/ _9 r% t
        long           val;
. `# E2 X8 O4 |7 i/ r( S3 E0 `        long           size;
, i. R. T1 Z- f! ~1 ]4 Y        int            i = 0;
8 |6 T0 W( i# n1 J( [5 V" G" ~+ K9 P8 W3 F
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {' o! y% G9 g6 q
                addr = base + cnt;        /* pointer arith! */
5 D5 @( }" |, w6 I8 I. b                sync ();% T* b) s) B0 v- e% ^; R; `
                save[i++] = *addr;
5 e2 O# m) U% k# R                sync ();
) I) R- K) h' _- l, Q* u0 h. C                *addr = ~cnt;
* [( C; ^0 C4 ?3 N! W        }
9 M+ E7 ?7 h+ F5 G1 k/ B) K6 }# P2 @' S, D* {; q# C3 H
        addr = base;  c7 I6 Q1 [4 z. p
        sync ();
6 n9 e- g! C6 G) N        save = *addr;6 `& ?1 ~. [* w. E4 R
        sync ();* I+ u0 X/ c! j! ^
        *addr = 0;# `* k$ o6 T% t) v5 ?* B; r' ], Y

9 Y$ v2 g. c, F& q        sync ();) t% p$ ~8 j" h# O( l! L- B& }  b
        if ((val = *addr) != 0) {
2 M1 y' K7 y0 T! o8 \( w+ V/ |6 D                /* Restore the original data before leaving the function.4 o; h9 F$ ^0 |8 N
                 */4 L' N* n9 O4 l- |7 Q1 L3 q
                sync ();. ?( x6 c2 X- z0 ~/ R
                *addr = save;5 u% e6 z. {1 h* A  n; V* y7 X
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {. i" p& F. b/ `
                        addr  = base + cnt;
" n) M* F" e+ C- O" b                        sync ();3 R0 c1 g: V  H" B
                        *addr = save[--i];: q% R, U$ W% E' H" q( n
                }" B. q+ h* {9 R  y5 ]
                return (0);' x8 b$ a% Y% C& I+ Y" Z# v
        }
; e4 X; \, O0 C; Z; B& J
8 d. i6 j% _6 F6 J& I! u  E/ e        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
5 R4 u9 H( Z( M' y$ [                addr = base + cnt;        /* pointer arith! */
; p! O8 F6 n/ g( p6 O                val = *addr;
. A" L1 K/ f5 y5 A$ j                *addr = save[--i];
( s8 a- R3 ?* {0 k0 U/ F                if (val != ~cnt) {
* q5 F6 a; L3 ~: F/ d  m                        size = cnt * sizeof (long);
  m$ Y7 ]7 O& ?& G% \                        /* Restore the original data before leaving the function.
( a% W8 K# m; ^$ @* C3 H+ ~$ C! Z' M                         */' O) e+ K# l/ d) X0 k
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {/ U3 v8 |& G/ q. N3 O" s) M
                                addr  = base + cnt;
/ L% x  U" {. ]6 O- V                                *addr = save[--i];
9 J. p( F- R% \% ^- @                        }
5 I  r$ r6 l# |                        return (size);
6 M$ K5 Z( h3 t3 c                }
/ i  D, c# _; F  m# X5 ~        }' g. W8 u0 Z9 [
( X3 F$ X/ B0 W" F, q) Q" [7 R
        return (maxsize);
# n6 _1 f" b1 k* U) Y& F}
# n# i9 Q; \  |, B, @int dram_init(void)
* j7 H% U1 m" ~& S4 g{. ?( H# V: m( {, V
        /* dram_init must store complete ramsize in gd->ram_size */* ]" ]4 g% ~% X7 V  x  R( U
        gd->ram_size = get_ram_size(
2 j8 C* g7 T2 O" Q7 l3 v                        (void *)CONFIG_SYS_SDRAM_BASE,' Y8 c1 p7 r, g5 c9 C
                        CONFIG_MAX_RAM_BANK_SIZE);" L  @9 R7 x+ t) Y2 D0 [
        return 0;( B" f+ B1 x- a: r& }  j
}; S2 L) ]/ Y, e4 j6 i' @5 L
# O  B/ t7 J/ F( C6 V9 O
: G. t% j& d4 c; I! D. A4 I4 R3 L

: m& m  |! T; l% ]& K1 k! n8 D) e+ g. W1 W' {# N- v
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
6 l, \4 i4 S& U2 K  N2 U, j
4 K# F! l0 t# b" I0 j% m' K- B8 z; y1 w3 X" F3 o
4 |/ D: T& l6 y- B





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