|
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
. w6 K( I) ]* R5 R1 k1 J/*4 [; K ^. K2 t$ `
* Check memory range for valid RAM. A simple memory test determines
- V0 b9 `) d5 }7 i* the actually available RAM size between addresses `base' and
$ H1 r! s2 V9 |6 C* `base + maxsize'.
3 Z4 T1 {* w. C, u4 i1 t*/! K; p& o" c( [& g1 k% }
long get_ram_size(long *base, long maxsize)
$ |* S" r1 Y; X3 N2 g{
& h! g, B/ }% U! Q volatile long *addr;& y8 N7 r: q6 S* T- X! [
long save[32];
+ M# k- J. J- L8 \" U' H8 S long cnt;
5 i/ K/ e* A) e" u long val;3 i5 `2 p5 ^* o; d0 s: y2 z
long size;
: y8 h9 B$ V! H- U, O int i = 0;
$ B9 J4 S# B$ A$ @
* o) d- c7 c4 t& J$ V [( y for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
& @& n0 P3 G0 ?; |2 g addr = base + cnt; /* pointer arith! */
; w0 U" x. N! B/ ^$ _: h4 l sync ();3 y$ `7 ^3 K2 D/ Q! X' o
save[i++] = *addr;/ c) A" r% T: |, k2 C6 m
sync ();6 b4 }& z8 l4 H$ L- P- N0 ]
*addr = ~cnt;- b( \7 [7 C7 S/ K4 Q8 U
}- v) _! v+ G- Y
7 d+ w4 E1 e% A- |; R2 q addr = base;
5 V- w$ _! @: D sync ();
" H4 _! t- W5 g2 k save = *addr;
( L! n) ?( }% H+ Q/ c8 q sync ();; E. q' j# ^ K! J+ ? z" B# B% y
*addr = 0;. s- O/ l6 q7 H! S8 e
! m0 }! J+ k9 J8 i/ _ sync ();1 D4 S, n1 Z' w$ r) ?1 r
if ((val = *addr) != 0) {$ ]% \/ y9 }5 M5 C# V0 s
/* Restore the original data before leaving the function.
2 L+ X; A8 ` K2 X& y2 S6 H */
3 o& m4 I4 d& i/ b2 ^ sync ();
4 e8 h; O! k# Y: P% U% M *addr = save;
' l+ K5 l" |2 q( P* U& l7 n& I& ~, y for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {' w& y: A) Q7 |# O! j
addr = base + cnt;( Z5 _4 K0 J9 i) x) z$ t% h. x
sync ();; x7 C7 ~1 l6 N5 G( ?
*addr = save[--i];* b4 ^2 N0 L4 [9 C4 }1 e
}
7 a6 M; V5 A8 M4 Z. H0 ^6 q* o, r/ l0 ] return (0); M8 O- A! b0 q/ a6 |" @1 G
}" o6 |$ _8 J" [% l' g& G* A
- Q: p2 b- l) b for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {+ h3 p+ C* H( B/ J
addr = base + cnt; /* pointer arith! */# P* r5 s! E# k; b) g8 F! {
val = *addr;
' Y/ B3 H6 p4 j' y1 ~. h *addr = save[--i];: X6 V9 U/ }# T" l0 Q& i, R, j4 h
if (val != ~cnt) {
" c9 [4 T4 G L1 Q* m. Z size = cnt * sizeof (long);: ~/ z, w- p3 x4 w
/* Restore the original data before leaving the function.
0 e5 b1 \( F1 f2 z$ a5 K- [7 I% b */
! M& f1 ?( i# t: s2 e; n( @0 ~ for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {6 R0 Q) v/ N& X% v0 s( i
addr = base + cnt;4 i$ p- ]1 C/ P3 N5 y9 W: e. t
*addr = save[--i];
7 | C4 m( l1 s6 f3 w. Z8 ~) e }1 `1 p- F2 J: a. s9 S0 C$ O8 T
return (size);
3 r! z" C- u& _5 y0 L% v }
, J6 q' H. t7 G% G+ G3 }- }7 {% @ }
3 d1 D6 @# ]3 x
8 _( Y7 z) P, f* U- j2 g9 D return (maxsize);4 J3 j1 @. ^% H# q/ C! G% v
}
( ]8 ^3 b% ]' m3 kint dram_init(void)7 d* X7 z, G5 I5 f" Y: j# ]
{
; A6 G; X' `1 Z8 I& ^6 j /* dram_init must store complete ramsize in gd->ram_size */
2 M) G3 a0 W i% a& n gd->ram_size = get_ram_size(( i3 F' l1 Q. W5 ^
(void *)CONFIG_SYS_SDRAM_BASE,
1 x+ @3 G/ V" }% C CONFIG_MAX_RAM_BANK_SIZE);4 Y: e" f7 l- @: N
return 0;
* j5 a/ h$ h5 w! v}4 E0 A% c3 x t- k
3 t; s$ { f1 k9 `/ L2 E& M6 k/ U. J) r! Z
7 o9 M8 ^7 |# l& F- v
# y* g: W4 e& X; ?5 m# X6 A. a5 kFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
8 u$ R% q* B! e, r
* J2 W( R: G! v; Y+ P- i4 v, s7 _% j4 l& u2 [# i8 p$ _
# ?5 H6 @6 B4 z5 I7 Q |
|