|
|
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
8 i0 n; b, k: f3 B& o/*, c. S8 D1 ^. e
* Check memory range for valid RAM. A simple memory test determines) v. P$ l) |* H) m$ P/ _7 ~
* the actually available RAM size between addresses `base' and
+ J% h% Y- p% k* `base + maxsize'.* t5 C$ D) @3 T( P" T
*/
4 E w* f+ Z/ O! [, [3 e" }long get_ram_size(long *base, long maxsize)
+ P- G% k1 |7 O1 _* _6 b% {$ v{$ s1 p4 L8 k+ [% f$ b
volatile long *addr;
1 A; ^3 z( H$ B long save[32];) |6 G% y: x/ A u; U) m$ q
long cnt;+ v7 r! t( n, z/ _. c. F9 @
long val;# w6 `8 B9 Z5 s- D3 W4 I# J
long size; \+ n, S/ Q3 w$ p0 D8 d7 Q3 _
int i = 0;0 e* w7 \# L! L z0 f
) o x& W: }# _2 x for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
7 ` g+ k$ H, [( l addr = base + cnt; /* pointer arith! */
- [/ A! ]6 x. m' E5 }' [, u sync ();
8 P. M* o& L, W$ d save[i++] = *addr;+ f( k0 a+ A8 @% P6 k* ~
sync ();2 A# h: ]3 [; G$ |) |2 S
*addr = ~cnt;5 g2 Q) ?& _; q0 b# Y
}9 @+ y( J2 @6 I" b
+ U C- k# O! A: O2 L
addr = base;
6 ~2 i5 P+ R1 `. w. ^4 V( W sync ();
9 n- b( {% G! V6 b5 P) V save = *addr;
# ^5 z9 \9 L# Y$ z sync ();
N& d5 [9 A, X9 i0 Y6 i. }$ e *addr = 0;- K# p8 |$ |+ |* H5 H( P
8 M( x i9 i! O1 h sync ();
$ y6 g4 k/ Y$ N* N2 s8 ? if ((val = *addr) != 0) {( [+ Z" u8 x9 ?+ E6 D( U
/* Restore the original data before leaving the function.
) ^6 }; ]! }2 l1 W# u */
( i! K5 O0 ^: f' S" Y9 }3 S( T sync ();
, T5 C* ]1 o0 w0 k7 W o *addr = save;$ h# ~$ h/ ~+ U* O
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {8 y9 G' H( |$ _) c
addr = base + cnt;
+ h7 G6 X @$ Y9 F3 x* ^ sync ();
! i6 J4 N+ V! b7 ]6 g8 | *addr = save[--i];
" K* ~! ^$ x: P1 m" W9 b }
2 L8 D% D0 v. o return (0);
( T* C# K1 j5 @7 B2 s! D% w }4 E; _# t% _: b6 s a
% Y, G: X4 q; A, c for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {0 ?+ x! }* H' T3 |& n# b4 r9 t! q) _/ Y
addr = base + cnt; /* pointer arith! */4 o; ]4 c. U, R, |0 a( i$ M m) M
val = *addr;- L" `- h6 ~/ U' O k, M
*addr = save[--i];4 `; ?( l* Q# q# a0 y0 m
if (val != ~cnt) {
/ l# H9 z& V7 [4 O6 M size = cnt * sizeof (long);
6 l5 M `! W8 L% [ `. ~8 [ /* Restore the original data before leaving the function.9 @! F" H% S( F$ s. |7 w& Q
*/
/ w' d' x& z+ x' Q1 _' ^- f for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
3 B6 Y& I8 {2 w) G f) }% b5 m( l6 p addr = base + cnt;
! r5 k7 `) ?" P2 t *addr = save[--i];9 A" e2 Q' P* i8 I
}% z( B) w: @) _' z: J: k4 G7 s
return (size);
- s7 z8 e4 r3 w* s3 {, j! G }
4 R+ K+ v3 D8 g$ ~( D- R0 U3 e }6 z ]+ z7 X( A
- d" l3 r% b' u; g. Q
return (maxsize);# j0 p6 z3 G; i* s8 c! L1 N
}- ]$ W- q+ {' v# C# j4 v$ d2 U- a v
int dram_init(void)2 K, l' e8 Y1 j" s
{
4 s! b+ U( `4 _- w1 r /* dram_init must store complete ramsize in gd->ram_size */) _3 Z+ X! Q9 X E% m
gd->ram_size = get_ram_size(
/ V& N" g |9 b# K( Q F+ ^ (void *)CONFIG_SYS_SDRAM_BASE,% ~/ ]* u% T6 R0 B
CONFIG_MAX_RAM_BANK_SIZE);
2 b" w) E g6 B! N& W. c* i& V4 A- n return 0;
6 p7 L, T, H" L9 b: |}
4 @% Z4 {4 Y& F# g0 b* L; s4 [8 J6 Z& M: Q( d8 Q3 x7 T) W7 A
6 i: a8 @5 q7 n
: p/ C0 J J! G0 C! C# _$ P* ]8 N
' u5 \9 A! ~: s6 Y$ A) r9 F3 A- p# ?FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
0 S; W R) u5 x/ z# Q( u/ Y" v- T( V% m6 `, S
! t. g3 g( R6 @# N
+ V$ i: }* L n* v! v6 x |
|