|
|
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:% B: r5 a) y1 ]' V7 Y
/*( m3 L% I4 a( u) q9 l
* Check memory range for valid RAM. A simple memory test determines
4 @ O$ j. T" O* the actually available RAM size between addresses `base' and& U1 M, w1 [ k: H, a* Y. q* U
* `base + maxsize'.9 ^- H7 n; e+ e8 K3 b8 o
*/
0 X0 |1 k4 }6 Q2 mlong get_ram_size(long *base, long maxsize)& Y' E5 A- R' g! P
{
" i8 V- y5 B, u. [* K1 n+ D volatile long *addr;8 J4 Q; y# K7 @7 H, k+ m4 S
long save[32];9 `1 N) ^# F6 m# P- Z& e# T9 I* U
long cnt;0 l& i+ E. `7 i8 ]
long val;! Q( \ |8 T3 `; d+ X' c! s) V
long size;
% p# t5 m, d6 l X: d$ a int i = 0;
6 I( _& A, R+ R% d+ g% D6 ]" `' m4 H: r- Y Y( w9 N
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {' O' a- D; C, }. }8 x6 l/ S
addr = base + cnt; /* pointer arith! */- \- M( Y7 X( [3 Y/ t2 h
sync ();
6 Y! u5 O1 X4 z; k9 m2 P3 j save[i++] = *addr;
2 ~$ l% @2 q/ J: _) v0 T sync ();( V3 p* s0 z% g
*addr = ~cnt;" I( Z% R, `% L8 N' A( `. m" u5 D
}
. [, |5 `/ \! G1 P B: i" a, A) _8 w4 r9 \0 O
addr = base;
8 f9 H$ N4 K C& l0 C Y sync ();
4 _/ r" i+ H& }6 m) J save = *addr;% V* p4 P# R- }5 T' ~
sync ();* l- k) G6 h# ~' p/ {. c
*addr = 0;
8 t+ K8 a+ B8 w' N, X$ m9 M
& m0 m: `6 M0 u7 _5 U3 s sync ();. U) h4 S6 E7 U- ?
if ((val = *addr) != 0) {
2 l8 S* C* _" I. O /* Restore the original data before leaving the function.
! E+ Q3 i! O3 g- r */) k% j# k; P* {
sync ();
9 I W- b) N2 g *addr = save;
5 D) h/ D( d: T B- c for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
9 U3 s v* l6 @6 t: r `5 ^7 h addr = base + cnt;/ l. f o; b6 U; `
sync ();5 X; @+ c0 V% s2 L' i
*addr = save[--i];. f2 O( W9 K9 s
}" m+ D& k E5 w4 G, `9 f. v4 G% ?
return (0);
& }9 D7 i/ A& H( j: x }- T8 @& M2 R: @. Z
/ R& j# y( Y) a3 e! U for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {1 @/ S( _2 ]$ }! E1 D7 g! Y5 G* c8 o
addr = base + cnt; /* pointer arith! */: `* L* `8 A0 @) P( |
val = *addr;2 |9 G5 X' q; g$ L" C7 A5 p! i" w
*addr = save[--i];
. ?! D* Z0 u9 }# y1 H8 f m2 Q# k if (val != ~cnt) {
& u( b- y6 S4 R6 u' q' u" I3 P5 o size = cnt * sizeof (long);
. Z* o: }: L& l# O6 w /* Restore the original data before leaving the function.
{+ |; K# `$ I */* }! _# L6 q0 b" l5 {
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {3 f. h" C4 _1 D- F
addr = base + cnt;1 @3 Z$ v+ k1 Z/ w% {
*addr = save[--i];
- G, h7 {7 ~3 ~2 h- U }
0 [) x# n; S, B5 S9 @! b2 l5 x return (size);, c# z P- F4 I6 b, O( R
}& [, E! K: ^% k5 H% O. q
}
" i: q( Y: `/ h7 {( b* r& }0 {/ x+ a5 \! _7 @. N) G
return (maxsize);+ v7 c5 @( L. z* w
}
9 B$ ^" Z1 w( }8 m* o8 A- Lint dram_init(void)5 G3 o& K% R I$ w6 o
{
% k: d3 m6 ^* o. U/ y7 Y- N /* dram_init must store complete ramsize in gd->ram_size */; L* u. ]( [3 M; A4 [5 T, i
gd->ram_size = get_ram_size(0 K" L E: O: |% Y' }
(void *)CONFIG_SYS_SDRAM_BASE,: |, f* \6 k Q. b9 O
CONFIG_MAX_RAM_BANK_SIZE);% f5 A& J6 N( ~$ I, }
return 0;/ ]( r+ {8 S4 O& O0 J
}9 L+ `2 x( X3 S8 ?
; k- F" J+ f' p* N" W( ^
/ @) w; A& M: M7 ~7 }$ m7 Q5 @' c) D" `. G
5 G- W! o( p- {. Q
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
; w0 Q9 g9 W6 q* ] ?5 A% n! h5 L. R! [; U1 Z* R
$ }8 M3 N+ g& G! p$ E! V* k, x$ o6 S, N; V' }* |/ |2 V
|
|