|
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:( |- A0 [* H8 c2 B) Z3 |
/*
. S, N5 X0 k- {9 Z5 M* z* Check memory range for valid RAM. A simple memory test determines% j! u8 x9 W* S! {
* the actually available RAM size between addresses `base' and
6 O# H1 K% J/ [" R" C6 d8 l* `base + maxsize'.
6 ^" `; H, M/ y% u) ^9 F! ^3 B*/0 P; b6 c; d6 b0 q$ L- M* G# ~
long get_ram_size(long *base, long maxsize)/ s9 {$ w" s$ e3 a2 t
{
7 x$ ^ U4 t! L( `* T volatile long *addr;. |1 w5 u6 }' R8 U# S+ L
long save[32];, O- j, J8 s' b% D9 t$ Z3 j5 y3 Y
long cnt;: W0 r- [! z9 v# `( P. |
long val;2 w8 r# u) l2 F0 W6 `
long size;7 l- D' e0 n: ?, b
int i = 0;
1 W; S C. Y$ x& o6 |1 \ P V B2 W) M/ C+ G
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {/ V4 V$ v3 U+ v+ `
addr = base + cnt; /* pointer arith! */" \6 e2 G/ B1 E
sync ();! s& Z3 Y9 O$ f& q5 b2 L
save[i++] = *addr;
* a' J7 o! K, K% ?; { sync ();2 {) B' h) h. x8 I' @
*addr = ~cnt;
X! i! n2 I# Q1 b4 e) y6 G }
7 I2 M6 F: J. H0 n. d4 b8 D
! U8 i( e2 \9 i6 x% J& j addr = base;( H. |( K: d- R+ D& V/ P$ ?' z
sync ();
9 }5 G+ \2 n2 s i$ Y r save = *addr;2 u6 i" P6 @0 E9 Y, y& W
sync ();
5 ?% V, N4 @) t- M, w% U$ _ *addr = 0;! Y& J) ]) s% c% ?% `9 r
& j9 l( T E& g1 [# V0 p, |
sync ();
0 M! s( X2 @6 w! [8 r6 x if ((val = *addr) != 0) {2 w8 T% v3 c7 N$ K) l' R& I3 a9 n5 ^6 w
/* Restore the original data before leaving the function.
/ K5 o; Q4 W- z, R6 {6 {5 F, L */- P' r$ s, p5 ~( L& B0 H
sync ();
0 t7 m; s: C) Q D *addr = save;
) a1 C' z; s5 `0 `4 \ for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {9 |0 u' ~, l, T, P( s) B
addr = base + cnt;
' o. ~" Y& ?6 N/ F sync ();7 K( M9 C& J8 z! {& K: G2 R
*addr = save[--i];
. y) V1 F8 Z7 q; Z- X }! z4 r& G/ N6 Z& A9 t$ ~: ]* x
return (0);9 j+ e$ f" |- X5 F, I7 Q% j
}: ^" N8 e2 V2 O N/ @
& D/ p% R& w6 M+ K
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {# H7 i F$ j2 A- `* U+ t' e) p
addr = base + cnt; /* pointer arith! */
3 k1 x1 R% D5 h' M val = *addr;: J: T0 Q& \$ y( G+ U* l
*addr = save[--i];+ T6 @: H& @( _# \; b# p5 O
if (val != ~cnt) {
/ n; K7 K" M* o4 r6 ]: l size = cnt * sizeof (long);9 _* d. S1 e$ h2 [3 W- N
/* Restore the original data before leaving the function.0 I z. i& j: w4 J$ X
*/& z1 K# J; k: s' x$ v
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {! Z' ^/ J- x6 L6 k) p
addr = base + cnt;
2 [- n& Y2 C# g *addr = save[--i];
- S! ?% j$ m- E, Z" f7 P }
3 k. s; E& I" _# B return (size);
$ }8 Z" b8 ^* G9 n9 E: w }0 F" `' ~% E* W4 _
}2 \6 l" ~$ b1 \8 O
$ A% r5 f4 c% R j return (maxsize);
: [8 l9 ~, @9 h" g& C}
' g8 w0 \ c/ B( Eint dram_init(void)6 C9 S/ P7 s6 r6 k
{5 w( n2 H- D$ A7 P' b
/* dram_init must store complete ramsize in gd->ram_size */' g" ^; A& `; W+ c" ?9 I# f
gd->ram_size = get_ram_size(0 ^' v8 J+ O, L' G
(void *)CONFIG_SYS_SDRAM_BASE,
' z: }- d; {) W, T4 d5 e CONFIG_MAX_RAM_BANK_SIZE);) E; F* S& J! q1 z
return 0;
1 v4 `' h$ o4 N$ i- u W2 f}
. i; Z9 E! J0 C8 O4 C& i0 C* a* ~3 A$ y# v: g
" a$ f' z& d1 d1 i
* W; h8 s& @; g
' M, s! ?0 @, S+ r, l- `
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!; E( X4 \+ t' c# H0 e
1 }, c1 P1 @: x& S
% I8 [1 s( R( B; B7 f4 a" G( O l7 H5 ^, S
|
|