|
|
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:, E3 t" i0 V4 ~9 r: p% |
/*! p' k: r( W+ l4 s8 j+ ~5 Y
* Check memory range for valid RAM. A simple memory test determines+ x6 g' m0 ^: R+ @9 i, P
* the actually available RAM size between addresses `base' and
- |. b9 L8 |- b% v7 e* `base + maxsize'.& F( d! S: v" ]
*/2 w1 u, D& F! s
long get_ram_size(long *base, long maxsize)
) o* |3 h! g+ u, B s8 T9 m" m{
4 c+ T- ]) ~8 R1 m volatile long *addr;6 I7 z2 L8 b F+ H5 S
long save[32];
8 S" G; n3 f/ C" Y( ^+ P9 a long cnt;
4 I6 |8 D5 R1 c: k long val;
8 R# C+ m1 N0 q long size;
" z# E& ]) o, a4 {: K& c7 X int i = 0;7 p# u1 X* {7 [" O
1 E0 N' Q9 w3 W
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {; D& \. p6 y) r" `( |6 s' @
addr = base + cnt; /* pointer arith! */
7 ~" G. K4 m0 C. Y sync ();/ v+ m' I2 x: i
save[i++] = *addr;' J8 D4 r/ V( }: P
sync ();
0 r8 G$ V/ B+ U4 k *addr = ~cnt;
7 d7 M& T( Y8 ]7 A. P" N" R }
, ^ j% v4 d% }7 |7 R+ R @
Q! j7 V, [6 j5 Z+ F4 I addr = base;
! X" G' [4 \ @' Y# q sync ();% K Q) F; a3 @! _$ O7 j
save = *addr;5 c4 d$ Q8 U- s1 G8 c5 a/ R
sync ();
( n1 M, J7 g1 B' e& q! q6 {6 e5 | *addr = 0;
+ v- W: k: Q* r+ ^! _- b9 a! ~1 {, c# o
2 X( V7 ?" ^3 z sync ();
! V9 ?+ b @" _ if ((val = *addr) != 0) {
" p/ F- l7 H$ f* }9 y /* Restore the original data before leaving the function." g% ?7 v; Z: ]. w; }( i) E* f" Z
*/9 z7 v0 h# p* r$ `2 U! J
sync ();9 {. `7 e* Z& c) ^6 k/ J4 a
*addr = save; X6 Q+ o8 n* g8 y. ]$ S& n8 ?2 X
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {' d; f9 a) F. F! l
addr = base + cnt;
8 E% W/ d+ T U; F& G sync ();) M) I+ p3 A3 F+ ~5 N
*addr = save[--i];
) Z% @0 O) P( D( ]0 E' i+ i5 d }7 G J* ?: |2 B. U: J5 D3 s
return (0);7 L& U4 O( s. c2 T
}* ]; x$ E* y. p' Q
( v" b' I2 i v5 [) X2 D for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {! P% T# C5 k9 y' q. U/ _; B* b9 x5 T
addr = base + cnt; /* pointer arith! */
% g" a( z, u2 B$ I, K; G val = *addr;+ R5 X8 U+ t5 H5 y+ M/ P" `8 j
*addr = save[--i];
' F( [6 D( D4 `3 b( G! T% { if (val != ~cnt) {
' w* ] I# W1 C* l size = cnt * sizeof (long);
7 p% A! m6 r' _) Z# C7 W! M2 r) g /* Restore the original data before leaving the function.
6 j) {: v1 R F' ~ */3 g" i( M; R. o Y
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
8 K% S: c; b0 p% a/ b9 C0 V addr = base + cnt;& n' @5 R# {$ ^2 G/ F/ x3 j
*addr = save[--i];9 o* e* q6 p3 G& K. d8 ?. ]
}# S8 K% t7 i- Z% d
return (size);
& w0 L2 F* k. a }' E! i8 j! h# e4 W4 n) Z
}
3 i2 a% h! A$ h; B' e- Z5 K$ m/ P% r( I( F( d$ T( S2 W
return (maxsize);
' {2 |' B# _3 Z) U! t}
3 Q! {5 h) {8 |6 ~. jint dram_init(void)
) E7 e/ I. M9 \6 F; |( p{
8 Q7 v" b, T7 V g) T /* dram_init must store complete ramsize in gd->ram_size */
6 E5 }( W9 H2 V! d4 Z gd->ram_size = get_ram_size(
- D. }. `, Q3 B4 \ (void *)CONFIG_SYS_SDRAM_BASE,
5 H# ~3 Q0 T& m" K2 ^! z CONFIG_MAX_RAM_BANK_SIZE);- D* O2 o$ T9 p' I b
return 0;' C! M0 \2 |, P% X& l
}
0 u( s& M' A, f3 h2 @# w' D3 P& V! A( j
$ J1 _/ Q6 o" Z- \) t2 D2 ^1 O' \+ e0 o# l0 ?& Y+ a) t! B
; |/ W& C; H* Y
" U5 ?0 `: I% W, q8 DFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!$ g) R9 S7 \9 I) O
; @, J4 G& W% X$ J! \+ S1 y" r. [; ] c: ?% X1 s. u" F# x% ]
+ E+ ?. w' l- K& [6 q8 W |
|