|
|
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
- N0 { S- W2 i2 N/*$ K5 S( Q3 K N' t% g$ N
* Check memory range for valid RAM. A simple memory test determines
! e# B' Q0 ~( ^' v* the actually available RAM size between addresses `base' and0 ^4 z- y/ i% ~
* `base + maxsize'.
v/ x4 [7 a: z. H( o*// s+ S8 j3 ~" P/ r5 b- x8 _
long get_ram_size(long *base, long maxsize)" c# p1 L1 H9 \ g% e
{
1 k6 V7 C3 f3 ]- W5 H' r9 j" X) d! o1 a volatile long *addr;& \: B/ U# N7 J
long save[32];
: O5 `& {% |8 L- C/ f long cnt;
5 A& v9 Q8 [2 }$ K/ u- e$ ^ long val;" R3 U% y( X1 K, w
long size;
I8 B" l2 T r! r int i = 0;
2 b/ L- I0 T" k# O- x! i" {. l4 T2 r2 t/ X2 u& U! A5 Z) K, Q7 n% W0 ]
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {% F. @; K/ A4 u5 V9 I! z
addr = base + cnt; /* pointer arith! */
1 c% I& ?. J* }* p0 x sync ();
8 |5 S; v2 i5 A1 Z' U* \ save[i++] = *addr;
" g4 @* R2 p. C" c sync ();
, q! d) s. Y1 t. x* R) v# O) c5 g *addr = ~cnt;
* r# r' R& V, C* s/ g }* m2 ^( ]; ^: { p8 T
1 s P# Q: G/ v. j addr = base;4 U1 K6 y# i8 F3 m5 y
sync ();7 w8 h, u, a$ A3 K$ ~
save = *addr;
- [2 |& b9 t4 R+ l5 } sync ();
# W8 c$ n) d/ M; ~8 g *addr = 0;
, O& h" i K ?% z, U0 t& {5 p! L; v! q7 F& k3 H' Z) P: v
sync ();4 @8 W1 T' ^( q6 `8 Q
if ((val = *addr) != 0) {
) a s2 N/ a7 u+ I /* Restore the original data before leaving the function.
& `+ Z- W+ {$ P G3 ~; ~- C' g */% _, T5 f/ {- C4 ?
sync ();
+ t& S9 r5 z, U$ K( I *addr = save;
2 J/ Q. Q9 P0 A9 k6 Z8 [ for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {8 H! e- `" Y0 F# h" V; o
addr = base + cnt;+ [+ [7 R' ~, q! {
sync ();
1 q# _( F# L. c, b *addr = save[--i];/ J+ I) F! \/ V1 }. _9 p' x
}0 Y! ]! F ?8 R( {+ U" b9 S
return (0);
0 i8 z( ~+ u4 i& b- n* d }. I$ k7 U p" q/ ?7 Z) L; G
8 l7 s& N' `7 L+ }7 ]" t) M
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {# R# A$ p' r$ |8 p2 ^( M
addr = base + cnt; /* pointer arith! */; U) \- d0 p7 b) @7 C0 A4 {2 `
val = *addr;: Q0 N7 V' c2 u/ n% G& X
*addr = save[--i];
" d8 T/ M- R L; D f4 x5 G if (val != ~cnt) { I! T! a1 U* ~" P
size = cnt * sizeof (long);
$ H! o) Z, C4 k6 V& A /* Restore the original data before leaving the function.
' ^, _5 N7 L$ X */
2 c( Y9 G" r& D; V" A! k6 g for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {8 U! X* n8 V, e
addr = base + cnt;' b# i4 e( g4 ?
*addr = save[--i];
) C& r" D( V8 i! l5 X/ C }
9 l" O$ c y5 D A u4 K return (size);# { z- z. u# S/ p* d1 D! u, y" Q, ]
}
6 O/ _ y5 r5 ]8 J }
, ]2 i# J4 a4 M8 G$ Z. U. h7 G, j
/ }7 a& v2 V# Y+ r; m$ J! R$ p4 s return (maxsize);6 N9 i% G0 ]) ]* W7 G
}
2 @% M% |& s( I1 eint dram_init(void)$ L% P* T7 @* A7 h
{
, q8 I! U% i) A6 m: X' ? /* dram_init must store complete ramsize in gd->ram_size */
) i& @4 w" \- p gd->ram_size = get_ram_size(
: b* X% S1 V: c0 g- ?- d C. G (void *)CONFIG_SYS_SDRAM_BASE,
- ~1 u% _& H A2 J CONFIG_MAX_RAM_BANK_SIZE);5 B3 K- ]" u$ e1 e! C7 X, q
return 0;. n6 O0 `3 _# `6 m
}* h# j$ J) R y. N
' Z4 r* d( H- f
7 P: E" Z3 x& S+ H. G+ _" F
/ T9 e. V5 h! d' W: N. [5 k. u/ l) N, q+ n3 G, e, K/ l8 [
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
, i* X8 U. ~8 V$ {5 w) Q" r! p/ ^2 b9 k5 Q, N- W; G
& U0 M: M3 D, \( v' e1 v; `
) i3 I. [- t8 T ]$ s( e |
|