|
|
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:. U. k1 w, ~# S4 z$ _ y }
/*
# k& @+ ?4 o6 b; Q: P. T* Check memory range for valid RAM. A simple memory test determines
- l1 `, ?7 q2 Y4 T* the actually available RAM size between addresses `base' and
) v7 O! S: d1 v* `base + maxsize'.# j# s( h ^% A$ D# R, B4 u
*/
( Z/ m4 X- W1 `- S% m: k0 Y* a! ]3 nlong get_ram_size(long *base, long maxsize)
# |. D! e3 M. C7 N8 M{
" E: Q, f; W2 p" D7 R1 l8 C volatile long *addr;9 r- g3 k+ T8 ` X% e
long save[32];
. \$ D: f# c. R2 d- m long cnt;+ z5 j; T) P1 Q% S* j9 J; l8 W9 }
long val;
; j ]+ g" }: u$ m long size;
- x/ L8 i4 S( l V& L: {9 R int i = 0;' G; d2 ^( n! N4 e V
& A3 e( R( Q2 m: s6 l for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {% b _3 D. E! c- K* t. Q
addr = base + cnt; /* pointer arith! */
) U8 `. K) w/ W5 t' \& y' f- F, m sync ();
$ n8 r1 N* u% A5 @6 W$ P) _ save[i++] = *addr;
# q) F6 t- z& @; w8 K; N sync ();
5 Y/ m5 H* b1 l/ E4 ?9 ^% e *addr = ~cnt;
! E: K+ D" I/ E& f4 @) l }5 c% ^! B% y4 k H/ j# w
$ U9 k& n9 n/ u! K+ D) g addr = base;
8 a' D6 E" j. F g! k+ d. k sync ();
+ H0 h( s) A8 g; ]+ @- m7 {: z( T save = *addr;# h* F/ E E+ ~) e3 I& n/ [
sync ();
0 T/ Z+ J# o8 p/ k- M: q) } *addr = 0;
2 r7 @& m ~$ X0 `
" i5 J. y9 u' m3 c( R) R0 g6 V) Q sync ();! i5 b/ j* x; b
if ((val = *addr) != 0) {8 A! n3 w* w' {$ K; ~3 |: w" x
/* Restore the original data before leaving the function.
4 ~6 G; x( E, [3 Z; g; l. k0 A */
' N- d0 h4 J- }# z1 i5 @% _- ? sync ();" S, V* c% U& ]9 k
*addr = save;0 |' u. e" C/ L# l
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {& ~! N |+ @$ A* L2 b# t
addr = base + cnt;
4 W- P+ w% K+ r: B$ M4 k8 ] sync ();# a8 S3 R% X B1 Z# _4 s
*addr = save[--i];
/ f8 H7 f6 ? _0 P }
! ?, s# M: n' W! {' l return (0);3 Q q% u& V3 c% Q) x) u. O5 J( C
}
9 l2 C" F/ h W# m
9 v( j8 \& u. F7 S! w$ p, T for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {$ ^. N8 J" B# C+ d7 c1 d
addr = base + cnt; /* pointer arith! */
) g, b5 ]7 Z( f' D0 H" n! ^ val = *addr;: W- R' D! `( o# Z$ A
*addr = save[--i];) Z7 l( G" D# W. C/ R/ Y
if (val != ~cnt) {
3 y; F8 f6 \+ n" a* R1 [( y size = cnt * sizeof (long);" a/ G9 P1 G& @2 b" E7 F
/* Restore the original data before leaving the function.
. u4 A) R s3 _ G7 T* G B */
; [8 G% j8 d p1 ]. { for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
$ \3 b/ R; X/ u* A. R! H! \2 [ addr = base + cnt;
0 s( z- `6 o. \3 k( p' a/ n *addr = save[--i];; k6 o) h+ n$ R; t
}& B( h0 c: `; s- Q
return (size);
+ U4 j5 A0 t* p Z }
- x0 A3 z( A. f- S* @ }
2 \& R$ w q% D! a0 o1 { p( z+ y+ X4 F1 z2 T1 ?$ U4 A
return (maxsize);
i. `( p8 ?: R- G; O}
% q& w9 E! E, r" G/ zint dram_init(void)
1 O$ ?7 Y5 q( `( |# E* o8 \{0 \# d3 k) k; R+ @2 O
/* dram_init must store complete ramsize in gd->ram_size */
4 A$ G0 V5 Z4 y( u1 ~+ o gd->ram_size = get_ram_size(% M" D) T! ^. h
(void *)CONFIG_SYS_SDRAM_BASE,; h1 E- H4 P: j3 F, q) `
CONFIG_MAX_RAM_BANK_SIZE);
3 X& D8 g, G; c% t- t# | return 0;' e' A/ z+ f* ?) s/ Q
}) ?" w8 d9 }8 m$ d/ S
# j2 j% s2 {) O4 i" f2 _
) l, W9 p' l0 C- Y) A( O8 k% X4 k. G! n
* L; P1 G% M$ B( mFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
" z6 w# B0 K! A! y" d, T2 d
: Q; p5 s' B% _. z/ `8 a6 ]+ x2 b9 B& ]0 S( v: |0 |1 X
! A9 F, ?7 w0 d! x8 C |
|