嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
' ]' {( r1 e# o' }6 ~$ Z9 h* P4 y' Q" R核心板2:DDR2 256M Byte   NAND FLASH 8G bit, H9 W- p. d; _" N! @
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
3 s9 P) v$ Q5 H& N
1 z- l1 M" S. t是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
* I, T' J6 r! i5 u. W6 n0 ]
8 _) _2 z& r. y5 r. x5 ^
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:1 R/ E& X# ~2 K; ?- S$ N" W
/*
/ \* A4 C( A+ i2 F2 t) T- z4 k* Check memory range for valid RAM. A simple memory test determines9 n" x& ~  r2 Y/ I. Z1 z
* the actually available RAM size between addresses `base' and
; J' y2 R6 e7 c3 u* `base + maxsize'.
) n; k4 c1 p# D( y/ u( ?*/
5 J" U" Q7 b) ~5 C! o: ]3 l, T9 Along get_ram_size(long *base, long maxsize)% t( E, C# T$ H0 W* Q3 Z  m% V$ W$ R
{  c$ ]0 x1 x. B6 D: _2 J
        volatile long *addr;
( A# ]' U1 @+ D4 x, q  m4 @        long           save[32];% Q3 s5 ~$ ?5 Z8 i* y
        long           cnt;
" E/ m3 `3 I3 v: u2 }$ }        long           val;$ g  {0 n0 U: y3 s" s( |
        long           size;
7 ~+ {' F- K8 y2 g" _) J        int            i = 0;, m* Y" o- w' R  D
2 t7 E: o; t5 U& u
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {, e. }8 M6 Z& f! u6 H$ [# w' [3 e
                addr = base + cnt;        /* pointer arith! */
  Q- @8 x$ m; X: J% S' ]                sync ();: l- B/ I) R) H; C' b9 l- p/ r) c
                save[i++] = *addr;
! O9 j( O" t1 @! C4 f' D! E' J3 @  h                sync ();+ q) f7 b' v6 Q" G  l$ y1 z! l
                *addr = ~cnt;
7 t7 n5 a; U6 O; v        }
- c6 ?: F; [6 z. O# a0 a+ g% u
* u9 a4 f  U" _2 I2 l. z* r6 H% Z        addr = base;
$ `) Z: c; C' T* N) |        sync ();& u7 O' Z% D6 R
        save = *addr;
& Y, l2 Q& O' I0 C% t7 R2 D        sync ();
1 e0 I1 }$ R6 }% @        *addr = 0;
, y# T6 ]8 o  F/ P4 K/ g3 O2 ?+ c) ?: c) P" d( c" F2 B
        sync ();
+ J+ f9 Y/ j: x        if ((val = *addr) != 0) {
8 H4 I; s/ x$ O- b                /* Restore the original data before leaving the function., o# @% D) W$ Q: ?
                 */. [  L, N9 q& l% t9 U" g$ g3 [
                sync ();
4 [/ V; i1 M, f3 u% n; V                *addr = save;/ ^) T2 Z  O8 p/ j% n- e
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
  ^: W% m6 K) d4 u  u                        addr  = base + cnt;
% }) |7 V0 a2 j                        sync ();
* s# l' b# N) }% S                        *addr = save[--i];! e  k: d% ?8 v9 B, x
                }6 z6 i* N1 t9 P! C9 ^  f
                return (0);
2 M  q) d/ `6 _0 Y. }        }
4 }% Z' x, M9 k2 A, m
- G: m6 e% g  E9 E( l: `: ^0 {        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
0 x( ?8 L: R$ n+ h                addr = base + cnt;        /* pointer arith! */
  j- E: l; Q1 D                val = *addr;$ d: J$ p5 a; r, r$ I/ @
                *addr = save[--i];
* }$ K1 J4 q% J  Z  i6 r                if (val != ~cnt) {
- K6 ?# P2 H( |# o% \9 ?                        size = cnt * sizeof (long);
0 P' G* N2 w% s- F/ N                        /* Restore the original data before leaving the function.6 c+ e3 S0 }/ A3 M7 I; C8 g4 [+ L
                         */
) s4 _2 ]' v( O% w* B7 w7 _" y. j2 N                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {) n+ r) s6 W6 \9 T- j
                                addr  = base + cnt;$ K! |7 [# i# c( a4 ?; k
                                *addr = save[--i];) Q# y8 N. A+ l% g
                        }
4 Y( r% ^5 i' h$ \; l2 {                        return (size);
4 m0 F7 t+ Y8 h                }
" E8 m. p& S+ t; H/ L        }
: G/ K( l8 T/ Z* Q1 f1 u' q5 s2 u1 K0 @2 f' @5 p
        return (maxsize);
' ~: i0 u* L! z7 G& z' @8 l}
9 p" ?7 C1 \/ J' N* Pint dram_init(void)
0 C# U9 d# w+ {4 A1 Z8 N{
5 P% `7 e/ |6 }) q$ {        /* dram_init must store complete ramsize in gd->ram_size */7 d* K9 {( v/ D6 w( v
        gd->ram_size = get_ram_size(
4 p- S0 L0 V- |. V" ?( p$ |                        (void *)CONFIG_SYS_SDRAM_BASE,
( B- W3 E3 d9 M7 e  |                        CONFIG_MAX_RAM_BANK_SIZE);' z0 `- g- P. m
        return 0;& r- }+ u( p6 o" J! O! g
}
* k# W+ Z% M  d1 ^, Q! |+ R
1 p2 i' o) J+ H9 e* Z' l- i; s. v1 Q' [, M) y7 Z
1 I; s5 O1 Y1 S9 v( `* q

$ M$ |/ d" w' B7 IFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
( k2 F7 H. a7 l8 t( F* h9 g" n& X% _6 @
! f& n  i# V: d; ~+ b% v0 B

( [$ Z6 ^% Y6 S




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