|
|
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:* ~- g: l0 X: V
/*
* ~( j. f3 ~$ Z3 p4 `: K$ A* Check memory range for valid RAM. A simple memory test determines
) v- n6 _ x# w2 U% C* the actually available RAM size between addresses `base' and
( k1 q7 H% a; x" C- q7 T. m5 m- Y* `base + maxsize'.& d- }) F4 d/ Q( v: r6 |
*/8 H- z* Y0 V- p. S
long get_ram_size(long *base, long maxsize)
! O9 N5 s5 }& D& [8 j' L{3 @+ Y& O/ n. E |
volatile long *addr;5 j( M- @4 C5 b( i6 d, Y
long save[32];! t) i: N. E/ S9 s3 Q, V" h/ S
long cnt; K" t* A h2 r! K; Y0 ~
long val;: g# p/ ]* t% E0 I) D T
long size;# M W' w! {* U3 c# ?% ~( _
int i = 0;
) P7 n7 U5 I0 {5 j- s3 p: @7 I% D
# _& f1 L' I2 C' w4 m for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
; K/ p0 _+ b7 J" k addr = base + cnt; /* pointer arith! */" g- f! t+ v6 G1 D5 }
sync ();
- M* k6 U' {" }2 ]9 a( ~1 I8 P, ] save[i++] = *addr;
3 r* `8 I& N7 `0 h; D7 Z' h$ H sync ();- M/ X+ b) _% I7 x
*addr = ~cnt;
9 u* Q, |, B" H% a) U }
9 C! b3 l2 L0 ]( z4 o
* c) i% {4 \! D addr = base;% W* p0 |2 D; t9 J# y
sync ();, H" j, U/ h O8 E2 ]: O! @
save = *addr;& C& ?, U9 i9 Q
sync ();* I$ A( v2 ]! h. L
*addr = 0;& I7 V5 w c a1 i( m2 X
4 v, g! O$ k! h3 T- b. M
sync ();9 p8 m6 z6 f: |, |' h1 k: v( \3 I
if ((val = *addr) != 0) {
% r( {, R: @( ^' R5 ? /* Restore the original data before leaving the function.
; A2 m. r% S3 K% V" w, D */3 z1 a) l. ]2 r5 A; W
sync ();
" @0 R: i6 g! |& G) Q+ ~ *addr = save;4 H" g9 G8 V# X9 Q7 ^2 w
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {$ [3 W4 j! b% X
addr = base + cnt;
6 y" f y; ]) M& x" p sync ();8 n. |! [/ Z& r0 Y1 r, r& N/ Y" g
*addr = save[--i];0 k0 ]& a2 Y8 Y
}4 t$ H' n4 t1 w$ g( ~0 M" h, l# `3 o
return (0);
/ c: U4 X- t+ O7 J/ b }
2 |2 ` W# I& `/ n0 k/ d
5 A0 B% M$ k9 F for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {0 h" {0 O5 M7 [3 `) w, [
addr = base + cnt; /* pointer arith! */
N: w8 X- V A" n" M" J( V- i val = *addr;
! b/ G4 G V V *addr = save[--i];
* d; p% \% c2 `. c+ D. p& I7 n8 i if (val != ~cnt) {! l& Y1 H9 t/ B* c1 b c6 o3 ^( ^
size = cnt * sizeof (long);
6 G% {4 k/ I, ]& O" O6 L; h- | /* Restore the original data before leaving the function.
" n% ~. W ] O. Y d# E) l5 k */
" A% f9 x" d& C" E' L y' p9 ? for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
# v* k' C4 F1 ~) Z3 d addr = base + cnt;
$ K/ A5 x5 r5 g3 L" r9 ], Z' [% d *addr = save[--i];3 h! _2 `" o9 g1 N- Q
}
: z9 i/ t6 a( H& W& H4 w% ~ return (size);9 e! i- t2 M& X5 F& Y3 T( C
}3 @: X% N3 `4 c, z* p2 B7 k
}! k- L# o Z5 ]8 }2 G& l) q
' \5 h2 \: O% b0 H$ V4 X! E$ ? return (maxsize);2 R+ G* z7 Q V
}
0 e3 { r+ \. o& l, w; L" n0 Q8 f1 ]int dram_init(void)
" a/ P2 E- S* s4 ^- K' a: p2 N{7 O9 C& Q# v, U* ]
/* dram_init must store complete ramsize in gd->ram_size */
2 t& P& m6 }) W1 h- x l7 U gd->ram_size = get_ram_size(0 A9 a( T1 F, U* w7 L, S
(void *)CONFIG_SYS_SDRAM_BASE,: ~/ y3 S7 u! @" F7 N/ x, I! w* `" w
CONFIG_MAX_RAM_BANK_SIZE);! E9 D& C: g3 y( Z% y3 x
return 0;, E* {: A5 T8 Z" q9 J
}
! |5 j$ Y- ] P& R/ y" R
# t& @9 G4 D6 S5 C) J7 m4 M! G0 S8 a5 c
8 _/ g4 D- i- G- i( P0 o) o; q- t, Y' E4 q0 @# r! m4 K/ P
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
! D, U# Q8 U3 V2 M8 B
( ~3 A9 a0 y& U# k+ s8 x, v) z- y- ?: Q0 V
' x7 g/ Q. k3 H# s% B |
|