|
|
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
2 Z" G6 k r# S9 s4 j5 W. I. H6 x/*
- D4 f# c2 ~: ~8 d, E* Check memory range for valid RAM. A simple memory test determines
w4 ]' l# Q8 R* the actually available RAM size between addresses `base' and" {; M) [( p- ]4 N7 e8 M
* `base + maxsize'.& X3 {1 |1 ]6 k& D0 C
*/( J& O: }0 x& J2 C: ~
long get_ram_size(long *base, long maxsize)
' y' i6 U' s2 J5 H' U3 _3 C7 k{
' |& G; B& p8 N) S t8 D volatile long *addr;
4 ` ?- u3 m1 \# G1 | long save[32];
/ o, g' h5 P2 J5 m& z' N long cnt;2 J4 N+ ~, y5 K! L
long val;
% W: ~) e. g4 ]. `# G long size;
' g, M6 b( @; _3 p int i = 0;. |1 K- k' t: ~/ r
/ p4 i0 B- j& |0 t# Y% z
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {9 r! b x5 {0 F% D- v. U! C
addr = base + cnt; /* pointer arith! */
, ~2 y$ J4 c5 ]9 q, o' G' u sync ();
+ B, m2 M# t7 s- N% {' d7 O* S- m# K save[i++] = *addr;
( Y; l/ u( y! U0 a6 z sync ();1 N/ b$ y4 j1 a) G* t" p
*addr = ~cnt;
8 b% I: f- N" P2 ]" h- h }# r; m! E9 t5 \3 n! o5 i' G R5 ]
2 ?# o: `8 \( j5 X8 v# }6 ]% b addr = base;
6 k* @ U0 q6 J! k$ r0 c {6 Z sync ();
/ k/ ^* y& }$ @1 {, K J8 d save = *addr;: f, K8 [& Q6 o. n# G
sync ();8 l d- ^7 _) K( r6 J. p8 [0 B
*addr = 0;$ R& s3 n; F+ l3 |- ~* G
5 f, A. y; A' F
sync ();/ {# z. k# C I( d
if ((val = *addr) != 0) {
K& s4 V9 Q( D a$ I' q# [ /* Restore the original data before leaving the function.
8 v, ^% K/ z* L) m7 e: t3 V4 f */4 C8 c m& \' n
sync ();
: a( L! X P" f9 |+ g *addr = save;: w6 T' ~2 f$ Q
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {; ]' |) z6 N" n z* [
addr = base + cnt;: n6 ^. J2 F$ e; D
sync ();
# l g( c4 f5 }" J *addr = save[--i];
( Z, J# h0 T. j( X5 Z- i/ G }0 q$ d7 C- U% c! e
return (0);7 b0 O; E' |" h: L( K- `4 W
}% l+ }# X3 @ d0 W5 H9 ]
+ n: m! \3 H& }1 k: t$ W
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
2 U3 g- v. ]+ L$ f: r, Z% V addr = base + cnt; /* pointer arith! */6 d, O3 q/ |% M& c A
val = *addr;
' t7 b& H3 c; D2 l7 R3 t *addr = save[--i];
% c; x, d. u: w if (val != ~cnt) {
0 |6 s0 _' `8 M! @ W size = cnt * sizeof (long);7 c3 a: X3 A/ E/ z+ L9 L
/* Restore the original data before leaving the function.
! u6 _. u2 ]6 ]5 [2 I! \ */
Q7 \" \ S9 _) D, {3 a for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
6 K% P* m8 @ `& D' z# S8 | addr = base + cnt;
! }( m7 {1 z* o- P/ U4 I* G( Y *addr = save[--i];4 r$ I0 Z; Q2 o
}
& [1 ?3 T' ?* C7 @/ q" ] return (size);
2 z) @5 N/ B' G5 K& Y }( j2 B' @9 X$ e; E) X3 Z, c
}
# k% ~3 r0 o& _2 e- N7 y0 _7 U' U4 l$ O$ m
return (maxsize);
3 U, H M# Y. {1 r' T* f! C# p! o9 X}
6 p. u, I: L6 q n O/ Jint dram_init(void)9 ~3 S) n- v( ` U4 W
{
% I/ U Y$ b7 l# J /* dram_init must store complete ramsize in gd->ram_size */
0 U& [9 [* R3 X5 f( u! u+ X gd->ram_size = get_ram_size(3 g6 i" j, E5 D n/ m
(void *)CONFIG_SYS_SDRAM_BASE,/ B/ a! N* _5 w% ~1 g
CONFIG_MAX_RAM_BANK_SIZE);
9 i* C3 F, ]& Y/ L return 0;. G9 M2 l/ y$ W
}
9 L3 \. @2 X5 K4 n1 b" w& E2 _ `2 ?0 t8 y1 S
9 ?! s4 \5 a: f6 U7 g( c4 z+ b( N
: r/ P" `3 v3 S3 z: M- T
8 r/ O' ^- Z( y0 G3 S# [FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!, ~- c/ H, Z& U" i6 O. r+ C7 f3 o, R
C) ^ D7 e- x' S% d. u& I6 X3 U& b; Z' c O w( n# r' v
8 o& q6 ?: K9 ?, t$ v# m! e& ~' Q. G |
|