|
|
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:/ {: L) n' k3 F2 o
/*$ g% U _! J0 }% x
* Check memory range for valid RAM. A simple memory test determines0 D; F$ ~1 s7 e4 h) V; X
* the actually available RAM size between addresses `base' and ~9 }' k. a5 d6 ]/ d
* `base + maxsize'.
4 b5 T6 L$ a# p/ {( p) S*/ u4 K2 C1 J& ~- X% a7 z
long get_ram_size(long *base, long maxsize)6 N/ U: N1 } a3 M$ U
{
, d: R1 E- z z& a& E: i( u volatile long *addr;- r: ~/ O: g6 h/ X6 t$ o% v
long save[32];7 j* D# I/ r/ h. a
long cnt;
2 _+ J* U( }8 q# @# w long val;) W. }: m" m: p2 u4 ~3 o, E
long size;
' r! L. d$ t7 E' b6 L2 h* F3 W: ?7 w! h int i = 0;
9 C/ {" t5 T: \: B0 R; P; x- L; ]3 R0 z
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {# t: Z: C- X: b5 G" _4 K
addr = base + cnt; /* pointer arith! */
6 X8 P/ p4 O9 z1 n' g sync ();
1 ?- R% D6 I& j/ ^! f/ ^$ c8 ~ save[i++] = *addr;
0 E3 w' q9 `0 K/ |# Q* q sync ();
" ?6 |) o' b9 U" X/ D* z; u *addr = ~cnt;2 P& n1 C1 u- ~, V% ^& ~) u: x7 f
}
4 @. |! u1 ^- w, ?* G) X8 d
- I8 E6 O" O7 v; g; g8 L addr = base;
% K2 @& H% k, t' ^4 n1 E sync ();! C L1 y$ _5 G8 Q: ^
save = *addr;
# I/ M# }5 Y' C4 m& y$ B sync ();3 z/ H8 C+ W( J
*addr = 0;
: `: n V- s- u: p7 [: ^4 H6 C
% j# `7 |$ v+ v+ c* F% H/ n sync ();8 z; e- v4 S: O
if ((val = *addr) != 0) {
7 B" y& V0 n6 d& T) Q" m8 x /* Restore the original data before leaving the function.* k. T% }! ]4 A+ k& e3 |
*/
% L. S. f9 K4 F sync ();
' O3 i1 n1 r% b( r" c, J *addr = save;
$ X+ e# u$ V2 Z8 O# [; H& E8 n for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
& X/ |+ m- w' ]' X addr = base + cnt;
- V: Z- n9 r% P/ p, |! W S sync ();' C) X6 M F. e2 e. P* y
*addr = save[--i];
$ Y" R0 l- V8 V, O5 J }
: a/ k/ h+ q5 k; Z+ ~$ P7 U return (0);
- `9 s3 M5 d- C. O: Y6 h }3 M" e9 x( W& s& S
o4 z% Q/ i) O0 ]- @ for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {3 X$ V& j5 j# R$ t0 a! I( `) i) L
addr = base + cnt; /* pointer arith! */
1 t) ^ Z) z+ M: D. ]; @; u* |1 E val = *addr;
- |' F, Q- \+ |9 x *addr = save[--i];$ m" e. q* O. F: ]
if (val != ~cnt) {; @7 ^( [1 L4 C3 _9 X! A
size = cnt * sizeof (long);
- p0 K! ]" U" @; q/ c6 g /* Restore the original data before leaving the function.
7 ]5 h1 M! |2 W( g8 h& r */
# w+ R6 m7 S% Y8 y7 P- [ for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
9 N4 j: G; a. g+ _9 C' B. p addr = base + cnt;
& O4 S3 K* [( ~! N, q5 X( t v *addr = save[--i];4 r+ _$ _; a4 [; \- g) l
}: S0 F7 w. O9 u- U* ? S* w
return (size);
( U* x9 r1 Q/ x* R# U$ W }# h, x. }, u7 Z
}: g- n/ S) X' r8 I3 l
5 I& W3 S1 u7 j+ v return (maxsize);
P6 r% z {+ Z6 D}
5 u5 ^6 r4 U$ f( ] Fint dram_init(void)
) I. H, p9 z7 q% H# G5 b$ ]{" T9 b) S1 B# X! J2 ^
/* dram_init must store complete ramsize in gd->ram_size */
! k3 ^$ Y# Q% l+ X; p( a. n gd->ram_size = get_ram_size(
& z* Y U& r4 Z3 T0 ~; {. V (void *)CONFIG_SYS_SDRAM_BASE,
& u; c) l. `! n7 i" Q9 ?- r CONFIG_MAX_RAM_BANK_SIZE);
3 T! Y. J- C6 H! P1 |7 O4 t( s5 G. u return 0;
- P5 {$ R, f$ N l' G! Y7 p}
% f7 G) ~$ m V! d, g) a
3 C4 i5 ^, i: l
1 b' M5 c: f! Z
$ g. Q! s6 b. k% g3 b% ]
6 H# m0 K% t. ~, P0 ^2 e; r8 s( EFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!7 R8 @% w5 c0 H! R/ X
4 O/ _: p8 V& P9 H) f6 I" C: b; H2 X" K
+ r+ h. s- D, {1 B6 U& v9 z
|
|