|
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
0 l6 w/ t2 R) D# Q. T( R, B M# S/*
2 w: C- A5 _5 \5 Q9 e' @* Check memory range for valid RAM. A simple memory test determines
4 q, g2 p6 f! M. s0 M- Y4 Y* the actually available RAM size between addresses `base' and
( P( c. F# a7 z" S2 a* `base + maxsize'.
7 t9 ?- K3 g( }& e*/
; \1 ^! h7 k& Z! n% P. r& G: llong get_ram_size(long *base, long maxsize)
6 k$ k q4 s W{1 J2 S& A. o/ Q, Q T# d
volatile long *addr;) W* I( i0 C6 }% P
long save[32];
v2 O2 N+ I1 p$ j" m# ^0 k long cnt;
! K! W7 v7 M. C0 X+ O s3 }- ^ long val;
% X+ K c$ W6 h; l2 v! W' M3 E$ H long size;
) T8 k4 [* Z. O# _ _, z' A int i = 0;
, i0 t8 W% W1 R" e f! q7 |+ o
- ~2 e5 @" M3 m7 c5 ?2 G( G/ ` for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
) w, t3 w& S, y( O( I" | addr = base + cnt; /* pointer arith! */. r3 Y' x3 ]2 d2 s" t9 i
sync ();: A3 y. a* }: }9 H+ D
save[i++] = *addr;4 H* P5 Z' O8 }5 |" e7 g# ~
sync ();8 Z' X% E1 R3 p4 }7 Q' r
*addr = ~cnt;; y! t4 S K& t) U* r+ a' G
}
8 r! T1 B% t/ S4 N9 `
5 P& w4 ~" B3 P( j6 l c) Y/ d addr = base;
, D# _# |3 l+ W* y. g; t sync ();" ?! Q- Y- v$ L1 k; t
save = *addr;9 b- z7 X7 u4 F6 A1 l
sync ();
- }0 j2 \& ^+ W1 H *addr = 0;0 B6 g E A3 D! y# Z# p
6 k. [2 h+ o; X8 e4 n' x
sync ();: M' L& T. }5 X, Q
if ((val = *addr) != 0) {
( `+ o1 K) M5 ]; ]; O# C /* Restore the original data before leaving the function.
7 `- l+ d9 G/ x. x */
) Z' {" y& O9 s, E# ]. ` sync ();
: ]# P* V3 M) H" e& l" b *addr = save;1 L0 H. a$ |0 } R! }
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
8 R0 ^- q" ^# B0 ~! D# V) G addr = base + cnt;
+ A) |& X f0 ]+ m5 o0 t J4 X sync ();
5 e+ I. C4 b, y" F# \ *addr = save[--i];
2 k( D3 Z3 ~) Z% L6 P/ ]$ i+ p2 G }4 {' e7 c; I1 F5 y, K
return (0);; C9 U# F$ @4 \6 ]$ B8 B1 h% @) c
}
3 I% N6 @4 f" r$ R& Q' ?
$ x4 Z$ h1 I) q: E7 p for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
0 a6 `9 d* m( \ addr = base + cnt; /* pointer arith! */) ]# Z ] p' ~- H, Q$ x% }) {
val = *addr;6 V) s1 d; T9 p, r7 w
*addr = save[--i];$ z/ ?: Z8 X' ^
if (val != ~cnt) {
( Q. q0 p/ ~9 e d+ Q size = cnt * sizeof (long);
( B2 |( J/ ]& X1 i4 l& ~7 m /* Restore the original data before leaving the function.6 G* Q3 K& h5 V0 }: H
*/
) M/ {8 `3 x1 m7 v3 Y4 \( Y% c for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
1 I+ d2 }+ I2 _$ z0 c addr = base + cnt;
* C4 N. P o- k$ b *addr = save[--i];
' A8 k( h7 V; p, K- E }. \+ m, U2 H4 V
return (size);
/ |" h# q" k8 r2 N( o4 O b }
0 O( r' \ k) h; \& V: ~ }, r3 ?2 Q. B4 d; P6 W/ @( |4 R
3 J, t# b: o/ w! R5 A* V
return (maxsize);3 H/ K4 X" J* V$ D" e6 N, c1 J
}) n3 W! m. |. r$ m# u
int dram_init(void)- j2 D* }* a; h" b
{
9 h- ?6 f$ ^) B* v) X /* dram_init must store complete ramsize in gd->ram_size */" M- ?* I& a3 V9 R: j2 _
gd->ram_size = get_ram_size(& F6 g4 k$ J( i" `' T0 N3 _% V( h
(void *)CONFIG_SYS_SDRAM_BASE,; b) ~7 k4 l1 t# ?) G
CONFIG_MAX_RAM_BANK_SIZE);9 O4 D5 @* `& d* u
return 0;
. @2 U5 D5 v* u1 M4 E, ^}
! h; q e$ A* @# Z7 J
" A; c, d- R" b' V8 R- t; v& C
" Y7 \ X3 _3 U- P: `, x0 k
$ S, ]) p' P4 h J- B/ W0 UFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助! x: w/ t2 Z, K8 Q) E
8 a5 Q0 d9 w3 }: x0 L0 _; g
9 F: f: _3 t6 E0 ]
: H' ~, t6 H; V6 g& V5 T7 {- ] |
|