|
|
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:* o( `! U Q3 t y2 i
/*
+ W* K; G$ H) \3 X* Check memory range for valid RAM. A simple memory test determines( h) R/ s8 k. K3 {& _
* the actually available RAM size between addresses `base' and' I3 R) y% z7 d1 s g. _% u5 a
* `base + maxsize'.7 m2 r) ?9 A* O2 a3 x3 [
*/) g. F' B8 }8 I8 L. L" ^ ?) ^4 E
long get_ram_size(long *base, long maxsize)1 \% g6 E! H; e6 |6 d! A8 h0 |
{/ B8 y" d, C2 p
volatile long *addr;
4 o0 Y- G9 w1 b9 e long save[32];
! a4 c' ?# H* X+ q long cnt;1 K# G+ U" p, k6 K$ k
long val;" |$ t2 ]* m/ n& o% @* V
long size;
' X9 f* f& d. b2 V1 A5 h/ A int i = 0;
, y! O: b, w u' D; o. d4 s; L) e# Q8 m; F- b: k
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {) Z$ ?; {5 ?5 T% m
addr = base + cnt; /* pointer arith! */1 G' p) F. u: O8 ^, S
sync ();% `8 F, K1 h/ _( D% b
save[i++] = *addr;
n0 H" D0 t% G: z sync ();
2 `9 ~ L& {4 ]7 `4 A J0 q' a8 I *addr = ~cnt;5 M. g, K+ u I( p' f& |
}0 A V& k! p4 N& z l
5 S! l" P, g4 } addr = base;
3 f9 w8 S8 ~2 B% s z. Y sync ();3 Q3 @' D1 Q. f$ n
save = *addr;
* E$ |0 G2 u$ @5 u D0 q+ z: D* S+ K% q sync ();
% \5 q- z/ s/ V* Z+ b/ t7 S *addr = 0;
( h7 i" {% G/ E/ O2 B5 F; j) X9 X# [% K$ ]( t5 C6 j( `' ^ _; z
sync ();% B" v9 {! f5 v) b8 _6 \7 e$ A
if ((val = *addr) != 0) {' s. m% n f* B! g3 x9 V3 q, X+ m
/* Restore the original data before leaving the function.
+ x+ T4 r! O, A, U */2 k; |+ W8 ^' M( ?' E
sync ();% I$ P/ h) n. ]+ l7 m
*addr = save;% I' e- m3 B3 W. p" t5 ~5 P5 I
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
5 o$ S7 R$ Z5 R! g6 y m addr = base + cnt;" h1 F5 x- a; s x7 {. a
sync ();
' [0 M- S8 I6 I# Q$ g *addr = save[--i];
! C( Q# d' I0 ], ]9 ?: P- v }$ o* E. V* z- b. B. K
return (0);: ^( L: }# F7 |- b( X2 e8 N- }
}6 Q/ y! U3 z6 z
9 g! \ J: o' g3 {* Q" p for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {1 }" G: p5 w* r/ U S- Q
addr = base + cnt; /* pointer arith! */
) p, O' E1 T( _# Y, y8 t val = *addr;# x$ x+ @( H/ y% V4 a% u4 `
*addr = save[--i];
4 Z/ D/ _: v5 i. O7 N& k5 j if (val != ~cnt) {' p! V0 t- ?4 _- a& Q
size = cnt * sizeof (long);, W4 ~+ ]2 s8 p: D6 K9 {, x
/* Restore the original data before leaving the function.+ z& ^& L; n* k; T: P( k
*/* K4 W! h! i$ o! p" A* N j
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
+ r( _) k* R1 e* p: x4 E addr = base + cnt;
& h2 T L. N) f: Z* } *addr = save[--i];
: \. b- w( `. e! U' ]3 ? }; l3 p& ~$ d: i3 \
return (size);& P. w6 `% {' D% `4 w' o8 r( l
}
) l! x! I% P# O4 E/ n. p4 t }- n# O7 v) _0 Q8 ?' ]
" X" s4 g# h# o7 I9 B7 L
return (maxsize);- O3 s& O9 c- w. ^' w; C4 p0 m( v& h5 m
}) r$ M) n2 b. v9 h% w: N
int dram_init(void); k4 Q$ C! |; J/ m. y) r# J
{ j! {# v& C) {* L( A4 B, I
/* dram_init must store complete ramsize in gd->ram_size */: \$ m# X! V; D F+ b! l' L" C6 E
gd->ram_size = get_ram_size(
1 Y: w4 _$ _4 V7 w2 [ (void *)CONFIG_SYS_SDRAM_BASE,- m+ a6 ]" D' n
CONFIG_MAX_RAM_BANK_SIZE);
9 P0 N. x; V7 |0 I9 a2 o, S return 0;
+ l: h W, l7 w( O}" T% x; q$ n. V
8 r. G; n$ r' A; ^8 B) ]2 v) u; j7 z0 V+ D4 q3 B
+ {0 R0 Q+ Z/ O7 u* V' _# i m
0 Y; P# E6 O2 Z5 X% UFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!, U7 E. l7 C/ Y
9 {7 K1 N; U. ^7 J2 L: o% l) h- s
* T* g. x9 Q% F$ S! p; l( C
: {$ B. \! b6 _2 n8 m$ R2 y& O |
|