|
|
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:- C( f' \0 K1 m& N
/*
1 F8 R) [ j6 V* r% ~* Check memory range for valid RAM. A simple memory test determines
7 b }6 K6 p, F! b% F' R% |% {* the actually available RAM size between addresses `base' and
1 W3 e6 C; E/ L5 Y* `base + maxsize'.; x, s7 [9 z+ t0 {2 F1 Q$ h
*/
7 s. G! {: u' X9 olong get_ram_size(long *base, long maxsize)
, p4 {+ D1 R) e' E5 W* X{+ B6 W7 _1 Q% a+ R( c
volatile long *addr;
6 r( a, N$ O3 L) M. h. ?$ O long save[32];$ G7 x4 L/ K1 f2 t( A0 @
long cnt;
" _2 J* N( _5 R, z+ G. [ R& m long val;
{' _+ d$ c: I, S3 ?0 ? long size;
+ Q i1 |/ b$ @1 t int i = 0;
0 I% o& C* ~2 v) B
% b. W0 r2 y* y8 f9 R8 M; e for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {" V2 g+ g" S. K1 w9 i6 \$ Q3 Z
addr = base + cnt; /* pointer arith! */
5 `) d" O: \9 M) ]6 ` u* T sync ();) w R+ n5 u Z, x" `4 z$ e5 M: N5 _
save[i++] = *addr;
; K- \% k) G+ W) b% t0 N sync ();
! a8 j# Z( z) a( Y2 I1 w9 g *addr = ~cnt;
' I! M5 o2 w( b0 ^: W. J7 F }
; Z/ H! [' [, n
# L n, N# [3 h0 S$ Q7 [9 T addr = base;
+ i0 h) Y; v+ Q% ~! E) \ sync ();; T$ z) e+ B! e; G8 @' T/ H
save = *addr;
0 ]7 K; C) \% q+ D7 W sync ();! c, O& y# @2 X& c
*addr = 0;2 Y# f3 q% p; P6 \$ {4 g$ Q
$ I" d. b' K& X3 ?- @. l$ a sync ();& v* x/ `9 N! I) T+ T' ^3 h3 {
if ((val = *addr) != 0) {! T, J: j0 p/ K9 t
/* Restore the original data before leaving the function.1 P5 H- |- B& e' |& |$ e
*/" n- H, m6 J* }
sync ();
2 ?3 U2 v9 x( q *addr = save;
" ]( h* T- \% D' y for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
1 i! x6 u9 x' P$ ] addr = base + cnt;2 Z4 v* E! @& i' d8 x" P2 J
sync ();) m% w* b. u r" h, N
*addr = save[--i];
5 V. ?* V5 J) S- V4 k }% Q: q$ J" J* F& w; r+ L7 W ]' J
return (0);0 O) t% c$ D0 F6 k
}* v6 U" ]9 u( d5 N& q) L
; x' v/ J, O9 P7 u: w
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {6 @" y/ o& t4 Z. g3 p. P
addr = base + cnt; /* pointer arith! */
Q' @* k( T( i5 t" r$ }- [1 G val = *addr;
4 ^% Z1 W. v9 A. @ *addr = save[--i];
& F( ~* ~7 t, h( q& f; R( x if (val != ~cnt) {5 T @0 h* l1 g: R9 @: _
size = cnt * sizeof (long);
, @3 T6 V) S0 W: W/ U! W /* Restore the original data before leaving the function.
u' _3 X( v5 x$ S4 C# ^8 f */) ~- T, d7 \: }( G# t7 r6 U
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {( z3 v+ o" I4 y6 A
addr = base + cnt;( \- Q' V0 v1 b' _
*addr = save[--i];
# j p% x6 U- ^5 f" C }7 C" e- ~' Q! L. {
return (size);
5 ] D; j- w; m# c# O- T* j$ D& M }
; X2 \" v; k8 t$ Y8 l% \ }/ F+ \" l& e0 Q' s2 I; [, F
' k( H" h! E! X+ R6 J! l return (maxsize);$ M) ^ K+ B4 a3 `/ A
}7 M7 H3 x- H' u- e* \- R8 y
int dram_init(void)7 k; S2 s; M* ?4 Z5 G) N3 B
{8 y1 I" s @- [$ e+ C! L
/* dram_init must store complete ramsize in gd->ram_size */( ~9 I0 x2 g7 W1 j. u0 B! l
gd->ram_size = get_ram_size(
- W% F! T. |2 a* Q9 _7 d' P: O (void *)CONFIG_SYS_SDRAM_BASE, r+ v/ _; P- D; ^9 X+ e
CONFIG_MAX_RAM_BANK_SIZE);
2 V5 T# b! l( I9 ~/ J return 0;
: x1 ~) I8 w" l}
# [1 Z0 e4 H- G% ]
) U+ ~, l$ r. b% k, M+ c9 w4 x$ |" `( S1 E6 b/ ~% c
3 f; @& K# x X- E0 ?1 s1 Y+ Y* O8 E, k$ H
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
$ g) e- g; `, a# v& b8 O* h7 o! e2 \5 N1 u# p
4 D. @# A* J7 @0 O& ]4 n' i; ~
0 T1 {2 ^$ I! M
|
|