嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit! M) }" h9 U1 |0 G. H
核心板2:DDR2 256M Byte   NAND FLASH 8G bit* W+ Q9 c4 y2 o0 @
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?3 {( F- s* O& h! t
3 R( @3 z  f# Z  ]; H/ ^' \/ r& a+ O( w
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?) j. W/ v3 w4 k

, }4 y, A- q  R  k
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
. h$ k& d$ Z; v: R/*1 W/ \2 V# r0 x& \, W( t& I
* Check memory range for valid RAM. A simple memory test determines' O# n4 Q- R, \, ?; e3 j2 w
* the actually available RAM size between addresses `base' and
1 ^. X( N! G1 C* `base + maxsize'.2 Q1 R! _! W- }# |3 ~/ O
*/
7 Y5 Z! M( ~: L5 h" blong get_ram_size(long *base, long maxsize)  s3 @1 S$ ]  y5 \! R
{3 c! O3 Z! [- k4 U7 p! X4 ^
        volatile long *addr;
7 G" y# W1 p2 P3 {7 N        long           save[32];- O& X& L, u* X, E( @6 g! d! @+ H
        long           cnt;
2 ?9 ~. B9 v# L- E% h        long           val;: @2 B7 {# x, ~( a) N6 e
        long           size;
. h6 W8 J: b! s* A3 D# H        int            i = 0;
: h; M1 T/ v: E1 A' ]3 N
# V/ E; v$ i; M% M        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
5 h+ ~0 E4 p! }. I3 A2 P" `                addr = base + cnt;        /* pointer arith! */
& d$ V- x/ X8 \+ l# }' v# y  F                sync ();0 R. Q' F* W* J# d
                save[i++] = *addr;9 Z3 H# L' A2 H% Z! |4 X& a6 L
                sync ();! m! l; ]1 a, h1 w; i. j
                *addr = ~cnt;
7 x7 s6 i7 S" f/ s. s; ~, z5 B8 }$ f        }
3 |+ p8 M- u6 V' h
4 ]+ B6 }1 ]  W        addr = base;$ O# a5 e5 Q/ l! I2 N+ [9 t
        sync ();4 g, @* s, i& o  y5 V0 X
        save = *addr;
* ~( O. |- _+ l7 Q& ^0 O$ {4 a9 ?        sync ();) C! B6 J' ?: t. O5 Y' P5 X
        *addr = 0;1 p, m5 @& Y1 c2 b5 G8 l: K

( S  q4 M$ E) I# i/ d% d; n        sync ();
  F7 r5 v  d1 d( Z2 [        if ((val = *addr) != 0) {
2 E- g( N# g/ d2 Y                /* Restore the original data before leaving the function.
  x+ C6 k+ r' M$ n' U3 o                 */- C% [6 N7 v  t, c1 E9 a- J
                sync ();
0 X& ~' v+ ~9 c$ R5 j                *addr = save;* X0 E& w$ v9 _2 ?, ~
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
8 l# k5 ~( ?' H9 z1 X6 X                        addr  = base + cnt;5 ~! q4 D; [4 z! T' m
                        sync ();3 O6 e' [& {7 c! R
                        *addr = save[--i];
8 H2 W6 S; r* X  D' X: l% y  h9 x                }
9 h* h6 G- M" [                return (0);* f4 a* b: u, E0 n9 S- e) ]
        }
( T( @+ `* [( {' U1 o9 u2 I1 n( c2 P* [( U. P+ ~
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {" p$ j$ O7 H7 t3 g% L) e- R: E
                addr = base + cnt;        /* pointer arith! */- n4 i1 Y% H+ N1 u0 Z0 x
                val = *addr;! k" Y( i& u  m+ b
                *addr = save[--i];& J+ b7 m8 P6 z0 f
                if (val != ~cnt) {% L, \3 C1 V; v
                        size = cnt * sizeof (long);  b+ m# E, d$ [
                        /* Restore the original data before leaving the function.
5 N. Z& Q- u+ {1 t% s3 t                         */
; P- j0 q% N; v4 j" f3 Q, ]                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
: [8 [, B7 J' d9 A/ D1 `                                addr  = base + cnt;
' e; s3 O/ r: x2 t2 F& D' T* V                                *addr = save[--i];
) d+ e( [( n, @6 f+ ~0 f" Q- v                        }
* ^. \% B8 \6 C! j2 n                        return (size);; O2 S" _; b2 b
                }
" `# _; i/ x! \        }* h) P2 ^, q- h6 ^! d: F+ h
2 d. V9 z, B. d# r0 |
        return (maxsize);
. `8 A: }0 e0 \}0 C3 U, ^$ d! z% K9 J3 L$ ]
int dram_init(void): a9 K% _& K3 w
{$ K- ~. m2 x) `) Y
        /* dram_init must store complete ramsize in gd->ram_size */) X( T% O4 l0 G; [' g/ |9 l
        gd->ram_size = get_ram_size(
& ~6 o; U: t2 t% V0 w, L                        (void *)CONFIG_SYS_SDRAM_BASE,- N, f* n  s  H
                        CONFIG_MAX_RAM_BANK_SIZE);6 }. w" Z5 p% Y7 W2 T5 w: u' y
        return 0;2 ?" j+ Y+ u4 f* O
}
( ?" Y: k) X1 v  K" L& i; g6 v) j( Q: t" g6 _

- m3 G! ~3 v: R( \) X7 J
) Y3 p. m$ g( ?' }3 k! k" c  Q
+ y% S  L( a5 s+ L" P$ c% W. X  JFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
; q! _/ p6 R9 b! D8 A3 b; H
  R; b% }4 ^/ C. w: G& d( L1 Y( l! k! o

: I6 [+ z; ^5 o+ Y' D6 n




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