|
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:; a0 k& Q3 q9 ]* C; X+ c2 m
/*( a, B/ a' d& @! d4 T8 ?
* Check memory range for valid RAM. A simple memory test determines" S' ]% x4 S' {# Y9 O- A, c0 Y
* the actually available RAM size between addresses `base' and3 }. q" M6 }% O: @* M0 O- e
* `base + maxsize'.
9 Z4 m. g* A& g# j*/
$ o C2 U" o& l& hlong get_ram_size(long *base, long maxsize)+ w) k9 Z1 f$ H; M
{) }. n t- ~7 F, X$ | m5 q2 u: M$ A
volatile long *addr;
* u( |) h& g" e5 w5 e+ A# m long save[32];
% ^. |1 ^8 y" R# I/ W2 t- u long cnt;. p# C' z9 N% V# _# \5 Q
long val;$ A5 f8 W, \/ F1 m' w/ [
long size;4 M3 D; t" L# f; u6 }1 X
int i = 0;
+ K2 ]3 u5 b( k1 Q# ^
8 q2 ?; Q4 ~) ^4 F) j: C for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
( Q) o" V8 D7 A# b addr = base + cnt; /* pointer arith! */- e, Y" E8 ^ a
sync ();- p1 \$ I0 X: L. O% E8 l
save[i++] = *addr;
6 N5 p1 g2 [+ k sync ();! j2 M K s0 F" v; ? S$ V
*addr = ~cnt;8 P$ d5 o$ V2 @; d+ y
}6 b. G: o/ ]& r# C, i$ m0 }5 O
( N' L: \" p% o3 n8 h! h& u9 u9 T addr = base;
% ?& E8 j# e4 S sync ();
& O% |2 I7 Z( `$ J save = *addr;
1 ]* P5 j# D+ \* w, T% {+ x2 v sync ();- x/ x! W6 b% o1 l! U
*addr = 0;
" u& R0 ]9 M+ Y' F( S; ~
" t) o0 y9 H/ O+ O/ _. E( E sync (); ]* E' t+ i. R* k6 H" D/ A( T
if ((val = *addr) != 0) {
2 V; L; ?% Z+ v, X /* Restore the original data before leaving the function.# T" d. q0 @6 q; O( q, O/ O! j
*/8 B# W; r* c, E: k5 p7 N9 ~9 t
sync ();
, G, r" L4 Q/ x+ w$ h: g *addr = save;
% w2 t. Z: g7 v0 r, k/ a: ? for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {% I/ n" t Y. k ?5 G/ a n
addr = base + cnt;2 O6 v- s2 U, ]& {0 p, T
sync ();3 k" H* a7 Q3 ? r( Z1 a4 w
*addr = save[--i];' B/ Z+ l$ v* t$ h- U
}
8 s3 X9 G" t2 K, v# w return (0);
% }3 Y$ S& f3 b6 e) J }) ~5 L* Q8 Z4 M
* q) R- u6 A3 e- H5 P for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {( d0 V# c! ?1 O. ?2 n' }' M7 w
addr = base + cnt; /* pointer arith! */
8 A7 _: P- @" `6 w% T1 C val = *addr;
0 {& a2 f- j0 ~' d O# S) k *addr = save[--i];7 Y# H7 J( k/ ^9 u( W/ f4 X4 A
if (val != ~cnt) {. p# E, p {! N6 U# _
size = cnt * sizeof (long);
3 n# B' C2 p" z$ N2 L6 k /* Restore the original data before leaving the function.
5 E+ l% w6 T: Y4 I+ i( z3 \ */
: D4 V7 s$ [& O! u for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {+ D" c6 Y: l0 C7 ]" d8 [
addr = base + cnt; ~8 F7 K/ p2 @# t+ K
*addr = save[--i];% t# ~9 |' |& q4 l- w
} o6 z0 ]$ ~" y' R
return (size);6 j8 ^1 R7 C9 Y4 o* k
}
' d' E1 w- L& i* r2 b2 F }& _+ @6 W% J& _0 M: Q E/ ?) p6 a
- h2 P; v$ i; @ return (maxsize);6 h* D) p) {- J' L7 A
}2 I6 i* y4 h. u- o( X1 `* h
int dram_init(void)
- P: @ F$ J# K) e Q8 Y; g7 _{
, I! b3 h: V: ~; g /* dram_init must store complete ramsize in gd->ram_size */
" }* P- l8 \9 u* V* k5 ?+ } gd->ram_size = get_ram_size(" Z/ A$ }, B- D$ c3 e0 s2 S' u) Y
(void *)CONFIG_SYS_SDRAM_BASE,# L$ E" K6 g) W8 ~% k2 R% m! S
CONFIG_MAX_RAM_BANK_SIZE);0 ]7 f! K5 V1 I
return 0;0 ~9 o9 H. Z6 V7 a {0 u% T
}( [2 B( E z4 R: d
1 D3 [( G$ ^- o: X/ \9 ?5 v+ W+ a
( k8 G: M% C5 T+ ` ?9 f# D
. E b$ `5 [& Z& f6 L
: e& p& K! B3 X# d! J& z w4 DFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!) [* q: Q# m- I0 g7 V4 F# l2 o
3 E8 A( B" T1 ?) P5 ~3 D
# i6 \& Y8 T( B/ b# t# t% B; ?" d# F$ F/ f; G
|
|