|
|
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
$ P, W0 e0 r0 C; ?/*
- E5 q; j: p6 h8 [( R' H5 s* Check memory range for valid RAM. A simple memory test determines
% v7 G" J4 j _$ A) q+ ]* the actually available RAM size between addresses `base' and
% e2 s) j- N; ~& n" ~* `base + maxsize'.
2 K9 S8 z" `, y F; ]- N* G*/
( X& c% z% T- klong get_ram_size(long *base, long maxsize)
- |5 R3 L) j. `# `2 |+ E. I{$ E& w. F( }8 Y( C2 S0 e% [
volatile long *addr;4 g" J6 v' q4 U4 \0 u8 a. X6 l7 W& B- q
long save[32];
& Z, p* o4 b# d# s r4 H5 B# z long cnt;# h2 E' i, h4 z6 \
long val;
6 ^# N2 g4 s: Q N! Y long size;
# @4 I$ d! u$ o" O: M) I! Q int i = 0;4 A& v- _6 V' m+ _ B
( O" C! Q* U5 Q; R& v2 u- { for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {+ d0 q3 [" k+ S( m- ^6 z7 U$ d
addr = base + cnt; /* pointer arith! */4 U, p: {: P H6 C: C. H& A) H9 `
sync (); M, u- n% a( b. i4 L2 U! Y& h
save[i++] = *addr;1 H% S; l; w' S9 ?6 |
sync ();; X4 C4 g; @- |/ D
*addr = ~cnt; b0 Q& S" E6 _1 E
}$ O# r; e7 r1 r; s; x
+ L4 g, L6 x, i( w* ~, Z
addr = base;
6 X$ v3 Y# n' C: c. \+ O sync ();/ C1 v! {8 l3 Z
save = *addr;" o, k3 `7 q7 i9 b& ~5 d& L: y
sync ();4 d% W& S& p7 I, [0 M& f
*addr = 0;: K, C+ g2 u8 z+ P, c
8 [; Q& V ~9 ]1 C sync ();
' x: b; j; z5 d* P' ?& u3 a; L if ((val = *addr) != 0) {$ s8 G+ a1 }; S' ~- X
/* Restore the original data before leaving the function.% A' f# U/ e- @$ C# d
*/
' W3 H% ]" x. j2 W) | sync ();2 F8 D! P: p" A6 ~* H* y9 W$ c
*addr = save;( y$ x8 `8 F) N1 b/ a( m- {; |
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {' j7 o8 p: ^- ^
addr = base + cnt;
( j( K/ `( j7 O: s$ ~6 H$ [" r# T sync ();+ b6 B+ f! m" y9 Q: t' Y2 t3 h1 a& c) l
*addr = save[--i];7 x7 P, |2 ? B: h `
}
( X b6 @$ b* A0 v return (0);
) F2 E; S/ h! f( n3 J) s }
" k& r2 ~- A" u1 G
* s5 y1 J7 B. _8 U( j, [ for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {3 n B/ Y. P& t9 G
addr = base + cnt; /* pointer arith! */" u' ^/ j& {% ^# n9 q
val = *addr;
# K0 e6 b8 x0 P' l a' T3 A *addr = save[--i];
' [4 d) p1 J B4 q if (val != ~cnt) {! e1 y: K; |' C+ b! E- W/ V
size = cnt * sizeof (long);3 c' x3 f/ m! b9 _
/* Restore the original data before leaving the function.% c' X/ R z Z3 X5 k4 \9 T* n
*/
4 d( U$ U- o; U2 S" e for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {& X- w0 U" y& t% h. S6 X' |* k
addr = base + cnt;1 f( F) \5 I' C, C
*addr = save[--i];
. s+ M! T# {; I/ Q1 D M5 } }" k: H) d0 X% @( S& }: d1 a. q
return (size);6 O& S/ W9 {8 _' `) X8 _
}5 R7 V0 \3 |9 ^9 L- L
}# @* D9 A1 n. F
]6 x" O7 G3 R2 F
return (maxsize);3 c r6 f0 [7 y
}
4 B# o( R3 \9 q: Nint dram_init(void)
7 E) B% j+ \# k T{
6 e Q4 u" B4 d' _5 _ /* dram_init must store complete ramsize in gd->ram_size */2 l8 y1 Y+ S0 F3 k! K( [
gd->ram_size = get_ram_size(
& S5 N$ g0 r5 z6 S, \2 m (void *)CONFIG_SYS_SDRAM_BASE,
( ~$ y/ \8 o1 q/ C# V3 {& h: b CONFIG_MAX_RAM_BANK_SIZE);
+ Z( w# T9 v9 N- S3 ~# ] return 0;
$ P+ N* P6 g% H5 U( N- r}
' @0 O# Z" T: X$ J) N5 ~. g t8 W% n# n8 z j e. s- h+ {8 F
% {/ ~6 w% X+ @1 A6 T l
. p3 }- ^/ Q8 j7 ~4 h, @
; d* R. X) ]6 P& v5 D2 I! g* AFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!) X9 G+ v5 E3 Z5 ~4 |; T3 y; \( s
# a5 m5 y8 @. V) I% ~. z( E) h! X- r- u4 |' Q4 w. s
0 C9 m; p/ r# Y( E5 \3 p& N; |$ ^
|
|