|
|
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
$ c' N' x! ]' {, R$ K* ?( H/*
1 o9 [" K( S0 y9 N* Check memory range for valid RAM. A simple memory test determines
& ~6 p* w) Q0 V9 ]! ]5 Q* the actually available RAM size between addresses `base' and. D3 u( L1 f& P* s& y/ g( ~
* `base + maxsize'.1 V7 [8 i( o7 D" x8 }8 k
*/$ \) E u; ^/ Q6 e( ?8 Q' O) f
long get_ram_size(long *base, long maxsize)
9 ?# N( P% `* k1 C{
! j4 D! E( O$ E# p9 B volatile long *addr;0 y* ~) r7 ^% p2 {* v, u l
long save[32];
* w& }4 e/ }0 R long cnt;
2 u4 k) u0 O. `# }% ?% ?& x) U long val;) I, o9 h- e9 D' [% Q* ^
long size;8 A( D8 Z9 M9 T+ n5 m5 Y: f
int i = 0;3 E7 S. h; x$ x, }& R
1 D! I3 i i( F
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
) W% A* |, W8 Y. x9 y% v, o6 X addr = base + cnt; /* pointer arith! */7 B% U4 g; j* e0 a
sync ();
2 i( J" k o, V2 Q! l save[i++] = *addr;1 i. T. ~- A1 D
sync ();& a: E4 g8 b1 R* Q( H2 K
*addr = ~cnt;
( D& u: t& r; b( X0 k- U- Q2 i% w }- P' C! S! X- F& y$ p4 d/ J
+ S( O1 P2 S9 V+ `1 V" d" i addr = base;2 x9 _" H. }4 `- A! V
sync ();
# q2 C0 V; y9 I save = *addr;
- {. n1 y: {1 n1 m/ d sync ();
% ?( ^# r; h" c; t8 c0 ^0 m; X6 X *addr = 0;
" C% h9 I% E$ p1 M7 t% Q% f9 g0 b8 S
sync ();
5 ^# L8 D% {- G3 S6 z3 B; R4 L if ((val = *addr) != 0) {
+ Z1 }8 {4 |8 N& N /* Restore the original data before leaving the function.
, q5 N/ W6 n2 O/ }6 { */* y% d9 Q$ T! C
sync ();
6 e0 Q2 G+ I3 |2 c; ^" G# ? *addr = save;4 J7 L$ a# k$ Q
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
+ a3 k4 s. e( X9 s; j addr = base + cnt;
" k& i9 l4 V& U% }$ _8 C sync ();
1 D" z+ T! ~7 S *addr = save[--i];
2 h/ n% b1 o: M' W: f" u }* B; n5 F! K R, x7 a3 U8 ?4 {
return (0);
! ?1 Z# M7 q: A- j9 c* e }
, P$ j7 c E; v- J3 h% j7 M% w$ K/ k
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {. @ `4 C9 G/ Y. _
addr = base + cnt; /* pointer arith! */
- Z/ d) B) |2 i! O9 |, ] val = *addr;6 d3 Z! ]$ R5 I9 y
*addr = save[--i];1 H: k& b% \/ d6 a4 i- |
if (val != ~cnt) {
4 y3 G3 ]2 q8 j' ?+ W size = cnt * sizeof (long);
4 E5 q( R( {- ^5 |- k; ` /* Restore the original data before leaving the function.% { j& K0 o& R D% v; V o
*/
6 I* b& ?9 B: O1 d; H8 \ for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {; T8 v5 f8 C1 u; Z) o& w
addr = base + cnt;5 C4 C6 j9 N9 v
*addr = save[--i];
0 I, n: h! Y5 Q# m$ S) O5 }+ T }2 v8 _. s# w9 c6 ]; X4 _
return (size);
% a; q/ A. D, P6 Z( R }
4 q/ M4 u, U3 b/ b& d }, ?3 a& ^" M. r1 q) s: h
; w0 c# w3 c6 m: {9 C return (maxsize);. W+ ]' E0 ]" b$ T4 X4 o
}$ m( H. U! D* ~
int dram_init(void)
( M Y4 M6 P: N# y9 U6 j( d! W{
% m" L. N2 N( k- ] /* dram_init must store complete ramsize in gd->ram_size */, `0 N. o: i, _2 O
gd->ram_size = get_ram_size(% l' H3 Z! e" `1 B
(void *)CONFIG_SYS_SDRAM_BASE,5 m- i0 P+ c B% u. C4 o! J
CONFIG_MAX_RAM_BANK_SIZE);
: }. n4 y$ i! O. r1 k8 e% G return 0;' U" S9 g2 t* m9 _0 A! O
}
$ y7 c C# q6 J$ S) X q; s8 P4 l+ a; ]6 u2 Z
) i+ Y# Z. G) S; M/ h3 Y9 X% k$ g9 f) d, F- F
. r# m8 v6 D: q+ @" j$ QFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!% K2 A. F) d( x- Z/ i6 D" i
* p. |4 M- W+ p! `5 F P8 |, p
/ O- q6 v( X$ F# a+ B* A& a2 ] w) s& h$ k1 T9 ?
|
|