|
|
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:& l; i2 j2 i- f' Y- Y1 W9 W
/*$ P% g% w2 x# L+ H" J! A
* Check memory range for valid RAM. A simple memory test determines
& J2 O: R5 h2 D. H* the actually available RAM size between addresses `base' and* V7 x- c( M; V
* `base + maxsize'.- Z" u; S# E; c; c0 x
*/1 v3 f! l: M* a
long get_ram_size(long *base, long maxsize)( [ H4 D% R* F9 E
{' Y9 W$ i: \7 k* U- b& @! d$ f
volatile long *addr;! j7 H/ Q8 ?) o5 ?
long save[32];
& g/ T$ U2 t+ a& H# Y2 W4 _/ g: _ long cnt;
6 z$ a9 q! H1 n5 N9 V long val;$ ~5 m9 E( b b7 H1 h- s% \
long size;% L0 x9 ^+ \' l* n! |3 j0 z6 }* i
int i = 0;
$ k' D! s0 P) q7 i7 o* }& R1 o) k
/ V s$ _8 h b0 y7 h9 ]$ j for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {( [9 e) R3 o. [1 X- n! ^
addr = base + cnt; /* pointer arith! */
$ ? Y+ v/ N9 e0 F1 R sync ();
' R# v5 e- r/ S) Q save[i++] = *addr;
* D: Y( Q6 n5 T3 R) L sync ();
3 |& K! g7 Z0 h *addr = ~cnt;# M- z% u/ k; r& |
}
7 }& I y; W6 X6 P& I1 M! W) o3 \1 T H. W
addr = base;
+ a3 m5 F8 @4 V- U1 `8 l# G sync ();
u- u+ V- \: P$ F save = *addr;
& {" w2 j( W4 V! v) h sync ();
$ ]$ @, s0 M5 p9 f8 j *addr = 0;
: ?0 T; f+ A6 U' }( `' ]3 `1 W* Q9 X
sync ();
% f. M m% [2 q, x if ((val = *addr) != 0) {- S! h+ C- p" t ?* \% N% m4 ?/ @. ]4 \4 h
/* Restore the original data before leaving the function.$ G& d# ~0 L/ r6 ^2 }2 V0 |2 [2 F4 J
*/7 p) z" G" S+ q& @0 e- [
sync ();4 |$ D' O1 V' t, j7 Z# B
*addr = save;
1 U- |- y& X i" w9 P6 U for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {- H& C$ a# l* t0 }" r. b# e: Y
addr = base + cnt;0 P/ k/ g( ^# ^
sync ();
& J$ ]- U; N T3 [; t& q6 H *addr = save[--i];* D- R" I7 O' Q( y4 \
}7 i* m3 p/ a# f' R3 j
return (0);2 g- x# T4 p9 B5 J
}" m& m& g& m( p; L9 Z# G( a/ `, k
2 M5 O. S8 W+ W; x2 t$ ?+ I; ? for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
. z$ e2 b$ y5 p9 Z( K- H addr = base + cnt; /* pointer arith! */
3 S6 v }" h$ z! D, U0 V val = *addr;
- O; ^/ J( x; o *addr = save[--i];* R$ ?) w6 M6 B( k6 j M
if (val != ~cnt) {
; k! _4 T0 ~4 H1 N3 I( v size = cnt * sizeof (long);
0 {+ Q" o3 J6 C: s) s& h$ H1 h4 a8 z /* Restore the original data before leaving the function.
( e' v4 p/ @0 j. s' F' N+ ?3 J */; n6 r+ ]& I5 b+ ^3 d: {* i7 X
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {( c) i! ?; Q! G& t
addr = base + cnt;8 V: A* ?( _' O% c# g! `, G& `" V
*addr = save[--i];
9 y% Y, d2 @' P }& i3 s, J! v5 [6 g; q, Q: t
return (size);" b3 V. }( _( W6 K; U; C
}
5 O/ }$ a$ P- I) @; R( { }
% k; {4 D9 M0 d
! u6 f: e4 L3 T, I0 Q return (maxsize);8 z. @. t0 f4 y+ \$ i. a
}
6 T* g3 E, D2 q" o/ Fint dram_init(void)
5 J$ f" {& r! C; ^# M) u6 f{
, r0 n2 Y3 [2 J, O /* dram_init must store complete ramsize in gd->ram_size */
3 [- G% t6 C* @8 n/ \" K6 \ gd->ram_size = get_ram_size(4 I* y& v; o; z. {/ u$ N& v
(void *)CONFIG_SYS_SDRAM_BASE,
7 h# I: c/ X. q* L( O0 U CONFIG_MAX_RAM_BANK_SIZE);3 K7 w, t; M" [, K, t4 u+ h
return 0;9 G% {0 x7 _1 }" d
}
: |3 H8 z7 A: Q" b( \& J L
- I4 B1 P) y3 T" E' ? j
4 K0 @3 N: U# `8 n: K- t6 T* C
2 D# y0 b7 K& O9 F! F
. s, v: I4 C6 A. O& a) EFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
& Q @, Q3 \' t# |1 X- `' Q) l' B
/ U& z: e( h- u' L; L |% P
2 J, L8 D9 X! I1 @* y |
|