|
|
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:* F( I' N+ d" e. w$ R2 m; g& e* v
/*
2 z# N' M' Y- |* Check memory range for valid RAM. A simple memory test determines
8 W. e5 `, m8 t2 {, s+ |; K* the actually available RAM size between addresses `base' and/ r$ V' R! W; z" P0 d
* `base + maxsize'.8 _3 P6 W& ^, e, {5 n6 ?+ Y) a
*/& s3 z, S+ J9 F$ ?
long get_ram_size(long *base, long maxsize)
3 b( W- I9 s) x% }9 P0 `% y: l{8 J- _" h2 s5 V6 r
volatile long *addr;
3 Z$ ?7 i* G2 Z$ f2 ^7 l4 e long save[32];- ^/ c: T4 [7 q: Z0 H, f
long cnt;
( s/ u, b/ K7 Z, |! Q. Q long val;
& v' e: _2 o, F long size;2 F, a, z( e4 Z$ J2 y
int i = 0;
1 \! G6 Y& l2 ?4 l8 a8 U
* L2 ?/ o3 i1 }+ l, G for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
, S. I3 S# u2 q: u8 c; N# m2 b addr = base + cnt; /* pointer arith! */. X n( `; V+ M( x
sync ();
# L8 R0 S$ @ [8 T ` save[i++] = *addr;
2 [4 ^3 N+ I3 I6 k sync ();# w9 B7 a! z6 F- W+ h
*addr = ~cnt;
0 R) t9 H3 l$ `$ N: W }
! ?' M" y9 {* ^4 P' Y
! y; o D: Q F5 c" z addr = base;
; k% d9 b8 d) n+ o' S% I7 i& K sync ();9 |4 s: a8 Y o( ^" D; t5 B
save = *addr;7 L; f2 g9 M) h
sync ();1 s8 Y8 [( R' S+ j
*addr = 0;9 H# F7 Y% l6 o! E# a
& @$ J0 Q; e" _' }( \ A# \ sync ();1 o/ U" A" g2 [9 P& F
if ((val = *addr) != 0) {, s* c; M6 f% f# p
/* Restore the original data before leaving the function.
! R( J% Y! Q) w5 {7 t3 P3 P4 g */
" X# H! A; a3 u, N0 i& D* w. y sync ();
& v% Q, R! V. d" {! q/ b *addr = save;
6 G% q) s9 N2 |# P# t for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
5 J& j% ]( v7 z1 t; U addr = base + cnt;
/ C a" {+ f% v- c/ y. p# x sync ();* g, Y' G+ W0 y8 Z- o# {; m+ p
*addr = save[--i];
/ ~4 V% r9 x$ p2 Y# } }
- E; N0 E, s- [9 ` return (0);
8 a) Y: a/ I$ r( S I }
1 ?: F3 V1 }4 @. K1 T1 R# T9 [/ t, ]7 y* Q+ _3 v
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {) w: d) {4 Q1 t/ y4 X! ^; {) G, _
addr = base + cnt; /* pointer arith! */0 e* {. s- R) f, d( V0 K) J/ E
val = *addr;
* j/ j, O# c4 i- ~' R2 q. j *addr = save[--i];2 J$ t& v- V2 x5 J
if (val != ~cnt) {
" M O" S5 r. \+ P size = cnt * sizeof (long);
5 Z6 Q7 j& L. T/ G) I5 V /* Restore the original data before leaving the function.& a# A- t% }6 e6 h2 x% i
*/
. I2 p" N; A; w- u for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
: ~- O. U, W0 _" d! n- L$ n addr = base + cnt;
3 x9 ]5 A% H/ ]' E) _ *addr = save[--i];! S; v& U6 s* f" h1 C: g" b* ]
}
9 L# @3 O3 z7 l+ Y. i, w6 ^' S- ] return (size);4 J9 s- [$ s' N* G( v H2 a8 p
}
9 |9 G; L$ z, n! J8 j0 | }, p: M, g% k- Q v
/ b5 M! z2 F: U. h: I8 p d return (maxsize);6 F8 `7 Q, V! T, {$ B# Q
}" a+ n# J7 c w- @- ]9 j: Y
int dram_init(void)
7 v% C0 A) a' L9 Y* s{$ t3 v8 x5 A( K4 h: `9 Y( F
/* dram_init must store complete ramsize in gd->ram_size */0 |9 N: q4 B/ I
gd->ram_size = get_ram_size(
" g, V9 c$ ?) p1 B" m (void *)CONFIG_SYS_SDRAM_BASE,
4 @8 x& s' N/ U; N6 I7 _* C CONFIG_MAX_RAM_BANK_SIZE);
# ?! g/ j0 Z/ x: ] return 0;9 Q( D% a6 z# a' t$ i
}
3 a4 Q8 p2 M5 N* Q. Z
+ n; N& p. j* {% |# T( D2 O) W. v# j. |$ a2 n2 r9 Z, ~5 Z
* N+ f( q- h- `+ o" P0 K8 I7 a
1 x, ]" j! O9 E& R8 q& x+ E2 [
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
) Q! K, S: s# O& q
5 q# }; Q; [% [. V1 t: v% \. T- v4 b9 ?8 K2 A1 j: o3 l
) F1 U, E: m! f! k2 Q) u: u
|
|