|
|
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:5 S. z+ Z9 i% U6 q, x
/*
2 c8 B. `, E! h; n/ `. c* Check memory range for valid RAM. A simple memory test determines" T0 b: f. I: _8 l/ f4 v" K8 V
* the actually available RAM size between addresses `base' and- J- L, _5 Y) r* g
* `base + maxsize'.! Y2 \& {! G# v s
*/8 ^% v! M9 L, H: I% N7 o
long get_ram_size(long *base, long maxsize) S- m% j" O0 Z! Y# E+ [. u$ }" i
{! r* q, H$ @/ A
volatile long *addr;$ T# W; X2 i3 ?/ S# j
long save[32];
4 p: j( G+ B* B( U- y+ V9 E long cnt; p) P% d: N. s; c3 P( z& n r! Q- N
long val;0 o* x7 ^' P; F, {
long size;$ g* L! {$ t5 f: F" i) `2 w
int i = 0;" u4 N' K) h) O' e) C
9 D: @) a- ]) c2 v) t2 S" u; x o
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
[3 B" m3 I+ s% N/ l _ addr = base + cnt; /* pointer arith! */$ E. K2 J5 G7 }9 X- `) ~- a8 ~1 G
sync ();# d' z3 }: M+ b' k! d8 o( v& q
save[i++] = *addr;
5 ~: D7 ]9 ^. r" K sync ();
. W7 M& x s! B# l$ h2 B& V `# [ *addr = ~cnt;# v( N& H5 e. p$ O+ X
}4 L6 f, T; V' F# R( B
- t3 j6 x9 F) O; ^ addr = base;, b7 i% E/ E0 b) H7 @% T
sync ();
! ^ D( R" K2 i; D6 }1 ? save = *addr;
, `$ d1 T( [8 m$ ?+ |9 p sync ();2 E# G1 L4 z. g9 k9 \ f* g
*addr = 0;
; @3 h8 \2 U. U! G0 |6 i! u2 p6 B! n$ [9 t+ a. Y H
sync (); S, t: R' C# A. E8 }# E7 s$ t0 b1 ]
if ((val = *addr) != 0) {% @% T0 t* ] e u6 l2 {! q
/* Restore the original data before leaving the function.
# s2 \% V6 `4 ~8 o2 `& W5 ? */; U9 W0 P, ]; l* f& F- P
sync ();2 L5 z) O) P5 P L# j# Q. p
*addr = save;+ F% T V1 q. a% b* h% @1 w
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {8 ?+ D1 n9 X1 S7 M
addr = base + cnt;3 Q4 m8 V5 U* G1 z
sync ();
# k9 e" S7 }& S: r P2 q *addr = save[--i];) \8 \1 i9 D! z4 O
}
4 z: R/ H( n/ v5 m/ g2 W( R: Q/ s9 g return (0);
0 P. D# _7 t8 P$ T( V c; z0 m( H3 N. ?' b3 d }
' h% i$ l5 E: g. M
0 d& Z- d+ a9 x2 p8 c for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
7 N3 ?% e. h, ]* [5 x, k addr = base + cnt; /* pointer arith! */
$ i8 @# z; f8 F; C val = *addr;, Q$ E6 M3 L0 B+ J
*addr = save[--i];- g1 B* E5 Q R' `# h+ `1 U, u$ _
if (val != ~cnt) {
5 r2 F' ?! _3 y: Q& ` size = cnt * sizeof (long);& }3 i! T9 o: x
/* Restore the original data before leaving the function.
/ F" k' b2 ~( A$ E */
9 M8 ~. ^1 w% F0 c; E for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
; |5 n8 Q6 `. ? addr = base + cnt;
0 _0 d! B& m6 t2 W9 T7 q *addr = save[--i];
: [" N3 ?) [- k- ~$ x }( E0 ^; ]; Z) W- _' J) R
return (size);" x) D- J$ E5 @9 W) R
}+ \% m7 E5 g/ P% w
}
. G! @; G$ V- W. M- p% E {, n; y
( b$ G9 z+ F* t4 ~ q return (maxsize);
' G# @# K" p! d7 h8 g0 p5 T: P}
+ H' x3 `5 C' I4 f' n. O( ^int dram_init(void)
! i M; {4 u9 X4 y. N4 N{' J7 K( h4 T1 h" ]' {6 P% ?7 c
/* dram_init must store complete ramsize in gd->ram_size */
p# I: x7 Y0 f) @2 z+ C gd->ram_size = get_ram_size(
* l7 H; {) o+ u) P (void *)CONFIG_SYS_SDRAM_BASE,
3 V0 H# W, q+ x) O2 `, i8 |8 l. m CONFIG_MAX_RAM_BANK_SIZE);
+ \, n1 ^2 t3 J4 w& @ return 0;
) m0 T$ Z: M8 L" Z2 ?4 ?) x" H}
( F, N5 S0 Q8 W' h7 I
2 {% i0 c0 S* A# Q$ O' ]$ t2 b" t! \" \* O: s! u* a0 r
2 R9 u4 {) u4 b G: d' K) S" L. n2 b0 a% n! S/ R9 t
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!! \: y9 z: s, A( u! B( D
; x! e: t4 `0 m! p$ z
# L. p5 _( e/ s( P7 B ], |8 _0 z* ~4 b4 ^- u: b& h" u6 r
|
|