|
|
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下: P. V& z' k% i" `/ A, p+ N2 c
/*' h3 X- K. W6 f; D9 O- U
* Check memory range for valid RAM. A simple memory test determines
5 }6 Z0 p' K5 H) e4 _ X# @# [6 G3 q( F* the actually available RAM size between addresses `base' and G7 X! D& r; b, X& F5 `
* `base + maxsize'.
1 m% r% T$ U( C2 V" G*/. B B O% t+ i$ F* q6 \- g$ y/ u
long get_ram_size(long *base, long maxsize)1 T+ E3 }; N5 s5 Q& e
{
5 }4 I& v! \: { volatile long *addr;
0 U6 l4 A4 ^3 q" v long save[32];- A+ V- a0 x! }9 W8 o. s- Y
long cnt; c; I7 t; K5 @* S" j
long val;5 Q& L4 O% m! A
long size;
% o5 t- H+ y9 t& M$ ]" {; V* o int i = 0;8 _2 e& g+ i9 D) I/ j/ ~8 [2 D
" ^5 V3 g+ k1 g# l for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
" g& W/ e& p. j6 N! b addr = base + cnt; /* pointer arith! */
. r5 {1 r$ b1 e sync ();
) U* J" j5 k( K0 }! V9 t save[i++] = *addr;6 G& L, z: e. c6 f8 p% T8 l
sync ();
% Y- ]) r4 \; X1 m J1 Q$ q *addr = ~cnt;
" U# }* D3 _9 a6 t9 l2 i7 @5 {9 [ }1 ~7 U9 j/ b8 n7 a# }
: H" u; a" d+ E( y( k) B; \# j8 a addr = base;) U' `; F, f+ C4 B* y
sync ();
% d2 C, `, X2 O+ m save = *addr;
$ x: Y; U8 [# ^4 \2 G7 V sync ();- U: h0 b# i7 B* w6 Q: p1 X8 a3 N
*addr = 0;% }% I Z5 f5 ~8 j/ B
4 b/ L$ Q% o8 ~& y
sync ();
: `; Y* A; K& G- O, D if ((val = *addr) != 0) {7 j$ @5 O; X; N& W3 \) y
/* Restore the original data before leaving the function.. |4 X; U: `( @8 c/ a. h# S6 V
*/
- i2 z" F# f/ L' z! P sync ();0 B+ M5 L2 c% E- [/ p$ s3 o
*addr = save;! r: m4 A* r+ k( @6 F. Z3 U
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
/ s6 H% v' d6 J- J addr = base + cnt;' b6 \4 O; _9 t4 T! j8 q7 v
sync ();
0 D% t* u K6 T: Z n *addr = save[--i];
) n( }. t o! S1 Q2 _3 _% f }
e, |% q1 {+ m9 ^0 M3 b& z$ Z- } return (0);
1 ]( A2 t1 ~$ ~% { }, I J. W) }% {9 V8 C
$ ]3 R, v* x, K N9 P
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {/ F" J- U, v; N i2 ` F
addr = base + cnt; /* pointer arith! */
# n) o2 f# h, u: ~+ n" y val = *addr;
) i; T0 d$ B4 r7 ?1 F$ t, p% L, Z" L *addr = save[--i];9 l( r) Z* _9 y9 H8 ?
if (val != ~cnt) {# d- d, Y- L- {* `' S
size = cnt * sizeof (long);% F' W8 }) H. F V l; k
/* Restore the original data before leaving the function.3 G" \: F; D$ k" x' X+ H2 N
*/3 ]: L" Y+ Q y) s
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
: C& G$ I# W+ O+ M addr = base + cnt;
, F. b! z; P8 [, t$ ] *addr = save[--i];" r( X- R$ x% m
}, ?, ~! U. G+ l1 l# } l0 k. P
return (size);
0 F5 x! ?2 ^2 [9 R) Y; P& V; F }
5 b A+ K5 \6 F: X }2 N# a4 [# H J( C% r
7 C" P( t, _4 ^0 ]5 N/ W" ` return (maxsize);& y0 \4 Z6 Q! C0 u# O! Q
}* B* P& ^' ^ C' `1 X, A+ I
int dram_init(void)4 e/ P! b( C1 B7 |" o5 X
{
$ v! ?% W# m+ Y5 b7 p5 q /* dram_init must store complete ramsize in gd->ram_size */6 [! l# j2 O+ B/ y' |0 B, o- ]
gd->ram_size = get_ram_size(
0 _) [5 K5 I$ T' I (void *)CONFIG_SYS_SDRAM_BASE,+ J; c8 f: l" E' S
CONFIG_MAX_RAM_BANK_SIZE);0 j& V- u" J7 s4 B
return 0;6 a: j, n2 F2 O4 g
}" R5 l4 {/ ~: l/ n s
4 e9 |' i- S# a- C* X! \
! U6 q0 w) Y' k5 h
. C: o4 u* @, u7 g& T. D j) I" I6 D" e8 X: ?! q: x
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!/ f) f* V3 x% p8 z" l$ s
3 o/ b% b) D9 O$ Q8 n
2 o. f% N' j9 G& N% n: h9 D+ ^
8 i) @* u8 c3 v' G |
|