|
|
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:' R) ?( C' S& \' I$ r
/*2 q9 z4 n/ v) F: D5 E9 }, W6 h# ?
* Check memory range for valid RAM. A simple memory test determines
9 M3 V% S- C; c* the actually available RAM size between addresses `base' and. k" n; c6 s: `! X. j. f; S/ s& n7 |) n. H
* `base + maxsize'.
9 }9 _, B4 I/ f& [; U9 G*/
8 w- u. V0 m- p+ E4 o" klong get_ram_size(long *base, long maxsize). c! p1 g }8 x' @! r
{2 t; o8 n; p( v) O
volatile long *addr;
) [) M, M& Q% A& F: o; C% d# k2 o$ f long save[32];
! j0 p3 g* n# Y& s long cnt;
$ K6 Y" X) H- V$ ] long val;# D) w9 D3 E/ k
long size;
, h; z* z+ d4 W int i = 0;' r) t$ Z3 I2 r3 J
% h, b& }& Z; {; k3 @! K; L- ~7 u for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {7 _3 i4 ~, c# m- e4 G
addr = base + cnt; /* pointer arith! */
0 f/ E8 n' F7 X$ O7 }3 j sync ();" b/ k$ \$ q( `. J/ R7 z! z# c. T
save[i++] = *addr;
, ^- o* k r$ M/ s" _ sync ();
, G, p. R. |6 X/ E; t8 _$ C8 N *addr = ~cnt;
, N2 [, k) B _2 o5 R, f' u$ [9 c }
3 ?; @% d5 p; N7 F# K/ W3 |3 N# z; ~* J% ]0 {% X# ~
addr = base;( H" V4 {% W) G4 I, `
sync ();# F1 C' S' s5 n. o4 I9 O N3 @
save = *addr;* ?, A% j0 v" a$ }
sync ();
: V; G6 k, K% ]$ l( n. p/ g2 j) A0 z *addr = 0;
4 }9 Z7 |- A9 F4 s8 r
2 F8 r# H* {+ {( e) B sync ();
4 U5 ]5 D t: j4 U" k if ((val = *addr) != 0) {, E9 u/ S, ^) l% I
/* Restore the original data before leaving the function.. q% ], N( {: V0 O
*/
2 a$ o2 j( k8 ]: i sync ();4 R; [! _& Z; H0 v
*addr = save;
% W x0 @' L8 K: f# _" S/ \) K9 ` for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {, T4 O9 s# K3 i" F7 t8 u8 c
addr = base + cnt;
- x, f3 V; `! {8 o. O% u5 d sync ();) s' U% f% G5 q
*addr = save[--i];/ q+ s5 i# ?1 ?% o6 p3 B6 W
}% A _, c; v8 e: c# a; Z
return (0);% G& n1 @$ v( l) R
}
) _$ Z- `2 w7 e1 M# Q }- `. ~ M8 y
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
9 [9 V( ]6 a# K/ H addr = base + cnt; /* pointer arith! */6 ~2 g0 J: x* U; w6 M8 p. t
val = *addr;. ^; s& L' W% A) M8 ~
*addr = save[--i];- l2 @- A \/ O$ X. l
if (val != ~cnt) {
m) W/ G& d Y" @5 x' f U size = cnt * sizeof (long);: u( o9 r+ l# D1 Y$ ^
/* Restore the original data before leaving the function.& _3 W7 v3 J- v ]3 L
*// P2 T: Q% o/ h0 V) A4 I0 g$ ~# V
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
* O$ E2 x: a7 s- b' w2 x7 S: n; p addr = base + cnt;# }% s r N2 ^6 G+ s
*addr = save[--i];3 @7 ]3 M; k' D
}
0 G2 X2 V! z- \0 s return (size);
8 ^' U+ G5 Y- v1 m7 O }+ N5 F5 r: h4 t8 Y; E! y, B: X
}, F" I3 V' `7 g# n" \7 R
* Y6 R4 R; _% [
return (maxsize);3 n6 Q) O# n; Z1 V" N. T
}. i6 i3 m; z- H; u- g( W+ @
int dram_init(void)
" e* _: g1 m& P& }4 |{0 g; n# A- U O
/* dram_init must store complete ramsize in gd->ram_size */
" j: m6 Y4 {% z5 X gd->ram_size = get_ram_size(% w- m. N: f1 R% e+ j( Y* h
(void *)CONFIG_SYS_SDRAM_BASE,4 m. E3 C. s# I; C
CONFIG_MAX_RAM_BANK_SIZE);
- \3 T: v; ~- G8 N return 0;' T# q4 Q2 k! _
}
! }* \8 R" m( \5 W8 k3 ^ u; ~2 [0 n4 v8 q9 _
7 G e; p' e; [% F: C+ e
; l2 z; L; H( q' N3 o4 r& e1 A& ~0 j6 H2 c0 f
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!& X* z' _5 S/ \6 R# e, q, d6 w
3 C& G) O/ w$ l
" u! q6 I. L# L' @$ r
* A6 }; f' f# Q |
|