|
|
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
! F7 `, W& W% s+ h8 B. s/*
9 @( l! D! _5 u A$ A; P* Check memory range for valid RAM. A simple memory test determines
( s, K6 m/ J- [( Z9 m* the actually available RAM size between addresses `base' and- f8 z; b( ?- H) |3 {+ S5 Y, S; N( @
* `base + maxsize'.) Q; I& f4 F2 q2 q2 \
*/
% S3 I |! {5 i+ d. g( [) O3 B% N& Jlong get_ram_size(long *base, long maxsize)) ~4 M0 F0 R& |% K9 F
{5 |. r4 Y( K, f- ?
volatile long *addr;
) q5 N( g e; ?+ G6 Z9 k0 s long save[32];
4 N2 r: p9 B4 ~. G; U long cnt;
9 Y) u- z* [" Y long val;
: C; t4 [. R: q9 O7 A7 t long size;
0 g+ O4 J+ }6 I8 u6 B! d: V int i = 0;: I1 T5 H( ~! }7 A4 }* W4 @. u
% h0 K. B; ~% y( B) Y for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
1 v4 B) P4 n, j3 M% _ addr = base + cnt; /* pointer arith! */
" Q, g) F6 I" f sync ();6 I ?, R4 c9 {! L, n+ @
save[i++] = *addr;
- C! U$ D4 p- k; A6 Q sync ();4 D) q' K, \/ H+ K
*addr = ~cnt;
2 i9 V; M' B3 g7 ~' q5 t5 [& C }
$ h- u7 |+ h2 s
1 b# [ s& G$ |# f3 D addr = base;
( l/ q$ U. l u P! A0 {: F5 ^ sync ();( Z! Y B+ D! \- a) m
save = *addr;, }6 f ]: c+ Q9 ^$ m' D# k
sync ();' f4 b# I& v/ a2 {- H) I3 O5 k, p
*addr = 0;3 d# q' B, D3 H: c' K( G
) H, P8 N! ?3 J9 |; ~ x sync ();
& f& I6 }7 k7 M. g# `) e if ((val = *addr) != 0) {
9 {! Y$ N+ m1 g3 Y" V /* Restore the original data before leaving the function.5 l- d+ q0 f/ a3 U0 j+ {0 l
*/
Z. A) ]+ E0 x2 |' x# ? sync ();8 X$ }9 ^3 e2 \ k0 n
*addr = save;+ b6 K4 H) m7 p2 y& j, h7 a' R
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
7 X% f7 K- ~9 v7 d6 t C- | addr = base + cnt;
+ {; Q1 U) d0 t% B sync ();
4 r0 V) ? a- M8 p* f- L9 r2 s$ j *addr = save[--i];/ l9 U3 c4 |+ M! ^
}- W& P# T3 Y. J' ?' f
return (0);
, n c' Z h. c5 q/ x L( L }6 W- u* n% ^% f) c
6 @1 `$ Y* Y* z. z: q/ ~. e6 ]
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
- D: V/ V$ h# H addr = base + cnt; /* pointer arith! */
( O. X6 U& e+ F' ] val = *addr;: M3 c1 g. Y4 d, M: j7 b9 @
*addr = save[--i];9 J0 Y6 } `) C0 ?( Z
if (val != ~cnt) {
. _( U# Q9 ~ P/ Z& V' ]% l size = cnt * sizeof (long);' y7 X+ H+ @/ s! X' _) }
/* Restore the original data before leaving the function.
8 k+ G: w- q& b& a */' b7 \3 F; k' \% ~
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
" I! e# ^% D& \* t0 t4 E, @/ m% f! u addr = base + cnt;, Z9 [! ^9 J& D2 n, D
*addr = save[--i];5 |5 e$ b' i$ b# B# Z e1 Y; A
}2 c2 N M( Y8 V
return (size);
4 z* {; G8 S. S1 Y ^/ N }
# z0 J7 ]( I. {3 z" C$ u1 x' p X, J }9 l3 i# f. S8 F2 S" A% ^, x
' z* `4 w% m3 ]: M- G
return (maxsize);
+ p0 M' D* |. C3 x}: k# w# e: `% s. C+ q# l
int dram_init(void)
4 ?- @) o0 B( g; a* ` N+ J7 }2 o{6 {$ J6 l( e1 P2 p& F1 @: v
/* dram_init must store complete ramsize in gd->ram_size *// E- `4 K! Y5 G- s
gd->ram_size = get_ram_size(+ n, E: _, T# ?; c3 G$ y! [: Y
(void *)CONFIG_SYS_SDRAM_BASE,1 Y2 g0 Q P+ O3 \7 [
CONFIG_MAX_RAM_BANK_SIZE);
/ I9 F1 x( V6 u, E0 V! R# t return 0;
# y/ j. t4 Z! K* K6 W}2 z- M1 h( U7 B
" w5 a0 O) W+ S3 b6 B: H, F& p
2 k, s* s/ Y& K8 W" q+ i) c
, O% o, C" h \8 n
a/ V' w" v2 _FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
1 k4 K) n ~, ], d7 Y
3 ~$ i$ L% R- D: b: ?- C( @9 J# o9 k B: E- G( r6 t% E
- d7 z; h# Y3 j" r7 v# R |
|