|
|
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
1 b& t: X% i9 z$ x# o/*9 S% ]" l6 W. Y8 a5 d. ^3 D( C
* Check memory range for valid RAM. A simple memory test determines5 o) N% l5 E' S* X- p' c3 L/ d Q
* the actually available RAM size between addresses `base' and
- Y* q4 Y* C: W0 D3 ]2 F+ R* `base + maxsize'.
1 U$ r5 n% w7 Q* W% |*/" W$ Q! ]9 Z' @8 h8 f( S4 J
long get_ram_size(long *base, long maxsize)
, n v9 H. g4 H" L7 x @" |& Q{4 S/ l( F# p+ K, o6 b
volatile long *addr;
) Q: @+ }! k; B- v: t5 R2 v5 L long save[32];
5 g% g" H( }; L7 s7 i- y long cnt;
$ f) }% _/ {6 B: A; b0 W& o long val;. E! z/ i. @7 a( ^1 ~6 Q
long size;
1 `5 }/ O9 q* j% v int i = 0;) P6 m9 V9 U3 x5 j6 }. L* Q
y2 |- r+ _# E# R# B- q
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {' a8 a$ u- O4 ~4 I
addr = base + cnt; /* pointer arith! */' P$ h7 D$ r/ ]
sync ();$ H& O! r3 X8 j1 k* d1 ^
save[i++] = *addr;6 W3 h/ X2 S1 D
sync ();
6 N$ x: t$ D% @ *addr = ~cnt;6 v1 ]' B' r2 P- l9 v [# t& p# H
} ~$ G" Q/ Q$ |+ [) P( U. E$ p
( w1 S3 _" S$ v ` addr = base;
a- k$ ^: M: b; | sync ();
" H! u; I( \. ~% P! s save = *addr;0 h: T1 C- b2 |9 ]3 u
sync ();
' q7 w8 Q" x D5 L+ ~& X. s/ r *addr = 0;) }: `+ v' L3 P5 N
7 u" |- H+ l% q0 X! C m sync ();
0 w( K/ N& H/ _1 J; M# Q( x8 o if ((val = *addr) != 0) {: Y: c+ o9 R! _. g
/* Restore the original data before leaving the function.
+ [$ u8 @( j7 M. X- A */ q2 o) Y3 {1 P6 m+ [7 W/ d
sync ();
2 [' r5 c7 i% o *addr = save;# ?8 Q, k+ r0 S/ @
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
4 j: K6 e5 V8 G" n+ q) E& D addr = base + cnt;
+ G$ G: C* D& C2 ? sync ();+ ]: i- p3 R$ E% d
*addr = save[--i];
$ T2 ^9 X2 s1 {. l0 A* s6 C }. t9 J; z5 M8 h1 e# w
return (0);/ x# |% D5 `! I$ | P
}. e; W0 A. |" n5 c2 {- I
, ^3 r' U6 N* t/ q' ~ for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
9 d% R: H; o2 ^& ~! @4 A addr = base + cnt; /* pointer arith! */
) o8 Y& R h$ t# ~; o val = *addr;
5 @9 r5 [* A' ` u *addr = save[--i];# E C& ]: H( |5 _2 F$ U
if (val != ~cnt) {
* j! F2 M, A4 |, D; m7 g( m size = cnt * sizeof (long);
! c: o1 Y# L3 C( ?" _& G0 L0 O! r /* Restore the original data before leaving the function.# J6 r _4 \$ Y* \
*/
3 v4 s$ j8 T! ` for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
1 l2 x" n+ O- U9 v3 T' d# I5 T addr = base + cnt;- Y$ j" ]/ Y/ A$ T8 H o
*addr = save[--i];& B8 r5 h6 m+ W, _2 k8 b3 F
}( I* f+ v, E! d6 T- p/ D; b
return (size);
$ c0 q1 L7 m$ w% V+ G9 H }& z9 v0 B. D$ O" N, V' G9 R6 r3 S
}+ c/ I: M! v x9 a
/ `. }& G$ l7 H9 W) u
return (maxsize);, w, B, X+ D8 u( J% D
}
& Y, L" O4 ~% Q7 t9 O, n3 B' c& Pint dram_init(void)
7 U- H+ w$ S" Q9 m" | `2 e{
; x7 Q c7 \) A7 _/ s1 n /* dram_init must store complete ramsize in gd->ram_size */; W" g9 `, N) y
gd->ram_size = get_ram_size(5 p" U- j( ]2 P3 f9 @8 ?
(void *)CONFIG_SYS_SDRAM_BASE,
8 {; w. @( \0 w M9 F CONFIG_MAX_RAM_BANK_SIZE);
8 D0 K; N9 q o) |( k; p# ~/ [ return 0;2 m4 L; c+ ~2 n) m I% @
}% X# K) ^5 N8 A1 \; w7 i
8 Z X3 \5 P# S* R; J! S
p8 W, G0 Q6 P3 Z/ J8 m, t! P. a6 R _. w7 G
3 G+ g) K! |* K: ?FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!2 ~: h, h1 l9 W3 [. t
4 P( j$ R) ~0 W) T8 L$ S- `6 P9 w3 o( L' ]. n
3 Q5 K5 P6 f. p" u3 ^; r |
|