|
|
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:, [0 e5 J7 ` A3 p% R2 w
/*
& n0 K* D1 X8 m: S* Check memory range for valid RAM. A simple memory test determines- i- }% K G4 Z
* the actually available RAM size between addresses `base' and! X5 c5 m) z% p: h+ [ k
* `base + maxsize'.7 [% C% @: r1 g0 x! D8 a
*/# f3 h3 ~& R& L& N
long get_ram_size(long *base, long maxsize); v& d+ i c5 k8 |+ F: I; B
{5 l# t. U2 g* B( N4 O' p. U7 B; K
volatile long *addr;$ F4 `( w! v% D- I
long save[32];
. a: A4 V- L7 V2 V! h h long cnt;9 w2 w& }) R9 f; w3 f+ _
long val;: o Q6 }6 F) j' H" Y: L
long size;
# K0 P# n! O4 } int i = 0;9 s1 ]$ K K# R8 f
# q5 y1 T8 E2 D% c+ i+ |$ z( W
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
6 X4 l3 n) s+ l7 w* m8 j( v addr = base + cnt; /* pointer arith! */: f% ^( u0 m6 t& ~2 r. l
sync ();
5 N. A% [$ M) [! j% |7 U save[i++] = *addr;+ e3 o! D: Y+ f* `6 H; R5 `
sync ();
* T6 \' D1 d5 C$ q8 v+ A% S: @$ m *addr = ~cnt;9 a! ?: s" d% D+ B) j
}% P1 V4 A: c3 b4 l0 c& r1 I+ F' H
* }# z! `: o6 O6 U7 G' z
addr = base;
' Y) p2 n* f0 @1 }3 Y! H0 g" Q- { sync ();
4 F! K5 \$ T1 l1 M save = *addr;" s' R$ R, f7 I# m- P8 p
sync ();
) t, b2 v* C- w2 M$ } *addr = 0;
) U6 R* M( k. k. b- |& a% B8 R( B9 n, K& b$ d/ N: L% p. M
sync ();7 e+ x6 h4 z1 c7 n' d
if ((val = *addr) != 0) {! y9 ]0 W6 m' B o1 F# h1 F
/* Restore the original data before leaving the function.: O9 e6 a/ J4 ~& g
*/
' j" R! ]5 b' w; r; h% F4 g sync ();
5 c* F" x$ z9 `/ n) q* E *addr = save;% O( k8 j/ X7 x) N
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {9 x$ t0 K. p# w* u
addr = base + cnt;
" @2 W$ [5 ^- _/ s sync ();
1 _( Z" \) T4 t! R( z) S. R *addr = save[--i];
/ e# N9 z0 ~5 D) `) F* [7 S } p& b/ \8 y( K. ~1 w
return (0);: e. h! f% ~, Q1 n) c
}
# e% `! z* V1 u7 y
9 Y, c U8 ^' B+ { for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
9 U/ g, c3 }9 K: ` d# d, S addr = base + cnt; /* pointer arith! */
W* o0 U! f$ v8 T val = *addr;* {& F* F) M. P( { F/ L6 x$ M# e6 i e/ {
*addr = save[--i];$ o& v2 l# ~0 Y- ~5 c; L
if (val != ~cnt) {1 i" u! q4 e- s- Y# y4 j
size = cnt * sizeof (long);
7 W$ f" D) I: L" B5 c4 ` /* Restore the original data before leaving the function.
$ f7 U9 C3 N) E, T& G3 Q */
5 Z: ?4 E0 Y9 M) B for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {- d, @0 l9 l `2 p
addr = base + cnt;
- u3 n$ T2 S% G! x+ ^2 i" { *addr = save[--i];; @ {8 W2 A2 I9 Y; S
}4 c$ M2 V# G4 d5 y
return (size);
# \4 b8 |# {0 @/ w- v }* ]6 ^. p, ~7 |) V7 M& ^
}8 _, y2 |/ \' p2 s" z
* j& A3 E( J O1 u. a return (maxsize);
" p9 \" z: J8 s0 c" S8 F}
$ W. I8 ~0 A+ k) v! yint dram_init(void)% _( F& M9 E+ {0 |
{) H) t7 g. P- ?: W" L9 L# _
/* dram_init must store complete ramsize in gd->ram_size */' x8 X1 q- M& L3 z/ K1 }/ ^
gd->ram_size = get_ram_size(+ i0 u/ w+ H# c3 a+ j$ Q- G
(void *)CONFIG_SYS_SDRAM_BASE,
; N4 X, A+ k( J' O3 F5 K2 m0 K$ L CONFIG_MAX_RAM_BANK_SIZE);
A" `- t2 ]$ K' ~0 `3 J return 0;1 P! M2 c1 j+ g: |7 c+ p: N0 @
}: ~* L( _% C. v2 [7 A
- _9 k; e6 Y: k! r- ^
) u! ~) ?$ T& L0 C% u% x+ k! b" N/ _# U$ h9 }7 Z
* U, T7 c$ h& ?5 h/ @FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!0 A' C7 X3 \2 f% u7 D
: X8 O7 W" @3 M; H7 h6 w; |( X& c+ o; ^9 ^" B9 K4 m' Z% X$ ~
' E3 o9 S& ]$ d' X9 O |
|