|
|
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:, r0 N( i) R, w" D7 }
/*0 u% A* S# n+ ]: j" e' G/ ?/ g
* Check memory range for valid RAM. A simple memory test determines
& G; [7 E5 b# k$ W# h5 Y1 Y( d* the actually available RAM size between addresses `base' and
" z6 t. o# v* L1 S$ [7 H( Y# o, V* `base + maxsize'.8 u) G; j) z; M6 n
*/% y0 c0 A" ^$ ~3 @% M& C: f1 y
long get_ram_size(long *base, long maxsize)! d* w& d; ^8 S# _( ?
{
7 h' x1 _# ^$ F2 [+ R& d$ W volatile long *addr;
( G6 c4 @+ a; r( G long save[32];
8 A- V( z$ y. s: | long cnt;' o% {5 {9 o7 U+ H* s |
long val;
: G1 W6 z7 h& I! R( w% K- t/ A long size;: j% q" Z* M& B3 a
int i = 0;
& H1 I8 p1 C4 S3 g, z; ?& a# q2 R$ Z* _0 G6 m5 {% i
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
o. o/ U; a1 n' n( g# l( h addr = base + cnt; /* pointer arith! */, p- |' Q+ d# A; J) h$ u4 p
sync ();
1 q K0 b3 K- ^ \ save[i++] = *addr;
( e; t' a$ P0 Z( y sync ();
6 R( P3 L4 q( P+ v *addr = ~cnt;
; L/ e3 j! b9 F/ Y }
; L9 N3 g" o2 D" W+ Q
0 O* T+ M1 {$ O" z$ I1 B4 Y5 k addr = base;1 U' [2 f! [. X0 X* ]0 Y, k: k
sync ();8 ?) p: s3 M2 C& @
save = *addr;
5 @4 b7 O+ i! ~3 j( i8 p0 q sync ();2 ~9 x% n |* r
*addr = 0;
2 ~& v2 r1 K6 P; [$ n: _$ C, Q& s. A) Q5 P
sync ();% C& U8 _' \8 D% S
if ((val = *addr) != 0) {
' \: v* o" o% \0 }8 j0 ? /* Restore the original data before leaving the function.
3 ^4 T5 `, m" _. F3 Z */# ^9 c+ w, T& S9 [8 s. n
sync ();
7 {1 g1 n: `4 q *addr = save;$ f8 u% Q# m2 ?" l
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {3 o- _/ c' s: s, v1 Q" F \
addr = base + cnt;4 u+ j; b0 B* @5 k9 y+ f
sync (); Q* {/ r8 c( k1 H& D. k8 F! K. ]
*addr = save[--i];4 \. ~" R' [) ]( k s3 G. p
}- ?5 c, S/ M" A+ U2 R1 ~( e
return (0);+ }: j( A! g* n) v1 k5 c. `
}
* o4 K1 c6 U. h1 _, U& V4 K) q2 d/ v/ O; P1 ]
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
1 P( V& x( d/ x" g addr = base + cnt; /* pointer arith! */. O, g3 G2 L, A2 I+ M- k9 u
val = *addr;' X2 p6 ?) V' K7 Y1 F
*addr = save[--i];8 `4 d# H% [1 s; r, Z+ E
if (val != ~cnt) {
6 q5 z: Z2 G% `8 }7 ]5 G* W size = cnt * sizeof (long);0 V/ u8 C- O( R& z0 S) \
/* Restore the original data before leaving the function.
4 B3 Y5 \% Y& T o7 O */
& z6 X0 V9 e; c3 v! W for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {5 h; z( N0 a7 ^9 \# n1 Z% V/ }
addr = base + cnt;: K4 D" |* M, \
*addr = save[--i];
1 q# Y: U7 {3 [) L" V/ }. c }# n" _& r$ Z& Y( @2 h& N8 k
return (size);2 t+ ]' z) ?1 H& S, Z/ b6 Q
}
1 ~# p( q9 A! ] }( b2 f) A9 T j9 L
! U& r) u+ f. w. \ return (maxsize);
. J2 I% Q% K& v! I}
) `" ]! |1 P+ x' W2 b: Z) Rint dram_init(void)
# O" i( R2 q0 p# ]{+ L5 U% X* T, h5 s e3 ^
/* dram_init must store complete ramsize in gd->ram_size */
2 ^; ^ U2 u) w9 A; N gd->ram_size = get_ram_size(; F& h m, d1 h% C4 S1 A/ T1 R
(void *)CONFIG_SYS_SDRAM_BASE,0 ~0 H9 |/ D2 j# X6 T
CONFIG_MAX_RAM_BANK_SIZE);% O% k& p# ^9 u5 F% m6 h3 P0 S+ R( {( T) a
return 0;0 Y y p) Z+ Q6 l
}6 I* s4 ?) n" ^" m( R0 f- p
~4 e8 R1 c% r' \ R6 i" P. G w% f7 e, L% O! Q1 C
; s& P0 Z* r5 b4 ` b
) N3 w( t# \3 r. A( `# {FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!! R& m6 y( S0 }9 e7 M' |
! y6 z* l9 s0 G# w' s
4 ]& p+ {$ N/ i* E% C
7 d6 @4 ?" k8 J3 U3 I5 w0 k |
|