|
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
; b: Q! D/ E# A9 l0 _, d" I/*
, n4 k! }2 Y9 w) S: U* Check memory range for valid RAM. A simple memory test determines; ]& C, u0 o% n: P1 {5 p! v- W; V
* the actually available RAM size between addresses `base' and
9 j* Q" t: p$ j5 w* `base + maxsize'.
5 v( y; b( X. l+ k*/; l3 [% d8 M; ?, _3 I" E6 j
long get_ram_size(long *base, long maxsize)% P6 `+ c3 X5 X& p
{# i' w' y& U) a6 A+ o/ U) Q6 i
volatile long *addr;7 z* x7 z& P' k/ X- x' s* W
long save[32];
7 l1 R, ^; p, e7 D long cnt;
. q* p% R2 A& s long val;
& c8 m# _! C# e E6 V long size;
9 O. k( t. P- O" r int i = 0;7 [8 }" B4 c E) W9 u4 P: w7 ~
% S; _4 n0 g/ A( u0 ~ for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {" {* F# n$ d+ A X
addr = base + cnt; /* pointer arith! */3 h3 Y+ u# O* k: s& Y
sync ();/ m$ t3 j+ }# a
save[i++] = *addr;; E5 l% \% x" b8 j& |( j3 l5 j
sync ();4 I$ F* L& u$ v) s9 y1 O" \
*addr = ~cnt;
' [6 C1 W( u/ X/ `* O, v9 T }
$ I9 E7 g' J1 {/ m7 B1 T: X4 x( K1 ?: Z3 K/ z
addr = base;1 Y4 K. S0 o+ b9 b: G4 J
sync ();
' @3 m. c' {7 D$ J save = *addr;
# G3 ]& s4 P2 {5 Q; Z sync ();3 b# Y% J8 ~/ _9 O2 ~1 [# h
*addr = 0;
* U9 H4 C3 |) X k: I+ V, E8 q" @. l
sync (); t3 \/ e. f$ c# p
if ((val = *addr) != 0) {# g( ^2 Q& _' X; q# c# h
/* Restore the original data before leaving the function.8 Y6 {1 ~3 N9 [ k0 m4 z, N& x) n/ [
*/
: ^+ x! }& H* T: P! E. J sync ();. z, H" ]% g% r% Q- S
*addr = save; y9 v0 |& ?' Y6 O0 g; I( i1 S
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {1 _% C1 h, h" Z$ S8 O, P, J9 U: V
addr = base + cnt;
% i9 T" x! m2 C6 H: ^, I) r sync ();
2 B( i, X% Y3 h; s- b2 T- F! V *addr = save[--i];" A! {! v1 W% S G' E
}3 L- g, S( I" T
return (0);1 T+ x! S P# T" @, n! |7 s
}
. U4 C( M7 `9 E) R" R! m2 W! s" }+ C. ]& [3 F% D- s- T! M7 Z
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {# U% O' x6 z* q4 A" ^+ R$ [, y5 [
addr = base + cnt; /* pointer arith! */
$ H$ E9 m9 W% r- q val = *addr;9 ?( B( ^# C( a6 o' u+ Z
*addr = save[--i];
" E: O" F' a( w1 b# _. b* T: F if (val != ~cnt) {
$ F3 _ r p2 N9 e) o& O size = cnt * sizeof (long);
; U7 `+ _: n5 r2 b6 _ /* Restore the original data before leaving the function.
0 \& b6 W+ \ {, q$ t */ R1 @% I, Z9 i. ?
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {/ E9 p7 e- U* w* o
addr = base + cnt;; b+ u5 \( _; D) ^( _
*addr = save[--i];1 u& z5 @( Q" r n" |6 K3 X0 n. O. m
}# t8 E/ t5 v: x8 I! S/ j0 B
return (size);/ D9 x& E8 }5 W& G" {7 t% s& t, q
}
, w: ]' }1 l- }3 X4 g }
; \/ S( }2 [- x8 ^; f6 s& J* w( T; G( N
return (maxsize);
& @8 C, ?, d6 q}
) H; k0 p1 v( M3 M# Q' |3 yint dram_init(void)9 _6 _) ?# j8 Z$ b$ `4 B
{. M8 c) z( U0 K" a1 w; A
/* dram_init must store complete ramsize in gd->ram_size */9 R6 j* ^, x* p" |
gd->ram_size = get_ram_size(9 i) E0 ~* `7 @0 D
(void *)CONFIG_SYS_SDRAM_BASE,
0 _* `& b& N9 E+ _* [/ t' ^ CONFIG_MAX_RAM_BANK_SIZE);) z9 G3 W7 r9 T+ |' z
return 0;0 d9 x. s5 f- V" a* Y% A' Y/ Q8 _
}
, w9 ~2 l0 i$ X: d, E+ U6 s2 ~$ ?* q; R
, r9 J3 l# h0 [$ g# }1 ]; r. `
% v; t# w, d# i @2 a4 k5 V
$ n# V1 f: `1 Q0 l/ n2 n0 NFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!6 h: R Q% y6 L5 { D6 D
% U$ q8 r3 q% T/ s/ S' }
! f: n- s# [* O5 d) m
! ?, c& q; ?! \3 r* C# b. H |
|