|
|
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
0 `' v I% ~0 w/** m. @- Q! k0 t- U ?. V8 j$ ~
* Check memory range for valid RAM. A simple memory test determines) t, r) }. H% c9 r/ `1 s
* the actually available RAM size between addresses `base' and
% z1 u' ~% X& _# Z2 q. {* `base + maxsize'.
2 A$ A( D$ Z) Q# F4 [1 `3 E*/
# X' E* O7 [% q& W7 X! R5 q' m" klong get_ram_size(long *base, long maxsize)3 ^9 \! b3 a8 h7 A8 i; Z
{' m. l/ F# ^6 ~4 p# b, }+ ^
volatile long *addr;
& n& s- I/ P) i; N long save[32];9 q4 U \8 w) h* {+ W5 {
long cnt;
% r2 P( n% s# x, |) J long val;8 m& d) q$ {5 c! Q
long size;
4 m6 E" y+ [1 G) j, ` int i = 0;
( _; ]6 e8 z1 f: m/ F2 Q9 ], S
. @' ^" d. x6 a& J0 N, u, V for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
2 v! P! t% Y$ J2 G$ u addr = base + cnt; /* pointer arith! */
; V+ s7 k; Z# ]2 ]) s: ` sync ();
( q+ R* F8 r0 B+ c& [; B$ [ save[i++] = *addr;
$ i$ K$ V2 q( m2 Z" S$ ~8 z4 u sync ();) X8 @: @ Z/ n
*addr = ~cnt;
" A0 D6 A7 l1 N: q* q }
+ k9 B7 k5 H' y5 I7 c: e$ c" X& r3 f0 Q" G
addr = base;
9 z7 `' y; a: [" _9 ?& P/ y$ S' X sync ();& C4 [7 }+ |) ^2 Y
save = *addr;# E% Q7 y2 f6 s( Z0 l5 A- ~) x
sync ();
8 l& I/ D* L R& J. G *addr = 0;
+ G- g* l1 d( C' L+ g* i9 H3 q1 q% d3 j7 ^/ D5 r8 {, ~
sync ();5 O" E t; c7 L
if ((val = *addr) != 0) {
/ j: x# D7 R9 T; z; a4 u4 L /* Restore the original data before leaving the function.
4 l5 x# t1 l2 L7 b% Y7 P6 Y7 G- V */
8 `# s3 K' U8 a: o% J- ]6 c sync ();
6 g4 v& V4 u) N ] o *addr = save;
4 n9 X6 z; E: X% o3 v for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
) b3 E* c" g# q& w7 \0 C+ P addr = base + cnt;
( u) R$ ]: S1 k- o* A' Y' ^) f+ ? sync ();
9 V" h- Z: c8 x- c& s- C$ ^ *addr = save[--i];% J+ H/ u: b; k
}; |: c! B9 G6 y: V5 S3 v5 f; Q
return (0);4 @5 \& i( F" C. B/ f8 W
}
9 s3 v# F% W+ p/ K$ i3 {6 b. v- P2 R- h8 B! Z H
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {$ L; M4 N' \- I3 B* ?
addr = base + cnt; /* pointer arith! */
: F% H4 b f, f4 ^; _ val = *addr;
- J7 z( P- g a) J *addr = save[--i];
" M: b" G2 I8 R( ` if (val != ~cnt) {
$ ?/ H1 x5 _$ \& ~1 _ size = cnt * sizeof (long);
, @ g: T6 C! u/ | /* Restore the original data before leaving the function.
3 w7 p5 }8 C$ p" g# x0 V, v */
3 J: S3 F; ~ h2 s S: s) \ for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {+ q4 W; M1 Y0 T' H- z
addr = base + cnt;
/ k# g+ V5 B0 k& I% I- q *addr = save[--i];
$ Z. v' Q2 M* N: o0 }. G) [$ M }# v6 G- H1 B( v1 g) u; W& Q
return (size);
" r; b- k) L- J& \8 L }5 A- r& |& i, P4 ^/ P
}
0 t7 \3 D M! v6 F/ Q7 A6 E9 |5 j
return (maxsize);
/ s6 g" Z6 Q v& D}; d4 \" P) V9 I5 e3 x& }+ g
int dram_init(void)
. C8 \( C* p9 r5 T, o8 y{/ [& o3 k" P2 \6 K( N! k8 D
/* dram_init must store complete ramsize in gd->ram_size */) v/ n8 I6 ?: `3 u1 q1 c% s6 |% F2 i
gd->ram_size = get_ram_size(
2 C5 O+ E( j7 L, X0 R& _# Z (void *)CONFIG_SYS_SDRAM_BASE,
2 N+ z. t$ A2 W' l9 b& C CONFIG_MAX_RAM_BANK_SIZE);
6 w/ x9 C& @5 p" t, y return 0;
( d( Q1 ?7 m- C- ^: M5 V}
" a6 L& X Q6 E. ?
6 O5 n0 C9 Y! [1 [3 l# R
l$ E% l4 w1 R0 p6 X. U
6 ]7 e5 F' N; A
0 s1 q: t! D9 D2 a" e. i$ ]FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!% ^' y1 { a0 e2 j5 g
* {0 c! g* ~! l5 O* [9 y: w1 f! e
( q `; k. K. q) d4 e( A7 g
6 J! s- t5 R2 }# t" N
|
|