|
|
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下: U% a- a; y }+ f) D, `
/*
$ q# Q4 ~* z; `8 h( w/ q2 g* Check memory range for valid RAM. A simple memory test determines( W9 p% A$ t; D7 k
* the actually available RAM size between addresses `base' and$ G P0 z/ K3 m! k
* `base + maxsize'.
. {) w3 y* t! O*/% s+ L3 D0 q6 G
long get_ram_size(long *base, long maxsize)
2 P+ p& g( z0 [{ \3 z4 h# @) f( B ]9 {7 b0 _7 i7 ]
volatile long *addr;" d: s# ~# Y; A( }# u+ v
long save[32];
1 c% q% @& b! C4 [& w+ T! R long cnt;
0 S& o) t' Z% F4 @/ h long val;
7 _8 i4 I- C' |2 g! @: }; x2 _+ J long size;
6 D e! ]8 T- O2 c int i = 0;' @% K' F m- m' ?& n) K" h
$ _, O- e6 T5 {2 R5 Q% w for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
: f# c0 P# M1 D# G9 R' K5 p addr = base + cnt; /* pointer arith! */
& v( D, B8 ]* W* H2 I" m sync ();
( x+ h2 A U' m/ n P save[i++] = *addr;
5 B4 t& v( x! h7 u9 W sync ();9 h) x& o6 I8 n: r( ]
*addr = ~cnt;
) G; |! }$ ^4 Z& b. u& M }4 N" X* p( v+ M2 t2 y7 c0 e
) K0 B* M6 ~8 P1 D addr = base;
# |2 p3 O3 v4 C- w sync ();
7 _. \! t7 O9 Q+ i save = *addr;6 P2 Y7 k9 |0 \" {+ y
sync ();9 ]. V# i" K, } Y
*addr = 0;& ]0 Q6 k7 R8 { j" g1 {1 E4 c/ e- {8 s
$ M! S8 \( `' W5 w7 m sync ();
# f M% a& Z$ a0 \& j' P if ((val = *addr) != 0) {3 h. m6 Y4 g6 R8 p" D) `
/* Restore the original data before leaving the function.$ j7 Y V$ `1 q0 Z) Q0 x
*/
* ~! y0 M( q# ]: |* S5 C' i sync ();( D: N' C8 I; i% b
*addr = save;( q5 `! B" E" I8 |( n
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
; q0 Z$ f: C0 V* ^, l addr = base + cnt;8 I" g- k" ^$ z" n, i" C
sync ();" P& v7 W4 x2 H9 E
*addr = save[--i];3 T; z9 J- k4 V
}
( y0 [4 M- |! ?$ \6 L return (0);3 F* Z [5 {8 f' i
}
7 J/ [0 |2 U9 [/ H) H$ r) ^
* x4 a: h* s; G/ s. T7 V for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {) m; M" W, f6 u1 v
addr = base + cnt; /* pointer arith! */
8 `* A2 K1 Z; a4 ?! w! E# U$ ^6 O9 R val = *addr;8 a3 a+ I0 S; l
*addr = save[--i];3 v9 ?9 W Y; n( u: N+ t
if (val != ~cnt) {. j8 W8 E! z" J( F8 q2 e8 b7 E2 Z
size = cnt * sizeof (long);
- \' I2 Q. k- @0 I, ~9 @/ ` /* Restore the original data before leaving the function.7 }+ Z2 P0 F6 ]" E) V: k
*/: @) n/ x$ I7 N( \7 {
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {! s0 M S* ~, c
addr = base + cnt;
/ @* b- s( D7 r; l- j0 t6 }" c *addr = save[--i];. w; E1 m3 l3 l) U+ _+ R% @
}
; z& X" C9 c6 E5 x0 s/ ~ return (size);- _; u5 k) c9 v1 N) _
}4 M6 a" U! k; K
}! x$ d- h' A+ j! y7 C( ~
+ \/ v# ~( Q5 k: J! A* w! R return (maxsize);; x) P4 B2 A- [
}+ |' h7 ] L/ k1 [2 L
int dram_init(void)
: u9 P8 b5 Q( J& p0 [6 D1 A{ z* G7 A2 G( @
/* dram_init must store complete ramsize in gd->ram_size */
/ u& d% P) `' a9 C. n; o( M gd->ram_size = get_ram_size(
9 T3 m1 P3 e7 d) B2 s (void *)CONFIG_SYS_SDRAM_BASE,0 x6 s" d4 P2 J: A* t% \
CONFIG_MAX_RAM_BANK_SIZE);
5 p! O! ^2 L; w" n return 0;
0 N' ]' {. L7 C! S3 R2 d}1 x0 R% g: F7 p3 ^/ K+ V
! I5 m( p2 W! H0 A5 C/ a3 B% S, ]$ f$ H+ M- H6 ?4 U& h/ a
0 l I& D( E9 ^) l$ `+ G8 s& [
% g1 c; f& _) ^! x$ R7 g
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
7 E7 \0 Y. O: D2 O5 _" u* C5 Q8 H4 {. z" D5 ^2 _
1 Z P* ~, Z- X# A5 v$ C) G- u+ F
# z& W1 @$ Q, I# O" q
|
|