|
|
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:% z* G; ~! S8 Y. D+ I
/*
0 e+ D5 J, p! K' V/ h/ @1 a* Check memory range for valid RAM. A simple memory test determines5 u) n! g* f, b! P- [. i; [
* the actually available RAM size between addresses `base' and" @0 E: ~1 O& i3 p! p
* `base + maxsize'.
- \( W; I' f/ u( p+ u*/
* q% J( ~2 o& H! [long get_ram_size(long *base, long maxsize)
! W+ Q/ Q( j, v0 Z{
c: B* }" @: M volatile long *addr; B5 b. x+ j7 `' o
long save[32];
' m2 J z/ x% Q& L long cnt;6 q6 N+ d9 B4 g& o4 l
long val;
7 @( \/ S! {. l& u9 w long size;3 o0 r& ~0 F- N, K
int i = 0;
. b+ f) B$ Q2 f8 m) S4 k! t) F& F7 v! ~( l
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {& N" L' Z9 \! K# D. y8 _7 `! y
addr = base + cnt; /* pointer arith! */ N$ N# p" R1 f! ^/ j+ f3 }
sync ();
6 `9 E1 G+ D8 I0 c' h0 | save[i++] = *addr;
7 e& [7 a! r! y sync ();6 P$ k, L& {6 R$ e- x ?" U& J
*addr = ~cnt;
- e; p. N) f4 J' M }9 l* ~2 {- d; D# A
. Z% g( O8 M. D9 ~' d addr = base;
, n7 j( u, ~! Y: A sync ();8 D) k+ F7 J9 M8 Q$ h
save = *addr;
- f9 R2 |9 s- }9 w1 C7 T sync ();
( ~# m4 W5 u6 A: o *addr = 0;
, q, M; A( E! l0 Z8 _/ g4 t0 D8 t9 K4 _0 r: o
sync ();! d' [& L' E$ |5 H) F3 w
if ((val = *addr) != 0) {
/ E5 l) `% Q9 w) s4 P" k /* Restore the original data before leaving the function.) N+ f: H2 V8 @8 t j( e( M, O
*/1 |" r+ K3 h- F `2 {/ z k. J
sync ();
5 ]' [+ m, z; f1 Z- _& u *addr = save;
8 e; [: L# N. q V! p for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
( [7 R; G2 \9 c: ] addr = base + cnt;
' t3 F, q9 P. _1 h k) e$ E1 U, F3 g sync ();
' |( e" B- {2 U: R! ~4 } *addr = save[--i];
3 X+ @, ]' |1 G' r }
: M; b; R' d' }; o: Y4 |- A return (0);9 M4 \) @+ n- I6 f
}) U, R' V/ y2 I N/ T8 {3 u
" {& G8 r+ ~4 \7 C for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
9 |; Q: W; Y1 }+ _* C: { addr = base + cnt; /* pointer arith! */7 R" H4 x1 Q) t8 J
val = *addr;7 n9 ?' S* y2 X& Z& g0 I/ L
*addr = save[--i];! ]2 {: n( M/ `) \/ X) f* i
if (val != ~cnt) {4 F+ E7 ~0 n8 l
size = cnt * sizeof (long);4 P; H0 a' a: j- c
/* Restore the original data before leaving the function.$ g! z8 u: }8 u6 _1 C* E
*/
. L" m% p8 C- M/ E! _1 x& s for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
) j1 o* b, l; D$ i, s) E addr = base + cnt;
5 d0 K$ i% l ?& n- d *addr = save[--i];
- d- o- C* f' H" `( n+ c) O }
9 ?5 \; [' b" {) y3 o- ~ return (size);
3 _& A% d& b& s' f6 H8 M8 n2 W! g }
7 ]+ W5 ~- j" ^' }/ w9 i) u7 a }
+ X1 z" \$ r! l. t8 K5 |$ D" K8 m1 \' C
return (maxsize);
: z: B9 k4 k8 F% {. E5 Y h}
8 B& D0 M" f n; Q/ d9 Qint dram_init(void)
1 l- \0 r' P: u( P{
, ]6 ]' i; W& V /* dram_init must store complete ramsize in gd->ram_size */2 j/ x" K- G- |# r& q8 Q6 Y$ n! G3 F
gd->ram_size = get_ram_size(% j& }; B/ ^0 [' n
(void *)CONFIG_SYS_SDRAM_BASE,' A, r3 P8 X' a5 @1 |1 I, u- _! K
CONFIG_MAX_RAM_BANK_SIZE);6 w9 f8 d1 M. e- ?0 c
return 0;
& c1 l; C) y% h# R- t}* A8 h5 g3 T! a
4 k2 H5 @$ n& h" j4 l8 U6 V
1 m5 E+ _) Q# V# E
- e3 T$ n9 i/ E
8 E+ y/ ?* [0 l9 k H, ], \3 DFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!& u }! g- g* U# Z
/ l# C" N* U7 a' H) H" R; b' I1 ]% F
8 I C# R1 @; c+ }; j( A: ^' D |
|