|
|
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
$ b' o: v5 C0 M3 }; p# S1 B+ r/*
- R+ U& P' o: k: @* ^' T* Check memory range for valid RAM. A simple memory test determines+ S5 h5 i0 _9 N* f& R J
* the actually available RAM size between addresses `base' and
1 Q" C" j4 S) N* `base + maxsize'.* k5 Q# v7 \- r( _0 D: V
*/3 K: B! r. C# Y& _- @) [
long get_ram_size(long *base, long maxsize)
+ s+ |# z2 h$ p{
& N$ V/ p( g( {6 s* y3 [; O volatile long *addr;/ `. R0 E( ] U- a I
long save[32];1 f+ \. d H) l
long cnt;
' b' \1 k- {: {3 n4 C0 { long val;
$ R# t" U& N6 A0 U! \, a' K long size;
: x6 X4 I5 x: E6 x0 n7 x int i = 0;6 R2 J1 D. ~* I
8 H* \ o* j6 U' @ for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {- P7 B2 w& Y: r+ h" D
addr = base + cnt; /* pointer arith! *// q) e+ H0 c8 n( o. M
sync ();2 \/ o6 w7 J8 G5 ?' K$ q& e" A$ w1 ^
save[i++] = *addr;5 C4 B" {& A: [7 A8 Z
sync ();
0 u3 M! [* ~+ c4 H$ E- i* n' G1 } *addr = ~cnt;$ c% P/ a x; K. K
}
9 n: ^; m% J, K: v G* l; e
1 c6 m) s: m; z0 A addr = base;
0 O. E3 r* q- E9 y! A) B sync ();: `* R% m- z7 X5 N# Q U2 |
save = *addr;
& K' `! b, }4 u sync ();
2 [2 I9 ?( [& Q! A *addr = 0;
' P& U1 G/ _2 z X' ?
& K+ q( O+ ?- M* |6 q6 { sync ();
: a" G- L) \: W8 V2 x, e if ((val = *addr) != 0) {
* v0 Q9 z9 w$ r" n5 U /* Restore the original data before leaving the function.
( h& [# e6 Y1 ~4 m9 K' M( @ */
. G% A0 L4 Y% v* ^. g/ t/ q% e sync ();" {5 _' T, G" a: b* c3 |- v
*addr = save;
! ^6 C+ i( L+ K for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
* j0 f- B) ~+ f: l1 h2 C4 z2 h; S, r addr = base + cnt;
4 s' f& x. b/ I- u2 y7 i$ ~# a ?" X sync ();
% N, `9 F% g) O# L( S: [ *addr = save[--i];% l3 K, K* F2 t+ i0 a) X
}1 |7 b' _- ]1 v
return (0); I6 t7 ]8 @; W2 k+ ~' T
}
% K7 X. t( Y4 }8 N6 i! ]3 t- Z: R4 i
2 X. J2 G% `( A& L5 @) v! c for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
& j9 Y% q# \& {9 T& h8 |0 T addr = base + cnt; /* pointer arith! */, N+ Q) H( y: `+ c: h
val = *addr;
/ Q; F( T# |; a! H' E4 g7 ~ *addr = save[--i];
" T, |. B, ?, u* V' d1 L5 e! h9 C! p if (val != ~cnt) {
& ~, y# [6 J% f4 A6 W2 v size = cnt * sizeof (long);
. E0 y; Y* W) q8 w* A H" Z: P- { /* Restore the original data before leaving the function.
" X4 W1 h, ? d. w+ R */8 U4 u& T: W* [. _
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
8 i8 A$ Z& ]1 T' Q- G% ^& `6 x addr = base + cnt;
1 Z- }! n% t4 y# Q* } *addr = save[--i];
" \3 o" b) J, H' K- a, g* x }
& h8 Y+ g. n! |3 w return (size);& e4 p" k) W) t& B7 g# w# i( C
}
# S9 |: v. `, M5 t- B: s5 \( t) M } F; y2 u& K2 M% ^& a* s6 L
# h m) C v5 W/ ? return (maxsize);
/ O: o( b( B$ e' o}
; ~. V/ s. |/ w- M. Qint dram_init(void)0 E e5 s6 A" x* n$ d% Y2 g5 ]
{7 F5 Y' @* P. f6 D( i% v+ f
/* dram_init must store complete ramsize in gd->ram_size */
% v3 R9 D2 u6 h3 q gd->ram_size = get_ram_size(* W* n) _ j. u/ y- _& p
(void *)CONFIG_SYS_SDRAM_BASE,
& b/ r4 e% J+ h# r- I: @0 o CONFIG_MAX_RAM_BANK_SIZE);+ @# R) v% v) U0 ?
return 0;
) O- a; g% t0 q$ a$ ^, i: ]}
e+ r0 Y* v! n+ [3 k2 T5 A1 ]) R4 f
, C1 e$ }7 c: ]7 B/ H+ G/ g# _" t: b) @# R( W+ e8 ~
! a8 e% W' {. u, m# }, i+ [9 G! b) W# {* T( T
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!) R3 C7 `* i7 A( Y& i' w2 y2 ?; [
( W J. K# z; H9 n/ i3 e! u3 w2 b5 `
# Z- W! f+ w7 l
|
|