|
|
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:1 \0 b; n) i1 ^- y. D; y
/*
6 g0 |5 H! _0 K7 C* Check memory range for valid RAM. A simple memory test determines# \% \) S; o, h
* the actually available RAM size between addresses `base' and
4 N- m8 [1 |2 F' `, u* `base + maxsize'.
* K7 f8 b, V7 Z# w& E*/
& k7 G$ L2 M1 x# v4 j7 U# hlong get_ram_size(long *base, long maxsize)" h1 Y; s, Z1 ~7 k
{
5 i. K0 `3 _- n; d& U3 J volatile long *addr;7 O" k8 I7 w0 }4 ?: d. T( i) Z6 v
long save[32];
3 ]" V7 ]7 W0 s" h' _2 V( t3 C long cnt;! t L! t% ~% ^$ `
long val;' L4 _7 `$ b& L( d$ A% H
long size;
: H5 S! |! f4 A) w0 ?, U1 a int i = 0;
3 `( X; T1 g3 Q" e; p u' C+ F9 Q
- |1 N$ f/ r/ x5 Z. ] for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
" ?. l) z5 f" { C addr = base + cnt; /* pointer arith! */3 M0 U' j4 E$ ?) x8 s+ b+ r
sync ();$ V$ Z5 k" l2 Z6 m' r( k2 G- l
save[i++] = *addr;0 k8 A" h& ]9 ^+ S/ h1 n
sync (); U A$ N+ d7 h) ?0 R6 k% V6 v
*addr = ~cnt;- x% Z4 S3 {1 P2 G( n5 p
}0 K) O, o% E: d! ]: k8 C+ A
) I( b* V, F' | U+ y4 A5 n4 l addr = base;
7 o% ~4 l* ^* e: _8 w: P sync ();9 p. H, F7 d' u
save = *addr; ^. _, i' V4 v* z# _/ }: g7 V
sync ();
9 F) M6 `+ z) X5 ]- o/ F8 ^ *addr = 0;
) I3 h+ E" ?6 y
$ T1 _( e) G ? sync ();% c8 N: Z) S. _$ s1 R% @
if ((val = *addr) != 0) {" H& \" F5 C& p' J5 W9 Q
/* Restore the original data before leaving the function.! @/ w: J% d; x/ L! E/ |4 R
*/) e1 h/ \: G) e5 b9 C
sync ();
. |7 g! l2 {/ s% l* ]8 E+ Y *addr = save;* B4 n# |4 X+ j8 D. _
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
9 Q0 N& a* S+ T' ` c& r! g& a addr = base + cnt;, l; i9 d3 V- Q; Q0 Z, J1 u
sync ();7 S) x' ^! M( F2 _. m- u5 v( D+ ?* @) t
*addr = save[--i];
+ K/ ^. x" o8 `- }. ~- S6 o }
/ j+ [8 a' r* M E) v2 p6 W( d return (0);' l$ m. f( C: |* o! n# a
}
4 ~% R1 B" u6 F% e3 z6 R8 k6 P3 w$ X* }2 ~- {
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {2 v. V' G e5 G( D; H' v
addr = base + cnt; /* pointer arith! */3 T1 V2 g, g7 ^5 {
val = *addr;
5 q) n3 j5 i6 o7 t3 Y8 E% Q *addr = save[--i];0 p, { N/ @( l: ^
if (val != ~cnt) {
8 \6 q/ D% ~# }+ X' p% R# w c1 B size = cnt * sizeof (long);
d. i2 |' O4 x- z8 F$ e /* Restore the original data before leaving the function.
% K/ T1 }# k0 ]- j7 ?8 j% K6 S */- K/ J1 |6 J% Z6 K0 F. N
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {$ @- q/ K8 r8 {
addr = base + cnt;
: N; w) K, C& M1 r; l6 g *addr = save[--i];
) K0 b, E" \7 A( z8 i* [& { }. ^- d6 b. `! H; _
return (size);
3 Z$ {7 n" J; l6 U }
! f3 c# y, j* t( f: M }
* T+ o$ P- [* i9 G$ o4 ?. X: A/ {% X2 |! }- p3 d% s* \3 G
return (maxsize);
* E8 E/ S7 V0 D}
. v5 O' r7 V5 q: }4 Iint dram_init(void)
) Q. C2 o6 L3 p. L" | p; c{
9 q; T; a; N% ] /* dram_init must store complete ramsize in gd->ram_size */) Q& m2 k+ g1 n- x- P9 B" ]
gd->ram_size = get_ram_size(2 r! q. P! F0 s
(void *)CONFIG_SYS_SDRAM_BASE,
! v& t* z- x( ^( B CONFIG_MAX_RAM_BANK_SIZE);* j+ @; c& n& O/ \
return 0;+ b6 Z* c7 x& M2 G
}
& l" i$ I8 T! z7 a+ Y* T3 O6 |) u; _8 z) j
) u* \' f1 u* O9 n% ~0 L9 g! c$ i! c& g& ]2 x# }7 o
$ T" e. y5 a" D& n$ w" dFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
' J. g: l* m4 y; [
9 [( g1 J4 p+ h6 r! y O$ g, f/ ]4 _, p. ^4 D3 I
+ Q8 L/ E" T* Y1 j$ G$ G3 L1 W" J |
|