嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
/ L3 \! E8 p0 o8 }, k! p3 c; h核心板2:DDR2 256M Byte   NAND FLASH 8G bit
5 W  }7 D/ o  u5 G+ p这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
+ w) n6 Z/ T) J/ m8 Q+ Z
! i" o0 w$ `* G/ z" W4 b/ o是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
) F# x4 v3 M3 G# C$ `* I# N; `2 _" ~" H! i2 z8 f( U

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:# t, P7 e. L' B
/*. b+ \2 b- I6 ]$ F" S! m
* Check memory range for valid RAM. A simple memory test determines6 A9 ?9 z) L5 A
* the actually available RAM size between addresses `base' and
! Z* q: y) h) l0 `( T; }* `base + maxsize'., A: k: k% B; f1 K: g
*/4 l( Z8 o5 [! {& a- l- Q
long get_ram_size(long *base, long maxsize)* Z" i7 X- |, q0 q
{
; }7 W* M0 Y1 }6 y5 [' x        volatile long *addr;9 U% M  v% B# O! _
        long           save[32];
/ g' m4 c: O8 V1 `5 b8 d        long           cnt;
, j) _6 V: C8 V. k        long           val;
& `* H7 B2 U: G# {/ r8 K( _        long           size;
7 w! j, z- |- _' [2 Q* S. {% C        int            i = 0;
5 g  z5 b3 G. D; e" f$ Z
) }  ~" u  D( J& _' k' q        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {& D: C1 s0 @* \
                addr = base + cnt;        /* pointer arith! */# n, Z$ W0 e2 w! G- a
                sync ();
" u$ J6 \7 O0 T4 i6 h                save[i++] = *addr;4 c+ Y. Q" P. j9 {
                sync ();
% q8 ~% F/ ?; v$ D                *addr = ~cnt;& ?2 n2 P6 b1 p
        }2 p" m# c! B8 j
1 b- n! G5 u( a# W7 [
        addr = base;8 k" ?  n& I5 e% A
        sync ();
/ F2 B, g. T: w/ X3 d5 g4 Q+ ~        save = *addr;! c9 O9 {% m3 u7 Z0 J/ ^
        sync ();
9 `9 Y* [3 k. s- |! D        *addr = 0;
3 Z8 s* _7 u0 \  a! j0 d2 ]% g  R$ C% u4 t& D! h
        sync ();1 [( K& p  b% [( l$ t! c
        if ((val = *addr) != 0) {& W( k$ x6 X; }3 }  t! @7 J
                /* Restore the original data before leaving the function.
* Y! S& L/ D0 ?* ?$ e                 */5 |" ?, w- h3 @
                sync ();7 X5 X5 B" \3 n* t
                *addr = save;
+ \0 \) d9 ^8 e1 _9 I; x                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {) n! U5 ]- ?3 o0 @3 q2 q" F
                        addr  = base + cnt;% q7 h0 [9 \* h1 G! I
                        sync ();! s6 j! R, Z7 Z3 u% A. Q
                        *addr = save[--i];
+ _# a3 ~/ H$ l                }0 b4 o4 s& c1 G; P
                return (0);
+ t# ~. \+ r* J8 e2 Z! p( o        }
! a3 ^/ a% w  E/ y' ^, Y, r4 @% ]& N- y5 R6 M  x. r
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
3 B8 V  A1 Y' P. n; E5 R1 Q. k" a                addr = base + cnt;        /* pointer arith! */( `  y% d; d" ?' t
                val = *addr;! A. q3 z. Z/ E: i( Q
                *addr = save[--i];0 r* ^# g* k2 i  o% O7 B# p2 A" X
                if (val != ~cnt) {
9 ?. a' F+ @/ T                        size = cnt * sizeof (long);+ N1 o+ a6 n5 f6 [1 o6 L( _( `
                        /* Restore the original data before leaving the function.: u1 u3 D* K* n# C9 e) S
                         */- Z6 W7 z; j; q2 P; k
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {) j3 v' K' F9 n- U; d  ?
                                addr  = base + cnt;
$ V6 j& F/ z. j( }6 b8 z7 b                                *addr = save[--i];
% m2 G/ X3 F% {/ h                        }
5 e$ o. D- Y3 F2 g                        return (size);& \& }/ d7 B3 |0 R8 o4 B& e2 i& J  V/ F
                }
: c1 V- u7 s8 E" f        }
4 m6 ?3 d+ y/ Y  @+ n7 x+ \5 `6 u' B; [3 Y
        return (maxsize);6 q/ \, n" s+ U1 E+ e4 ?+ d4 H; K; Z
}
4 l- S0 ?: r% k% @7 `! Q  Wint dram_init(void)* n2 j+ |% }1 H+ J2 |
{9 ?8 W( M& O3 ^5 k
        /* dram_init must store complete ramsize in gd->ram_size */- R  I8 X+ Y6 r" p
        gd->ram_size = get_ram_size(
  j% d; X/ w& G                        (void *)CONFIG_SYS_SDRAM_BASE,
, Q0 h7 ?( s$ f7 B                        CONFIG_MAX_RAM_BANK_SIZE);
1 o  ?% [- C  q  H( _2 ?' K        return 0;
! `" Q0 e9 j. o$ G* [( s! ^}
+ U' v# U+ w% E, `. h" d9 m. v$ B6 U. ^% p: }7 u
( V$ b1 O" f# D) y8 I

/ g$ s" ^" u- d
8 C+ i& V8 r: R2 e9 uFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
; {1 r( ^0 _. k
: `7 v) m- m1 Y: Y! _# g
3 t0 q5 ?9 \$ b) X8 c$ q3 l
) Q. Y; W9 ?) y/ M; }





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