|
|
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
0 ~# \3 x6 n2 N; g2 \. V/ X3 ]/*
' R$ F/ I m) \. {* Check memory range for valid RAM. A simple memory test determines
8 {/ L, L7 l P7 }) l2 [* the actually available RAM size between addresses `base' and+ D8 `+ B, D* W7 N; ^+ ^
* `base + maxsize'.% R; j& X/ a& A8 H- J9 J
*/7 j# _7 z" S. P4 P8 R! N
long get_ram_size(long *base, long maxsize)$ Y( r2 C) ]; K5 E% z/ w. A7 ]! j4 y
{
2 r& q$ u: p9 _! }3 k' S$ H7 E0 c3 q volatile long *addr;
& b8 ~1 c4 J/ m long save[32];5 Y. }1 T1 \7 k9 h9 i1 ~
long cnt;
* N1 v! ^0 P' K long val;# \0 K! k/ I! e8 Z
long size;" w6 z+ @) ?! r& F2 I! T
int i = 0;9 B) P, f- m) s& x" [, ^5 H
+ e( P( A& b8 h& W: K# U for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
+ w) ~, @5 {8 i; L addr = base + cnt; /* pointer arith! */
2 L# N0 A7 [6 x G5 x/ X1 x7 I sync ();
' P& c; z$ w. V! U9 @7 [; B save[i++] = *addr;
: B3 v6 C" e& p' y" t- Y sync ();
4 ?" i0 M& x- Y *addr = ~cnt;7 u- {) R2 w% ^+ t5 `' H3 W
}
" ]& }8 C# c( W. S/ d6 e3 c! m! P& e! o, I: D7 k
addr = base;, M) X' X5 G" i7 j) Z6 [( E9 R" M- Q
sync ();* \+ d. a& c* k% \% k
save = *addr;
. Z2 y4 c2 s2 X/ l- ?2 x( n sync ();6 N/ }: Q- E0 N5 @; f+ F! ]. A4 E
*addr = 0;6 ?$ C. K+ F1 p; h
& j1 R6 S* R6 c" Y) Q! G( Z: B
sync ();0 B/ u9 V8 `+ d. |+ m7 k7 ^
if ((val = *addr) != 0) {3 U/ G3 k. N/ ^- j* c: V% c+ K$ L
/* Restore the original data before leaving the function./ E7 p( R) L* a! A
*// ?7 E7 U5 B% `! o6 g& |" h }0 p
sync ();! L6 C8 L4 ~& M( s5 L; S
*addr = save;' k1 s3 N, d$ P$ ?) D2 c; |0 \& {9 V
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
& @- _" h: H% w" q5 E) P addr = base + cnt;. O5 |9 h0 R; x/ o5 K& q
sync ();/ Y2 ~. b0 ]% K3 m% B
*addr = save[--i];7 V+ f2 m) N& I9 J1 e% M8 a; @
}
( f- q5 X* {/ H: ?$ I return (0);
/ `: M6 Z3 \( g- e2 Q3 x }
" ~9 _' e& }" v# X9 P& q w4 @8 g& X: F
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
+ h: z- C) A) b5 t addr = base + cnt; /* pointer arith! */2 n) ]0 T3 m( E. P# k
val = *addr;
$ L& Q: s" E* u6 z) S" j- ? *addr = save[--i];# H; s3 [' v5 A4 a; z5 M
if (val != ~cnt) {
! {$ r# T$ l5 r' g& |) I size = cnt * sizeof (long);
2 e/ [' c% C5 G, w /* Restore the original data before leaving the function.+ ^. w4 s( x @9 ]
*/& u. i( i: J5 ?: W- e! s, D
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
; E. i$ _+ O8 o9 i" S' o8 t addr = base + cnt;
3 N2 w. z4 q; h( }3 U *addr = save[--i];5 N+ x2 ^6 i7 S! ?. Z% P H8 z
}
. y( r# h, w$ L2 D! ^ return (size);& N* R- _* V: o: j% R% A f6 r W; Q
}2 g8 f) k5 ]/ ~7 Q
}
- m3 ^. p7 B4 c
* @/ b! x( ?# v& B6 D3 i return (maxsize);: Y7 g; P! J$ @ Q; Y
}7 e% A/ T+ t/ h! ~3 a3 d* e1 J
int dram_init(void)! |; ~4 w2 Z- c+ h1 R0 l
{0 ~# Q9 }! D: \* u* [5 v, U
/* dram_init must store complete ramsize in gd->ram_size */
& ^) M( ^8 e; X- h: p gd->ram_size = get_ram_size(
5 `- k3 O2 q1 F8 E: [ (void *)CONFIG_SYS_SDRAM_BASE,. d$ q n2 z1 I
CONFIG_MAX_RAM_BANK_SIZE);2 I3 H2 Q( e: e
return 0;/ k1 i; N2 W' }4 g3 u; G
}
! Z& N# P4 j' U; ?/ R. B* ~7 s* \: b) @0 y# y( W
6 [0 y7 j" L, V2 l' n: t8 z9 Y! j7 c4 H! ?" U5 [6 I- }
2 v2 X) Y$ T: I' I! o: BFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
7 d" d: w6 B! W) r f2 |3 h* l {3 H P9 s. j' P" R" k
( ^% w2 U; b3 C6 o+ @% | u8 J
8 z5 c. F! G$ U$ m |
|