|
|
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
# h) }+ U( j( k: O3 M& c& Q9 B; h/*+ M: H4 Q4 I6 j8 H: B+ L
* Check memory range for valid RAM. A simple memory test determines
9 l+ }9 e/ c, ]* the actually available RAM size between addresses `base' and
E. c/ K$ |7 U* `base + maxsize'.& Z3 N8 P; l/ N( ]) i
*/2 p2 d( z; d0 e1 c+ q$ y
long get_ram_size(long *base, long maxsize)0 K* m3 A3 y$ R. V& W+ d' b
{. u. B1 O; B) P8 c! K. [
volatile long *addr;$ {' l3 y5 L T# A! M, Z; a
long save[32];
6 m/ A8 s) `* U" k9 b. E- x. @8 e) u( R long cnt;( l$ I3 s- f6 R
long val;3 |. @# w, W9 S/ y2 i; ~
long size;5 w& v" N: y3 G) b C8 z
int i = 0;, u1 ]* ]& v1 Y A- e, \) z& n/ i
0 S" B: }1 l0 w4 D) B
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
' _$ H1 F& I, j2 f: h' v! } addr = base + cnt; /* pointer arith! */
9 ^% q: Y. E4 g4 @9 z+ ` sync ();! s" l; K( |4 W6 V. E
save[i++] = *addr;. g9 w- ^1 Z6 s
sync ();& u6 E+ L. H/ m. r4 x
*addr = ~cnt;
; z/ N1 u" L: o! v# ~ }
" r7 u" l9 j* C) c+ g! H- E7 Z& ?9 ]6 w. R7 M+ {; {! j
addr = base;7 W4 I# y6 Y( Y' o5 A2 d
sync ();
5 c' |% i8 q# P; r2 I save = *addr;( b0 R$ ]: z- ^' p3 ?) N* w
sync ();
6 W, X8 Y S0 X+ l! r$ R *addr = 0;, I7 l3 y( Q& H6 p
. X8 h7 J8 T. \) @0 h sync ();
5 _" g( T; q& l# Q if ((val = *addr) != 0) {
! m8 q6 y3 L) x. K /* Restore the original data before leaving the function.
3 ]* z2 m3 m; M4 o! S4 Q# D1 p */' i5 X. x* S, ]3 V
sync ();: ?) f8 a% P0 H
*addr = save;
8 j& |/ Z( J5 G+ s, l4 O for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {7 }' d6 g# P! c( A2 h: @
addr = base + cnt;
" T6 v q8 ^* l$ c: M6 R sync ();
+ o& a/ |" I0 G: ` *addr = save[--i];' Q/ c4 m1 k f* J5 u4 f3 O
}5 ^ c* P9 y% ] y
return (0);2 @) n% o$ g& N- ^3 s% ~
}
8 c" E/ F. r% r' s% |
2 f* A& c5 u0 W: v# a' Y, R for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
X- {, K0 U+ m" e$ _, h' p addr = base + cnt; /* pointer arith! */
# p. ]& E7 j, V( [& t val = *addr;% p! G7 ]% R0 H) J
*addr = save[--i];5 j% I: w) x. }* z
if (val != ~cnt) {
& _$ V+ u- P7 d: X% o4 e size = cnt * sizeof (long);
4 I1 h$ x2 c, e2 v) O) c; F1 V /* Restore the original data before leaving the function.
% y# H/ x7 \5 u$ R' w */6 P% D0 B: R4 k0 ~1 ~4 W+ {2 [ v- Q# K
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
1 l8 @) E5 k% ~- Q8 h addr = base + cnt;
, |6 S0 j5 p% t& i7 N9 f6 F3 j *addr = save[--i];
9 I) W4 h5 o/ d5 s2 i }+ M! G! S5 i7 q
return (size);9 F8 d" o" t: f% l8 i$ l
}& J' G( b* {" I+ @
}+ d' ~9 O2 r5 I. G
8 R( c1 t$ N! k0 M0 A* r return (maxsize);
* q1 c) w9 A* R% A1 w; l} M0 l7 m& d. d/ B
int dram_init(void) \6 z, { T% W. U7 l* j/ i
{* t5 [3 V9 o4 k* D
/* dram_init must store complete ramsize in gd->ram_size */" Q' q i8 ?1 A1 ]
gd->ram_size = get_ram_size(
, C; }' l$ o8 a v' G (void *)CONFIG_SYS_SDRAM_BASE,3 _0 y5 i7 b# [& [" C6 i
CONFIG_MAX_RAM_BANK_SIZE);
8 q1 R2 U% \+ g8 c* ~3 j return 0;% ]1 r+ N" w: h
}
) `0 ^% L6 m$ z( z; r8 u. c
# H# t2 s4 j8 @8 L5 R. o! Q
# h; P0 p+ k8 b" m$ R% F0 a& J! }/ Q' \& Y6 Q
; [* T5 T* W+ z% i/ S7 H
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
. X% _1 j4 Q9 b8 K" I' L1 E' T2 N$ ?; Q' C- i8 O
. C- Y% f' p) o2 C
6 i1 ?5 y; k' L% p
|
|