|
|
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
% b$ ~( k- x* e) j$ P8 @/*
# ?1 s: T- H3 e& P) i; o& I* Check memory range for valid RAM. A simple memory test determines
2 m l3 M3 o1 k& L' [6 |; ]* B. T* the actually available RAM size between addresses `base' and
) d0 j8 x" p, ^: O% n# c5 y4 L; a- Q* `base + maxsize'.# I C9 w" Z* r( r2 H& Q
*/
' }8 Y: f! F( |4 u# vlong get_ram_size(long *base, long maxsize)
9 j4 Y9 f3 G/ n) h, [! U/ _{
/ o+ v9 O! i, C5 c ~ volatile long *addr;9 l9 m8 p! \ ^ r n
long save[32];
# N: o% R- u1 p1 j long cnt;! X( r' v& o5 x* F* F/ i1 h
long val;$ X( ~/ Y) B( r- i/ Y
long size;2 ^5 n* t: C* E- ]
int i = 0;% g) I$ Q( o- m8 Y3 R( n) q' q
8 y! } R$ }8 @; Q% E for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {$ v8 ^' |, `5 `9 `, T/ Y
addr = base + cnt; /* pointer arith! */
/ [# X. U+ ]* {9 l: r+ a; Y- D sync ();
7 d) v' H" k2 Y" } save[i++] = *addr;
U2 t* ]6 ?5 j: S+ e; b) P sync ();
+ k- e: ]6 e- L, |/ s2 e# m! k *addr = ~cnt;
8 V$ g4 f# t7 e) N2 C0 x7 O3 j; o% W }
4 {+ ]/ O0 m) c, o4 A/ l7 g+ `3 Y3 p! N
addr = base;
/ F7 f; @+ l/ t1 k& p$ |: i3 E sync ();/ W) B- f$ o" m0 \& [" t+ @& Q' Z4 H( ]
save = *addr;
( l, z3 F/ f& k$ p& H sync ();2 E- C# n! ]/ z+ X. W# U8 [
*addr = 0;: k( J1 i, j' p; y( O2 [
) x/ {! ~, m# {: Z( C
sync ();
9 B' ~2 H2 D& k! _' I% x if ((val = *addr) != 0) {
9 I; {8 d$ |1 {' S( h+ {9 E /* Restore the original data before leaving the function.
; g! B% C' D+ e, T, u# n+ a */
/ u! b/ F" i A sync ();, _6 o4 D0 {) X+ m3 D0 M
*addr = save;
* p! f# R, p+ O, E for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {" }$ Z7 o' y8 T
addr = base + cnt;
1 b, C% d/ C- T0 _- ^9 r sync ();
0 g9 v& d+ Q8 \8 ^) s *addr = save[--i];
/ {: @2 u6 Y# m }! H( d# @8 R$ N" O6 @/ T' O3 w( L
return (0);
( F& O* l/ ?2 w9 n7 D# i2 R0 Z }
+ _2 y F8 T* h" S
, V5 t% ~2 k X/ z f2 Q for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
( H) Q+ D! }, @9 K addr = base + cnt; /* pointer arith! */2 O+ i/ ~- F' t5 _
val = *addr;
2 {% B) m" w: c* S. M% e *addr = save[--i];4 }( Z; x! z: [5 @
if (val != ~cnt) {- W3 @7 q2 q' s' t* J4 U5 Y
size = cnt * sizeof (long);; B: [! V) }( M$ f" e
/* Restore the original data before leaving the function.$ A2 w* r# V& ]
*/2 V0 p: [- l1 _, D) z
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
5 s% j5 |( {$ |) A& A8 c. \# ^ addr = base + cnt;
' w" K5 E* |3 d4 N- z *addr = save[--i];) _" P* F0 V, \, B' _
}! Z B; i; p3 B4 ?. c, S
return (size);
& H: M* T/ E7 {: _8 I9 t* N: L }9 s1 Q- [: f* }% O9 Z
}* s- L A: L/ P* F$ {: c
! i7 z1 d2 B* [" } return (maxsize);
- D3 k' |1 g" O- E- ~, m3 L5 X}) \9 ^# ^$ B3 }- f
int dram_init(void)- }6 p. v' S$ I; t
{
7 X& g5 @0 Z4 }" V7 p" l. Y /* dram_init must store complete ramsize in gd->ram_size */
" u% v6 x5 e# h2 M! D$ M5 Z gd->ram_size = get_ram_size(( [5 E {, Z B$ E2 q
(void *)CONFIG_SYS_SDRAM_BASE,' z% h# c( [' b8 R
CONFIG_MAX_RAM_BANK_SIZE);7 ^/ E9 W `6 G" v7 }( p6 i5 P
return 0;
2 A% \7 e/ w* t, M! L" X}- J! J Q' H. Z$ S
% e. W, }' V% J, O3 L0 ~) V3 x8 R0 E: R; }0 ]; E
' g8 r F4 h* o1 ?: k3 @# P6 V& b4 _, K% W
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
, R R" ?: ^/ }3 E+ b% y, V& W! F9 G& V e
! V$ a0 T- I' R
$ c) o1 z; y0 W
|
|