/ |+ \7 n5 I% f7 o: |作者: 2532609929 时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下: 9 n2 u) G; [4 ~1 D2 J+ N4 F/*7 e8 I; X) Z ?, e- F- j0 H$ ]
* Check memory range for valid RAM. A simple memory test determines $ `% R* m" B) [4 ` V* the actually available RAM size between addresses `base' and6 Q1 v0 P4 S# V# Z1 i9 T/ Q# U$ v
* `base + maxsize'. - n0 Z1 k- x" v5 s' f*/, j# r( S+ M# h& k
long get_ram_size(long *base, long maxsize) * C' q e* q. k. i# E" ]& i{ 9 A3 r% X/ R; Q& g volatile long *addr; : Y. o! U, N! e& R/ }" q long save[32]; - l# h1 \2 J8 C7 S9 h# ~) _ long cnt; 0 ?" `+ A5 T7 b6 d$ x long val;/ I- {# K4 E$ R+ g" g y
long size; 3 ~ B" C( m$ c1 }7 v int i = 0;& j7 L3 X6 P9 }- ~- t" ~% N( k
9 ^2 p0 J9 u$ |. b8 i
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {. ]- {% ^" I, H' Z; J; ?3 Q# C- u
addr = base + cnt; /* pointer arith! */! |+ J- X; g3 o7 r, X8 A8 g/ _
sync ();: n0 e- Q- X' @% w
save[i++] = *addr;+ ?( B4 I/ S( x6 ]( u% [( P
sync ();5 N5 z6 i" {0 v0 G& Y
*addr = ~cnt;0 j: a, }& F; d1 I1 {' \
}1 S3 [! y9 ?4 `- O }
8 P5 F; Q1 `0 ^ addr = base; ( o9 l2 `. A+ }, O& t3 u sync (); & U! z; C1 n1 ]) f0 Y save = *addr; % h$ C: d0 \2 ~5 d Q- k+ U% [ sync (); 0 L$ q$ h& x4 d4 h2 ~: r *addr = 0; 1 }2 o5 c8 d! Z, \ 3 Q4 y+ p1 l. y' b0 N; ] sync ();: Q# C8 L6 o- h% s- g7 B
if ((val = *addr) != 0) {- k8 z: x0 C8 ]
/* Restore the original data before leaving the function. 2 v: {8 g% j" C1 ?, h" t0 m4 @8 ` */1 U1 g% C2 B. o0 u/ a7 b" p
sync (); " x- Q1 q9 \6 r, K *addr = save;( t0 N; y0 @ E2 n; n* O O
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {- D- u& |* h* M# u! d( v% b' B
addr = base + cnt; ( H8 l9 S+ E2 l) e! d$ d% k9 ? sync ();* _# |& t' v$ A- G
*addr = save[--i];7 B" N+ G" f7 v9 \
} {0 b3 `2 \, u( W
return (0); $ n" r! {* `, W; ?, r/ f+ y' t" U! C }. K; S( L2 Q' g5 }
& i4 }, s C1 s7 h for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) { 8 i- o9 x1 b1 V2 x& m* i addr = base + cnt; /* pointer arith! */ G9 O( c' b* y* s2 E) l
val = *addr; 5 Q7 z8 q+ U( v1 ` *addr = save[--i];0 E6 ]% j! Y- z0 d5 f
if (val != ~cnt) { 2 U$ h& H ~: @: x6 o size = cnt * sizeof (long);- g- O; w" m3 U% [* V7 O
/* Restore the original data before leaving the function. 3 I& B8 l- F% `1 T */ , z+ }( K! z) w8 F8 Z& `* b for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {+ r% K& v- n6 L% I/ C7 M
addr = base + cnt; ) ^/ v; m/ Z% Z0 p5 ?% [. x% Q *addr = save[--i]; I" G' i) ]% f& ^' z% Q
} $ ^+ j! k# ^! W7 x2 G return (size);2 ^% s* _. t* l$ T
}$ q$ S; v/ z- I+ \- r
}( m& K- l9 p3 A4 ]# Z
! ~. ]( Z, M0 f, S! R$ e1 A9 T return (maxsize);% A! j: j s* D: q. Q+ R) T
} & w: w' l; o3 `& d9 G& I9 {int dram_init(void)1 g4 [8 n% G6 x. U/ t1 R* P8 G8 i5 X
{ 1 x9 {6 v0 C ? /* dram_init must store complete ramsize in gd->ram_size */ * X0 ~- } j5 N, I6 G! b' I- ^ gd->ram_size = get_ram_size( & }' C$ X/ p9 z B. u% C. n (void *)CONFIG_SYS_SDRAM_BASE,. n- O2 ]" ?) Z. z0 o9 N+ V) h) u
CONFIG_MAX_RAM_BANK_SIZE); 5 }0 p. k. P) [. V% |& K! ?- ^2 C" C) T return 0;: l+ s4 |3 H5 B7 W9 B
}1 \- }- x ]! b4 y
+ f0 ]/ d o C4 @* ] ! s/ ^2 f; P% I% c4 t3 x6 ]2 C. b6 s& y; D
% A; M' p, N7 B) X
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助! 9 A/ p+ C- g1 q' l9 G' M ' c {4 U ~6 {% ]' |7 n + V2 z2 I5 r' q* T * I7 c- e; I8 c) g6 Z- y& s6 j% H