|
|
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
1 h2 x' K n3 U5 b& I/*
% A8 F$ Y2 E8 }. |: y* Check memory range for valid RAM. A simple memory test determines
) I+ _0 E) c5 @0 \3 L. O" C9 z* the actually available RAM size between addresses `base' and
* e! }' D2 s* i: u4 q5 a) u* `base + maxsize'.# S. f+ J, c+ G1 H; D
*/% x9 Z! \6 G+ ]' t
long get_ram_size(long *base, long maxsize)
. J+ a7 N+ Y& }; Y( J0 H0 O{2 M/ |7 @& e z$ V# H4 x( r
volatile long *addr;
]1 D! }, t1 F! x8 P; y long save[32];
( ]3 u3 ~6 q5 v$ U long cnt;
1 ^ q9 i0 s7 \+ S3 W) G long val;
- q6 _% d4 i4 J( l1 C5 k1 ^6 A9 s long size;2 y; \+ x' D% L; O5 z
int i = 0;! {# G/ M3 P$ z" V
! d6 k& V0 f l1 H' s
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
) ~& W5 L. L5 O( G, Z. h addr = base + cnt; /* pointer arith! */( e# l7 \4 e' f( F$ d* o6 ~$ A8 X
sync ();. l c" V3 u1 S
save[i++] = *addr; c# R. }: v+ O/ W3 u
sync ();
3 s+ {$ D( w2 X( `7 g C *addr = ~cnt;! [8 ^: R0 d7 c. [- Z
}7 K# C( q* | ~, v1 f# E t" G
% }9 Q3 S& E3 D+ `$ |+ _/ B) w addr = base;
- H/ L! Y: b3 k4 j4 m) l sync ();
9 ]! q( }+ H% u save = *addr;
) Y" R: U) x/ k- U4 B/ P- ] sync ();
8 i* u4 R u+ m' u; o- ^, Q1 I! v *addr = 0;6 x, d9 S( g" @5 O& A3 Z
7 u0 r1 v% N3 W7 p, o2 V4 K, J9 h
sync ();
" p3 W, W; H/ ]! t1 u$ w if ((val = *addr) != 0) {# j; O' j, |/ l3 O
/* Restore the original data before leaving the function.$ d! i% k, \& D* {# a0 O
*/
$ v' s0 H# q n6 J sync ();
8 p: W& i. |+ q" i# A/ J *addr = save;
7 H! L$ R/ a2 Q7 v for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {6 |7 N: c& j7 C) D
addr = base + cnt;+ P. q3 a# H3 B; G& {* k
sync ();
3 ?% h2 }" |7 z8 f: {9 ` *addr = save[--i];
3 c* k. e; [! k3 }/ }" N# R& K% ~1 U }
3 F& p4 E$ z o* _ return (0);
2 M; @- D1 B8 m9 q9 N }
2 j$ `* L: w" w) \
; L* G2 b2 _: q for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {# h. w) C' z9 ]9 R, ^& [
addr = base + cnt; /* pointer arith! */
% s5 P5 v9 O* p* W) Y1 y val = *addr;
( p& C2 x* X$ b" w *addr = save[--i];
# D& h! Z3 c% h" e! _ if (val != ~cnt) {
7 `( f* J2 |+ D; ~ j size = cnt * sizeof (long);
4 _+ L5 g) c, p2 S' F+ a /* Restore the original data before leaving the function.
9 ~# Z: ?! J9 F6 c9 y/ n */
' @1 ?+ X5 \) e; o2 x( M for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {, G- Z/ {8 }+ w' D7 B
addr = base + cnt;& l' J0 r' n0 y" d/ _6 A
*addr = save[--i];
1 p2 g: H% F3 G j. U& V }" c& L0 I( n$ I
return (size);
2 W4 a+ S+ |4 ?+ C- v+ U }
* \. v+ ^+ k; ?: q" ^; ` }# m; q5 ~; T! K4 ]# P
2 Z! o5 ~! s: B- d6 G; R return (maxsize);
( R# }1 j1 \% y, C. f}7 L) C+ f& I) l) H( t
int dram_init(void)
# b8 l. b" S r+ x6 A5 Z# O{
7 k0 |9 M i J9 h5 D /* dram_init must store complete ramsize in gd->ram_size */* @, ~3 H. t/ y J+ A
gd->ram_size = get_ram_size(4 ^/ J9 x3 @$ z4 h! q8 K
(void *)CONFIG_SYS_SDRAM_BASE,/ L5 C8 H- H0 a6 x, p
CONFIG_MAX_RAM_BANK_SIZE);) N9 E8 j- e# k) Q: p% P/ N
return 0;
0 i- m" x7 Y9 o}- {; [: {# p9 Q! `' X5 L
6 O) I( \* X% ]+ X+ g( ^: o. \
6 {% _" V2 g- q% O1 `4 E
$ ^4 g8 [1 Z9 c
: o# u2 L3 O( dFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!. h# F) ]' U( _: }
. s4 R0 h5 q A. H% y
; a; \, y+ ^& \6 J3 Z/ s
% t; ^* A: Y* ~" @: f$ w
|
|