嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
1 ~+ A/ H9 M) @/ U! D7 K+ W核心板2:DDR2 256M Byte   NAND FLASH 8G bit
  C# E  z1 Y: M" c9 n7 h这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
. S, L( s' W6 ^+ D- d1 z  r
/ y; C1 h, I  K% B: a是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?( h- s6 |7 z: i- [' j1 n

. r* d$ o4 E) ~1 j9 w  z
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:7 K2 b5 |" Z) U2 p
/*% k2 r: c9 ~0 L+ L8 k
* Check memory range for valid RAM. A simple memory test determines) E8 k+ l0 H# ]6 {5 g
* the actually available RAM size between addresses `base' and
8 n/ h, e/ [5 m4 n5 h$ t* `base + maxsize'.
3 M; r$ B; e! U( F* E( h" y& F*/7 N& C+ G) P2 b' Z1 z
long get_ram_size(long *base, long maxsize), T3 I; m9 x: z( L/ L
{
8 }8 R: M, B- a        volatile long *addr;* F0 h( k. Y4 }% b3 b0 c
        long           save[32];$ q# E5 ^! U: w" F# L
        long           cnt;& [' n! f+ R$ p4 i4 C( k
        long           val;/ B) i! A" j7 b4 T4 X: a# y8 _( _
        long           size;& G* n- |* H! F6 N
        int            i = 0;
! e; ~% @" i$ _3 \1 ~7 ^' y" e. K+ m7 F5 V+ _
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {# r+ k! {7 [, _: g/ H, h) m$ k
                addr = base + cnt;        /* pointer arith! */' q, A5 a6 H# T+ L
                sync ();* |) u5 u; X  y6 x7 Z6 A' {% ~& o
                save[i++] = *addr;
$ }' r0 `4 \- J! [4 o$ Q$ ~  D                sync ();
" K1 x2 ^: V* j# g                *addr = ~cnt;: i# |* O; ^5 }8 p: x
        }4 ^; _) C% X/ C% U- M" G

  P# b3 R4 [+ L2 U: O/ B( t        addr = base;' l% x+ }5 X1 d
        sync ();
& {1 l  |3 Z  [5 K$ `        save = *addr;5 _* F' W. a1 x! h9 \9 g
        sync ();; d3 f0 S4 M& R' V
        *addr = 0;
0 H% C5 M( S2 |. W+ s. J' p; D) z5 R% |* ?. i
        sync ();
( d  M  l, R, V5 _6 \        if ((val = *addr) != 0) {
4 j2 h# H) M" f) y4 R+ {. c                /* Restore the original data before leaving the function.1 [% L7 ~# V* m* H4 m
                 */
* i& A# s. t" J) I# [3 ]                sync ();" m; N9 v# i* X0 G2 n0 d
                *addr = save;8 N5 d$ j- C* u0 a+ Q" c' Z' m3 o. e
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {/ e+ n/ U# |) @# A
                        addr  = base + cnt;
% A; I( D8 b9 ]# [8 N- g                        sync ();
# X' N$ [2 t8 r& j. B                        *addr = save[--i];
* F3 @2 I" Q9 p. ]9 L% n                }
$ |! r/ B( k, h5 P0 z" a                return (0);
# \' m! I7 R) u9 ]3 z7 U        }
9 T- k7 b  P* u" e! r5 J  F  |- \' ^, {" Q  K' r: U
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
" X6 O* m, B8 m. A- ~                addr = base + cnt;        /* pointer arith! */
- |& W4 `; z% z( k; U2 ]5 N                val = *addr;
( o) p, B  X3 K. F                *addr = save[--i];
8 f6 |: d+ J9 V0 i                if (val != ~cnt) {$ c4 d7 _4 E5 l
                        size = cnt * sizeof (long);& |8 G( D( q4 s0 W& |
                        /* Restore the original data before leaving the function.
9 [/ D# C( J* l2 I$ W                         */- C% {5 o# O( k+ P7 H  ?
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
! {& }( i3 d) L$ J& w/ t2 \; L                                addr  = base + cnt;
0 K! G. {4 Z) [1 |9 v  s2 c                                *addr = save[--i];; }  Q$ V0 P- ^6 k* }5 u" s7 K
                        }
+ H- i# l# d+ |0 V                        return (size);$ F* y1 J! ?" W1 ~% h
                }
) k' t3 A% ^2 J5 Y$ A5 j/ J2 {        }! v+ Y% S& J+ ]

: h9 d  p* c# G3 s        return (maxsize);
1 k+ r. R8 X/ J}
2 ~+ S1 w1 K7 @" pint dram_init(void). p7 ]! Z5 D- C
{# Q+ i6 n1 U9 e  n5 f% g/ U
        /* dram_init must store complete ramsize in gd->ram_size */
) s* {- N: x& q5 F1 Q        gd->ram_size = get_ram_size(
" C) v' L& I  p' }0 B7 x                        (void *)CONFIG_SYS_SDRAM_BASE,
3 z  Y$ a3 b8 W9 v6 c                        CONFIG_MAX_RAM_BANK_SIZE);
# @% w5 @: B9 @. D        return 0;! z' z0 ]( C/ |; X
}
) `5 u! }* H. A/ m* t2 i
- t- r( T* A: e  _& \& `+ w* C" g5 B* H
1 J  V, u8 a  }  p3 I0 {7 _
4 M5 b' ~7 L) ?( r% Y/ J
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
; d" c! P2 Q1 s" W( A" x9 ^- b8 b+ K8 J+ m2 F; T3 Z: \

, k( ^- B2 t% R* z" w6 e

2 @1 h& t& S7 |( ]




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