) g3 }, g- u- S- z! c作者: 2532609929 时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:; A/ T/ u7 T% i! G* z
/* 0 \: I8 w2 R/ `6 x- E" ?. E9 ^* Check memory range for valid RAM. A simple memory test determines& m+ r( z% K" }
* the actually available RAM size between addresses `base' and, h7 {9 k- H9 r! K7 ^+ ~4 E
* `base + maxsize'.0 s; d. F, n: y. [2 T7 J
*/ # C* z/ b: N" u* m3 J% ]( _9 H9 Hlong get_ram_size(long *base, long maxsize)) D4 q# p% N4 E4 U% l. y$ ?" D
{' Z( I+ f! l6 g; W% x+ n
volatile long *addr; / G* N3 r" ~/ G$ {& z! g5 m. w: B; Y long save[32]; 3 r+ J- ^& G7 R/ S& R' k$ K5 f long cnt; " m. [ k5 V$ A long val;+ F2 u2 T0 y h5 }( ]; S' l
long size;) i! d8 X; Y& _) |$ z( U4 ]$ G" d
int i = 0; 4 T4 [/ l, u1 ^! c: p# w& ~: g6 o! Q o; b! B
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) { / M, u- w6 a0 l' f addr = base + cnt; /* pointer arith! */! F2 J% C8 e# a" f2 Y$ j
sync (); & o* l- `' t$ N. ~4 O8 g8 ` save[i++] = *addr; ( c: M) Q$ h5 d: g8 j sync (); : O" k# u: [# O! W, d *addr = ~cnt;1 i/ i+ p8 _& @& k; L& [- d* z
}- g+ g& L4 h. E, @. P
2 M. Y, v( p4 ]" V S0 t; j
addr = base; ! A$ Z- B' c, k: w9 `4 u, p sync ();. R! n. B0 ] u! {2 Q! y' U+ x
save = *addr; / W" g/ T. W, r- D7 i4 s sync ();7 g$ {. Y: s+ G
*addr = 0; ) X O; K/ ^* o/ o% z' P) f( g& }0 N5 N$ N; v$ S5 N+ v* r
sync (); - K) s1 C6 }. t' o/ a if ((val = *addr) != 0) { , Z O+ I' h% k /* Restore the original data before leaving the function. # g; G' ` U! j2 L7 o2 a( r9 E S */ . j$ i* F& k* x: ~, g sync ();9 f! i4 l$ q% e7 `
*addr = save;9 ]( d' d* }+ a7 W
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) { ; r9 t2 W- H/ z: A* }3 W addr = base + cnt; M9 B, K' u9 l$ @ sync (); ' L0 q( l8 N Z& _" z* G *addr = save[--i];; I: a* H8 ]% R/ z8 I
}6 j2 G" N0 d$ v: `' ~, w
return (0);" c6 q& o$ e' A: T8 m
}# l% X9 D2 `/ o" B( f- o
+ e& Y! L, M) \+ u1 V; u9 X for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) { # P" Y: Z9 U5 c) s8 G. P addr = base + cnt; /* pointer arith! */ 5 k; V, y3 N$ @ val = *addr; 9 R$ e" b+ r: ^5 P1 p c7 \$ ? *addr = save[--i]; % N( i" r9 |1 ]' k8 r7 P if (val != ~cnt) {: v1 U3 o+ ~ {! ^* z
size = cnt * sizeof (long); : e7 `3 f7 A( @- c3 \ /* Restore the original data before leaving the function. * x* K6 d+ s9 }) m' N3 e */# O( o9 ]3 B5 z5 e: E2 N" o0 ~
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) { % ^/ d) Z: n8 V8 v; u addr = base + cnt; 8 q5 b) t4 `% i j( m- F *addr = save[--i];) h" b- W, b& a# `- \
}' u m$ j4 N4 D. u/ T1 s
return (size); : N0 y& [* V2 }/ t$ ~0 m } }. B w0 x% _5 r/ B2 H }5 w- c% ^( l* q
6 _& a' y: m2 E0 {: c7 P; L: N9 ~4 q
return (maxsize);3 G$ B0 z5 v" [3 J) \5 r) K
}3 N8 r7 _5 N: a, | m. z
int dram_init(void) j) `* \: v' B9 a{ . G2 v' Z5 r6 ?) q5 e( E2 x /* dram_init must store complete ramsize in gd->ram_size */ & X( l8 Y* H2 z+ l gd->ram_size = get_ram_size( ; w$ h& I& h' `' s( X& L (void *)CONFIG_SYS_SDRAM_BASE,+ m( o8 X9 ? e4 t. h
CONFIG_MAX_RAM_BANK_SIZE);: \3 v! s6 E9 k3 i( h
return 0;* d8 }7 @ ], q7 c* L
}; z; R, d" ^" T0 L" S1 W
% I k) m) o- C5 b% v 9 c2 Y* |. X% V3 ]' w. A8 D# i) _% `! @: N: n& o D! M
" j* z1 B3 _5 W0 i+ P o
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!7 {8 _$ Z; f9 B
P% n4 O; v' p9 z