|
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:& G* A1 l7 ?- P, |) ?, O
/*' C9 K8 ^6 N. O) B
* Check memory range for valid RAM. A simple memory test determines1 \9 M. ~4 _& k6 H/ `. @4 X
* the actually available RAM size between addresses `base' and
* s$ Y9 I# I! }* `base + maxsize'.! B7 I M6 H3 h; P: U4 U; F
*/
! R2 S5 m. S) N% h" `$ @$ ilong get_ram_size(long *base, long maxsize)4 I$ b8 G7 m9 V9 {3 T
{
% ?: L0 f- @& S, x4 j volatile long *addr;
1 @# W ]) y+ W+ I long save[32];6 G8 n: n& Y# o# i1 {% e& K
long cnt;
3 f, Q } P2 F6 M. ` long val;7 k1 S0 R) ?% W
long size;6 w& \- E$ U, f: U, Y
int i = 0;
' ^& V" m0 `& l M1 `# o# s1 o
9 h. K- P% V% u# E) }2 ^" _ for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
5 S( n/ N; ]4 u5 `5 I$ Q addr = base + cnt; /* pointer arith! */
- m' s& G; ~' }5 B sync ();) K" M6 }4 c* J6 T, f" P" M4 _
save[i++] = *addr;
+ d* z' k7 s- F sync ();
9 v8 F9 z! w( C- K6 ^ *addr = ~cnt;0 d- A4 H/ ~4 v" q" r: r
}
% e" C) m0 D4 r. _" M+ k7 n! ?7 R, g& E# }1 Y& e
addr = base;
) N1 I3 T1 E4 F9 t7 K- C sync ();+ V5 c$ {- b- f0 I N% e! l
save = *addr;0 q; y6 G( N2 y& s3 e
sync ();
# f& L# X0 P M7 O" o *addr = 0; L, ?: h7 Y: D. i. k4 b
' o* E$ Q0 w! R& B$ J+ U4 L
sync ();
# \- U) z# U8 ?7 ~; T; h if ((val = *addr) != 0) {
0 h1 n3 g0 H8 q/ X0 |. _& r /* Restore the original data before leaving the function.
; t) [& q4 l: J6 V */2 R7 ~- L. L& O0 {
sync ();
a( I6 |. Z% L; `+ t6 f# w *addr = save;
" A: s) m! V3 {& s: m9 f; I for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {2 S9 Z$ e' R8 W/ n! `
addr = base + cnt;+ x+ J; B; J- ?
sync ();. o) r& J. a& b1 ^
*addr = save[--i];5 [: n, y5 t' N. u
}
% p( w5 h/ g( F' _+ L% z J$ F return (0);
8 G5 a" [( n0 m5 ]6 B4 l }
' k' s. l* W& n$ j/ R7 B, I) Y4 d2 e$ z# X4 m) T
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {. R( ~, ~6 G9 R4 S3 r* n0 J. W
addr = base + cnt; /* pointer arith! */- r2 W) f$ n3 ^+ T/ P5 g
val = *addr;1 G o5 O3 Y% W9 o$ `
*addr = save[--i];
! s% |3 ~. s6 J6 }1 \ if (val != ~cnt) {
; W) }) V$ f/ i) O; j size = cnt * sizeof (long);
- ?7 P: D3 J) b) x8 r! | /* Restore the original data before leaving the function.
4 p1 Z+ h) h, n- H1 R% | */
9 G9 `; u4 }% O0 ]* n for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
! C- d0 w* f1 A addr = base + cnt;
6 D. M. T& T& B7 H *addr = save[--i];8 m' y* ]. J! W7 v' t, e V
}$ |0 d. T1 O# L. P; b% S
return (size);
5 |* q2 p. l8 q6 J% v; o2 n$ ^ }8 A) x: K( l: Q+ ~
}
; C3 C' h$ R3 `$ O; X& R) ^5 o
2 P4 N( @- U( _; r l: @6 J0 d$ C& p' N return (maxsize);
9 ~0 u* F. s" z) f% `4 S5 N6 Q0 w}
! K) e% }) {5 c5 w9 S6 J: Gint dram_init(void)
* P2 K: ^4 j$ M! w{
. M$ m& l7 m7 u$ W: K /* dram_init must store complete ramsize in gd->ram_size */
# c. W/ Z% @, c. P) T' I- d gd->ram_size = get_ram_size(% F0 G. Q* c& {- r
(void *)CONFIG_SYS_SDRAM_BASE,
! e2 z5 a' v( Z& o) I CONFIG_MAX_RAM_BANK_SIZE);) C/ C. V% v; L+ l
return 0;
& M# J. Y9 p- e5 K" Q# L}& q% K+ p% x1 b5 r" p) |; z1 R) I& T
+ S$ Q- ~- P1 o, U' C
0 s$ F% P) Q% E$ l
' L8 {7 t: Q+ e; J2 z9 h# t$ ]
# `" p0 r& F sFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
3 ~$ K9 H$ h! H; d5 O' ^/ I) a0 J5 ^; c9 a9 r) s' [
! R) C* }9 S0 d! _5 A
0 w( c0 V1 @" J; ^1 O6 S |
|