|
|
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:& q1 A4 e" {, \: Q" V
/*
: i4 A) Q. ^/ I+ H4 l* Check memory range for valid RAM. A simple memory test determines
E" ] u/ V% T* the actually available RAM size between addresses `base' and
8 J) A9 A" y' e) L$ [" A* `base + maxsize'.
$ W* G, z; K& k$ R5 n% B! I# H*/
' Y% @& R* ^8 M1 S* {4 x4 along get_ram_size(long *base, long maxsize)
6 `. f" _ Z0 o{
2 F- t% f, o, u: }3 \# g volatile long *addr;
. D& p( Q; A4 f' F& @3 S long save[32];
4 v% I C5 Z( @: j: N2 a long cnt;% a6 W4 H% q2 H; z; F8 c
long val;
' x2 {. S& r- [' L long size;" m% ?) Y" [. k* R% `4 t
int i = 0;/ x$ z- i2 m1 ^+ O5 }) R$ x# |" e
- d, e, a9 f4 H) P0 K
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
& {4 { t/ z7 ~7 D# a/ p$ H" w addr = base + cnt; /* pointer arith! */4 D1 q& S2 S' Q Q* J& n
sync ();
' J& Q0 L$ h# w/ d" i) U2 i save[i++] = *addr;9 ~; b, {& M% ]# A0 ?
sync ();
8 E! p R7 Y; c0 ? `, |: w *addr = ~cnt;
- \/ b1 ^1 {! P3 T& X1 A7 L; E' I }
3 e7 p* m2 i' ?2 g* Q* l m+ g$ B) M A/ u
addr = base;
$ G5 C) P$ s# k m sync ();
# M4 E! K3 U$ m5 s save = *addr;# i+ h& {- K# \, |; H4 W
sync ();
) t: K8 \- {1 `- Z' R0 Z+ X/ H *addr = 0;
) S) U8 k; ?; @9 J
1 Q9 }# c3 V" p sync ();
' y# Q4 \. B8 q% o: V4 \ if ((val = *addr) != 0) {
' }( n& X) \$ C' w7 V6 z( j( b /* Restore the original data before leaving the function.
; h: d6 T2 Z: E9 f, X* W */
% Q) |8 ^: ?! e2 ]- l sync ();; g' ?- N; i0 G k5 ~- @ A
*addr = save;6 i- d# H4 |/ O+ m _
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) { p+ L; \, x( ? g* t/ z
addr = base + cnt;! h& W ]$ A3 \6 U/ P) }. i/ d9 ]
sync ();' n8 [/ f3 U2 ]1 I3 f) A2 c
*addr = save[--i];
! u8 ~* A/ r0 x, m- h6 Z( f. N0 @5 [ }
, z$ v4 W. A8 r8 h/ g) F. _( \ D return (0);, R9 h `% _$ h" m% c! d( ^+ s
}! c% Q" K, I Q/ {( ~. B- _
! W, I3 T w$ Y0 ]7 P! I
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {" M P3 S( v2 r
addr = base + cnt; /* pointer arith! *// G# p1 K6 m t
val = *addr;: k/ H+ ?% ?7 i6 o# P1 T6 r6 ~3 Q
*addr = save[--i];
9 I( E7 O; w D4 J$ O if (val != ~cnt) {5 S. g2 o h- v6 J2 X! d
size = cnt * sizeof (long);
4 d$ C8 R- h7 z+ V% W /* Restore the original data before leaving the function.
/ M- F: z" h3 z, }! @' X0 Q */
' j2 Y' c$ s8 L( a4 l! Z6 U for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
* t/ z/ b. G, g$ z g b" [' M3 Q addr = base + cnt;
3 y# g% n) h/ E, f, A& F" u& A *addr = save[--i];
5 p& w0 ], P3 ]* }9 P }' ? T e, p3 R# Y! J4 M0 | A
return (size);% O/ p/ E; ^% P' S" ]9 D/ \9 P
}* P' U8 H5 S6 {% }
}
X. c# O: N6 w0 Y& I/ x8 I2 o6 v- k; M. w! \& t9 m
return (maxsize);
" {5 C* v: l5 |$ W; ^& a7 b}
- f: k1 T9 D1 g! z2 Z1 Aint dram_init(void)
3 S; r4 z1 `* M6 |0 z% ~- R8 V4 Z* _{7 h3 [) p) P3 ^: ^8 }
/* dram_init must store complete ramsize in gd->ram_size */
4 [+ b; ?6 r& l& a gd->ram_size = get_ram_size(% v J7 r% C4 _/ Y* C3 G) k4 N
(void *)CONFIG_SYS_SDRAM_BASE, q' Y3 n" x( d3 m; ], J
CONFIG_MAX_RAM_BANK_SIZE);
6 x* W$ y% n3 t) o# X, v return 0;2 [8 J9 ^" i8 \3 @' _
}1 C8 P8 @1 C1 @. x6 y
7 m# R$ v) t* D# O* G
8 D. c+ _- C/ m) B0 Q+ t- l3 D- F4 \6 G& I/ n: Q/ P/ ]$ R
$ f5 q1 ]& j. K' a; S. `. H4 X6 g
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
* ] q- ]3 n) Q+ d' ]" Q) r5 a, H( y% b6 ~1 o7 s
& }; P+ r6 q$ N# @4 J; i# W# _0 E8 m
; P: S* I* T4 c% M) E0 k" t
|
|