|
|
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:) t1 G2 z. t0 L- {% k0 f' B d
/*
$ \1 Q% {1 U5 Y2 b; r/ I* Check memory range for valid RAM. A simple memory test determines4 U+ v9 g/ }+ S9 |9 N6 {* b
* the actually available RAM size between addresses `base' and
" G1 Z( J: d! j/ d6 f: V* `base + maxsize'.3 H! ]/ w* ], n, L# {: V
*/) L5 F1 p) u% u0 p: p& }4 a
long get_ram_size(long *base, long maxsize)
6 B. a# f0 C" e: v{
# ]+ _ Z. g# z- R: w volatile long *addr;( b: r, h/ y( x: T6 W. p6 Y" ]
long save[32];
; h+ e) ^$ j' o Z; h# N8 r long cnt;
* H" j" X- X8 E0 B* D2 f, E% V long val;$ v, V8 H2 u/ S
long size;6 f! x6 S% b: k1 x2 b5 r2 _
int i = 0;
* K7 O/ P4 k! x( H h v5 s+ p. e3 m0 K0 @6 i
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {" K9 f1 V' j, n% L/ W5 `1 L
addr = base + cnt; /* pointer arith! */" ^% X4 z1 ]' S8 I5 z4 z
sync ();
9 C% ^# j9 Q0 L" v4 t6 l save[i++] = *addr;7 I+ @# Q$ _( W- P' {
sync ();4 z/ w, l9 F* J. d7 g' ?
*addr = ~cnt;2 b/ {) R$ b4 E) Z/ K1 Y$ D1 U
}1 j4 m' M1 U0 v9 ?
$ }3 L' b& O6 e! l W# x addr = base;
, {1 l$ \! m7 p. _, U sync ();
! s( g$ K4 t7 i' }1 { Q$ c8 y save = *addr;
" C' ?9 ~6 o3 Z/ E sync ();
y' l9 J4 H5 s% I9 n9 P4 B4 A) e *addr = 0;7 f2 c+ y% M& Q5 G) O2 k7 m$ H
7 ]- \) T+ D* a& ^9 d5 u/ d# y sync ();, V( Q- ?3 }( a. t
if ((val = *addr) != 0) {' _8 g8 s6 V- w3 Y7 j- m
/* Restore the original data before leaving the function.
' F: o) C5 l9 X9 S) M */
/ B" ~7 Y- N% v, W sync ();* G! D. F T- a* a0 Z( F
*addr = save;+ N4 D( j# H% K t! u$ c! O/ \5 B6 D5 L
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
0 m$ G5 l/ |/ d4 ? addr = base + cnt;
) [$ X" K. J* u4 g" _, M6 D( R; [ sync ();
3 t# p6 m- j# g$ k% R *addr = save[--i]; ?5 d6 x W. J C9 `" d3 T7 H ]
}+ b: q8 }9 r J' K6 C8 w$ U
return (0);
- V! `9 y9 Y% j- S8 n0 J }
# F4 o3 E& Y. b1 W% P" {
4 r- X' z( B, c# A for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) { ~2 f/ G% k* z" T% N. y
addr = base + cnt; /* pointer arith! */
; O2 }# x+ E7 s" B7 M0 h! ~ val = *addr;
. ~% O( y& W# Q* v *addr = save[--i];
- C6 _& y5 y7 e if (val != ~cnt) {; J, z+ K4 s8 O! a" R9 I" ?
size = cnt * sizeof (long);" V, ^' {! m. c. a
/* Restore the original data before leaving the function.+ y1 p) d- `- v- K' ^- o
*/+ p1 @9 v2 J- F3 T( ~
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {/ j, K9 N, Y+ j8 k( G3 u: W( d
addr = base + cnt;! W' I4 g# C& x& }9 f
*addr = save[--i];
: x5 |0 H+ r5 F- J6 a$ |# Z/ [1 ]/ B+ r } X& A" r8 Y+ S9 @* Z# g& }
return (size);
1 q3 W" I7 D5 m* C" K7 ^7 H( h& [ }; ]- h v2 v8 m/ X
}8 {' y, K4 P. `" l* n4 B
: C% r' ~8 w, M5 J
return (maxsize);' Z% |7 X, l; W+ y) R9 S6 ]# l
}
* C7 G" p3 {$ Q' R: I9 Uint dram_init(void)
& D% |: ~+ p( x5 e8 _* r" @{5 k7 ~- }7 Z# f
/* dram_init must store complete ramsize in gd->ram_size */
3 ~: \0 W+ ]% S3 p gd->ram_size = get_ram_size(" i* i! Y- E$ h5 f
(void *)CONFIG_SYS_SDRAM_BASE,
+ }9 p$ a d5 L* ] H( r CONFIG_MAX_RAM_BANK_SIZE);4 V/ L z* F& K; J' p( s
return 0;$ D% D, U& E7 `* C
}
0 W6 T2 z; k3 J
: W/ x U1 x d: O8 ]
O# C# F! p6 }3 I7 O- F# N# a4 r! [" S# l+ A' Y
6 {1 i4 X- h& c* c& H
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
; e5 N7 E7 o( z( l' P0 i: ~$ _
( ^9 [+ d; A! K2 N! B/ s8 z* W8 O: ?
$ ]5 Y5 m7 m5 d$ k+ H6 b H |
|