|
|
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:7 h" E; ~+ _" C; D# \$ W
/*; {" S3 j8 h+ ]$ Q1 b1 s7 H% R
* Check memory range for valid RAM. A simple memory test determines% O6 D$ C5 L7 S; }- a# m: W* g
* the actually available RAM size between addresses `base' and: x5 F# t/ D. ]2 l
* `base + maxsize'., a7 b9 Y* O' y7 |8 n
*/, |# s7 @5 w. a5 M* y+ A: f3 m
long get_ram_size(long *base, long maxsize): k- E2 w. c( A! q- n$ x) O$ X
{
3 f/ q% D/ `6 X3 H volatile long *addr;
/ p0 n; s6 J" b% F; B long save[32];
6 L- t8 K% I% n* X& p6 G" I long cnt;" _6 M- p* }8 X8 C2 I
long val;5 @" M" P/ Y' ?- D
long size;7 s8 g- B8 ?1 q
int i = 0; `# o) s, N6 ]. U0 _/ t0 [ R
) D1 c! w. W- C for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {0 @+ y T3 F, ]: s2 k$ |, V3 g) g( z
addr = base + cnt; /* pointer arith! */
$ k" T/ _8 ^6 M9 k' u! C0 e sync ();
3 K; O5 \0 c: P save[i++] = *addr;
4 J0 ^+ k* L# i# x% P; E# `/ F sync ();4 }, _- M- W; L( \
*addr = ~cnt;
& ~3 T4 F8 K5 s }
; Z- g& e: t, A9 t- L$ J/ B5 D* B7 n# X. M4 }! ~, |0 R
addr = base;
0 O- m& r% J* v9 ]8 R1 N sync ();. l j7 L8 U9 N% n2 j
save = *addr;
' x+ w% F4 |6 f4 K U) u/ _7 R sync ();
/ |3 j" k9 i& } W/ ^ *addr = 0;8 Q; f) v T9 ]
% K# e1 ~" ~' a6 l) }, [4 _- {. l sync ();
; P ]4 g% K0 w1 _9 L* d. |% F if ((val = *addr) != 0) {
7 h6 a- G. a# f0 F /* Restore the original data before leaving the function.
" t3 H8 i# H8 F8 T' ` */
Y) R" }' _9 Q: m6 V* I sync ();& ]1 s X% R( A: G3 C" i1 o
*addr = save;( f! e9 v4 ]; m- A8 f
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
4 f: D) Y7 S7 }, j: P addr = base + cnt;
& }7 e2 e; [" B2 E3 ~ sync ();
0 s# s! a8 K m* h0 i* S *addr = save[--i];/ Z3 n# Z8 E& K/ \0 c7 R
}
6 |. R! c% G& P# |+ g/ x" B' Y return (0);1 Z, l; u. O1 h6 N. D4 L2 _' @' J. I
}$ O4 r, d- w+ K! y. r& l$ _
! n) J( {- f) b+ H# V
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {; H! H- F+ r! i, D- N" ?. l- ?
addr = base + cnt; /* pointer arith! */
9 Y' t+ C2 K( Y4 W3 L( `5 J1 W val = *addr;
8 n% A! [! Y6 X/ z# p4 h# B0 g$ ~- A3 j *addr = save[--i];" W* P& ^- Z" z' R$ X# A
if (val != ~cnt) { j& I6 l9 k$ J" w$ e
size = cnt * sizeof (long);
( i' w% t2 W; S5 a* N1 [5 m /* Restore the original data before leaving the function.: S( D; L% [7 c! m- L
*/
9 s- \9 i8 W8 F3 J for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
# x' y! G1 S" [5 G+ W addr = base + cnt;
9 j( o3 J( x6 L: k5 A6 k *addr = save[--i];( K8 k( o# o3 Z+ J
}! ]5 O( Y l: I1 e7 f1 g8 h5 y
return (size);
$ M8 k8 D! ^% z$ @5 v1 |) x, P }
$ N' t0 k3 ]4 F }
& L7 @- F- f6 e7 O1 }
# g R* G6 _ H5 `; b return (maxsize);! W& Y8 r. \* p7 v2 t4 R1 d8 t
} M$ f, F. c' Y* o4 n5 G
int dram_init(void)
( R9 h; G! t; A m- J& o0 c+ C{, b& X: b8 ?7 D0 D4 J7 @5 h8 |# B$ A
/* dram_init must store complete ramsize in gd->ram_size */ [+ X# ~2 ]. N: o5 j+ [3 m+ P
gd->ram_size = get_ram_size(# G; K- b1 b% Q
(void *)CONFIG_SYS_SDRAM_BASE,' K3 ?0 q O% D- q
CONFIG_MAX_RAM_BANK_SIZE);
2 s$ H6 V. I, \: }9 A% m1 B7 ` return 0;
6 q |/ u' H* O+ C& h9 m3 T+ i4 {}
! d# C% F: W- L% `9 F5 W- Y9 z* y' ]0 `: Z; A3 R0 q! V2 `
7 u q( @' u; B; B% b! Q
$ C! y$ M% I, @3 s! A# p6 z" O! j2 e
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
+ Y# S. B7 @- I7 ]9 Z, \6 S" M8 u4 M7 ]4 f5 k
4 R; h) W h0 ?
8 W+ [/ ^" v& i& f, D6 }# C) X) d |
|