|
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:" o. \6 }, V- v5 i6 i
/*
Y. c9 T6 D0 ^: x7 d* Check memory range for valid RAM. A simple memory test determines) C* V: z$ o, p9 }$ Q/ g$ A
* the actually available RAM size between addresses `base' and) S* e# R" N! w
* `base + maxsize'.
' Z5 R ]2 _# l$ P% u* l- {/ Z*/1 s' c! Q* P* M
long get_ram_size(long *base, long maxsize)
9 N+ y' b) ^2 ~+ [- f{
* z3 ~0 E$ f, i) G2 i6 M# \ volatile long *addr;
7 v3 E8 `7 a1 q8 @: n$ \ long save[32];
& q- L4 C" \8 l long cnt;
8 p3 X$ C ?$ X long val;
0 v$ s+ P: z! q( \ long size;
8 m+ v6 i5 y# R, E' W: A: I7 G int i = 0;) D+ T7 Y% w) q' O2 B
7 o$ ~9 v. a% P) ~7 a
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
F7 S* R _" k3 y# ?0 L8 a addr = base + cnt; /* pointer arith! */
2 H' P S1 h7 a: _5 t sync ();
# g. [/ l) v9 ?$ S) H; ^% f3 W save[i++] = *addr;
+ \% Q9 {! {' ^: u, Q9 v sync ();
) j0 U' W2 i3 T2 H, P. ~" m *addr = ~cnt;
# S4 W; }2 V! T L7 ]4 t }
( d( A% _2 R- L+ ~1 K% \6 `) w: O/ O4 E+ ?9 J8 q5 ?* \
addr = base;
9 y/ o' \6 A: K) \ sync ();
" e$ f2 n8 `- j5 E5 H3 A+ @0 p save = *addr;! j0 }" o5 |$ t( w* J* v( j6 u! X/ p
sync ();
; N$ H* ?% ^; z( q. A3 |/ a *addr = 0;
; S0 G+ h/ Y! Y
8 f- w* k! O) O$ a; v8 z! W- B sync ();
6 @0 |- P+ V K+ d8 V3 Q if ((val = *addr) != 0) {
6 ]/ u; ?( }8 l /* Restore the original data before leaving the function.
0 \4 s( I W0 ~: _2 Z( H: r */
7 U$ D: q" Y/ Y& ] M+ a sync ();6 V% \ `& r: {! v' S1 A
*addr = save;
. g* a; Z- F9 i5 }2 T F for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {0 j* B! a8 o$ q- `3 }: `; R
addr = base + cnt;
/ N" O! `/ W3 w" D5 k5 P2 X sync ();' H# @7 S# R& A/ |1 T, {* T5 \
*addr = save[--i];
3 h. R' @3 H2 P9 ^ W }9 Z& T u2 d9 r. O) R0 d- k* k) A
return (0);
, ^- }5 Z; ]: G& o }
# k7 ?! z+ c4 B8 G: ]! h
+ h5 `# s( `3 f% {+ ], b- p for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
4 Y( q7 V0 k P addr = base + cnt; /* pointer arith! */
" C6 {! i4 L/ X0 D t6 \9 X val = *addr;4 K" c! ?) Q6 J/ J, G
*addr = save[--i]; `' k l# p% Y
if (val != ~cnt) {
1 b H! v: J) h, c2 j1 u: U size = cnt * sizeof (long);5 ] F: ?: z4 k) e `) y! d" @1 R
/* Restore the original data before leaving the function.9 T7 P* V1 T' L; p. j9 X
*/
. |7 Z3 V4 [6 `. g for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {. g x$ p6 |( m9 j
addr = base + cnt;
! ?, ?+ w- M* ]) V7 Z. s *addr = save[--i];
. V& H! s5 K4 Q8 p7 B }
4 o- t5 T5 A+ i7 d# u$ ` return (size);: W4 S. A$ t4 a
}9 N! x6 j; g0 Z" d) l
}0 O# S6 q) _7 Z7 q3 l" e
; t, B/ e% Z, I( U+ l return (maxsize);
0 s' T8 R4 Y' M) a. ]}$ k- T, v4 B; m/ a
int dram_init(void)
& c, f- e7 X$ p" i( ~{
" M6 W$ _$ |1 ^4 o /* dram_init must store complete ramsize in gd->ram_size */: R8 ?! M( U. v' q* ]4 g( U" X" S
gd->ram_size = get_ram_size(
9 h7 q) {" |% r8 Q- v& ~" B) |/ A (void *)CONFIG_SYS_SDRAM_BASE,
% V$ s ?$ K! {" e CONFIG_MAX_RAM_BANK_SIZE);# _9 U3 C* Z8 R, j' e9 z
return 0;; X% {* L' t$ t9 W+ Q
}
/ e- s7 b, D3 `4 W7 K j3 B
1 h8 T4 [$ v: B
) h# x X) o+ `& F, C6 \
' U& s' K) S }; D# Q( X4 Q; z& g t- d! G8 O' x5 [0 x
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
! G8 B7 Q3 s/ o+ I& q2 j0 q" F) X
0 F z* U$ Q8 N* D m6 j! j8 B6 `
; i2 o. G7 o0 G0 T0 T) k5 ^2 g' H0 t. E8 C1 y8 P, l- _/ o
|
|