|
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:+ c7 W& `' j+ t k# ?
/*( X0 m! _9 X( Y% D" J8 ]
* Check memory range for valid RAM. A simple memory test determines
" T' D" M- m5 W* ^4 _0 i* the actually available RAM size between addresses `base' and% t6 n: O6 i; M, @
* `base + maxsize'.
) J4 Z1 g2 }6 \5 h3 V*/
; ]8 R3 s( D4 Slong get_ram_size(long *base, long maxsize)
4 g- K, x) m+ c1 b I{; N, p- Q4 J6 U( [6 M) v2 H
volatile long *addr;: d$ B: \, E5 g, O9 a
long save[32];0 J8 U% a. ]9 Y5 r2 Z
long cnt;
7 n! x6 v7 c: s& e7 s2 G& a long val;! P$ K; U. _2 z% O" ]7 l. e
long size;
x8 t) }' \: U3 V' W int i = 0;8 h: M2 ^( I+ d! F3 p, N; A
6 C& w) U4 @5 T* m2 S
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
6 g" V7 I- m7 I$ @, G/ S addr = base + cnt; /* pointer arith! */1 d# b" o) c& y9 Z
sync ();
4 b' v" s1 d% j2 V0 }' U save[i++] = *addr;' w6 P" P; y. P% t+ z
sync ();
/ l1 u' H3 I5 [ *addr = ~cnt;$ v! |) [$ x* g( K$ U6 y- E# I+ P A' ?
}
; L5 ]3 o2 A4 Y8 g8 s0 H' P, ^1 ?3 n$ W4 u1 O
addr = base;
6 k/ W! M) D+ `* E( J$ V sync ();0 a. p6 A" G3 f) ~
save = *addr;
% x# @6 a) I0 _6 ] sync ();
9 ^ a$ y5 Z! `! D7 m5 a! C *addr = 0;
0 b; A* E/ t$ x; S8 N0 n# e5 r- |5 X. B! E, ~( A
sync ();8 A- B3 B1 Y; ?# Q, `
if ((val = *addr) != 0) {
) G" x/ @# B$ r1 k$ @$ P /* Restore the original data before leaving the function.) `" {1 o' I2 j" d
*/
& ]& [1 M" ^& u0 Z/ V t sync ();7 o' u, c$ G! r% X* E% d3 G$ {1 x
*addr = save;
1 g& e4 _7 l0 ^1 e for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {9 c0 w! w- P& Z" c5 P
addr = base + cnt;1 u9 ]$ F/ S( x% @7 z6 }
sync ();
u. d: V- `# r& I5 D, \, }. } *addr = save[--i];$ }+ i- p+ D# w: l8 X o$ ]1 ]
}; I; a- x. h& H% w2 O
return (0);; M1 `5 C! j/ e' [- @
}6 {3 ?4 t7 u; P( R% L$ H
2 c x0 k, z% g# o o for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {* ~! K3 N- u3 z% j4 Q* k( {& t# }
addr = base + cnt; /* pointer arith! */
8 D3 {& d. X2 i2 \* E$ i val = *addr;6 J1 `8 X# f, i6 m& ^/ d
*addr = save[--i];
- U- `+ U' q( u7 g if (val != ~cnt) {; ^& J1 s$ \& y0 a" p
size = cnt * sizeof (long);6 y9 R/ |; G2 k, T1 B- h. o/ a+ w
/* Restore the original data before leaving the function.+ O# a& _7 g2 W! k3 D7 {3 T( Y5 C
*/$ m$ L: G. Z. ^
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {, d( L0 n/ A$ `- O9 o& j
addr = base + cnt;3 } r0 N+ Z- k+ ~+ c
*addr = save[--i];0 a: ?+ c+ e2 a5 R# v* f% Z
}2 c$ o1 D3 K; l) e2 Z0 p
return (size);3 j& w* _( \9 Y' e
}
Z" e* u( J, ^: K% Z7 b# | }5 m" W7 i- ?0 W$ T& m
) t3 y6 [+ }) m S9 L% ^: O2 ?
return (maxsize);
5 c3 p7 `, i `: t. l! O}
8 \' o0 @0 P0 e" m8 H& Bint dram_init(void)
9 U" U0 m$ s+ I{
T4 M7 @+ b3 g! k+ Y /* dram_init must store complete ramsize in gd->ram_size */
# n) }7 z% w5 B! }/ W: s. m$ Y4 j gd->ram_size = get_ram_size(
% K, m7 F8 A1 \ K7 {' k0 x$ x8 j (void *)CONFIG_SYS_SDRAM_BASE,
; A" p- C3 j* D: U, E1 L CONFIG_MAX_RAM_BANK_SIZE);" V0 N* W$ w1 ~( r1 {; x% g8 _- |
return 0;1 ]# o! q* _" J% |0 Z
}
7 X' [1 s4 l3 T3 C. ]; S
8 x' O9 o) u* |5 T3 K, _, S) F
1 j" X S0 B/ Z- Q7 M `+ }/ B
& i: g; x- e x- u
) p' m3 v9 e8 a6 F9 ^FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!3 \8 ]5 {( R9 v% K( f3 ]
5 d7 \% n- V% K' }- w/ I7 C' U W# I! U- x
! N0 Q! a; c7 a) y
|
|