|
|
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
" @2 U% Y+ H, H; P7 q/*! T5 V" d' H4 k+ p/ b. E
* Check memory range for valid RAM. A simple memory test determines
, m% d! X& n% O. Y; Y6 s* the actually available RAM size between addresses `base' and8 _! r9 P( I+ ]% S7 ~
* `base + maxsize'.3 r9 e: C' A5 F1 U3 j
*/% n2 n! {0 K3 o1 z
long get_ram_size(long *base, long maxsize)0 D3 u* m% f6 w
{
# V4 I# W5 i+ y5 } volatile long *addr;
9 j {( o) W% Z4 n( ?& d/ l4 O long save[32];
7 o8 X, n D7 r: K, W8 H+ F" }% e/ `0 V/ S long cnt;1 r! U; I; ^2 p
long val;' k# l4 R i/ s3 u9 A% z
long size;0 {- R5 h$ N! A% n" c) i
int i = 0;
$ x# \+ G0 G2 g9 y3 R" v7 \* ]- @. D) `1 j/ V& V+ t7 Z+ f
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {' i& x/ A/ B( r1 |3 ~3 ^
addr = base + cnt; /* pointer arith! */* C6 h/ r8 P h
sync ();3 `3 i3 c6 m" O0 F# c
save[i++] = *addr;$ m, Z. K" K- f$ s O2 `
sync ();
7 T y6 E2 v+ X; | *addr = ~cnt;9 k8 e- X; q; ^8 S+ M
}
/ Y! o. m! ~$ H( @0 t. L! o
. j7 Y% Y1 q3 u: x/ e# O addr = base;
! j% ^2 y/ e$ R" [5 L- r- d( U$ r7 | sync ();
4 g. ], H* e! p save = *addr;
' j) d: Q3 l! R: [% {* O6 v+ _0 {( T( Z sync ();
1 [. Y1 S/ J$ S- _. V% ]' N *addr = 0;
, J1 D# w+ n" e8 D- x8 ~: q" {6 y5 v- v$ ?3 I! [* R
sync ();8 P5 }2 x& l3 Q; m$ Z G* p7 V
if ((val = *addr) != 0) {
/ `8 i% K4 z1 s0 @/ N* M /* Restore the original data before leaving the function.
% n! q# y, r9 L, ^* Q! n: W, h */% w( `. @ n. U5 i
sync ();) T+ O" ~/ K/ z0 o! O' K m
*addr = save;
" w$ `5 M9 q$ D for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
9 J. T. a2 x+ i( V1 T& M addr = base + cnt;
$ h. o9 [, p* W2 y3 G/ @; y+ ] sync ();
6 ^* `5 c6 ~) g7 \! H *addr = save[--i];
6 E$ u8 P! v( w1 K }$ y. {, b# }: N) s
return (0);
" B& }4 p; w, u: n1 n7 M }/ A9 c$ ^7 W S N2 F, a
3 E# ~/ ^0 _0 N i, y9 B7 k8 p3 W9 s for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
1 `0 ?! ~7 m) k+ t7 x8 d addr = base + cnt; /* pointer arith! */
6 ]6 ]( ]: ~- e. g9 T z" ] val = *addr;
/ z; o9 I" J% p5 Y; q *addr = save[--i];
% O0 ~0 C+ R4 W: m% n; @# {- U& i" F if (val != ~cnt) {6 z+ X, f: _- Z& V, \! G" E! g
size = cnt * sizeof (long);* h: p4 s* n# ~
/* Restore the original data before leaving the function.
# b. F0 C6 }3 T3 h# o */! u) V0 d0 }& R9 @- ]2 w# @+ W
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {0 l( h& _! ?' J r0 n
addr = base + cnt;9 h$ Z8 m6 r% ]7 H6 P; o
*addr = save[--i];2 ]6 L1 k3 I: m: ` D& k$ J
}
1 l1 f6 t' ]0 t/ V return (size);
7 i5 Q' s, j& U; Y. m }, d: i0 K. ~6 N, N7 T: u
}$ W4 P* w# h1 _9 n9 R( W
" H+ H" D6 f9 D7 ~7 N return (maxsize);! k( T) t6 u+ b
}% d! ]' G1 G% U2 D1 ?+ p4 M' H
int dram_init(void)
. V+ H2 W! E; \6 {. q, H{9 w; g- l0 C e) P, C
/* dram_init must store complete ramsize in gd->ram_size */% a6 ?0 |4 E5 C( L; H0 ~
gd->ram_size = get_ram_size( s2 I0 P5 i. m3 N5 a
(void *)CONFIG_SYS_SDRAM_BASE,
" H- ^7 {! ]" ]8 X CONFIG_MAX_RAM_BANK_SIZE);" o( u( d4 E0 r f3 j0 M
return 0;3 i/ D5 A' Y, K& c% t: N% w# ^
}4 e' B# i B- u0 ^6 n
9 V ?0 X' E) S/ K, k' ?
! p. _( B8 t2 N4 E5 q6 o. d6 Y
5 }1 ? c# _, R# K! M, Q
2 {% f& Z5 x# W* H6 QFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!8 l; o* r0 T% ^
. l( x6 f/ k+ X% F2 c i. O2 `" m
5 ?" H" o0 F [' G) I. b" u. }8 Z) N |
|