|
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
7 y: I* @& y: d' |( p: R/*
) s1 k. R6 T4 N( r6 l1 ?+ ~) p/ t* Check memory range for valid RAM. A simple memory test determines0 G' x0 \! ~* y4 u0 e& R; ]
* the actually available RAM size between addresses `base' and& o$ K8 z& x/ l0 G; G' D
* `base + maxsize'.7 p' c7 ~$ T( O) ~0 b! L$ W
*/ H6 R% [1 n/ p) Y( m+ e9 K6 l
long get_ram_size(long *base, long maxsize)# u' ?' T: \1 r% {4 r7 F9 `1 V2 a" E8 U
{
( c. O" N8 P2 k, I volatile long *addr;: N) J8 g+ I2 k% r
long save[32];5 ^' g( @: X# |2 B% e+ k- X
long cnt;) e# ~6 @6 I* f4 T, f- u
long val;9 A% i9 k$ H p% b0 A b
long size;
5 m, `% O7 E3 U' m5 x$ v int i = 0;
, e. @, n( n2 Z/ @5 I$ a- j- Y
( _& U" l+ m0 A for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {4 ^- i3 x( x) c, `
addr = base + cnt; /* pointer arith! */4 O! M$ Q* C: }3 W& f
sync ();
& ?5 ^8 g: Q+ `: y; c1 Z save[i++] = *addr;
2 D# @* d; J/ b- J+ l6 i0 q8 `4 E sync ();0 B' r5 V! R ^# t8 h4 y
*addr = ~cnt;; m! [& `% y! l
}' D0 c( ^& m/ ? d* x
' }2 Y# n, t6 y! }6 \$ M- w
addr = base; L: O9 G: f+ r
sync ();
% z0 j" h X* G5 D9 \/ v save = *addr;/ }; \4 _9 _ `6 I. r0 H- c& i
sync ();
6 L* \2 I' T( ]4 A( Q% X *addr = 0;
0 K3 \. M* D" K& S: Q
+ E% ~3 u B1 c! q, G% L0 k" H8 B# l' Q sync ();3 _# s( R1 @1 t5 y3 k- l. _
if ((val = *addr) != 0) {
& U3 h6 Y5 F+ B- z /* Restore the original data before leaving the function.' |; ?" d2 l( [
*/; u- z. p3 A1 V5 B
sync ();! X; B3 {! c+ H% L: j1 n& g; C
*addr = save;
: Y- [3 s' E. b6 U for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {' r6 N6 W/ j5 H6 x. D+ W8 {. B$ Z
addr = base + cnt;
; w$ S0 Y* k H/ b) ] sync ();/ F7 s% d1 n& i3 \
*addr = save[--i];# T6 P' ]# U, K. p/ I0 X: J& \
}/ `. i3 o8 r v% o& g0 M. M
return (0);( D5 x4 z! a4 W4 b% a) g
}
( i8 W9 C. n# O' H, p$ ]
: t! k0 @& E9 L, M9 ^, r/ R! M' b for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
$ }( z) B( i9 T! ^4 c; r* m addr = base + cnt; /* pointer arith! */% F/ x2 J i: d! _! Y; T9 q
val = *addr;% Y$ i9 t8 b9 Z: E) r! Q
*addr = save[--i];; ]5 Q: K7 h! |" x, t1 r
if (val != ~cnt) {
$ A/ k+ m' f& t, W) u; c: C9 L size = cnt * sizeof (long);
' X4 u% X& f- M2 M* f) q9 ? a& Q /* Restore the original data before leaving the function.4 Q/ x: |8 o3 g: u
*/. w: D& O1 i1 `
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
$ ^% \4 ^# e0 `) d addr = base + cnt;
6 e J; H: ^ Y0 Q$ r *addr = save[--i];! M9 t B( W+ i* U7 m0 @. P1 N+ V
}$ Z: R8 }! W! n, r# q! j
return (size);7 k# A: f" b. m
}
d' f& X( L S }
, B( t" E7 {! V0 U/ K) `. A+ m6 J3 f% B
return (maxsize);) Q& h& L1 [5 ~0 Y
}
: V5 q0 n* p( z7 @int dram_init(void)
* p8 E# [# o$ s, p# o; R2 \( {{$ N. R8 P* p4 Y7 v* }
/* dram_init must store complete ramsize in gd->ram_size */4 w7 b0 Q" E5 o& s
gd->ram_size = get_ram_size(
. W$ }8 s4 ?3 g/ j (void *)CONFIG_SYS_SDRAM_BASE,. U( X: z, J' V) @, x
CONFIG_MAX_RAM_BANK_SIZE);
6 a G+ {, m" V& e. W return 0;
/ V$ |/ _# k) I: P' S( p3 l k}7 u: | K3 M& ?6 W% u+ D" f& W
; t8 S# E0 M, q, c: L% Y: s8 d! R8 y5 k
* Y/ M9 f+ G! Z
+ w/ s- J3 A3 K- P. M) [. b4 K5 j) V
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!* W9 N1 o; D/ C; h
3 s$ ^( i# v4 M) \& w/ `( U+ R0 s: V0 ]$ z
- s. w$ [. @0 Q! x4 n |
|