|
|
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:3 v. b& q" E% ?+ m4 W; E! [, a* Q1 L
/*9 d$ }" T4 j0 r I
* Check memory range for valid RAM. A simple memory test determines
! m3 S" K6 T. P, S* the actually available RAM size between addresses `base' and
8 k% t. L; O; N: z% R* `base + maxsize'.1 \( I# Z& p3 m- u& H. z
*/
" J7 y+ I& a, Jlong get_ram_size(long *base, long maxsize)
0 `) L2 j+ O2 u/ g{
7 ?2 G. q1 n% A$ C c volatile long *addr;
: X X! {- n( W, C0 h long save[32];% U6 H2 ?( S. R* C3 r
long cnt;: @3 H1 c; m4 j1 p
long val;
. S$ `) Z1 v! S) Q. y long size;
" p4 N/ N9 T# k8 w8 I4 e int i = 0;& n5 r% F& F* ^/ e1 ]; f
* `# w& ^3 w ~; W for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
- n. H. i% Q7 c; L$ { addr = base + cnt; /* pointer arith! */5 I( R: k0 b: O: f( Z+ n+ m
sync ();3 J$ O ]; p0 Y- n. I: m3 l+ f
save[i++] = *addr;
, p) z" c" w7 [& i8 ^ `3 D( \ sync ();0 V) K# @ `! y2 Z
*addr = ~cnt;- w) s) J; S9 n
}( X4 y7 x0 A9 y( I: x
* ]0 j j) X: E( D addr = base;
) G( v j! }4 x8 J E5 }3 A& _/ r sync ();) E2 n; M* C. a: n" C$ g
save = *addr;1 r3 e* B, x, ~) c/ H4 R, K; g& L$ m
sync ();
/ I% a5 m! @7 K* i/ U4 ` A0 T *addr = 0;7 C @- Q: g: \; M) g
9 {: P l+ G4 J: ^+ q sync ();: P% e8 ~% B9 E/ ] t
if ((val = *addr) != 0) {/ n: u6 b! Y' y% o K
/* Restore the original data before leaving the function.# H) ^! c6 d" }3 h. \3 N4 D
*/- W0 ?( }& L/ c' ^9 C7 z, N; `0 w! `
sync ();
- b5 a! e* h9 ] *addr = save;
; \* S w# G" C4 S for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {8 i9 v8 S% i3 a- U0 K+ W
addr = base + cnt;$ S) l; X. } V$ R/ U
sync ();
' v4 Q, H% I5 u' s7 B2 n2 V *addr = save[--i];
, j/ N @5 a3 D }8 ^3 m) p/ y' F# ]+ |9 X1 q
return (0);
: M& ?- l1 p4 w" ] }0 B }5 L# Y' N) `, W+ Z2 ]$ C6 k) k
2 f! p/ l0 | H7 ]
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
$ s: Y; J" A- }- J( w, {2 C addr = base + cnt; /* pointer arith! */
3 z9 R4 i- L& q" H* c0 { val = *addr;
( Q2 U" K/ s G( E *addr = save[--i];2 r8 M- H, \/ z7 R5 X4 L1 D
if (val != ~cnt) {
# l; n [- z6 A) H size = cnt * sizeof (long);
! u& u4 p2 L4 Q0 }2 V; v /* Restore the original data before leaving the function.
' o: `5 U8 }2 S2 ` z2 a, ~! L */3 x3 F/ O$ O" y2 t& v
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {# \9 l3 c z( Y: L' V
addr = base + cnt;
0 h. `0 ?5 R9 g9 \8 F! z *addr = save[--i];7 z" ?: S! B- T6 Z! a
}1 @7 Q0 K( I6 x6 y! M
return (size);, D, ~# f" I/ @1 C$ R4 |
}7 r' k2 X+ ?8 F! Y
}% s6 m" h9 E8 b0 U
0 @0 m6 e2 T" z; K7 G3 r" ^
return (maxsize);
& ~$ T: c: ]+ z- n. J}# S( c5 J4 E; K, `5 `* R5 R
int dram_init(void)! r" S7 ~$ O- \3 |
{$ F6 l9 n9 c; E. h, b
/* dram_init must store complete ramsize in gd->ram_size */
2 l9 z( n" d* U gd->ram_size = get_ram_size(7 i* b+ J( T0 m, r# R/ ^8 \
(void *)CONFIG_SYS_SDRAM_BASE,
% B- u8 m" s! n y9 p) n: E CONFIG_MAX_RAM_BANK_SIZE);
. Z! v0 M" d0 e1 n8 N- W: a6 T0 q8 d! x return 0; g* r8 d/ d( A
}
! @' @9 O% G3 t3 W
$ E- Y8 |8 h! G& M6 D, L! N8 Q5 ^3 ~' s7 u! @9 V
$ V! ^- K/ S+ v* I9 I+ p/ f
# k2 G- G. d( ]2 o3 CFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
" @) p4 r0 U% X; }2 ], U$ C* y$ k0 o. @! ?9 j
) Y# ]: l! C' d
' S& r5 k6 e# p9 U6 b, O |
|