|
|
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:% u: {, T* n% a' g
/*
( X2 ]( A5 s6 d* Check memory range for valid RAM. A simple memory test determines C3 f& A5 ]4 e% S# P
* the actually available RAM size between addresses `base' and
# r2 v0 q6 W2 u2 D5 o* `base + maxsize'.
* U4 H% s) a( k9 Z4 Q: e*// w* j: R7 I& _9 N3 |( p1 P
long get_ram_size(long *base, long maxsize)
( ]1 f1 e: a; L" K- F# k Q* g{/ K0 N+ N* L3 {/ R( Y* G
volatile long *addr;1 l( r$ h& Y p, U
long save[32];
9 J% b0 c" W6 K- t. I2 d long cnt;
+ {+ L/ x( D' }/ ~! L long val;
. T* |( G/ A+ W$ u- D long size;+ E9 I0 B: j! q( T
int i = 0;
6 m7 R. V% ~6 u, z4 g; H# z" ~% n( u) H' r
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {+ Q5 @; L+ _. b" [
addr = base + cnt; /* pointer arith! */
, M$ G- i. [" ?8 M sync ();* H+ s- }! m2 Z" _$ [
save[i++] = *addr;& `+ H, L3 t: E3 {( b
sync ();( B9 T6 H! m; B3 q
*addr = ~cnt;
$ ?3 ]' P# P) N2 U) {, r }6 b1 Z* K' [# e2 P
5 F+ t2 d- E2 F( b$ E. ~ addr = base;
7 G. Z& E" L) D" _$ | sync ();
6 u+ x9 d( T/ P& M save = *addr; o$ ^; U) l- ]
sync ();) _# f/ G# c1 O
*addr = 0;
( c1 m/ Y6 a* R) F1 g/ ?
7 q% V. S {* [+ ^1 \$ W! w sync ();3 q, F. p+ n) T; C" V/ {+ n R, \5 F
if ((val = *addr) != 0) {
# C8 a9 [: t" q. i2 [( [9 u /* Restore the original data before leaving the function.
5 q9 a F& u3 Q, a */
- G6 r! ^9 H* q" f1 u sync ();
9 r- k" N# {4 [# T5 j { *addr = save;6 T* s; B9 D1 P& e: v
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {" P: U" A& t# H- {+ x o
addr = base + cnt;
4 h; n& V$ v8 Z3 q7 [% V sync ();
! l E# G, ?/ ] *addr = save[--i];
/ U. V+ r6 O6 `- V7 h4 m/ N4 U }0 y0 p& _6 C" |% ~
return (0);% j) F2 r& x% }1 q+ K
}( P' O; [6 Q/ a" S
" z/ r/ |/ A0 r
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {# S1 ^" v% E1 k
addr = base + cnt; /* pointer arith! */+ q: A5 X* D v
val = *addr;
$ e" u$ c5 \' H7 v& H+ U *addr = save[--i];% B5 A: X$ [% P6 v
if (val != ~cnt) {; Q+ G! e ?$ p+ ]
size = cnt * sizeof (long);
Q0 d2 a S9 n& ]! b7 f /* Restore the original data before leaving the function.
4 E( F% G. A7 n; V */+ H) q [$ Y% H* }; O( {
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {! F% C, I1 B* W5 r; }. P4 q1 Z% u1 \
addr = base + cnt;
) P6 U+ u& l8 ] *addr = save[--i];. Z; H8 i) l/ s& v( n
}
( s; h6 C, x2 Z' S return (size);5 Z, |, S1 u% O7 B5 C2 J: ?6 P1 k
}
4 d& q; n7 e6 \4 K/ ^$ o }
& B# n* c! a7 x1 Q/ q1 L/ M! Q: i! ?0 C# X( [& _! g
return (maxsize);/ |3 ^1 N2 H4 G" g G
}5 ?' q0 \4 G5 ^' A ~
int dram_init(void)
: ?9 ]# W, @+ V! w; L% |/ a/ ^{
2 m% C; Y, j( ?7 p" d /* dram_init must store complete ramsize in gd->ram_size */
/ d5 {& |- E' a) }' ^ gd->ram_size = get_ram_size(
/ i+ Z3 z5 s+ m8 S- V (void *)CONFIG_SYS_SDRAM_BASE,
. K/ c, [. u# F2 b& u- R0 X1 @ CONFIG_MAX_RAM_BANK_SIZE);! M% e8 Z2 c: K8 V5 |3 l
return 0;. `" ^. c% f; L/ y/ @9 R
}
' {8 a+ W- Q+ G# h W x4 n2 F/ ~/ b' }9 x, Z7 r
, }# s2 r- L9 n; [3 \: i, Z
9 \- h7 O4 A* v
8 H! ?: _7 @" s% T5 b0 u' |
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
; w- t3 n1 J" F4 x6 i' F
0 u* O9 Y: Z! n. [( O$ u* w( g" d- x- p9 B
; T3 j2 f, G7 F' s |
|