|
|
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:) V: G& H2 g4 V5 |* n
/*; F8 G% r6 s" b9 O
* Check memory range for valid RAM. A simple memory test determines4 B( @. }5 m& {, b1 T
* the actually available RAM size between addresses `base' and
9 I% @# T# \% O4 w/ {8 f4 s( c* `base + maxsize'.
4 _; B& s O6 `0 j1 {*/7 r, Y4 @( _ G3 m
long get_ram_size(long *base, long maxsize)$ d0 ^0 C" H$ Y4 m( c E; z% E; q
{* U" k Z- `# _1 f0 t
volatile long *addr;' c* Y) W! V$ e4 d4 B5 |, a
long save[32];
1 `6 F2 R% N# W, d; d( `2 u) I( [1 C: X long cnt;
% m! S7 |6 f" D! T) k2 q1 C( y long val;6 p& i+ @( y% [% n5 j0 m, b+ N
long size;
8 y) B4 G1 k5 y& e' [0 a2 t int i = 0;
" Q9 k0 f- b* `$ E y6 {0 e
* J1 b$ N7 z, R5 ~8 C+ F8 T for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {' l; W. u) X; E+ }
addr = base + cnt; /* pointer arith! */( M3 S. {. V/ \3 n" q; E
sync ();2 J, m+ P2 u9 e4 `9 \$ Q& g* x
save[i++] = *addr;: J4 P& |0 E' R$ p- s# o! }
sync ();9 T. B) a# @0 k% H" ?; a
*addr = ~cnt;- q) o1 j( z5 q
}% s9 e! V4 | V3 Z
* E# }( B8 V3 w- ` addr = base;* W5 m4 f U+ R
sync ();
: Z! B3 `( M }3 b" z: P1 v6 V save = *addr;- O% D! q5 m b' s B
sync ();) ?' `! ?$ ^# J
*addr = 0;
$ U3 p7 }/ B$ T j; x; e; t# O8 l. R4 G* O
sync ();
2 H! h0 Q" |$ M if ((val = *addr) != 0) {1 r# [# ~- q; k4 g/ v
/* Restore the original data before leaving the function.* Q7 z# ]; h- j' v
*/- P4 e. G! d$ P$ E0 p( @. y6 y
sync ();
+ I' v( R+ ~& s( b' R, Q *addr = save;
6 d$ B4 D+ T7 q- d- ` for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
% ~/ _: j: _& p addr = base + cnt;* F0 U5 o6 s: Z
sync ();
# v4 y& g1 b0 T& l& T2 r *addr = save[--i];
5 Z( N7 S- l9 p7 Z9 }. u: Y; s }
& v2 k9 j3 G1 h0 P8 _8 p" h return (0);
6 ^% I$ P, \ c6 ?2 k; ]& R }
# ]* Q. V" g- U8 V4 F" c2 \) p6 d: T( c% t8 |) w
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
0 ^$ ?3 z! ?0 q# c2 o$ i3 T. b addr = base + cnt; /* pointer arith! */7 }5 P9 W2 g4 m! v
val = *addr;
- e8 A6 J* d' {6 p *addr = save[--i];" m. q5 j2 g, t8 s: O* O9 ^
if (val != ~cnt) {
% T8 |: p2 w2 z( g& p& V; F size = cnt * sizeof (long);) r4 L& s, O1 K/ R4 x* J
/* Restore the original data before leaving the function.7 D3 Z0 P' m# f" X1 b
*/) y! U4 s. x) x: ~/ D
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {2 k* i- B6 `- Y' j" Q0 G( H
addr = base + cnt;: u4 }5 ]7 Z1 k/ y# k
*addr = save[--i];. G1 ` G8 k9 N+ O
}
1 n- D# s3 ~" C5 Y- K: Z- S return (size);2 d% ~: Y' T x; ~% Y0 R
}; y0 `& ~- u$ D% b" c+ X
}& E* Q4 N, w" H E
4 R9 K3 s4 I9 S- S& R( E6 C, |; l return (maxsize);3 }4 ?8 h% ^( [0 J; Q2 Y& L
}* \/ w/ F# h' F# l" q: n
int dram_init(void)
) t( k7 r: e3 ? q! t3 m4 `2 R3 D{
7 w+ y+ v/ l6 f# ~, s /* dram_init must store complete ramsize in gd->ram_size */
, B& F2 s) A1 \5 ~ gd->ram_size = get_ram_size(
, c' a' e. r* f6 }; J; ~+ l+ m (void *)CONFIG_SYS_SDRAM_BASE,2 x! t1 K7 e; j* S7 h
CONFIG_MAX_RAM_BANK_SIZE);, Y: } f* b2 x* ~& G
return 0;
' n3 x/ W& O* Y" g}+ ?2 r' \7 T& z' s K$ \" f5 [) @3 S
& u1 y# O- [. |+ y9 T) m( l/ x* d" j
9 `* @- F, G, x! z& p' Z7 d
) D" o% F% r9 b3 s" v1 w+ \# \5 _- c H( k8 O F- e
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!" p1 b Y6 Z/ v! M- ?$ m) D! L" X
F' A$ R, K) t. i8 m" z) O, o5 q$ y7 ]3 Y8 o
4 D& o6 T$ ?6 x
|
|