嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
8 k. S6 Z7 }8 \8 ~4 x1 F核心板2:DDR2 256M Byte   NAND FLASH 8G bit  C: e& ^. a. _4 x# S  l. O3 o
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?2 O( M' Y: G- g/ b! X& {- d
& v9 K8 V. p) \+ l
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?* ?9 p0 k3 U1 n9 l
, t* ^% p; W0 S3 K! h# H$ u

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:3 i$ \0 B* {+ r2 B3 j# u3 a) T1 R
/*4 d( P2 @6 u7 Y: n$ @1 Q& d/ r
* Check memory range for valid RAM. A simple memory test determines
5 E% ?: b' @3 {+ U; O/ R* the actually available RAM size between addresses `base' and$ k1 s. ~/ K0 w0 H6 I
* `base + maxsize'.
0 n+ A0 O# s3 x/ b*/1 T/ r7 Y5 H) }6 n% }/ z
long get_ram_size(long *base, long maxsize)
3 a1 Z/ h1 R( B& J( i! E/ A3 W- N{
! j- v, Z* c' ~- J  T        volatile long *addr;2 g2 l- P) `0 L6 y- l/ r9 J( N& O
        long           save[32];
) Q/ n' a4 u- r+ V6 B7 o3 R! B        long           cnt;
( t# P7 A. Q$ O) R        long           val;! G' i+ C" Z! R3 R- ^7 L
        long           size;
3 b1 j1 U1 f1 n- t7 f' U& _6 y        int            i = 0;) q7 u% b6 R, E7 |

, T( r8 u8 V" N# y0 T        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
- n9 w( P$ J+ w4 Q, Q                addr = base + cnt;        /* pointer arith! *// O7 W+ `: Q- B$ q5 }, K; j
                sync ();
/ y1 K3 u. S% {+ I                save[i++] = *addr;
* i4 _5 N; u! ~% K) i                sync ();
) s6 W- h, P2 B2 Y                *addr = ~cnt;
4 [- y  F, d) D3 J( p: K" k" b        }+ Z  B: k# z/ v$ q  B

+ C: n( q1 U7 S        addr = base;8 U: E, X( f1 L8 T; F2 z+ @
        sync ();
. b# Y. ~8 G+ ?# t, z" U) j        save = *addr;
, q* P& E# w" f: s  \2 x        sync ();
5 Y" O4 W# w- p% l6 v        *addr = 0;" W# n- Z, t: S5 ^+ K2 @
# N4 B) w# O& L0 ?% j# S
        sync ();+ p+ a% S* Z* s9 F( ]
        if ((val = *addr) != 0) {
, k  _. N( Z, T                /* Restore the original data before leaving the function.0 u, ~) n8 `" H, L
                 */( L& ~. s, I: M" d' v
                sync ();
' E+ v: ^' t  Q- b1 v! \4 f                *addr = save;2 y* p! d8 x, x8 K" N( h  ]; T, h
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
4 }- A, D+ `' m/ p& i% i. m                        addr  = base + cnt;
; o/ Q7 |: D8 C, {# P                        sync ();. m  X- ^$ m5 e5 x
                        *addr = save[--i];- F* g5 @8 Q/ c, e
                }
' {, Q1 H  E! P, J8 W                return (0);! z7 n& Z# k8 ]8 `( V& E; b# x# l% i
        }
7 a! G8 _# I; w
$ e8 Z: j5 w* |2 |9 Z        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {7 V6 j0 p( J2 z/ ?' a2 \5 F
                addr = base + cnt;        /* pointer arith! *// G$ \$ l7 U2 E% b8 }# U" D
                val = *addr;
- }3 ]0 d+ p6 R7 `5 S; Z                *addr = save[--i];
7 J' u! P/ t  T2 C. ~1 _" X# T                if (val != ~cnt) {
$ `" Z; e. z8 C# D9 |. W3 P: k7 o3 X! ~                        size = cnt * sizeof (long);
3 y- O0 ^: e7 O5 \1 @& G7 Y# |( D2 t4 E% e                        /* Restore the original data before leaving the function.
3 F9 b: Y: ]* c                         */
0 T- ]/ z2 s1 Q, R+ t. n                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
) f4 E0 b8 f! K  N; ^0 ?% O, N. l                                addr  = base + cnt;2 V5 V% L. }! O" t9 e& ?  `: B* r, J
                                *addr = save[--i];. J# _0 ?  e! @- l2 K
                        }
# j9 o' R5 m- L                        return (size);4 E( U3 u  @3 W5 e8 M9 |
                }, z" R4 Z, p  f% g
        }
) l3 [2 E8 U" T! @' a% t2 r* e6 Z
        return (maxsize);
; Q0 c5 ]8 O9 z0 n+ }}% t: i# R. R( v7 r) q+ ~
int dram_init(void)
5 d3 t& b% W3 I1 \{5 A* }! J0 ~; k
        /* dram_init must store complete ramsize in gd->ram_size */5 g! Z( e  q) U, o; \% [7 h, P2 P, b. y
        gd->ram_size = get_ram_size(6 k( O- L' G  E# C5 W. x
                        (void *)CONFIG_SYS_SDRAM_BASE,! g4 `) C% [0 H& h, ]* B
                        CONFIG_MAX_RAM_BANK_SIZE);( e* ?" q/ a7 }" L5 L9 K
        return 0;. V1 p) C' U4 {; ~6 Q
}1 _3 _/ U/ x5 U& u8 g6 U0 U+ l

/ l/ H! ?# e" D% r! M* U$ I" y5 W0 Z( m# v
% ?+ a& W; [0 l& s/ k, g0 m; N' N, G

7 _- i% X/ m4 [FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!/ B% o+ }6 m+ T$ u/ X

5 n. @6 q- k5 t( a! V: K+ G
6 L0 G2 d- q/ y6 X3 l& t
: |7 \- g9 G+ h4 u





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