|
|
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:& P8 F" f2 p- u
/*
' y; [/ u e$ R1 y$ X* Check memory range for valid RAM. A simple memory test determines' q- F$ L5 Y7 w7 O
* the actually available RAM size between addresses `base' and
% l! i/ q9 Y } Q6 v. E& x0 c* `base + maxsize'.
5 T6 N* a: D- y*/
3 _2 Q7 r6 b2 _8 Y3 L, Llong get_ram_size(long *base, long maxsize)
% \# p" n. v9 w( s6 ]{
- P& C' f6 @/ {9 U+ x volatile long *addr;
* t' W8 M3 I6 c- p) a long save[32];# ?" E" `, N* y; d G2 Q7 O V
long cnt;
1 g6 C3 F1 p" `& E. R( q long val;: W9 W* |8 }( J Y
long size;
3 i# B# X, j0 R. D q9 `# ^ int i = 0;
. [ x0 F, d# F z. Y+ O. [9 G$ [) F
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
" h* [) V# k" v addr = base + cnt; /* pointer arith! */
7 l+ W* H, {' T, I sync ();
5 z# ?* v/ F6 d f save[i++] = *addr;4 G* D; j# n% i3 w5 I
sync ();
) a$ m0 w& ~* a/ G) Z *addr = ~cnt;
) d( b, m; `# j# ] ?' `0 f }
/ [7 ~6 u( R8 [- {; J; F0 {+ A
; q& L4 Z' ^4 i3 H( h5 T9 ~ addr = base;% b0 N7 [7 `) U" d# i3 J3 u J
sync ();
& v7 D" J8 t$ G3 Y$ Y0 s9 { save = *addr;
, g B' t) x- a3 a1 n) T/ I( b- @ sync ();
3 C& l6 q5 j" x* Z4 |1 w *addr = 0;
/ Z6 Q# Y3 n9 A5 B! ~- D& h6 L3 {# y$ o0 D- G
sync ();
" A+ m1 S1 x2 a& j& Q' R if ((val = *addr) != 0) {, r* j4 A; l, U6 \( Y! r2 p. {+ Y: D
/* Restore the original data before leaving the function. h$ @' r% U9 \$ o
*/
, O/ y) Y! r+ c2 B4 i( Q sync ();5 a, ^" P7 ?& ~' }" L
*addr = save;
5 U8 @! W" B$ O for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {; X& _7 f( K1 a/ n0 j/ y4 H
addr = base + cnt; Z2 E3 b+ @. z
sync ();! U2 r. b6 z1 m. o
*addr = save[--i];# I$ x8 W7 k1 P' g
}+ X9 e8 q4 q# h! T5 z# l, V
return (0);
5 S* Z3 z' ~1 Y% D5 N# e9 X }- w$ \- |4 g, Z
V3 i, G1 S5 s7 n6 R& t @
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {/ r" \( d- m) @$ {& w1 o
addr = base + cnt; /* pointer arith! */
# M$ `6 l6 F( y# w. N val = *addr;# M( W3 K7 _) x g" }0 ^
*addr = save[--i];% e; G) o W- m
if (val != ~cnt) {
1 i$ Q, ?% i2 U( b size = cnt * sizeof (long);' b) m- U$ T O- O& l5 M
/* Restore the original data before leaving the function.1 g$ h1 u* M; ]( u
*/( h% w& ]( g! B, F, T" }% p
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
( v7 E( g9 Q9 @( Y' Y addr = base + cnt;+ Y: i: A2 {3 b' U
*addr = save[--i];
~! ~7 u( J' o }& f6 m& e( y2 g- [' X* h( ] k
return (size);
: a" ^6 u! C* E, ] }
) a# y I- V/ Z+ N5 {6 }2 q }
8 C" ]! m7 T( O; m! Z; y% k( P* p9 E( ^7 b1 S4 x- Z1 X& m" H
return (maxsize);
7 ~; N9 L; ~2 Z! @: B' H0 l}. G0 T: T9 {! L1 Z7 C3 i' _6 @
int dram_init(void)
! L1 Q. i* F/ p* [{3 S2 ?4 X+ M( l7 J P3 ~6 n
/* dram_init must store complete ramsize in gd->ram_size */
0 ]7 h9 c7 m/ r# p gd->ram_size = get_ram_size(
4 ~7 b1 ]8 P5 n% n# B (void *)CONFIG_SYS_SDRAM_BASE,
8 I" ^' `( ~9 C7 } CONFIG_MAX_RAM_BANK_SIZE);
; L4 r r7 h7 J4 F' m return 0;8 W$ }: B# T W8 C" S
}" U$ q$ J. h% f6 Y
: t( A! \1 o8 {+ x7 [, v
( w5 [9 S8 a3 `5 i+ X; @7 L9 `
* f6 U1 C$ r$ y2 M6 m ?$ E7 n2 ]1 o5 `, ?3 A! o T, O2 P
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
) s4 n: i, G. D2 n* f
7 v- [" I( y% t7 k
, r0 i* M$ v, J/ a1 j
3 _7 W4 M* a" }" h* J% D |
|