|
|
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:) ^0 e. D6 g5 f: {0 ~' g" N
/*
2 C& a6 }: ~. H- F$ |! F* Check memory range for valid RAM. A simple memory test determines- ^5 g C6 t7 Y( d4 W
* the actually available RAM size between addresses `base' and5 s$ e3 I0 |, [" f, T
* `base + maxsize'.- y% _7 I* }3 a
*/$ n0 S1 s6 ]! y
long get_ram_size(long *base, long maxsize)* @1 v& h( R4 ]$ x6 [) b/ u
{1 L& f8 S7 r" h1 p
volatile long *addr;# B1 g' d q' T- E' D7 [1 t
long save[32];: a. Q M. m, G5 E
long cnt;/ y1 l! G. ^" U3 I0 a; T9 m
long val;$ |7 M: k4 T l- p+ @
long size;
2 ]* Z# C: [# M# M int i = 0;
9 Q; X3 W; q& u1 y; k# ~" P1 N+ b, B
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
- V/ `9 [, \( C7 X) G2 ~8 L addr = base + cnt; /* pointer arith! */' D( }" J& z* f- w5 O5 Y- l
sync ();1 g& j, B7 U' J, p
save[i++] = *addr;' H; d9 l0 p# r! h! G2 @8 z
sync ();
, B0 U7 O2 A" `6 C5 p *addr = ~cnt;
! ]( @# O; ~7 E. p. t0 L }8 y _$ S' j0 T% h& r" n+ b
8 n* w3 w2 ?: v% ?' g+ q9 z/ m
addr = base;$ J) |0 \. i: F7 I; i. k" b& q
sync ();
b+ D/ o4 ]; a& {, @ save = *addr;3 g: U7 c8 u" k0 t2 m8 w2 w# c
sync ();
' k; F5 S# _6 C7 T+ |/ _8 t *addr = 0;
; i4 {( B' [# o- b: N& A, ]$ X7 S4 m& m
sync ();
7 j6 ?' m# k$ t, k3 v if ((val = *addr) != 0) {
( N$ ^( D+ p+ _ /* Restore the original data before leaving the function.
* f6 }5 x# M5 D9 p( N2 Q+ o */. s# G- Z7 H1 r% J' g( w
sync ();1 o" Z8 y+ y$ I R; i
*addr = save;
/ n7 @6 j4 Q/ r& o* w for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {# ^+ m( Z u" G+ L- N
addr = base + cnt;7 l: H. z; r& O3 ~
sync ();
& _- J6 l1 h" ]3 Q' X6 m% J+ p *addr = save[--i];
5 q$ b; u& F3 I* N9 n0 m }+ I; p$ N. e4 [8 U) `
return (0);) w% m) a- h' k! E( m
}
. A2 r6 r, x& n9 t' A
2 W1 Q7 I# Q' _ for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
; A4 l5 W1 a7 R! W7 j! j& d! ~! z addr = base + cnt; /* pointer arith! */
1 Q3 w) Q; u4 J" t" ` val = *addr;( g9 }) I* I. i, F1 x% q
*addr = save[--i];
# R# Y& c; S, A if (val != ~cnt) {; \+ f; s0 }# O$ m1 W
size = cnt * sizeof (long);- B! y, w, R0 `: ^( S' w7 a
/* Restore the original data before leaving the function./ J( i7 \+ I) Y
*/
. o5 x9 V7 z# f! i, M$ ~* t for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
- P, b! w3 l$ Q& g( G0 ]6 V addr = base + cnt;
' Z5 X: J$ p A/ `) A. B *addr = save[--i];) C- S3 u3 y* s7 j, ~4 B
}" G; T' D, w/ `# G9 w+ J0 J
return (size);
" h0 o' t$ g: ^% b }3 m/ J8 W$ z/ ]; { d! \) K1 J- \
}' F8 \1 U; J. b" k; t
; F: ^! @8 E% U
return (maxsize);2 \+ J( y3 h. U7 O) N( w! _/ J
}
% m9 D, S: a5 b0 ~8 Tint dram_init(void)1 F0 H( \6 h& f( R
{1 I3 f! k" Y0 ^% E* s# M
/* dram_init must store complete ramsize in gd->ram_size */! J; g7 u1 ]1 h* T
gd->ram_size = get_ram_size(
8 X" f5 F& b8 T3 C4 c (void *)CONFIG_SYS_SDRAM_BASE,) q" @% Z% _5 f" E: f
CONFIG_MAX_RAM_BANK_SIZE);
4 w* M. r; G ~3 |0 ^' C return 0;
5 X0 }+ A+ t7 V J}
6 N9 X( {/ \* l" G# t6 z
$ S6 e) x5 R) [
. x9 _+ C5 {5 K$ y7 T7 j
4 S! L# K% `' n3 c2 _' x# y6 v
! M, ^' c @) o# ]' PFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!% t3 k6 Q) D: `& h' ?
5 }6 d; r9 |" Q4 ^/ G; `4 y2 K$ r& ]7 U5 Z X7 Q% W+ s
6 k- t+ G. g/ W! \! p |
|