|
|
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
; u/ f0 m* |; I) D* r/*
. Y0 Z2 s5 j9 |* Check memory range for valid RAM. A simple memory test determines# T/ T# ? T, ]3 F$ }
* the actually available RAM size between addresses `base' and
: b/ D3 R v# A( g1 q* `base + maxsize'.
, w9 @* K" d' `% v9 C*/
. u2 h" T9 |# F2 S1 blong get_ram_size(long *base, long maxsize)
$ w' l, ?7 E- k/ K2 a6 S{
( I7 D3 x1 Q* q o( C; s' H volatile long *addr;# F3 P4 L1 Z! v8 I2 l4 c
long save[32];
8 }3 j* V2 F6 P( J long cnt;
- u( y3 e* R1 H+ Z$ K' A5 K long val;8 h' s& X+ {4 l% }
long size;% [- N2 Y2 o) i8 \
int i = 0;3 t0 j: [) W; f5 G" ]; q0 J* |
$ K! n) d3 H7 Y7 G; E
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {( k! D5 {" q1 P* d
addr = base + cnt; /* pointer arith! */$ \. q' ? ]( W7 g
sync ();
- Z4 r" R3 {& o: }3 I y save[i++] = *addr;; z- m% T8 i, {8 Q2 K) K7 ]) L
sync ();5 ]8 X$ q3 @: I/ A5 l
*addr = ~cnt;5 k% B. e) G- }' U' `, J+ [7 Y
}
- @* C( o$ I) g% q: S
4 r* } C K5 r& P- W- m. s, P$ \+ O8 | addr = base; n7 _& a% r2 S2 ^3 O2 a- m( x1 [& b4 S
sync ();
6 Z ~0 V: h- K4 I F4 u3 g1 T: o save = *addr;
J7 A' V3 _) @8 Z1 R) n9 v' A sync ();9 K, e+ J/ B8 j" ~
*addr = 0;
. d; c9 K+ t3 M4 c& z; Q1 {& U# ~5 {! B( m% k- ?* h5 q6 y1 M
sync ();6 V, _0 x) Z* S N/ [5 h h- a$ W
if ((val = *addr) != 0) {
; a% H- X7 a) F3 k7 d# f /* Restore the original data before leaving the function., B( @" N& j: y- {
*/% d9 Z5 p, x) B1 s: ]
sync ();
% }! H, e, i' N *addr = save;
; h6 @7 I8 k- L. G$ J for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
4 \5 K% F% |4 ^8 e# b1 f addr = base + cnt;
3 F% i5 N2 z# I4 G/ S( r sync ();
3 s8 j9 i' s* }' u *addr = save[--i];, h" Z& D! `& M7 ^& @5 |) ]
}8 c8 I# @) B) ]. v/ d$ G
return (0);
" }6 z) C* E$ W$ m% @4 }2 t6 c }- p* v1 K- U( Y6 S) n" D! b# _
/ N5 \& G5 E/ @( d% C! T- J2 m( q
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
2 z9 H+ t. P( q2 t$ a addr = base + cnt; /* pointer arith! */- m: v* O8 F; D, H, H- \
val = *addr;! k! P6 Q0 f X& `1 I
*addr = save[--i];
/ D8 A3 x; x) a if (val != ~cnt) {4 O' O3 J! N9 T# Y7 a
size = cnt * sizeof (long);5 P$ B6 I; n0 L
/* Restore the original data before leaving the function.4 Y& a3 ]. f& A- _8 M" O+ M
*/2 J, F$ Z8 ^9 i0 o
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
% x. y/ U6 T6 R- m% E6 s addr = base + cnt;
/ _! n6 X; R- ]3 h5 Z# z6 U1 E *addr = save[--i];' V7 |$ c" c* j( g2 j
}3 S+ O; n* d0 D$ j8 M z* H8 U
return (size);
, W+ K: B p, c }
9 \& F3 f' u7 \, u' s$ Z3 k }2 `& {$ Z! l: X! U: A1 U
: a6 q, o j0 N/ C6 q
return (maxsize);" q% s7 U# D6 R+ ]; ^) ~1 K
}9 a @2 v1 N) m2 w4 n0 \
int dram_init(void)
4 c6 e" s( k+ R{7 g5 `3 x, J, Z6 q; s5 i
/* dram_init must store complete ramsize in gd->ram_size */
# M! \. h( s6 O, ] gd->ram_size = get_ram_size(
0 X; G" [4 P( t2 X6 I5 X (void *)CONFIG_SYS_SDRAM_BASE,
& g( ^$ E& K. h0 M" j+ K$ L( e- y CONFIG_MAX_RAM_BANK_SIZE);1 ~2 K! T' n n3 Q9 V5 t! W0 _
return 0;
( h5 ^* S' E- n+ m0 f7 J}
$ Q" z/ I1 g* d l
' N. G; j+ O, {1 c$ I, w m! \
1 T" K7 u0 y: c+ t% Y/ V5 N; e
) j9 o* K1 U, ^$ b; o* r7 R; @; T- L+ f1 R
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!2 U) Q, \: Y* C+ W4 E8 T; j
% J! o+ N5 n# r
8 o! b2 Z- d5 a; t/ E- n/ x) p
# ~( \/ ?. {0 n6 u5 y
|
|