|
|
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
3 p' j3 o, Y) Z2 X7 M/*$ z4 }) j# t7 @6 F
* Check memory range for valid RAM. A simple memory test determines
/ _+ t: Y. K4 g# B0 D8 o' J! v7 N/ w* the actually available RAM size between addresses `base' and1 N) ?$ @4 z. E6 \( Z( X# L
* `base + maxsize'.7 X& v" E7 X4 ?; X
*/
7 l3 J ~. T; i& |/ G, m( k' ]long get_ram_size(long *base, long maxsize)
+ F! S2 C) f3 e& V: X{
' e: d2 K! t3 m/ D volatile long *addr;
, P/ L# K5 z9 p2 F V/ |7 g long save[32];
. b) T- R8 m$ J9 ~ I1 r! V long cnt;2 }, a. y; D5 S8 w# j% `" v
long val;
. E k7 s3 @6 @, g% R2 W& f- q long size;0 s9 E5 H) D/ Q h8 G5 A
int i = 0;2 r% V& f' {* B* n5 r: Q2 ~ A% x' E
( i; Y8 R: v7 H
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
1 q' j6 Y- p: z- {' K6 ` addr = base + cnt; /* pointer arith! */3 c& @$ m2 @1 H* w' s( K1 p
sync ();+ W# a# @. i' Z9 H' r0 g2 M
save[i++] = *addr;
4 F. U7 A& A$ M1 i sync ();
# E$ e* r4 \- K5 Q *addr = ~cnt;. e: J/ a4 ?' p% H) Y% R
}/ K! r$ S! Q: k' v
' L# w5 e0 F1 V' C% N0 q
addr = base;! ?7 m d( o/ I% I, }
sync ();
7 Y" g8 L! G/ a save = *addr;
* D- i4 O7 e' j sync ();
3 ]7 G& G" B% b' H: B; D *addr = 0;
6 m& C5 M- M2 x# a" H
/ B. `2 n. m, m# b! X, ~ sync ();5 v# V( p2 J9 \
if ((val = *addr) != 0) {
9 p+ S8 f; A$ D5 n /* Restore the original data before leaving the function.& s: A5 _( P! |% T2 F
*/
) T' \8 p7 K0 p) s sync ();7 i1 }1 N \# [
*addr = save;3 T" l! ]9 R z5 \: a
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {3 @. E# c( O$ z* M
addr = base + cnt;2 f) d* }) J4 @+ D S. U' L
sync ();' Z) [: X% t: g# j8 F) G7 U* `
*addr = save[--i];, n4 f' r' d2 M( c+ | L, n* I
}$ r& R5 T' R. C5 u2 n( h) x5 i
return (0);: B) }& i- g/ \+ L$ w" B. N! s9 E. V7 H
}
" V: @+ U' B( v7 s. S6 n' s/ G4 k8 M& j, F3 D8 y8 @9 @
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {2 H9 Z" f) k2 T# r& l, q
addr = base + cnt; /* pointer arith! */" E1 @# ?9 ^7 }2 T$ H( Y7 B
val = *addr;
1 s) G5 s: a0 w' g8 _; w2 q *addr = save[--i];
" ~, I# ~! R9 A0 |* K* e' B if (val != ~cnt) {( }" o' o0 ]9 k
size = cnt * sizeof (long);. K% O. k# b+ K4 F& H/ u
/* Restore the original data before leaving the function.
+ H" U: V1 v+ u( U% Q' ] */
+ }* ^# q+ {# R/ V for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
: L( t* J* j$ P3 F4 V' b# C8 c0 L addr = base + cnt;
! B. \& b9 A9 w1 f8 B# ] *addr = save[--i];7 x1 U2 T& P: U3 Z8 C, S0 Y
}
$ z! J, b5 m& i return (size);' R" _2 Z! k& o7 r; Y! T$ M8 P& s$ a. s
}( z7 O: D7 L; F9 h; S$ I
}; r3 b: j8 A- I5 }- ?! b. {' `
4 V! x$ D! _9 }5 V+ c( E9 D
return (maxsize);5 t# _) a* u" J3 o
}
# P% p# r0 I2 f' u6 {9 x7 a" \6 Eint dram_init(void)4 x! S R. o3 J& m: s
{
' L# o$ B8 u" V9 K \" r /* dram_init must store complete ramsize in gd->ram_size */ t& {/ w2 V' {" R2 t
gd->ram_size = get_ram_size(0 [6 t9 B4 H; @( f8 E
(void *)CONFIG_SYS_SDRAM_BASE,% b1 T' D0 D% t: \7 d
CONFIG_MAX_RAM_BANK_SIZE);9 y- A( C- Y9 G5 V
return 0;
0 x$ I( x4 J3 T( v}, k3 w8 r% R+ N' \7 ?. L4 T
- X7 P9 T% e3 A. y+ I1 ]% y% H
& n# l$ M3 y$ G0 ]/ O, y
* r- J- Y; g4 t# ? g6 Q V2 S7 t: v# v. C% ~: U7 ?
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!* R! z$ j2 u x7 r
; Q, c x4 r3 {# b3 r) L V+ t
9 c. p* Q/ ]/ U3 b( `+ ~) ?( k, Y1 K$ ? a3 i* H
|
|