嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit3 I. z7 Y5 I/ K0 i0 W9 j
核心板2:DDR2 256M Byte   NAND FLASH 8G bit
" ^- F$ Z- t; I  m* l2 g这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?" z" l* E. {; }; f
+ E: f2 ]7 i1 e# V! `
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?5 d, w' m, \+ x: q  N. T6 O4 y

8 l! z! s4 T+ @1 {0 }
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
. l2 l, W# N6 M$ W5 Z/*
- Q/ `1 e4 ^7 N) V* Check memory range for valid RAM. A simple memory test determines* E4 q% W; b$ j( Z# X
* the actually available RAM size between addresses `base' and
! I3 i, E& h3 {& z" v6 ^* ?  P: Q! Z* `base + maxsize'.7 O. C, t+ y6 }! z0 M
*/
0 n9 Z. K$ Q+ G  Hlong get_ram_size(long *base, long maxsize)
9 L# P+ Z4 ?# x{
) b! P$ S2 G7 M/ c6 e3 a        volatile long *addr;
) k3 u. A1 j3 J5 F% b( L        long           save[32];
  s( w9 d# K- ?* z" u        long           cnt;
! z; O, D- C6 Q9 F( ]        long           val;
# W" v3 @/ o2 [* Q3 q. ^; p' k5 @        long           size;
! S, _" E% q6 g* ^) b& x        int            i = 0;
2 k' J5 c5 {- i) l/ `- u8 V. O) B
/ @( {5 F" G8 k% @        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {+ g% V) r3 y5 v6 \  r+ S4 L5 Q
                addr = base + cnt;        /* pointer arith! */1 x: u& C" O6 A7 W8 l; e
                sync ();+ S% M9 s$ S- ]" N/ ]
                save[i++] = *addr;5 ^5 U5 e) P6 j- E0 M4 T  e
                sync ();
4 n6 a4 b2 J+ G+ r                *addr = ~cnt;: M! \8 x+ m* F* k: O& _
        }
1 @0 m; S6 ]/ F6 g8 x
0 x. W( P" Z. f+ J" @, j: t        addr = base;! L9 X; O1 ^* g% p* i
        sync ();
. a% S( P5 N: p! X; \        save = *addr;
: `, B' `4 T6 h  g# i2 j        sync ();* d6 P: }; z  v# p  S+ H
        *addr = 0;
; a- E1 Z  j2 Q  P/ m4 z6 a% a/ W: f- d
        sync ();& [) M9 z& O3 p
        if ((val = *addr) != 0) {( y) r8 t: J, i1 c8 E7 n
                /* Restore the original data before leaving the function.: J: ~0 p6 B- W
                 */- b4 Q8 Y1 r* g" i3 ~. U
                sync ();2 i  J  J( v  j& E/ ?. c
                *addr = save;+ W! C- Z1 P3 ]" U
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {' s: X' w- D8 o2 h: c- q# q) L$ r
                        addr  = base + cnt;
% E& W  Q, C- K( B8 Z! D                        sync ();
3 J$ X$ i+ w' k% R3 \                        *addr = save[--i];
) L( M: _9 x- z+ J- B/ t                }. S7 U; U: V: e
                return (0);
7 {; l5 b& G. X! j8 ?; O        }
5 U. z8 O$ ^! x. w9 z/ Q9 O" _( |& r
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {/ m- m# T  q3 a% M* h/ W8 i, V
                addr = base + cnt;        /* pointer arith! */
# m1 L9 v& D( V( f1 {2 a                val = *addr;2 K, E( R9 d; P5 N! s/ x5 P4 M
                *addr = save[--i];) z$ G# x9 c% S" ]" h# y0 V5 `
                if (val != ~cnt) {8 z7 X( t/ S& w, K0 O0 }/ L. Y* |3 l
                        size = cnt * sizeof (long);
" L% ~. R9 Z5 p1 A  d, q                        /* Restore the original data before leaving the function.( s2 p8 l2 t% {& F
                         */0 V* t3 P4 A$ {
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
0 J6 e& z) R; |                                addr  = base + cnt;. b! }! D0 d4 [. V0 v+ n- Y
                                *addr = save[--i];
+ X& v+ @9 ~. l% t; x+ u9 o                        }
. A: b8 s1 X5 T: c. p' [/ f                        return (size);
/ A1 i$ ?5 i1 i6 b' }                }
  J, }2 g* d# _# r9 n4 {* ^/ j        }
3 q& t* R% H" y( K, v+ u1 Y
$ b0 E( w: p( {* @; h        return (maxsize);: Y! x" g4 y& n7 B1 Y5 z/ \2 J
}
  Q. s, E/ x; {, O' lint dram_init(void)
8 f+ A) x! m4 x7 h9 X{
6 N* b7 E5 V1 o. n        /* dram_init must store complete ramsize in gd->ram_size */
% f/ \* d2 \3 J1 \6 }% Y- k$ U        gd->ram_size = get_ram_size(& S# a5 i* F" m' T7 O
                        (void *)CONFIG_SYS_SDRAM_BASE,5 y* ?) [. O5 R9 k* c2 s4 X& i
                        CONFIG_MAX_RAM_BANK_SIZE);9 N  i% I4 G6 ~( U
        return 0;& K$ V) `/ D3 k# o3 v, o2 ~, k9 q; W
}
, p9 m! ^! F2 Z$ @# g- ^
2 y5 m, t3 }3 k# l4 m1 B6 N- q0 r& P# w' s
( P0 h& }: k! o% {# |
7 D2 z  z1 S. M
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
( b  B7 o: x, A% Z' O- ~( k5 s
* n; r/ ^4 w1 x1 z
/ h3 z& P7 {& a2 H: q

: a# ~! }" A- x+ e/ N




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