|
|
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
! Q3 J& U7 @, D9 x6 ]6 c7 Z/*& A- l3 p/ G7 g) Z' b" I' z
* Check memory range for valid RAM. A simple memory test determines" Y |; t) Y3 B
* the actually available RAM size between addresses `base' and
" v& u6 R6 H+ m3 L6 Q! B6 v3 \* `base + maxsize'.9 s( p: |2 ~- m* H) ` u
*/% \4 l1 X' r5 C$ V
long get_ram_size(long *base, long maxsize)) D6 i4 E M6 W- }
{
( o* }$ H A2 M volatile long *addr;
( a; X3 I! w; k1 Q5 Y( U: ] long save[32];/ h) P/ [/ ~$ ?# i. r3 m
long cnt;
4 a9 m5 Z% k' l K7 L long val;
$ V+ N4 Q7 j% W9 ~0 n/ E& R v long size;
, k. f$ j8 x0 H6 L1 J o3 u int i = 0;
# B1 `0 H5 \* F3 B( q8 r5 ^- K I' T* U) ]: R
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {9 t& J, E6 z$ A
addr = base + cnt; /* pointer arith! */& B; Y; {* Y/ @
sync ();
( k( O4 |* S2 L1 ?/ F save[i++] = *addr;+ e( N! ]$ w6 L0 U5 E2 C
sync ();: y7 F! y1 \% u1 o& J
*addr = ~cnt;
X% w- S f8 n# T- V" V8 v }1 `1 p5 |2 H9 v, E: R& [
+ x* D% |% W( b9 H( _5 S" a+ Y ] addr = base;1 f( V% \! d4 Y7 P
sync ();# V! h: i- M+ e! K
save = *addr;
3 q$ s9 p3 [6 U1 O, d% B! g9 o7 C sync ();
/ m% Y$ L n8 K1 R ] *addr = 0;
5 |& D9 L: M, j9 W, \/ I3 H" b
7 t8 U: I5 g$ H! y0 _: } sync ();
2 b/ F8 K( e- b% O if ((val = *addr) != 0) {
a& h% J* i* [ e6 s+ Z /* Restore the original data before leaving the function.
4 _0 a1 G8 _. ]' \ */
1 i n9 j% U- \7 h7 ?8 S2 l. u sync ();
( g! a, A9 O5 F1 W# o( y *addr = save;
* N( j( [8 l& x6 V for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
& ]% h/ J4 o8 }3 ~ addr = base + cnt;# r( h" o' F4 q3 y; W
sync ();
! [. N* \5 ~+ B! l* g *addr = save[--i];
# h; B- F$ x! b/ V- Z }
5 w0 b+ h, R' `# u/ D- [) | return (0);
$ X& n) m! B* g; d7 E }
) d9 h9 [, c; v7 u+ |5 Q |3 Y) A
: r- j# G1 z' J for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {6 D6 R" ~3 x8 E4 R: P9 a# ~
addr = base + cnt; /* pointer arith! */2 E7 B3 ?. P8 c
val = *addr;* j4 u& B; l, X
*addr = save[--i];
! F( Z* J2 e3 u if (val != ~cnt) {
( l! j) k ]" h7 D! r" K$ m/ e size = cnt * sizeof (long);* t/ {0 O/ t$ ^$ X" R
/* Restore the original data before leaving the function.
! ~- C! y m3 T+ x2 L1 Q */
7 r2 R$ ~5 t/ G) G6 Q for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
1 I9 @0 R& L4 y% R' \2 V" E addr = base + cnt;; }" J$ T, G% ] c' g1 O
*addr = save[--i];: ~ \) A) k! g; {. W
}0 J7 v2 F% t, _0 t4 K9 h$ W9 \
return (size);
# Y. T4 K7 b$ W/ V3 N6 |' \6 d) X }
" Y B, u4 ^) }3 L# ]- V& q/ h }9 z% x/ X' f% C& r
. m9 I1 d+ D5 q) u3 y
return (maxsize);; Z% T2 K( {$ p5 ?8 ~, w
}/ J% c5 g* b- v- u+ C
int dram_init(void)
& T8 S& n; w" j1 c* _+ Y- W{. Z9 T" w: j0 e# ^, O: z4 n. I
/* dram_init must store complete ramsize in gd->ram_size */& g( d1 \. }" U8 z; K; P$ H+ W8 z7 j
gd->ram_size = get_ram_size(" Z+ S0 z1 x7 s
(void *)CONFIG_SYS_SDRAM_BASE,5 E) Z6 l, N; H) |4 `/ I
CONFIG_MAX_RAM_BANK_SIZE);
8 A: A3 Y, a% c! } return 0;6 m. I; m* f. i+ ]
}
. m& j; {1 }9 g5 k x
4 T0 _8 x8 q% i4 r& h& P- f2 [, n' B7 N$ ?3 Z# C6 Y) P4 u5 b/ G A
7 S |- m% O. r. f6 j0 ?! d
; d. u. }6 ^+ GFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
5 L& c1 g5 d! u ?, b) L
1 x# _! [1 W8 O2 Y4 e2 X& ]' E: J8 O' V% E# M; J- g. \* `- p
: P% D" v( ?8 G( E" E* [5 _
|
|