|
|
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
% w/ Q& @; ?8 J7 D/*2 _- K. m2 d! ~( l
* Check memory range for valid RAM. A simple memory test determines/ i* \3 b, F) q* Q' t
* the actually available RAM size between addresses `base' and
$ t( K) J9 P! m) v* `base + maxsize'.
( [- ?5 S* \+ ^( s*/
3 [5 i" B+ ~( ` |7 |long get_ram_size(long *base, long maxsize)
4 G3 A' C+ t9 _& a) O/ O2 J{ g4 Z) u4 a, R
volatile long *addr;
; u d* E; I4 X! z9 P4 m0 s long save[32];
' S- s1 I$ ~; M' w long cnt;
: C1 n; }8 X1 F* x long val;4 h3 G& Y1 O+ P$ U
long size;: |* t i5 C! d* k8 e g1 B
int i = 0;, {4 B) q. U+ X5 s6 |
+ G" ^- _2 y3 F3 f
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
2 D6 ]0 m; T1 G4 @. r addr = base + cnt; /* pointer arith! */2 ?3 Z1 y1 K' I; W/ [$ e
sync ();
% ^* L9 X. [" {9 X save[i++] = *addr;
! g2 D. a/ I2 V; c sync ();
m' U8 R& M8 C *addr = ~cnt;* y/ J, v' W5 z( V
}3 u [% ^: ]5 w0 Z& k. g
. {' q4 c8 S, c0 F
addr = base;0 l0 ^8 {: `8 J2 t/ Y" S
sync ();3 o2 |6 |) {5 S' f7 f# ?6 m
save = *addr;
% Q% s- D2 j3 j6 {2 K& F0 [ sync ();
& q- P. z, T8 p& y *addr = 0;3 w" _, d i F5 @! Z
1 m. E6 ~7 i7 [5 [( J) U; K sync ();
% {7 t1 `1 n' C2 E- o. e: l/ Q if ((val = *addr) != 0) {
8 @; X1 P7 I# F; g( a L% U /* Restore the original data before leaving the function.
; f5 v) T8 u! b( M& K6 x */( T% u$ q' Q; F F
sync ();
- B' L& A/ q/ d- V *addr = save;) V8 @2 |! O. |( {+ y
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
8 n' C I" ^# v# t* w6 L addr = base + cnt;4 U& E" p, k4 N: j& O W
sync ();
3 V C4 d z5 x, ] X3 N& Y5 X *addr = save[--i];
1 l9 h1 J5 Y' _6 t }) s" @/ i8 }+ m5 n2 F
return (0);6 e8 W, p& P4 Q5 z
}; l! D8 q$ E( p q& S
6 P; ?6 a. i4 W3 e! q+ B for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {, T" I2 n0 F0 B0 T
addr = base + cnt; /* pointer arith! */& v) ^. [( B; w2 u
val = *addr;
/ E+ ]6 } y) R! z. h *addr = save[--i];
& c$ B" U+ h9 ?' j1 `; Z8 _# g8 V if (val != ~cnt) {
7 \- e. [2 ^9 d9 @. v1 g# Z size = cnt * sizeof (long);
6 t* b+ F/ a+ D% U /* Restore the original data before leaving the function.0 K6 [) \+ U3 W0 ?3 M0 \
*/$ z6 I, o5 u6 O: a4 l( d7 T
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {3 A* a2 h4 K, s* M, F
addr = base + cnt;* T3 F& P. l# r2 J0 i1 n
*addr = save[--i];! P Z1 V F, P+ w; ?* ~+ b' \( G4 f
}
0 K- x: t5 }% s5 c# d9 S, w return (size);- [$ }% p5 F$ l8 o. w1 t
}1 w* n1 S2 p n4 a
}5 |9 ^4 i5 }( @0 ~4 `- @
- o9 a) h" N& m$ ~) ]) D! u
return (maxsize);+ X5 v2 u! ]- g% s; _2 {4 W0 t
}. g; K! D) O. r' _% C1 t2 G+ [
int dram_init(void)3 j- o. b; p3 V
{
" S* A% N" k) U2 r r! D /* dram_init must store complete ramsize in gd->ram_size */) T% _5 _1 K* H. t, K
gd->ram_size = get_ram_size(
% k" S, X# L: H4 V4 P+ M9 K (void *)CONFIG_SYS_SDRAM_BASE,
3 s" j' M6 [" O( s% b) o1 I CONFIG_MAX_RAM_BANK_SIZE);
2 t; b7 r, |5 _8 e return 0;& h! n$ F+ ~5 H6 m; V
}
- i/ i( q! i4 q+ ]* n- t6 \0 w
0 K Q. f& W/ e# A0 r
6 c9 w5 C9 d$ v9 F% h! x
2 f3 n* `; N( C4 R( ?
4 z8 A& H2 e CFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助! K* d- S8 M$ j! J
3 K" q' m/ Z2 W. ?6 s( E& E4 \
5 t; s: ?/ [; b' Z' X
) K+ Q/ K9 W S8 N7 n |
|