嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit, g8 [# O/ ~; U- b) H
核心板2:DDR2 256M Byte   NAND FLASH 8G bit
/ E. r& S" Y* I  c& G& ~这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?1 P4 C, _2 A) k+ n
) o7 t( O8 z7 i
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
. Z0 s- x! z8 C" @/ @  p
) w' U0 Q. ]& Q! N( t( X
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
5 E' o9 K3 ~0 W0 I3 a4 g/*
* J6 s$ Q0 t" F/ x% s. z3 G* Check memory range for valid RAM. A simple memory test determines
) c0 C- a( J# U5 i0 }$ j0 h5 n+ N* the actually available RAM size between addresses `base' and
3 H9 o9 e8 U- z* `base + maxsize'.$ k  x8 c2 G$ z* U/ u7 L
*/9 U# I4 |$ q. S1 B8 W9 J: O6 g
long get_ram_size(long *base, long maxsize)0 A8 `1 U( x/ q' O, ~
{0 ~+ K/ P' L: R: a9 a/ C; E
        volatile long *addr;. ?& O- f4 G2 h6 t, G
        long           save[32];
6 h5 L- R+ r- F% u2 t  I' D        long           cnt;
  T5 n- F8 }% t, H        long           val;9 }! M( i  u# b  D) W# g
        long           size;! i5 T) J7 A3 E8 d
        int            i = 0;5 D7 J0 L. O  e- C
6 g* x/ X3 d3 F$ M; k0 H
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {3 r+ S* u( o  c# z( j
                addr = base + cnt;        /* pointer arith! */
: Z' j0 E5 p# H                sync ();/ ]! u6 {% V0 N$ J% O8 T( D
                save[i++] = *addr;
) V/ [5 y5 `. Y/ Z5 W4 q                sync ();# X- i! B1 F" q/ N2 G
                *addr = ~cnt;
& j& b' h! S: H# B        }
' d* e/ A6 h4 \8 y+ E3 K
$ l+ f8 h1 n' I" ]* g- p/ U" s3 p        addr = base;
9 u% O: E" A1 u1 Q3 a7 U- u& W- t; Z' f        sync ();
1 q7 q$ f4 h+ D2 A7 |5 t/ X: ~        save = *addr;
/ l/ K/ v2 C1 A' D( `        sync ();( [( T" f# `+ y8 W( x$ A
        *addr = 0;' c* V8 q* l8 K1 y0 j1 m' q
2 ~* w7 P3 J% l( f! Q2 w+ p4 z
        sync ();0 [7 f, ]/ @! D- j2 @
        if ((val = *addr) != 0) {
) D. O/ k- G/ @  x0 \8 i                /* Restore the original data before leaving the function.
8 S8 b* p+ ^8 w) X' j                 */' d4 j  V& a' r
                sync ();
( T: v  ?5 K3 S# a3 r                *addr = save;
2 @) i! R! |. g                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
. t8 O% J5 W" g8 ~4 o3 B6 C                        addr  = base + cnt;
" N" H- I$ N% b                        sync ();
" e8 Q3 k* s  ~# Y' n* p                        *addr = save[--i];8 E, N% M/ ^3 A2 r% ]
                }
7 V2 G: H" n8 r: L2 j0 s' K  |                return (0);
- N: `6 r. o) X) Z/ [        }
$ Q: u, b8 ?; z& V: X" @4 T* l6 Q1 E; ~; P9 B9 W) u! h; `
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {) T' y! \! ~, C! P
                addr = base + cnt;        /* pointer arith! */
  q6 a" s. v. c6 H7 l/ g                val = *addr;" F9 q8 R6 S) a7 I  P! A/ {) R
                *addr = save[--i];
7 C2 e) j4 H+ B/ s                if (val != ~cnt) {/ E5 c7 n. `2 x  L9 t4 s# b
                        size = cnt * sizeof (long);
- |% r6 F# ^5 Q9 q: n- I                        /* Restore the original data before leaving the function.2 h1 o0 D, ?  S- ~
                         */
6 l' V- Z' P+ b  w! y+ R                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {8 \% @6 t2 [* T+ Z0 Y- V2 f
                                addr  = base + cnt;* C7 q% c1 ^( ^$ o% E; C2 y4 w1 k
                                *addr = save[--i];
. j& c3 f3 u% q- w# @3 F                        }5 `* h( [( ?8 Y& D9 J. X3 Q8 `# [
                        return (size);
" I# b# W( z! Z8 g$ }; Q; E7 O( o6 ~                }3 \: n5 N* e( }3 I1 Y
        }
4 ]! j' c! m( r. R. ~
  s$ z0 U- D& ~+ a1 V        return (maxsize);( [/ S* r) Y1 c7 M( [$ q
}7 N( z1 _: C* x8 G. J, q
int dram_init(void)
4 J! Y9 Q& L/ H2 m{: M3 ~  o' o' A1 l( M* J- S: v
        /* dram_init must store complete ramsize in gd->ram_size */$ l; a8 ?1 @7 i2 j( Q# N5 Z
        gd->ram_size = get_ram_size(- K  c1 A! ?6 Y+ b0 v1 C. e: t
                        (void *)CONFIG_SYS_SDRAM_BASE,
0 n: X, a, K( A: e                        CONFIG_MAX_RAM_BANK_SIZE);: }& n: d6 s+ s/ R( u
        return 0;* _# w4 p0 q* u# o2 ^
}" w- e  @4 ^/ O

) {# v2 s' j7 v1 \' d. L7 W9 [' N) Q/ M0 o, j- z

+ T6 f5 z, N! y9 `( |" ^
$ r  x4 }3 n4 g- U8 ^FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
6 L) ]! z/ F1 m+ C7 M- y9 Y% _" R6 _( V

, a, W- k. k! d; D, ~! R0 u
) S. G; f& M8 e4 U8 l( c/ l





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