|
|
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
& a; `# V/ p' U" b' @% q3 ]/*
6 C- M% ]# c+ K+ E* Check memory range for valid RAM. A simple memory test determines7 k3 N0 U- W6 f
* the actually available RAM size between addresses `base' and, r% \5 n6 E' p$ K
* `base + maxsize'.5 V7 _! N! C7 L8 K
*/
$ u3 T- v) O0 @/ Blong get_ram_size(long *base, long maxsize)+ I( r! m5 b6 y& v( I
{5 [- O1 @4 {4 R9 }& I# j Q
volatile long *addr;5 Q& Q# I: ]+ W# i: P1 H
long save[32];$ I/ J0 [& l: ^" q) v" q
long cnt;
8 v, {& b% W9 H" S/ }+ z. U# W long val;
! f/ X0 v7 F+ |" O9 d long size;+ n; i* ~2 T* D9 Y
int i = 0;) e* w; P" d# G T
" s2 K0 R; I& |: {2 ?2 _0 q: c for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
6 E8 ?' w W+ y" i" i addr = base + cnt; /* pointer arith! */+ V h# o6 o# Q b. Q2 s
sync ();
' V; `# ?5 R1 | save[i++] = *addr;5 ?8 m8 X* G$ `& Z+ ]* J( m
sync ();
* `3 ]* d6 M2 H* Z *addr = ~cnt;$ b5 T O7 W3 x2 I. p/ x4 e
}
, f. z0 y9 h8 S+ l; K" E( u. @3 v$ o' v& v6 ^5 v) ] V
addr = base;$ [4 w, I7 D' X
sync ();
7 x! ^8 X3 f. a( F4 _ save = *addr;
- ?8 \6 j3 T5 a7 _ sync ();. g$ m* v' {% n( ?! N
*addr = 0;6 e3 v' O/ D- h0 P
; H' f/ Q. x) ?! y
sync ();
; _) e7 |) b; n if ((val = *addr) != 0) {
/ X7 K, C& b* c$ j. u /* Restore the original data before leaving the function.
5 |7 y e, d( S) i3 h R: N1 r, n */8 \+ U. N+ s( ^- r2 k$ U- x; X3 ^
sync ();; s: T/ J4 v9 R. O9 K9 u
*addr = save;
* J& V8 q* z( n4 u for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
7 t! } T& v5 i4 [& g4 } addr = base + cnt;
3 v0 D: ?: ~$ s* ~ sync ();% Y/ \5 r- C" z# z0 y
*addr = save[--i];
6 A* R( O4 i% |1 y- } }
' h7 g+ V, {# q/ s4 C% W return (0);
+ m% X, o/ ~ i1 q7 B0 P* a0 z. d }& V7 v- r, O7 q0 \
0 p4 b1 D+ I: w' F4 T1 I for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {6 @0 z. K5 {/ o' J& W7 B
addr = base + cnt; /* pointer arith! */
0 O- _; q( s5 K- w6 P, B& D val = *addr;0 S. u( \: d* k4 c- ~9 r6 L
*addr = save[--i];' i: M( B/ d: P0 j
if (val != ~cnt) {
9 n8 ^9 p4 N+ n1 W8 M, h7 `' x size = cnt * sizeof (long);2 d% r4 f k* l# c6 {) v
/* Restore the original data before leaving the function.9 o; e3 z! ]4 G! @# v. P
*/
. u- s% p7 ?$ {9 {6 P! q8 u for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {0 v% V! g8 V, f. Y
addr = base + cnt;
+ c+ q" }: f3 m0 O. t( v *addr = save[--i];$ E4 s" ^: n. x0 f% s, X
}4 M: K' F1 x7 f7 r) C
return (size);' }, ^' [, M0 n3 c2 A5 h
}
. O( \- `! K+ X, j6 }; Q: y }+ E: ~: x" W) ?: [% ^: s0 W
4 `( Z/ U# W9 E! a! k( X7 K return (maxsize);
8 `! G# U& V# i! d& t}
2 [) W+ t/ S- I/ c- Oint dram_init(void)2 p) _ h! G4 c) W2 V( m
{
8 Z) B ^- v% f7 v& v /* dram_init must store complete ramsize in gd->ram_size */
7 T" [! k, b# c; q0 H gd->ram_size = get_ram_size(1 u4 x; ~$ b! d# B! r9 n; N- \8 R
(void *)CONFIG_SYS_SDRAM_BASE,% B; K4 q' Z' V9 ]
CONFIG_MAX_RAM_BANK_SIZE);
) Q3 _/ Q( a: y1 S1 X+ z7 W9 g* R return 0;
7 I: G6 g. S$ E; U% |}
& W5 J8 D3 [9 U- r2 g( R2 `+ l$ X2 _7 c+ s8 J. N; Q( w( l$ R2 [
3 L) R5 q, `) p4 I# `+ _& I6 x( Z+ T% H: A- s
0 t" d: F- r% J1 {- p$ m+ q, K" F6 n( N
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!9 H; R: r+ O; c2 J+ r0 C/ f
8 u; t0 b6 B1 ?, x
8 B# l% ?( i% r1 N7 U
0 [: `" k z% H( w$ v |
|