嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
" w! a, P7 r4 b* x9 q* ~9 p# H: V核心板2:DDR2 256M Byte   NAND FLASH 8G bit+ C4 S" L! T0 e/ }2 s
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?& ]( k: M0 o0 |+ z: {

, o! {1 J, }' W0 ~; w6 u& k& g是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?, b+ V1 Y* w7 @1 T+ j
$ U  X( \& {) ~3 {5 g. z

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:' q( N# @. U6 ^: g: Y, Q) W/ |
/*$ A% `3 T6 b/ a- r
* Check memory range for valid RAM. A simple memory test determines
! z/ O+ F7 }* U+ i* the actually available RAM size between addresses `base' and
3 W. k7 M% f; P! L" c* c* `base + maxsize'.7 J0 F" E; L9 e9 d* u, J1 C3 b
*// u, ~; D* o( {% z# A
long get_ram_size(long *base, long maxsize). T) p2 j! Z- m% J' {& z+ n0 a
{
* X& a1 C1 E# I% `" {        volatile long *addr;  A' T3 F6 K' ]" \/ d- P1 j
        long           save[32];
* D, Q$ l( f+ ]% f2 @% b1 I7 E- p: ~        long           cnt;
# o  q' q2 F, h- M, _        long           val;
, U8 H& ?: |2 H' G1 L1 v        long           size;
! g8 b9 t! K' o        int            i = 0;
$ p+ _6 {; v2 H7 n% c  T9 X
. v! C, @+ L$ ?4 ]/ E  p        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
, x$ K. M# Z! D, I                addr = base + cnt;        /* pointer arith! */3 k( k0 i" B! n  L. _# _" J. a
                sync ();1 [2 t' y" G/ i9 S; d  }
                save[i++] = *addr;
5 @. x" M0 q  O* H+ |7 u9 P4 k                sync ();
3 ^3 c5 B3 ?; p1 [! R3 @                *addr = ~cnt;) D; z, {  O- K' ~$ \
        }
! p8 _5 R" W  O* c
: U2 i! j# e7 q' u9 S        addr = base;
' k, Y. B% T) i' R6 x        sync ();
+ |3 T+ ]  O, [. D  d5 M        save = *addr;% S: Z4 ?% Z3 Y8 A. Y2 W% Y. h
        sync ();' F) N3 I( H3 I
        *addr = 0;
8 ~, q5 |% w+ D+ B2 p* h' H
. y' p, @2 z/ ?8 z& ]        sync ();# |+ d* _8 s+ I4 Z0 y. @) H
        if ((val = *addr) != 0) {+ W% ?' U. z7 O
                /* Restore the original data before leaving the function.
' x, ?* H( N+ o! }                 */
, }2 A3 o7 y9 ]9 k6 N" f! v                sync ();
# B7 i4 L% j5 Q' k% N6 k% G                *addr = save;: p# X! B: Y: I9 ]3 @' u/ M
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {) Z9 @( n+ `0 `
                        addr  = base + cnt;- i( g' K! V! g8 Z
                        sync ();0 V* ?9 `9 }( E3 `. S; \
                        *addr = save[--i];
( M0 \  ~, A) J; g+ {# z                }
6 b) I2 X! Y4 E0 e! g* `% |8 S# y                return (0);7 T7 b  x3 y. R8 I
        }
& n$ Q4 |! e! v  p# U/ _# j4 \. Q: Y0 q$ a) p6 u
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
+ I7 A7 N: A$ S& j                addr = base + cnt;        /* pointer arith! */
+ m7 @! y# N6 f( W! E2 E                val = *addr;5 a+ E9 ?' O9 k+ \  c/ m2 ]  T
                *addr = save[--i];/ \) t9 E  o! `1 N0 l/ z
                if (val != ~cnt) {
" d6 Z$ o6 ]( r) f9 E                        size = cnt * sizeof (long);8 P1 w# [, J$ a/ U0 u
                        /* Restore the original data before leaving the function.
: @, v* I# M' m- c                         */6 I1 l% \. [  |0 E" T# @
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {* {. O  I6 x. e) l
                                addr  = base + cnt;# m# O. d' f/ X/ p. p
                                *addr = save[--i];! {& I+ T# ?6 u; J4 p
                        }! J3 K. V4 e5 a! L
                        return (size);
, q" z9 g6 E6 [! ^                }
, v8 e7 }4 J" f4 S( p3 W. M" S( Z        }
5 Y$ l# r$ H% C' _, ^8 I& h7 U; U* W2 m  C& O
        return (maxsize);$ \3 A% I4 Q0 v- y. e3 L' V
}, e# t+ I' Y2 r5 k' `
int dram_init(void)
; z" B- Z! |2 \1 s& g6 t{: ^$ q9 p6 X. B4 C: _" {% c. d' W
        /* dram_init must store complete ramsize in gd->ram_size *// f  N% [5 A; @5 \" N2 _- L
        gd->ram_size = get_ram_size(
- }, e) f! b( D& P! r                        (void *)CONFIG_SYS_SDRAM_BASE,
; R$ @0 j: g, R  `, E7 A! I) N                        CONFIG_MAX_RAM_BANK_SIZE);
# e: v7 R; n( h; {$ M2 c        return 0;
9 ^1 S+ E* s  o3 ]6 A+ A/ x, V6 G" [! P& t}. n, o: L/ V: b' \
7 W: i% f8 g. K1 l! k

) Q; Q% S0 I4 D- [1 u/ \
$ k+ C% m" J3 D: Y( H$ X+ G3 |5 u2 {' D  G
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!& S1 n" C& ~6 O- @& ^0 C) q
, L- d* R- ]& k% L% h
) l+ ~9 R1 z4 q% I
0 I9 b; e" K; o" o7 y  E( [





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