|
|
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
0 q) H: Y" K- d9 t2 |8 k9 b/*
. O m5 \+ @9 R) _! Q% x) E- j& t4 J: C* Check memory range for valid RAM. A simple memory test determines
; b! B$ |7 E2 O' I* the actually available RAM size between addresses `base' and. B! [( M2 p! H& P) h2 W
* `base + maxsize'.* i% v; B1 | f8 W
*/
! U! F" Z! {: W: tlong get_ram_size(long *base, long maxsize)$ A( `4 Z* ]! j3 x' i9 {# q2 S( v
{/ {9 ]: i. T0 M: V7 f$ T, {
volatile long *addr;* O+ }& j; [) g5 k+ z
long save[32];
# T, T0 R! l* [. v z9 H: Q long cnt;% i; v3 k5 k* F/ [* G
long val;
+ r5 S: t5 G6 W$ J) j1 U: Y! D long size;
9 b: C0 J: x: _& E5 f0 @ int i = 0;1 K( ^/ Y, B$ {3 d% F
e! E N% ~) M; A d; Z/ N7 q for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
) k9 ~5 [4 i' ^. U f: f+ ^ addr = base + cnt; /* pointer arith! */. f7 C4 x2 u1 [+ {
sync ();
`5 |! J; Q6 K2 L6 c/ q save[i++] = *addr;% m2 \5 U% B* R6 d
sync ();8 _* ]0 B( y4 U$ i/ M
*addr = ~cnt;
4 b9 e, G, G5 b; d& [7 [ }8 F4 G2 W. u- o! o$ J
; t' F8 y4 ~1 U% \/ P. d2 I, e addr = base;, ~0 ^1 L" N& q4 [, ]" s
sync ();
! g, E5 k1 Z4 S7 e save = *addr;
. x1 B( M1 c0 S! b$ N' O! p# g- B sync ();$ n: j* k3 P8 Z# ~
*addr = 0;+ f$ S' ]) N) [1 Q% e9 ^
' i. k [7 Z. E' L8 M; ]" V
sync ();
8 `- } e6 J( S. x- {9 M" k/ H if ((val = *addr) != 0) {( I9 W$ G" y7 i2 A# X; W% W& f( Z
/* Restore the original data before leaving the function.
" n! [' p A6 W+ L */8 O/ D8 T' {6 B& i Z
sync ();
4 N; o8 z. ]" b *addr = save;3 V- f5 K1 E5 H3 O% o% V- v+ F7 ~
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {/ M/ E* @+ G7 W; Z* t
addr = base + cnt;1 f# p3 }3 b [' j7 Y/ u. V3 N+ d
sync ();
& _# t" u+ T' i *addr = save[--i];6 c; ?) O4 ?( X7 K/ f) x2 |
}; w; F2 Q( Q8 I2 v4 J
return (0);+ n% B) N: D% Z8 b3 W( i
}
; \8 ~7 e" S: H2 [- _) Y- F) F$ z) P8 m( \* ]8 S% S
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
. h# j2 Z3 {, d& P addr = base + cnt; /* pointer arith! */
0 P4 U2 ]! U( g0 q val = *addr;5 {8 z, C0 H0 F' N, k" ~2 m
*addr = save[--i];" @3 `8 J& a h7 w% f
if (val != ~cnt) {
, m7 q( ]/ \ x% { size = cnt * sizeof (long);1 }, n8 s( w7 z, {
/* Restore the original data before leaving the function.' n4 M% ?- Z2 U6 r0 ?- g, l1 F
*/
7 A) Q( k/ h0 ~+ _ for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {' O* Z3 Z3 o# \
addr = base + cnt;& v) d8 O, T0 J+ Q
*addr = save[--i];
* j _3 N! J# i: [0 w D }
( L% ?6 {* z$ N+ j, w6 k0 \ return (size);
r% | J: G e- { }% R- m1 m. e/ g2 Y
}3 b6 i% ^: x: ?, V( L2 U
) d: t7 h H" k2 }
return (maxsize);
. i( U$ { C1 M% r$ X9 ]5 I# |% F: Q}3 r& r; j/ H/ o$ R5 c7 ~9 Z
int dram_init(void)! u2 K* ^6 z% i2 R, s. S" o3 r
{
! u9 ?' y2 I1 v4 a9 y /* dram_init must store complete ramsize in gd->ram_size */2 E# O6 b b" L- I; _* p, y4 t
gd->ram_size = get_ram_size(( P, U5 Y7 S7 r! O! n1 w" d
(void *)CONFIG_SYS_SDRAM_BASE,
9 H2 D9 Z" h& S* O CONFIG_MAX_RAM_BANK_SIZE);9 T! E& p5 A( g
return 0;- F+ o9 O' w( a. n3 J5 K7 O/ Y
}
0 o9 F" i$ K" Z: L/ R# P/ P2 V& V
6 a* i6 C. d5 t0 d ^3 y& U. b
" Q3 {7 C1 V/ B$ W$ l' d
& }9 A$ r1 g; @3 Y5 J
8 a: ], ~8 P3 C- s, gFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
& G# A. r4 t) {9 q9 B1 u/ u! ~* R7 f2 v& i. z {) e W/ V
; C/ ^. ^) x- G* z& n# X" Y% K" R6 b/ l
|
|