|
|
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:5 R4 @& H( `. Q1 R% J
/*+ B, T) Y( C* I! b# E
* Check memory range for valid RAM. A simple memory test determines
0 [% B; P% L+ I4 k* the actually available RAM size between addresses `base' and( W# j1 B% a+ ~
* `base + maxsize'.
# e3 ~1 g% f2 A3 T* e( s: L*/) A$ I3 Z, E* p* b
long get_ram_size(long *base, long maxsize)
* Y) x+ B0 D4 r$ c" B/ i% Q{
3 K; i- ^! H2 w! P, B5 }' B& r volatile long *addr;. p$ ^; T- C( R
long save[32];9 I5 d( ]1 x) v
long cnt;- ?- j+ X; W7 D
long val;5 U: C" I" g& n5 b5 w T
long size;
$ i0 C2 q! {# c) b) X* _ int i = 0;
) r) a+ I7 E! e8 P
b2 q: e/ g& D- e& M, a for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {8 N/ N) S9 p" E
addr = base + cnt; /* pointer arith! */
% M5 f7 H/ M8 p E sync ();
r$ N) _1 B! j/ s save[i++] = *addr;
& G' `* X# o c0 ^! r# Z sync ();4 z" _1 I/ |1 z' ~; a
*addr = ~cnt;/ h8 @0 s- v' j% P- J% V8 d l2 F
}" X3 {# A/ g2 v" z+ P6 J
: m* W0 S* O4 R" f' t. i3 ?
addr = base;
& ^+ A5 w0 q! z1 N- |7 p4 O sync ();' ^' P; G( n' M: h4 n
save = *addr;
7 \$ N X. ^- k6 `9 Q sync ();
" ]/ A+ |" n% u& D *addr = 0;6 L, Z! ?9 r+ a' R
; h/ P5 ?( L. ^% ^$ e0 c' i sync ();
1 c/ L" _- G6 w if ((val = *addr) != 0) {
5 w1 l& r! S( ]# y /* Restore the original data before leaving the function.
! P! n8 n9 S; n7 r+ C% r; f */
: x, x K) T# W/ A' p sync ();. w' f' s {1 J' X
*addr = save;$ c) @! }, c2 u& o" p- d
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
k& d, ^$ g( H l7 S5 B4 O7 d addr = base + cnt;) j0 ]1 J% h9 C" F$ D. ^& i
sync ();
7 O0 `2 Q4 A8 l; m1 N) P$ A *addr = save[--i];
4 e# } X6 ^6 Y# q7 W }) W; q: G6 [- g% }1 f- m
return (0);+ u8 y, X d$ A2 r$ u2 U1 q( ?7 K: R
}
L6 s/ ~7 Y/ S1 N: z9 @
j) i9 v. o1 Y9 p2 d# F for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
4 [4 a9 U6 S% P5 W1 l: E: w4 [) K$ ` addr = base + cnt; /* pointer arith! */
+ l& q5 J7 q3 u1 v8 j! U" H5 ? val = *addr;9 _& d; A1 g/ m. ~/ q
*addr = save[--i];. W2 e/ C& _; s: }& a
if (val != ~cnt) {) z1 Z5 E* t7 f. ^! P# v
size = cnt * sizeof (long);2 C2 A0 M/ H, V/ m u# I0 `
/* Restore the original data before leaving the function., H9 U, m, a0 ^4 N$ Q
*/+ K! n& D& U8 `" X2 d8 q
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
0 c7 L' i7 H+ Z addr = base + cnt;
; |7 |: \1 O/ b$ w *addr = save[--i];. f; i6 |4 V( M
}
* A! I, z+ e! Y* Q return (size);
& W O. n0 {* u) Q9 ^3 m, o% m }3 g7 `9 ^, U/ q1 m7 j
}
f' q/ H$ D6 [8 ~% M r8 u( J/ e4 f& ?& S) s5 x# B
return (maxsize);7 M t( p# K" N1 a2 g' L
}* V8 f/ D! [6 G2 Q6 J
int dram_init(void)6 @0 z0 K6 H0 f" S! v) q, U8 N
{
]( N J& }# ?2 Z! |2 p2 ^ /* dram_init must store complete ramsize in gd->ram_size */
$ N$ w' N% @* M' K( |3 x, \ gd->ram_size = get_ram_size(: R/ d5 e B, p$ A4 R% u
(void *)CONFIG_SYS_SDRAM_BASE,
3 i! w8 V; q) c* ^) i) p1 ^ CONFIG_MAX_RAM_BANK_SIZE);- Y! l) j- e1 c( U
return 0;
. C5 ~3 |: F' j}
: h5 K- O! A1 [0 a; m: W/ ~* f4 g& P1 C( U3 O: J9 ]3 c2 W5 Q
5 i' F8 C! I/ E( J
8 y9 G6 P/ t& q# P! U/ a8 x- U7 [- J
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
+ ^3 Y1 `' d4 e8 H( e* `. w
9 e, E+ `6 C2 {1 I0 f1 I+ p, H [. z
' q9 ~" |% S( z( Y7 b
0 c i4 W5 I- J3 { |
|