|
|
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:+ S {- s }: a
/*7 [; r. v! I( O! e0 N& B1 _% k W
* Check memory range for valid RAM. A simple memory test determines9 G# }% u$ d7 d/ t& }( h$ k6 u$ M
* the actually available RAM size between addresses `base' and' a! x& _8 W$ L
* `base + maxsize'." L2 ^, f J$ y0 C& J1 |
*/
' |, e: v# B6 h$ N" v3 H- tlong get_ram_size(long *base, long maxsize)
1 @5 B6 X F5 |5 Y0 O) M+ A, N+ Y* @2 a1 n{6 A. l& N8 I6 m- W4 _1 B+ ~: }
volatile long *addr;% @9 f! x" Q' J8 s* h0 V9 d$ j: r
long save[32];8 {5 ]7 f4 {4 h
long cnt;$ O. H* |( Y, O
long val;, e: A* x7 {6 p# h8 P& e
long size;1 V' P( l* m1 B1 B
int i = 0;
* `4 a1 D5 Y, R. J+ m/ Z* l. p' v7 F8 w9 w! o# ?' G
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
9 T- G7 [: {$ C7 R! }0 s addr = base + cnt; /* pointer arith! */" [9 {; p5 ^9 M. Y
sync ();6 o5 N2 D- Y1 G- L0 S0 S* d
save[i++] = *addr;
% E# ^2 B5 G6 P) q( H, p: @# |, k E sync ();; n U: p) [1 b! T3 i, \
*addr = ~cnt;
4 G" e6 E, J: G+ v9 _+ j }9 Y2 z/ \" ~( e
# k* p- Q+ G' ]9 P9 u8 U9 `. l7 t
addr = base;5 _5 G4 C6 L, q1 ?! ]8 ]2 p
sync ();& K4 c! T, H! |* H q+ M
save = *addr;5 d8 R1 ]$ v: d; E4 r
sync ();
$ ^% x5 _! v: ^ e- H: q% l, v *addr = 0;
7 T* |7 c* M) F2 H3 x K2 s. Q. ?! I1 z- d* v9 {1 ^! l. i
sync ();/ i% \: _% Y; S4 Y' ^8 }
if ((val = *addr) != 0) {
0 |) c+ ^0 h4 a* I/ c' K1 _ /* Restore the original data before leaving the function., Y$ b; q$ T b3 K( K: i9 V
*/
: T, c$ Q' Q% ]) C5 C% O Q sync ();
8 v d( w* `( R: X" P ^ *addr = save;
; q8 T' e7 I8 `; `/ ]) n for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {, V$ p k6 R' B7 f) E! R8 e
addr = base + cnt;9 J$ O" K2 E; q* f5 t2 c0 W
sync ();
3 r! H; Z4 t0 I# M& B9 L *addr = save[--i];# |, c- X6 C% y# T5 d. A" ?
}& y% I' M8 d/ o+ w0 U! H
return (0);/ x- `3 j7 \, s* L8 y8 n6 Y" C
}1 k9 {9 s5 O2 b
& ?1 t& T7 S( d% I4 n4 U+ f# u for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
9 H& Y3 H, c+ F; P addr = base + cnt; /* pointer arith! */
3 J0 t9 L- w& N% N val = *addr;
: f S- I/ D, z- R *addr = save[--i];
3 E1 c8 s$ {% c0 T- d. I% u if (val != ~cnt) {
3 A$ g6 J4 H* K5 f1 X: z size = cnt * sizeof (long);, w$ `% s* A; ~/ a
/* Restore the original data before leaving the function.+ o( J/ w$ Z- F4 t5 e- s6 E
*/0 i$ h7 P& Y. j8 \) I
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
3 K+ i0 M3 s$ Y8 _- x, J addr = base + cnt;7 M N. w$ s" g5 p& B: ]
*addr = save[--i];
( ?0 W% D5 h4 N6 k2 M! T' Y( q }3 P2 I+ @% p' g6 m% Q9 V
return (size);
4 ^: o6 [" x6 ? }( R8 c8 x4 b! W2 G
}' P3 o6 ?8 Q0 K, } \& B4 |
1 \+ I. g+ J, {1 \. m% ] S! j return (maxsize);
3 O1 m( B" ]! d$ L9 r}
# S4 P8 ^0 K% K' u3 X0 K- o! kint dram_init(void)$ S/ h, U3 _+ U( i% a# `
{6 U: U r5 z8 g, W7 {6 |- X; N
/* dram_init must store complete ramsize in gd->ram_size */
, ]1 X/ n4 V1 x& p ]! c, T gd->ram_size = get_ram_size(
! P7 F" x$ l$ o. o/ S7 a; I (void *)CONFIG_SYS_SDRAM_BASE,
7 f( j! a' o1 J( H3 S CONFIG_MAX_RAM_BANK_SIZE);6 h4 m+ D: V* {
return 0;
( a# Q9 ^. {1 J% U8 N}
8 O5 |* A. k5 M0 U( |
) g7 ^2 [6 [( y: D+ e& b7 l. ^8 b' h6 O
, t) Y$ P; W; r8 E7 l+ H8 r6 \3 a) |% q# w$ B9 {" u7 p
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
6 O8 s! G$ g. U! P: T9 f
: i3 J8 @. \7 Y: S6 f5 A+ S* G( u
( K( F7 N+ @# W+ V0 t% `
g5 ]0 Y9 S7 B/ U/ b2 X& j |
|