|
|
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:# S* `. ^# I& a% v1 ]
/*
7 s: o3 a+ i H9 j9 o9 K- o* Check memory range for valid RAM. A simple memory test determines9 @0 n) d( n4 f" E
* the actually available RAM size between addresses `base' and' h: w, a6 r3 g" E) M5 V
* `base + maxsize'.6 p# T, p, v6 Q5 U6 `
*/
0 _ O, ?; v" Z$ O3 R1 d/ flong get_ram_size(long *base, long maxsize), C9 r" R7 G; y/ n$ N
{/ ?. S w0 y- ?* k
volatile long *addr;
+ ~: i* b+ f0 X! D) P+ ]. I$ C long save[32];' y" q8 p- U$ R( i9 q( T* a
long cnt;
! f# D5 j) c. F$ i+ G' { long val;5 N4 x5 j c, S, o% r* s: O% c2 W
long size;" C% z7 A: g4 Q
int i = 0;8 Z8 _ f4 Q, }% p$ g
2 }: p8 v* Z8 n2 K9 Z. V. C1 p$ z for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
3 R5 ], E/ M. P# }+ A8 Y0 d addr = base + cnt; /* pointer arith! */6 @" `' m7 l/ ^( I, a9 u/ z
sync ();
. }# s- D7 Y7 y! u save[i++] = *addr;
" |& Q% V+ x5 ^* O sync ();
# H* ^* ~8 A* P; j, X3 g" s. ]4 u *addr = ~cnt;- e" {5 x' f$ ?5 g) t( c
}
; i' ~; Y: }8 A( S% p9 w2 s- T. p6 L) s
addr = base;7 K9 G* \+ V! g
sync ();
C [6 d0 G3 H% ~! _' Q save = *addr;% P; q- S- h2 }$ i3 B8 G2 d' Q
sync ();
0 C& C3 Z, R" X *addr = 0;# k$ i$ j( Q# X: J3 h
+ k6 M" P5 @9 E# A sync ();
+ B* b6 f% z- r! c& j if ((val = *addr) != 0) {
3 m* B+ w# i4 W: R' f: M7 ] x( |* m /* Restore the original data before leaving the function.
' {' G$ h$ N# G1 u */, q9 c% I/ K. B( r" F/ C
sync ();
/ \( V# V7 H8 w *addr = save;% X' `/ M+ {9 b+ L6 t
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {- t# K- t, t! I' N$ A3 i6 \
addr = base + cnt;1 S4 @% v% I3 Z5 M3 D
sync ();( V/ h' w0 ~8 W0 }
*addr = save[--i];
1 y0 W4 } Q: d$ Q5 A }
4 H& }$ C8 M* z* h2 m+ L9 I8 V return (0);! N T0 C4 @: e2 d* p
}
& W- |: M8 t7 F# ^0 X
2 R0 U: Q. j- r for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {$ C- V) D7 Q# U5 k9 B& Z
addr = base + cnt; /* pointer arith! */7 }7 c; f4 m4 [3 @$ ~0 h2 |
val = *addr;( V# A) i1 f# D( ^
*addr = save[--i];
* B. f1 l7 F2 N/ m3 Y* R if (val != ~cnt) {9 `+ L& W0 T2 P/ U8 S) O
size = cnt * sizeof (long);5 U( T+ i7 I, h
/* Restore the original data before leaving the function.7 s' D' y5 r$ M6 r* K( N; N) y
*/
. z6 U! t1 _; a2 s( w4 u for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
# c8 R* v0 K" s. T2 m addr = base + cnt;, O8 t% P8 P0 b
*addr = save[--i];
3 I' X2 ]9 @' H6 z- O2 T) j$ q }
1 o; i) F0 m' r. C7 v return (size);4 _$ |: g0 s5 V: E! Z
}9 b0 K) u* W6 W
}
- W* b" | T' a5 q0 }
% i- w8 i3 x! n2 o return (maxsize);
# W; a7 j2 \* c0 e8 V6 q' w}
6 m' n. ~+ ~4 X! W. @. o8 vint dram_init(void)# M* {/ H- F# A% S5 ^/ ]
{0 @" _$ W% w4 r1 j! \& t, s
/* dram_init must store complete ramsize in gd->ram_size */
9 l {- D3 M4 F+ K" m gd->ram_size = get_ram_size(
) x0 N& ?+ T& l+ _1 S (void *)CONFIG_SYS_SDRAM_BASE,, X! X0 z, V& m" u/ r; j/ ]
CONFIG_MAX_RAM_BANK_SIZE); H& z! f9 L9 b9 N0 ^4 O* Z1 H
return 0;1 g( V |, e; K
}
% S, m7 k! c# x! I+ I4 ~7 I6 W/ W; @
8 |) P# P( r7 X2 Z
1 k2 \' N6 Q4 z+ d$ L( |/ W0 O, T4 F' c6 F/ g! C
8 [% N: [, u( T9 T+ k
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
& F1 j; d5 Q# M8 V, B0 D$ a5 d6 p, g. [! ^) P. r, A p
^* a1 d4 |# s5 M O0 N, Z! W P& ^ [- w
|
|