|
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
0 N7 E9 |" L: j- y3 r# z/*7 {3 C/ I7 i# P3 [ q
* Check memory range for valid RAM. A simple memory test determines
5 |' ]: I# I9 Z( z9 ^* the actually available RAM size between addresses `base' and
4 K. H; b3 b8 {* \& T5 r) n* `base + maxsize'.: u1 F' |+ e% C; r( z8 m0 p
*/9 \ y9 M" Y: p
long get_ram_size(long *base, long maxsize)8 b. Z! w2 o, [. u! @# q. o
{
/ g, ?% ] n2 w/ V8 k volatile long *addr;( n( b9 Y1 v/ E! X/ H5 ^
long save[32];7 \3 B: ?" n: d; c: h! P! `! F
long cnt;5 u3 }7 Z6 l" o5 i& D$ K$ Y5 q3 K
long val;$ H3 Z4 j ~! D; n, z. ]2 B
long size;
3 ]/ x' j! n7 N P/ p int i = 0;7 a! x/ L/ B0 C" I: m
* W& O; w5 u1 p+ E& f$ n8 b
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {- B" w, R+ m. ~& z3 B0 J
addr = base + cnt; /* pointer arith! */
+ l2 b: Y! d8 j sync ();8 g# q2 y0 n2 o
save[i++] = *addr;
4 L6 B; {. ~/ V1 y7 N& s. E) V) x sync ();
# b& `+ i, `( @( A *addr = ~cnt;
+ K4 w: Y1 Z# }# l2 ^, ` }. B# D$ U, N+ j; J! D- O( y
: J d' A4 y- ?1 N$ t addr = base;
" [' V0 E% ^) n8 n3 j( I sync ();
0 \; b, J' k7 Y9 b. Z9 l- W save = *addr;- _4 D! S, ~ ]$ I4 l
sync ();' y( M( t5 T F4 n
*addr = 0;8 l$ J3 W) K( o$ l1 m. s/ h6 K( C
- v$ u' Q. Z1 a: j, q) a
sync ();0 O. X3 y& Q9 I. y- r
if ((val = *addr) != 0) {
! @7 V$ m% u5 w& B3 d/ a7 u: N /* Restore the original data before leaving the function.( c& {3 x% V1 W$ d! ]& v
*/
9 C( X5 X/ y) x5 p$ p: t5 p4 h5 I sync ();& ~% B8 R; o8 ?
*addr = save;! q* {8 h( |8 l7 M* f/ }
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {9 A2 K" r% z" d- Q" P% p
addr = base + cnt;
3 {. y" ^6 M' W# X% ?. C, m, b sync ();
7 I: A0 S( ^( G0 e) d! C' f *addr = save[--i];
+ I$ w# @ r, R7 z } O+ B y* C0 N( {
return (0);8 L6 U' N* D; |6 y, D& K
}
4 S0 B" V/ S8 ~* N* f# K. h: @( c$ n0 I, J6 _/ a. W! u2 [; i E
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {0 t' K- Y3 p7 u* T; b1 X2 C
addr = base + cnt; /* pointer arith! */
8 Z8 Y# u! X: C" t' d0 U7 ]5 @ val = *addr;, ]7 \: H7 E0 l; l7 n3 R
*addr = save[--i];' e0 @( e: w$ J0 G$ d# i3 m! w7 ^
if (val != ~cnt) {% H( {. h+ t( c, M) k& B
size = cnt * sizeof (long);
T, R( ~* v1 W$ g# b) m d /* Restore the original data before leaving the function.
8 G2 z4 v6 u% i; ^/ |8 c */
1 P& k& h0 g% G! X: E- y for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
; C. C) |4 s. d& v. f addr = base + cnt;# [2 Z7 v1 q6 F9 l
*addr = save[--i];5 P: \0 i/ I1 j3 e$ v! z
}
8 B4 }* U/ @6 Q) ?+ a return (size);7 ?1 d( P' V7 ?0 h4 S( o
}1 R, W& D6 x0 C
}8 L, B% k( C0 y/ Y) n. Y) c# r; a
2 e0 p+ J! d. y. S9 Z return (maxsize);
5 @8 K& g8 x- u z. P% B}
' O1 q8 Y/ l) u, T& fint dram_init(void)2 o, t0 k/ Y+ {% N8 Q
{2 u C3 X" `; @, i
/* dram_init must store complete ramsize in gd->ram_size */2 E% ~ K: i0 t$ B
gd->ram_size = get_ram_size(
: f& r2 I/ q1 i5 s (void *)CONFIG_SYS_SDRAM_BASE,: Z1 g, \1 U( Z7 [! W5 M; [
CONFIG_MAX_RAM_BANK_SIZE);
1 b4 M4 q9 _. q% O return 0;- ^/ p+ \5 `" k( R. g
}! p# v( {, E$ l1 d6 d
' V3 k0 o2 ~& e. I! g/ \' M
8 l5 A7 W% r- q" T7 R
: x3 j1 J1 M9 M( O7 R; u5 q# b
4 E! y: j; \+ y- Y, q7 b$ DFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!6 `/ ~- }' E2 h) O# O: i. ?+ Q
, V. j2 i( m& ]
- v, P) `9 {" N: {7 ~; ]( P
5 n9 ?; }, r* r2 }& c |
|