|
|
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
7 V- x0 H4 w j5 J |& W/*
6 V+ P8 R0 f, s" |* K* Check memory range for valid RAM. A simple memory test determines, ]% e2 X0 p* _0 S0 p0 s2 i' |
* the actually available RAM size between addresses `base' and
$ d0 g: f' \8 d: Y. ?) L5 Q* `base + maxsize'.
7 I* s! E. u, T*/5 s" i% s% D& p
long get_ram_size(long *base, long maxsize)
) m; W6 G0 y t0 {# `8 |' T. e{+ p: |8 E% b4 z* w) U
volatile long *addr; z# q1 ^0 L I4 m) C. O7 l
long save[32];
" Q' k4 q; v5 l9 H long cnt;
# J- z2 |2 ]" |0 y long val;
5 \% J. C. f" g' i: m long size;
2 S. b5 u: \9 U, ?; j int i = 0;7 Q4 U z% p1 \9 M2 l1 ]
8 V; B6 O& O% r+ {/ j
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
g+ b+ S( C' E addr = base + cnt; /* pointer arith! */, i/ B* Y- s6 J$ `+ }, W3 V
sync ();0 z$ [9 s) Y' o# N9 d" b( l6 a
save[i++] = *addr;" P2 e2 @7 |& M1 _ ?
sync ();' G4 _! X1 {" r# j4 R/ D" }
*addr = ~cnt;
6 {- D% u* O5 _ }
: j, p. @8 }$ M. t) U
" _7 Y" g6 p5 j$ Z addr = base;
6 q i8 h& G/ v1 c& B; h6 P sync ();
' F9 t7 x' b5 a& o* N) }5 D D save = *addr;
F' j; T, w" C/ c' ? sync ();) K; ? V: _# I o
*addr = 0;
% }% _ X3 e: U* x( Z, t
) L2 b, x! z: J L sync ();$ g5 S% }* K$ @2 W5 w9 I4 I3 M
if ((val = *addr) != 0) {, A$ k- Y3 _* F; n. ]
/* Restore the original data before leaving the function./ `9 O. W( g" n. K+ o# Y- Y* `* Z
*/
1 s7 r4 n0 I4 \9 u) F sync ();2 `) R" ?, m, @7 y/ K3 Y, R
*addr = save;
8 Q' ~# q0 e& t: ^9 N2 z' [ for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
1 C2 k/ R; ?: j1 W addr = base + cnt;
% ^& e: I# V) w6 `! p9 N. W& X sync ();6 K6 v" l& J0 Q. R- q
*addr = save[--i];) }. s; E/ X5 x
}
4 T3 p& k- i ?6 r J return (0); g6 Y" r9 A6 H8 t+ G% d
}& ]) A, M5 x$ t) m' _
% \8 ~( Q- G5 s2 e2 O5 D for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
& q8 y4 x% d) H& a% w0 n addr = base + cnt; /* pointer arith! */
3 U" p+ y t% a0 a. s2 M* j- \ val = *addr;
# K9 w& Q% R. D5 {) l3 C *addr = save[--i];
7 C+ z/ I- c* h! v if (val != ~cnt) {! R; O$ c! y- u% E: Q! Z
size = cnt * sizeof (long);
* A* I4 D( v/ S8 o: _% @+ g /* Restore the original data before leaving the function.
0 r8 ~5 i/ e. G6 o* M% k- z) h */
. m3 p) m v s# D" g& N for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
4 e3 g' H4 E) h addr = base + cnt;6 r" e% [1 `. l/ A* d
*addr = save[--i];! v0 s( k* i) B( U; t, c' h# z, ?
} Y0 Y; W7 F: x3 R: A
return (size);. v( ]! I, D. F2 L: g0 I
}0 [, E5 G4 d# z2 k( j4 E, A7 N5 d
}
" Q" u4 C/ p4 ~3 L
, ^. l& G4 G; p! V, {+ x/ L6 r return (maxsize);; V" {; `9 k$ |6 {
}% R: t& l0 Y* @7 N8 j4 R
int dram_init(void), Z- T4 `9 i# X0 C e; D' K
{3 U9 I' P' d7 Y' _
/* dram_init must store complete ramsize in gd->ram_size */
7 q6 G. y0 [( k5 ~ gd->ram_size = get_ram_size(
& K$ _/ {3 }6 s% C S% B- I( c4 _. f+ z (void *)CONFIG_SYS_SDRAM_BASE,) v1 l8 u% w9 Z Z* \
CONFIG_MAX_RAM_BANK_SIZE);; U- w1 t. D8 h7 \6 ~" n
return 0;
3 w. C2 O! W; Q( \4 U}
0 b+ e! o7 S3 B
2 k; o5 J" f: Y6 D5 H# G: H8 V2 ~0 {
/ Z6 L; @" [3 j5 A" ~+ _3 X
4 o( d. p! t1 W& j6 xFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
% |1 M* D6 n1 |; _! y
8 V9 A2 x; C0 {3 f" F7 S
( p) d$ m! g3 W6 Z
9 w2 m) n d) W* S |
|