|
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
: }6 p% U( H2 a0 c2 f/*
0 S. S5 Y8 U' H; S. K* Check memory range for valid RAM. A simple memory test determines
$ o" A( u4 y1 L) Q* the actually available RAM size between addresses `base' and
. ^1 Q0 Q! u! i) {; i6 X* `base + maxsize'.3 k p @; r' q/ h+ Y
*/
3 i' e1 r, F: ?- plong get_ram_size(long *base, long maxsize)
G. l- U( \2 B/ i* S. v{
$ R* r+ `( m" F; H3 b volatile long *addr;8 b1 d9 N+ B/ o6 E
long save[32];0 |) V3 M* R9 [ x: T8 M
long cnt;
1 C" y" b' a+ V2 Z long val;
5 ]/ l3 R0 E+ T& `1 r/ M long size;
- ]$ P; f. R2 {7 G. x9 O int i = 0;3 r5 K7 L% d+ I# O
: ^1 P" [* C, f7 I- X9 B" L; _; j for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
8 f5 g3 k: ~# n% ?% H5 u( ~ addr = base + cnt; /* pointer arith! */
; P) h. M: {, v$ M$ v' c6 ] sync ();
( U) ~) X$ V) w+ P4 o" C4 k save[i++] = *addr;
/ n' L3 }0 ?6 T; L- x9 x' X sync ();
% g. |8 [$ e l% {6 F *addr = ~cnt;* q1 z6 v2 v: }
}
# ?9 R: r2 C7 \0 E# O
: Y- Y5 D4 D& d/ M! j; w7 E addr = base;
" \/ R, u, P9 H! P0 g. z4 ` sync ();
& @' f4 ^8 |) ]+ H# ^0 ~0 g save = *addr;
0 U: t) _0 ]4 r! f7 _' Q$ h: f B sync (); N( Z5 k, l$ x& o4 Y! V
*addr = 0;4 u, T: z. s* Q. Z' w g' A# h2 t
" E( X7 C- {: b; @$ u sync ();
- _8 D8 u) s( I! |6 J if ((val = *addr) != 0) {
7 R, t s5 ]# _9 G/ I+ s1 ]8 D /* Restore the original data before leaving the function.
$ _6 s! }$ [1 E4 Z) h4 t8 h */+ }1 [6 ?0 ~: p0 w
sync ();, b- \/ @8 [4 t S( R% e. ]
*addr = save;' u/ h' ?' c8 Q
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {! ?$ }% ~: d3 X# x
addr = base + cnt;# O0 C* X) {: U( H, K! b
sync ();; Z6 _1 M: [* ?2 E
*addr = save[--i];( K7 t$ q9 ^: u# F E# r" @( Z3 l' _
}
5 Q& w+ R" ~8 i, E. g return (0);
7 G5 K# O9 x8 W } V7 h, t8 H- u- O
. ~) Q% }% R. L6 \. P* I9 ^ for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {* o' D$ w ~* M
addr = base + cnt; /* pointer arith! */
+ U. B9 a3 Z/ O$ Y. e val = *addr;1 P/ `/ V. X" G" \
*addr = save[--i];$ {; {; b/ Q9 Z
if (val != ~cnt) {
2 Q: W6 J7 s2 t, \7 L; U+ ]9 | size = cnt * sizeof (long);
: r9 K+ ~9 |! l1 m+ B- Q- u /* Restore the original data before leaving the function.' c" U/ P7 D$ c4 |2 k6 k) D
*/" h7 E/ X( Z& }. z: o8 |; z
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
' R* O* w3 ?7 d* l addr = base + cnt;
+ | t' |& @3 b9 s9 O! P *addr = save[--i];. b- q8 h/ g. M: v2 P/ b
}- w0 U0 m8 \; W; g8 m" N
return (size);- Y8 C5 L+ q- M8 ?4 [8 b
}$ ^2 }4 n- l b9 I1 ?- l6 J, T
}$ O6 v# S1 ]1 ` J+ a
- H1 m$ c5 L& u3 H
return (maxsize);( |- G, l! {$ S4 r6 Y
}& Y; Q1 w2 X/ ~4 J% `
int dram_init(void)
% H6 _8 y- Q' I/ W. M: J) u{
) }9 `8 L# e9 B" h /* dram_init must store complete ramsize in gd->ram_size */2 j# [+ m7 k2 K; p
gd->ram_size = get_ram_size(5 b- I3 }# Y9 J+ k* O; a- O* Z
(void *)CONFIG_SYS_SDRAM_BASE,
9 y5 s5 c) y9 W' S: h CONFIG_MAX_RAM_BANK_SIZE);
+ H4 f0 R5 d; l) U) n return 0;3 v& |6 \( G4 Z, M) H; A
}9 O3 o; I) p2 g- x6 @/ c: k
6 R% R9 z6 `6 x# p- d5 |: X/ r, b8 F# i$ [: i
5 Z1 G, W7 `3 V" F% z( X8 g
. F! o5 x) O9 _# a& B3 U( AFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
) W2 j3 s" i: S
! ^% d! Q4 o! q& D6 D- o) i- h: H
' x9 y$ a0 O" A& v1 Z) z
4 N% i4 _+ ]" L# y* F5 {' q |
|