|
|
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
& k% _# a# K/ ]; m: j3 m3 m# m/*8 y8 v# ^) c- a" K' w* B
* Check memory range for valid RAM. A simple memory test determines( D# N0 R. p( Z8 B2 T; `! N1 w
* the actually available RAM size between addresses `base' and
7 t! t `* C4 x* `base + maxsize'.: I7 K$ y: r; n: l. G: @) u
*/
1 }. _. ~/ p! w% clong get_ram_size(long *base, long maxsize)
- x& I" O, J$ C. i) T( Y{" ?. C' h! o$ Y- f- I% ^) W
volatile long *addr;
# t+ i0 s' g) r. i long save[32];" p! B: L( @; p- [
long cnt;% X; x9 Q: A M0 X8 s: B
long val;- Z5 O4 L7 A/ L; w# b
long size;
* x# G% ]) u6 h( m int i = 0;8 y" k( T" V' }8 @ q. ~' u* t% n/ R
9 j% q8 G& [5 t Q for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
: _7 K! O7 ]& Q8 I) o addr = base + cnt; /* pointer arith! */$ E! m) _1 k# w! c! ~
sync ();
2 f. F' y) z, s3 ~! e. J$ W save[i++] = *addr;2 f. {0 }8 H( `# n3 n9 E, I
sync ();4 r- W4 P& {4 l8 k# w
*addr = ~cnt;% y; k" q! F' {6 ?
} Y8 C, w2 A6 \4 G9 a( Z/ K
( I7 a' a( h7 V' E4 T0 b7 _& T
addr = base;: N1 e+ V! i+ R& ^% t
sync ();
% Z/ ?; N8 `+ E& Y7 g/ d1 W' t save = *addr;- i# D/ D- y# {3 o
sync ();$ S) R! ~7 A5 ]
*addr = 0;) u: ?! n0 _7 r0 L: s
" t9 ?$ D& l/ d sync ();
Y+ n! d8 h3 y+ [ if ((val = *addr) != 0) {, v$ o5 ^" w+ j4 w; p8 f
/* Restore the original data before leaving the function.( q) ^$ U& j; S" {2 z
*/
1 q3 a& ^0 d) e. K4 x* c$ M sync ();+ v' G" f1 l3 |+ h
*addr = save;
- ^! F q3 ~ Q# ?/ q3 \ for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {0 \/ ?0 S! [, |6 ^; F# |# ?; G+ D
addr = base + cnt;7 U3 H* p9 o" {& ^
sync ();
. i! M4 ]: R& g+ ]+ C *addr = save[--i];
7 e- z6 m T }$ T, P& k, M% F }$ n: Y* {$ V: r" z- G/ K* u
return (0);
; z O2 l& k# t$ i3 ~' a& P3 C }
) V# k! v! @' |5 `: K3 u6 s. V* g' n# C- N
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
" k9 j Q. O8 _! w addr = base + cnt; /* pointer arith! */3 g! T" t B, d- T9 R0 j" ?
val = *addr;
! ?2 ~& U _" R( I' u# \! e *addr = save[--i];
x+ y, A7 u# }; s% c8 r7 ]' {5 w if (val != ~cnt) {' L: z. _* z' k+ t3 |
size = cnt * sizeof (long);
- c5 c) ^! a) r; }4 ~: E7 B Y! G1 ?6 t /* Restore the original data before leaving the function.+ i; N/ @2 m3 V0 \ a
*/
) H8 k4 r' m7 O! T/ A4 L: M8 d- I for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {' Z! K5 |* L8 f' I. F/ t
addr = base + cnt;
" b- u/ {" w( R# Z8 ]& t/ R *addr = save[--i];4 Y! _0 g7 Q& S M" b
}
7 R0 b0 D' e6 L0 J return (size);
" F0 u: \, M9 C0 h! b; z }5 b. ?( u0 z$ j, j
}
5 S: K4 M/ C# s5 [; m1 c: N! r: q9 B/ ^
return (maxsize);) a9 q9 L% Y+ H$ T
}& o% \6 [& K% Z b* O8 k1 t
int dram_init(void)- w. g3 J( @4 }" Q
{
' J; A% x& N- O: _: d. @ /* dram_init must store complete ramsize in gd->ram_size */
" a$ ~! k7 g' M! t7 x, y- t gd->ram_size = get_ram_size(9 i. ]+ [, \2 I; T$ w
(void *)CONFIG_SYS_SDRAM_BASE,
- `$ |$ a& I8 s n: o" v9 n CONFIG_MAX_RAM_BANK_SIZE);
! o" z0 X: v' r% D' N0 _ return 0;
: @: z F- R8 \8 h}
E, M/ B% B6 i' y9 s# |: s B0 e8 Q" `5 E, z8 l! d
P) s$ ?2 L3 j) J" n% Y3 o
0 y7 a% k) U& }) N+ y. ?0 u8 q% k4 Z4 J6 G' @) N: s& f' z" x( V
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
- X6 P. X5 O+ Z/ A" T6 j1 L/ | [4 b$ v) q( g+ ?5 b& d
& A% @7 [ b' T" o1 q, X6 x* E% c1 y" x9 m# s
|
|