嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit. f& I' z- C1 w" M1 S. v
核心板2:DDR2 256M Byte   NAND FLASH 8G bit; D; h7 Z5 i- k$ C; q: C
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?5 k: h7 T5 c/ A5 \& n4 W* _& G
; @" }8 v4 F# v# e# d6 |- d, ]/ y
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?( l8 j$ j% V; U7 d

  S6 j$ m. K1 x  _$ H/ P
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
5 H2 `  y; v: Z. q9 H. T8 M/*
# v0 i' F" B2 |: D0 F" [( m* Check memory range for valid RAM. A simple memory test determines
; h( ]) f) L0 ?* L% t* the actually available RAM size between addresses `base' and
9 Y. I! e* M/ V* m" |* u* `base + maxsize'.* i! w6 _; g7 Q- m9 ~1 @9 t
*/
* k! V, X% S0 t  n9 [& B& b* xlong get_ram_size(long *base, long maxsize), _. _3 x( H9 [; Q2 l; ~
{
$ o. R: [+ a0 ~3 d* m) y! ?" `        volatile long *addr;+ L" }7 h5 K3 @" }
        long           save[32];* U6 C+ R2 Z1 @: `! A4 {
        long           cnt;
& K4 [! ?4 c$ p        long           val;
; n: c0 G) w: ^1 d        long           size;7 M& k  P, q9 L2 k  f% e
        int            i = 0;
1 R1 C6 k) p. V& O8 j# ?" N
& y/ @5 [; ]+ K# G3 u! w; _        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {# _, n6 a8 W: J: z# o
                addr = base + cnt;        /* pointer arith! */: I/ a. l6 K/ y1 W
                sync ();
1 C( T: \+ t- z/ G                save[i++] = *addr;
. j0 @& D7 j1 Z                sync ();
( t" o$ u/ R' h  {                *addr = ~cnt;! o9 h$ o- U. K3 t# A0 u
        }
$ U' q5 C$ M: d7 Z8 v  i
8 H, q6 h5 p( [% ]1 Z1 y' u5 l/ z        addr = base;
+ b5 E. K$ \6 B* E# d        sync ();# T( T  F% {; n" d* Z
        save = *addr;
* p1 C0 U( L/ v# r/ U- i  p        sync ();; n& f. U0 F, a0 H  G5 ^
        *addr = 0;8 ~6 o! u& }8 J

4 o/ E0 X+ o, [0 I+ Z$ }        sync ();5 x2 f& ?9 f7 X
        if ((val = *addr) != 0) {
7 z6 r, ?3 }% [, {8 L5 }                /* Restore the original data before leaving the function.
! E5 r0 r; i* ^3 |  \3 N( p/ l7 U8 A% k# r                 */
4 n# L9 p1 ]' Y% j                sync ();& `4 F/ `' e/ E: v( o
                *addr = save;* l8 m* R4 X8 @/ a. o
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
. x7 d. n( K1 Z/ \, U                        addr  = base + cnt;4 d) T0 \& S" G
                        sync ();
" k$ U5 r* H/ `$ F$ E                        *addr = save[--i];
+ t. S* e' u0 L% Z5 Y! e                }
' O8 F! E& l7 K                return (0);
! y6 g0 E% V2 n6 M' S        }, N# i# t& O& Q1 [: U
' A) L" ~$ v* [; V
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
2 [$ m; @) J2 K2 [                addr = base + cnt;        /* pointer arith! */
1 m2 C( N( V, t; M: l; X; n) T% k                val = *addr;
2 b* n# r- Q7 D( `                *addr = save[--i];# C- S) s; k* C$ A! K
                if (val != ~cnt) {
2 P3 ^* ~6 ^  ], K" k                        size = cnt * sizeof (long);- a% B' k+ w( `) \
                        /* Restore the original data before leaving the function.
* T6 _$ ?( b- a% {                         */) Y) y/ l) C! c% \
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {& Q/ s' f  T3 k$ M/ Z
                                addr  = base + cnt;
' B; b  }7 R4 k# J                                *addr = save[--i];+ Z, \2 c8 I# v: ]: \
                        }
; C( g% w0 l: i+ p                        return (size);
) ^8 u: C$ r) f# Y0 P& B# d                }  T5 ?1 V" f- [) ^
        }1 ~$ U0 X3 x* }, K' L9 ~( C
; O2 y, R2 r0 G3 Q, z
        return (maxsize);
$ k8 t' _" [7 ?6 I& N0 p$ W7 C}
) X$ [( }/ U6 ]6 M( C0 |7 V, y8 [int dram_init(void)5 U1 U8 n3 B. P$ l
{* a: [( m1 t: ~! y4 P
        /* dram_init must store complete ramsize in gd->ram_size */3 o+ D' S; E6 u" e) s
        gd->ram_size = get_ram_size(
, ?6 Y. ~/ n' r5 V( X# B                        (void *)CONFIG_SYS_SDRAM_BASE,9 w6 F' ?# {4 Z. B, A; U) k
                        CONFIG_MAX_RAM_BANK_SIZE);2 ^- o; I2 G1 K! r6 j
        return 0;
- G$ G. H& V" M0 z$ P}' q1 q' @$ |# y9 Y6 n* y, h
. m& `& T9 }+ K5 i

$ ^1 x! J! G7 H: V, n1 i
) n: e$ r  J: i+ g! G) L, x
8 Y8 B- ?7 X1 O0 ]0 cFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
8 t0 r: T3 l! h+ f/ l0 p
% j* W- i# F) e; X* @3 Q4 u
) e/ _4 g6 k# V% h
5 h0 w5 I# @5 g8 U* M+ e





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