$ o' x* F9 Q# q* A( R0 i3 d作者: 2532609929 时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:3 i) [3 ]# Z3 I% q7 w$ {
/*1 P! x; r6 F5 @! U/ ~! p4 M4 D
* Check memory range for valid RAM. A simple memory test determines8 u. Y* d$ ?9 V% m: V
* the actually available RAM size between addresses `base' and 5 F; u2 A( ~0 \: ]4 e( `) x) @4 |2 f- V* `base + maxsize'. 8 _7 p2 Q$ ? m: Z4 r! Y7 ]*/ # S! B" Y/ W" O% Q) d4 \/ Q3 along get_ram_size(long *base, long maxsize)' r! O- e; \' o- k! ?
{1 R. _' s) t3 _: R
volatile long *addr; / v* M& u z' y" t/ \ X8 D/ K* W long save[32]; $ }* y! v( W' J3 v long cnt; 3 a+ O4 f& s( \; O) e% R1 O# ?( m- N+ u long val; / a+ X( [( h% A+ V1 J, ]$ F5 [* \& W long size; ! ^$ }. z7 j$ F int i = 0;$ b9 L1 n+ e9 {" z% l. H
5 H; p8 W( u' Z( i" d: |: M
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {9 @, n. d# H; L6 r0 m; Z
addr = base + cnt; /* pointer arith! */ 0 f+ f$ }+ M- c9 z sync (); ( M/ Q+ T4 m7 `: z save[i++] = *addr;5 ]* X d. N. v# t& ]9 H4 T- }# D
sync (); 4 |9 t+ j; y% S5 W' r: L0 S *addr = ~cnt; . ?9 f- U+ p2 B( e% Y; R( Q2 \ } 8 E6 Q+ U, j) g + C+ b3 b* s' w& t1 M8 p$ N5 o addr = base;6 {: j/ H: O7 ]; B$ x
sync ();0 O+ b3 b9 m& {6 w
save = *addr; - J% ?# p' E! |$ L. T/ m6 \0 W sync ();& @/ B, q1 j. z u
*addr = 0; ) a* V; z$ L/ M' @: y $ t9 q' Z* f4 |3 m3 |7 ~8 W, m$ w sync ();/ S7 t, ?- n: k7 h3 U% L! J
if ((val = *addr) != 0) { 0 d6 L+ B/ D' J2 S% v* | /* Restore the original data before leaving the function.. c! G* w7 e! H3 T3 g
*/ 4 N- p: L6 l8 @& m2 ^ sync ();: L/ D, ]! e& t3 {3 V4 S
*addr = save;0 d' W0 d5 i2 U+ s! j
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {/ n8 J8 @& E2 J" g* m2 R! ]5 |# |
addr = base + cnt; $ v6 b; Y( ]$ f1 Z1 E sync ();$ F, W! V7 _ l$ t& a0 r8 c ~6 k; b
*addr = save[--i]; 0 N: @6 d. _. P- C; I }$ a$ g$ }7 s2 }: p! U4 j0 b
return (0); ! n% ~: p9 ]$ O* \) X3 b4 O2 y } - {4 ]- h0 `$ I7 b t" H. d+ `/ g/ J: w) z8 w4 U' S+ t
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {: L/ A Q0 |8 ?0 W/ N) i( [5 O
addr = base + cnt; /* pointer arith! */( T8 e, q9 F7 T3 r; |
val = *addr; , d5 a+ u! Z W) r *addr = save[--i]; 4 _+ o! P1 [7 I1 o if (val != ~cnt) { , E' R! }$ ^% \1 ^ size = cnt * sizeof (long);$ r) _/ B( _1 x% i& [' Y
/* Restore the original data before leaving the function.+ d0 d+ I: Y( O+ |
*/* ?- ~; b+ ]0 W, d( s! W, {
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) { 4 Q! j3 z7 k0 q! G addr = base + cnt; r7 r& p) Z$ \3 q& C* ~
*addr = save[--i]; 2 B G2 C; j, f5 i! Y } - {8 x) @% X& m! H( A; B! p* X return (size); " h6 m L& N9 t3 b9 [5 b } & n& ]3 z" x6 p0 i0 k } : `" T; T, }& U4 F x1 d8 D4 T2 a, H' C6 f return (maxsize); # d; X1 Z! D1 d} ' T) B/ T" }+ ? _# L Fint dram_init(void) 0 s- v. |( M8 |7 `. u) }{ 8 b( w/ V" i6 o* N- s% J4 E /* dram_init must store complete ramsize in gd->ram_size */% D; S4 o5 b2 \7 B" C
gd->ram_size = get_ram_size(, K) o) Y8 Z5 P( I+ E- n
(void *)CONFIG_SYS_SDRAM_BASE, + z& P8 p$ t+ z6 E4 P' o CONFIG_MAX_RAM_BANK_SIZE); " }; Z1 i" A Y return 0; [4 X$ L2 R3 X3 @
}' f) J, H3 _: S
+ |' J; ~4 c. E6 `. {
6 N; R& S0 Q0 k- r 9 Z+ {/ O) h. s. V2 X7 G0 P - P7 E2 Q, t0 S0 E) A G0 A7 bFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助! ; H/ D# I: e. s' s4 L) E1 ^% v: G9 m7 O5 S7 m. x
% @* m; }, x1 l% [" @4 G, T. V3 \' Q 6 Q' m; _/ s! }8 w