|
|
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
( c: c3 D5 I9 e& u6 R; r/*
+ {" x# n6 w$ v7 x: m e8 m* Check memory range for valid RAM. A simple memory test determines' J4 p" {6 O; k1 _& V1 Y( ~
* the actually available RAM size between addresses `base' and/ i7 j. u$ l" i( Q* K- y c; q
* `base + maxsize'.
: a- `5 I( V+ \" k3 X! J*/" `* K, x6 A7 \7 X0 a5 W
long get_ram_size(long *base, long maxsize)* g( J5 x$ l! t1 V, k
{' o/ \1 C( F8 R" \6 f8 A% {& X
volatile long *addr;* h+ B( O2 A4 m' }- C
long save[32];. O; Z& x7 o" l
long cnt;
0 s5 `# _6 e# P; u1 z4 ? long val;
4 ^4 r+ F4 k" O long size;
$ A7 B! V$ I% {$ W3 Y1 h3 f. c int i = 0;
* H7 _# U, o7 U, ~2 t/ O8 y8 H* a, V3 I' x# j$ G9 T
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
/ C) a6 @8 M2 @1 c7 Q* R$ b addr = base + cnt; /* pointer arith! */+ d1 |# q/ [( H" c
sync ();/ P1 |9 J' ?& M c7 ^! E
save[i++] = *addr;: b/ C- R. D+ Z- O% m8 [
sync ();
1 y2 K& w* I4 ~6 C' C, b( Y *addr = ~cnt;
: U9 e2 V7 X* G. m) P! a }5 C! n& g/ {8 u' H5 C
1 W! y. i, k9 z5 }: P
addr = base;/ P+ S \ h: \ K1 x# E
sync ();
& P/ L o0 U- N' G- {5 }, i$ }6 d save = *addr;% @( H0 a( f' ], W. Q* Q
sync ();: z2 O% r* U2 l* q& j
*addr = 0;
5 j" x8 O& V" k8 I% F
& e N3 B. d) N& m4 s1 { sync ();
9 }; _; G7 ]9 O+ g if ((val = *addr) != 0) {
/ B$ f/ g- l% E2 u$ o4 g5 t /* Restore the original data before leaving the function.
; r) s) p* f; g8 K& p */
7 z; N, y. C7 ?/ b' q! G7 y5 }2 [6 [ sync ();
' \( x2 U" B' L' s* k4 l# g *addr = save;
0 a0 r- s0 J* h: Y# u2 y, E% i; p for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {0 f1 J& P' L3 b9 C3 G" \ y
addr = base + cnt;. ~0 q( U+ V O! J) ?/ C- n4 p) v& z% Y
sync ();) @0 a$ T7 s$ b$ J8 `5 \) D) P
*addr = save[--i];: g$ S8 j& ~9 ?0 W7 }3 C7 [
}
5 A5 A. Y# ]% R5 b. I return (0);% F' ^# b p; [. F
}
; p6 J0 C, u( E) `
; p+ L. Z/ M) ?, l% E6 b4 c for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {$ c% ], O' C" a$ J6 ^6 T0 e
addr = base + cnt; /* pointer arith! */: A/ u, G! h( N$ c9 c) }/ K8 F- ^
val = *addr;& A6 M3 i& b$ ?* A
*addr = save[--i];
* P1 j- L/ X. ]+ F- I8 W) \2 w if (val != ~cnt) {+ I2 o0 p9 F. H. T* m
size = cnt * sizeof (long);
8 D# C- R: d; k3 D/ T# K6 @9 d( `7 n /* Restore the original data before leaving the function.
* p9 M7 i5 j7 ?* p9 g: a */: ^/ m$ E8 ?! _, `& Z' Y
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {% M+ J/ W# q" F) F# N: E/ e
addr = base + cnt;
% ~- j: E9 T9 i6 o0 X *addr = save[--i];) D4 g/ R0 _# n( P
}
% ~" N6 x2 B& W- ~ z% o return (size);
; o# B9 X. f) H% g }9 K- }1 v+ ?5 q& {/ E( ^
}; I6 S# Y4 V. z$ Y) _4 I: `5 y
6 M" H$ @: t: X" { return (maxsize);9 b6 c. `0 g9 k6 w" a& Y
}- p: b: m1 C$ }
int dram_init(void)
& v! V3 i: }8 S$ ~{
5 s6 {' [1 y5 @$ q2 ~3 D /* dram_init must store complete ramsize in gd->ram_size */
0 ]- `: g6 {, S/ H* b gd->ram_size = get_ram_size(3 R# V4 l3 Q( |* a( P1 W
(void *)CONFIG_SYS_SDRAM_BASE,3 K$ g* f, y) D4 b. A
CONFIG_MAX_RAM_BANK_SIZE);
, t) {0 v3 n8 h! \- j0 u' B return 0;/ y0 H! y% ?; Q/ J; F1 [3 D6 d
}
% n5 t* q. F* k- v- P2 ~; w7 r+ T7 t7 \7 h+ k
" c2 E( l+ |: J7 `' W
' Y1 ~& p! ^# m/ N5 p, ~' b& `
' g; n# B& k. f8 [! X2 |" B8 s( T
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!& |2 Y1 ?( ~' i# C5 M1 P
9 F8 x9 z5 ~# m
5 f6 G$ e. ]( Q) b9 a
# X9 m& g+ t: y5 V7 h' Q |
|