嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit5 v2 b- C/ O5 p1 n& b! T$ C  _
核心板2:DDR2 256M Byte   NAND FLASH 8G bit
4 B  N. V3 g$ A$ F+ k& n- S4 Q5 v这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
& U: p( t# Y6 S! `4 n7 V
2 n2 B$ D) h+ M4 B/ f/ h是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
! B9 m; m' _* Q9 B
! V% w. }- M, R3 ~+ A. d$ G$ P% V
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
" T$ ?* I, s0 r' d/*; F# ]5 J! T: k2 |7 w
* Check memory range for valid RAM. A simple memory test determines1 u7 m1 I4 @- v7 t: L  W$ R
* the actually available RAM size between addresses `base' and' H% e9 @4 A: z1 h9 C
* `base + maxsize'.# g  f6 w4 W- N  V; Q" R' ?
*/) ]' b& {" v$ ~0 W6 D
long get_ram_size(long *base, long maxsize)
7 I" a; _0 P5 Y{
2 o6 `+ r0 d+ Y# r: i        volatile long *addr;
# H  I* u8 f/ ~: C( s        long           save[32];
- L$ a6 m, n. U! s  _8 f  ]0 ~        long           cnt;
: Q# H2 y  \  c. ~( M% L1 ?8 A4 C        long           val;
' ]+ w: [" I/ \( z6 m        long           size;. j+ ~8 G& F& G# `' T' `
        int            i = 0;
* O6 \' C+ |+ b0 U) t& i0 X- g3 Y" o; v/ J0 E' x6 a
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
1 t; z3 C, m& d6 D) h4 c                addr = base + cnt;        /* pointer arith! */! O. C( S7 d9 ]/ t
                sync ();
5 t, f! B# v- Z                save[i++] = *addr;
& I3 p" I3 u. z, P, V                sync ();% M" J5 M2 S( E7 G$ W
                *addr = ~cnt;6 S* f; U* [* K$ p
        }8 s; K6 w  n/ U' n; p, P
8 j0 n/ L5 A+ Z  U
        addr = base;
) b7 e# Z- U, s        sync ();6 k. s  i, L, k. l7 R. I
        save = *addr;
. X9 q$ a! V. h7 B/ j, n' N& U+ J& m        sync ();( X* s1 L; W! s" D) `
        *addr = 0;6 N- @' h$ v: D) L9 q9 `
# C- T1 h7 n$ d
        sync ();* u1 R& I4 B# H0 r* ?+ `& S4 u
        if ((val = *addr) != 0) {
8 v: V" Q/ {- M) Q* L5 H# @. v2 R                /* Restore the original data before leaving the function.
& i% B, f3 v, a1 [                 */! N: A: N. y$ g: H+ Y* O$ ]
                sync ();! @3 z3 @  b* Q
                *addr = save;" O) B1 S9 \1 Q
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
" R7 s: B' X: f6 y4 l3 l8 i                        addr  = base + cnt;8 @  k2 m5 m( A1 G6 q  M# n% l# K
                        sync ();
9 B; p, p1 Y# f3 a4 k" S                        *addr = save[--i];
6 y* g) @3 {+ M0 V5 F                }
; P0 c1 m! M, N1 Y; N$ l, v                return (0);( [- |# K- S2 \
        }( d7 O7 e& ^# l

7 B: P' W  ^2 ~) `- @( U1 X! V2 C        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
0 w# b9 y( {+ l* [$ v3 U                addr = base + cnt;        /* pointer arith! */
6 _: K, z0 \1 _+ u                val = *addr;& Z5 k6 `: }: y  }/ `7 v
                *addr = save[--i];3 q8 U) j& U) D8 t
                if (val != ~cnt) {
! \- d$ H$ X" u. M+ y: X                        size = cnt * sizeof (long);
) m3 ]: T) ?1 g' K) ?; W! R                        /* Restore the original data before leaving the function.
+ m" V, ^0 b1 k" Q' j5 g8 ?                         */
! p. G8 j% y/ S$ b7 X' u4 Q6 {                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {8 n* ?# U! M* w: I- L: L
                                addr  = base + cnt;+ R! Y4 a8 ~  _$ k: x! v
                                *addr = save[--i];
! w0 N9 S5 G* |; I/ D( C                        }
% M: _' t* U; y                        return (size);; f4 }5 P/ V. \4 p  j! `
                }) N- A( N2 h7 h6 J' K1 S
        }
) i6 c/ d# \6 e  C
! ~9 D3 \7 l, Z- L5 D8 ]0 B4 W: `        return (maxsize);
2 q% n% E9 H) S}; v2 I* l$ a9 D( n4 Y# s
int dram_init(void)
  V0 g5 [3 X- D' V, o{( i7 z3 t/ f" m% ]* ^
        /* dram_init must store complete ramsize in gd->ram_size */
, j/ r+ V  X: R- v        gd->ram_size = get_ram_size(6 W( \6 Q% q7 i4 c7 Z, G( Y' o
                        (void *)CONFIG_SYS_SDRAM_BASE,, D% U) j+ m( |0 T
                        CONFIG_MAX_RAM_BANK_SIZE);+ K3 Z; Q# _# m3 R2 W( ^  l
        return 0;9 v. D8 Z+ N/ b/ u& r
}
, Y! z* w- _% U
7 E% b: @7 w9 ~
6 U6 \" o! A: X5 s$ \" K1 r/ S

3 y" F1 |, I, s& ~  k/ I1 EFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
8 N/ T) c+ \+ v8 Q2 {2 d' \7 ?2 @; I. _0 F4 n' r
$ z! {( n' F- ^# _5 ?1 }! x9 C

- c! O; B7 p. _" P0 D% L! R/ A




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