嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit4 }0 ~+ P0 t0 I
核心板2:DDR2 256M Byte   NAND FLASH 8G bit  L5 ]" M% R% `. G% t
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?8 T+ P$ q! \& o# r, _# v' f6 S
* G6 `9 @" v" e& T) a! j
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?8 N" D/ t. ^2 H" q/ \- H

% X' H. S: W: ?! w: W$ I4 z
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
* R$ h: R( {( C. r0 W# u. ?/*, ^' \1 L5 z; N" X- b" B' D
* Check memory range for valid RAM. A simple memory test determines
* r. U( |( v) a+ q7 I# N* the actually available RAM size between addresses `base' and; u/ h9 a: U, o
* `base + maxsize'.$ w' K1 J' I. C+ [
*/
4 x0 ~) B( P% j0 s; m7 @4 @long get_ram_size(long *base, long maxsize)7 A0 M0 H( ^8 _) P  ]
{8 z4 I4 |9 Z6 W3 B) B' Z5 o
        volatile long *addr;4 \2 @; y& M$ Q  r6 g0 T# @
        long           save[32];
* E8 r: f5 |( o& n7 D+ T        long           cnt;
  A4 `% V$ ?( q$ ^% Q7 ]: }- W        long           val;  g* ?# x1 Z7 H- a
        long           size;
8 K( |/ o! h( o        int            i = 0;( O/ u' V6 Y1 k  T
6 ]* d# W; F% j  }
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
. M1 z$ K8 v) H; m                addr = base + cnt;        /* pointer arith! */. E( S$ z4 r9 B1 u) J; c
                sync ();3 b  g7 h" ?- {' {4 W
                save[i++] = *addr;
, a, s; o9 x7 T6 n                sync ();- m  R9 n: Z( }+ R. W, J+ t
                *addr = ~cnt;
! V3 }- }' v9 t7 q8 p        }7 f" Q( j- y3 y% E5 ?& U
5 J# @, W' t8 t. P% Y8 m- W: C
        addr = base;
. G$ d' Q! w1 l1 G        sync ();
7 N: ]6 S; a4 q" [8 j  p        save = *addr;3 T2 ^: E6 X* U/ o, M2 p
        sync ();
7 T& k% _0 J" a+ m4 w        *addr = 0;
/ e, v" [1 w5 b- l* ~4 v3 J" R6 a
7 N5 F( w4 v5 w5 C- X& Y. R! g        sync ();
8 x' g" p  R/ A        if ((val = *addr) != 0) {
3 f; R5 I) P( U- J                /* Restore the original data before leaving the function.. h. ^+ w  b0 I: }* l4 Z1 ^  b
                 */
  W- Z) O2 Y0 }+ K- i! x1 e                sync ();
' ?1 n; j/ K! o" W/ C1 O                *addr = save;6 s# x2 t3 Y+ q% {8 ?2 m2 F5 I
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {$ [' T8 r1 s2 N$ T* I8 D
                        addr  = base + cnt;
) q& R% q! x6 Z  R, S& I' P                        sync ();
0 c! ]6 ^2 C0 Z' O( X  ~# O0 u  _                        *addr = save[--i];1 Q$ S$ l6 z7 S- f* `6 |$ `4 _, \
                }0 [* ?; Q0 C! h, X
                return (0);
6 @3 B/ V9 y1 @" ?3 e        }
7 R) C; v) e8 P+ Q9 o3 x+ \8 Z+ J# V4 G
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
: Z& H% n, g- O4 j8 ?+ p                addr = base + cnt;        /* pointer arith! */1 [0 k+ [$ q0 J/ R5 U  r
                val = *addr;" f: C  a5 w% E/ M8 o
                *addr = save[--i];4 v- F% A3 m  g+ G# O) Q% o
                if (val != ~cnt) {
9 W3 J5 ~* _9 @  \% F                        size = cnt * sizeof (long);
/ X  m9 V4 T! [3 E" g- j+ i                        /* Restore the original data before leaving the function.
/ R+ T$ J9 b4 M, _& W/ `                         */# y7 A8 s3 z5 F  o7 l7 K. x
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
0 e' Q6 l+ P5 X' E4 A                                addr  = base + cnt;. y6 M( Q5 u! m* W
                                *addr = save[--i];; C8 d, l, e$ I& e+ w
                        }
  ?) z3 }7 |  U& m" V  `/ T/ J5 g2 ^                        return (size);/ ~/ r# ^/ p9 I7 b2 d# x
                }( Z& W3 w4 q$ X8 l) m
        }
) t$ U# a5 l# X+ S& F5 M% s4 ~
5 L$ a( a0 V" I5 O. s        return (maxsize);1 _7 j+ O* V: q9 H& G' Z
}
. d$ [+ p2 `+ x0 Bint dram_init(void)% b$ P% ^. m4 t) W7 s, k7 s
{
6 g+ A' P2 N7 v/ C        /* dram_init must store complete ramsize in gd->ram_size */
1 V9 s; Y7 L% i  x8 k: Z        gd->ram_size = get_ram_size(& n: n: \. Z+ a  D& w; O0 f- p
                        (void *)CONFIG_SYS_SDRAM_BASE,. f0 f- x# ?. B
                        CONFIG_MAX_RAM_BANK_SIZE);0 V6 Z$ y4 ~9 U! |9 y5 d9 n1 u& v
        return 0;
% q) ]6 k3 l3 x8 O% ~5 I  q" _+ @& o3 K}
# R7 |$ n/ J# W' {
7 [' Z. v4 n( N2 R- z
8 H4 V4 G* \4 C' {/ g3 h+ @5 [( c1 B+ H

1 e% ~1 K3 g" c- V+ i, pFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!* P/ s0 T$ R0 ^1 Y

' E; R! \+ A2 |$ A
8 B" K/ U4 C' k+ ~' ?6 S: b; v0 k8 u
8 ^. q0 a" b4 _$ {# G6 p





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