|
|
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:8 s+ @9 {+ w& \# d1 j4 H% f
/*& V& x9 V8 H, n8 F2 W! i8 C0 E
* Check memory range for valid RAM. A simple memory test determines v1 n% E& [3 E- u% {
* the actually available RAM size between addresses `base' and
* P) V9 u% d L, l; c* `base + maxsize'.
: v# b; N! Z5 f+ M. G*/- F2 _# t$ {) T c5 _5 }
long get_ram_size(long *base, long maxsize)
, d5 D% D' L; y1 q! K* A{* B8 g( {: \2 n
volatile long *addr;! j/ S% a8 ^7 E9 ^! e8 a5 Z
long save[32];
/ a- ~: f5 I# S. ? long cnt;# e \4 {$ N6 H7 }3 G R
long val;( H0 l: a/ U: B! L6 A
long size;! I2 P9 l1 c9 U2 `5 i; {& h/ W
int i = 0;1 s U: c. g. l: v6 q' D8 G
5 [9 i# a9 c& k for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
/ @ U% b( \+ Z8 s, |1 c% v addr = base + cnt; /* pointer arith! */
" a" f4 o7 a l" p9 G sync ();* t, F' P g/ O7 j* v
save[i++] = *addr;) g" R- X9 K$ y! Z& L5 E' P7 u
sync ();
3 K9 Q2 p5 z4 |0 v9 O& f' B *addr = ~cnt;) D: @. A* N/ U+ f
}
+ q0 s2 P: A0 [+ J8 ~5 ]+ k& F" }
1 w# ^, S" Y& C- M2 P1 D% k addr = base;! B$ X/ d! ~! e" ~8 W+ p8 v
sync ();
3 _* H+ ~8 q, a save = *addr;. _0 x% W% J/ m& {% ]" b
sync ();
. E q: m( T7 z% z" d8 O9 i+ U% u5 S *addr = 0;
1 t( h2 P! A9 s/ O% [, m {
q$ i) N1 e* T' w1 s5 q0 H2 ?, m sync ();
1 }+ @) U) n4 ]3 D if ((val = *addr) != 0) {
- H, o3 l- e( J /* Restore the original data before leaving the function.
, Z; E) v4 ^. G */) y5 a* l& o0 K' k. r, l7 A
sync ();+ |* @: a1 E6 e- W5 G- m4 I
*addr = save;5 n: j$ O! A% R8 a$ D3 F, p
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {3 U! X- ` W3 f
addr = base + cnt;7 H- x2 S* M5 M6 [& i6 t {
sync ();
" _$ k ^( i" V* c4 k/ Z *addr = save[--i];8 }% z: N9 [3 e. I# J9 o5 m
}, \! M4 J) g, k) r) C& E2 {
return (0);
. J1 P/ z! h3 h- d1 Y9 ~ }+ A8 F5 F& B' h( L4 a, ?: J. V
% Z: M+ U9 d3 y; C+ ?9 w. t. V
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
. [! N, ^( O+ U/ ?1 D8 u4 V addr = base + cnt; /* pointer arith! */7 h U9 K7 E; I7 F1 G7 K" w
val = *addr;
/ \) n& M9 }* J/ I; d9 H, j *addr = save[--i];. B3 m: x" [6 o5 F# B: T8 i
if (val != ~cnt) {
/ A/ T+ g; m" G% J% n0 p size = cnt * sizeof (long);9 X+ ~. a$ U% s6 W7 W9 J$ C
/* Restore the original data before leaving the function.$ k7 N) H7 g x$ n9 X( c
*/
; G7 }3 }, u8 P7 D& X+ b& O for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {( m0 Z6 f, Y! @, ^2 ?
addr = base + cnt;
m* H8 p$ e( o *addr = save[--i];7 U% v ?% l: Y( e# k
}; ~0 g$ y+ Q$ i
return (size);1 U- N4 {2 F$ e# b. a
}/ u8 `8 `8 S2 p* M3 ?6 x3 }
}0 x1 j7 q1 v' @/ d/ g+ P
3 x, f o$ e) o9 {; u- T( H0 L9 g
return (maxsize);
/ K, z, R& Y3 u" `. q}3 N: L/ U) D+ V2 b. ?# p6 X6 Q
int dram_init(void)
4 z- e8 j9 Y% Y1 V5 b9 k$ k; ~( T% C{
/ A8 Q& n/ U+ L( p- c; c' F /* dram_init must store complete ramsize in gd->ram_size */
5 t- g0 `1 h: g- M/ l# k$ r, \ gd->ram_size = get_ram_size(
6 L$ ]9 T# e) U, s' a (void *)CONFIG_SYS_SDRAM_BASE,
4 m+ p& ]" p- i. b& P$ `& G* |2 ~ CONFIG_MAX_RAM_BANK_SIZE);6 Z/ H9 G2 y( D% ]4 O- @
return 0;
9 A9 G4 ?4 N+ b( k- U}
8 l v! v5 p W2 ?+ r1 R8 t
4 D9 y& k+ \8 k) ?& z$ j) p. {8 B, j! P
) i g H% G- o G# z
4 F+ g3 v- v! x; ^$ U5 ZFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
6 r0 u2 X" E( f2 E& n) h: q- H6 e' u0 X+ r1 q$ Z8 K4 [6 g
; z7 s# l8 {2 J( X# Q
4 V$ a: K0 H2 O$ q6 W |
|