|
|
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
8 b3 o6 u( E) x& |/*6 u- O/ L0 J! O
* Check memory range for valid RAM. A simple memory test determines2 j- P) F& Q" H+ r* a3 w/ f+ {
* the actually available RAM size between addresses `base' and
: a r, ?) Y7 K) j+ K; ?* `base + maxsize'.
- y* J O% t+ _1 L" v% r: T*/5 {4 H9 j* z7 z7 E) N
long get_ram_size(long *base, long maxsize)
' E$ b8 k' h) N/ i0 C' C{6 G4 ^3 \. ~3 j
volatile long *addr;
0 Z1 Y. N9 c* f; ] long save[32];# J: B2 I: J& N( F( T! X p) l7 D% f
long cnt;
; y$ c8 d7 S) H( B) G long val;$ t% \5 U0 l+ w5 n
long size;' o" i. p& F" Q) ~) v
int i = 0;* F; r" H' v0 V) I' m l3 L
; X+ J2 \/ _. Q4 C5 f
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {& _( w( { G8 M) [" m( j4 K
addr = base + cnt; /* pointer arith! */
3 K, x ?/ l; H0 | sync ();
+ Q5 ]7 a2 T7 X% [. \( y5 Q4 ]1 \( k save[i++] = *addr;% |( i* j3 \# H& v( o$ F
sync ();$ P& h0 m% q; K/ Y+ g
*addr = ~cnt;9 W" W! z9 Z( A+ _) [, g- J
}
) t+ W9 p4 t5 a7 |
' v: I' p" p% R9 H% T) x addr = base;" T4 E! ], G. t* F0 q- A6 k, W
sync ();# H' x0 U& j7 b5 b
save = *addr;
" Q9 O8 }- t8 o9 U0 f, K- _5 e sync ();; c" e2 }' r6 C( _
*addr = 0;
5 M" h0 k5 S' T) \" @
; w% O$ {. d) }" |# ]6 g sync ();& K/ m1 [# K* s" t6 P0 h1 t
if ((val = *addr) != 0) {
! q# J% u% U$ Q, }* v7 V* q /* Restore the original data before leaving the function.6 D n" e( M/ r, {# c
*/. s! k. N% {; i6 n* A
sync ();) E/ I; l. M3 i) V, c* R1 O
*addr = save;: k+ @& ^) t& d! A( Q6 q: l7 Q$ |
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
# Q' _/ w0 r/ }% K# S4 V addr = base + cnt;
- V" t& U4 }3 o5 U sync ();) [$ u" Y+ p+ l( E
*addr = save[--i];
8 d4 `% @) {) r* ]+ }7 h$ {& i9 K }
+ c0 e% u0 O* l# Z) ?! |' g return (0);
8 _* G$ J- r! S }: j7 r0 L2 e3 d3 O6 r
9 F3 A8 I( ] X; ] for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {. }7 ~5 p- o( [4 c, F' {! n1 ^
addr = base + cnt; /* pointer arith! */; N: _3 F) |( u4 b
val = *addr;
& O a" Y; `& j *addr = save[--i];2 J2 b$ v2 h( l* q/ g$ Z* d Q. W8 E6 T
if (val != ~cnt) {
* ^4 i& B/ w1 y5 O size = cnt * sizeof (long);3 \; E8 q9 q; y8 t+ N
/* Restore the original data before leaving the function.
6 K0 K( h, C3 O. { */* s) y% w9 m2 y; L+ V6 l
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {* I% A$ D) s' b+ y# q6 S
addr = base + cnt;; J5 [ i8 F! k
*addr = save[--i];
! n2 I _3 a8 f' P8 y }6 g7 W* |9 \7 _6 `) \
return (size);
: I% M# m- m$ |3 |- A }
6 ^* g4 w* E& Q" E" \' B }+ ~3 P. c- {' ]* }
5 I/ ^7 h2 j/ L l
return (maxsize);& v( z3 a4 r% o
}; R6 X5 V1 X. W9 Z& a9 |' e3 J
int dram_init(void)$ l3 n/ D T K
{4 B6 l. i/ Z* c! _8 ~) @
/* dram_init must store complete ramsize in gd->ram_size */
- r$ q1 [4 l7 U gd->ram_size = get_ram_size(4 W+ e5 k* u8 P! u8 S4 U3 D
(void *)CONFIG_SYS_SDRAM_BASE,
+ g/ R J+ j1 h5 C/ q0 ^6 f' \ CONFIG_MAX_RAM_BANK_SIZE);
2 y1 C! }! M- X' l return 0;
% @% S! O+ y# g5 W0 G}
% [ O j# [" k+ z
2 F Z. B* U( E: J! L6 L6 p& v
! R) t# y' A$ u4 b5 f8 K
& o) ~2 V9 o/ S, {. h# @
7 a1 J$ i5 B' mFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
5 ], Q. Q" y$ O4 C- A2 F
6 i. E& d' y( q, ~# p: i+ b9 y) c+ _5 U4 m' U+ ^
! T* m3 ^" }: U9 [; W2 b" C |
|