|
|
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
$ Q! B8 q5 I2 S3 }1 V/*! G' Z& i4 A" A6 @9 N+ m% y
* Check memory range for valid RAM. A simple memory test determines
& b9 q0 \# x; |# a' ]) e) J* the actually available RAM size between addresses `base' and
6 p0 @* n2 l% a! @! j* `base + maxsize'.( K% S. d( x( B8 Y5 m" e) l
*/
- J4 T& Q: E9 H4 c# }- Y! Ulong get_ram_size(long *base, long maxsize)
+ Q# x! d1 S' K{
Q$ C7 C; a7 K' Z$ M% w volatile long *addr;! ^( [3 [$ G; z' ?# } S! z K* e. I
long save[32];5 \4 d1 s, i8 [
long cnt;
0 \9 B: `7 V5 K+ G& R8 @ long val;
. F8 z% r7 [6 m; `' f long size;
9 Y7 p" C5 Q2 a1 k( f0 b int i = 0;( B4 S/ \/ o" I+ h. A0 w# I
) ], [! v+ M! O& O9 L5 w! r for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
" c1 ~. z, k( ^, K addr = base + cnt; /* pointer arith! */. b$ Q1 J* Q* W7 q8 T$ a
sync ();* E: j$ ?' T9 s9 k
save[i++] = *addr;( w7 O" t$ z3 N! l7 y
sync ();
) Y0 q6 L" D$ T0 l% J *addr = ~cnt;' U# C- I) r5 a8 J
}( i# d" w/ {% V/ ~2 E' A
0 l& t. h7 H4 M: N% T5 u3 s addr = base;
0 y+ C1 m0 ]1 M ~; ~2 Q# P9 T# U sync ();( E( U' K$ T/ s& _
save = *addr;& I0 s5 ^8 B# {3 l4 V7 Q
sync ();$ U4 E) M9 o1 z* s. Q
*addr = 0;
% G/ t( W0 g8 Q5 [9 q3 d7 a: p3 c( J9 X2 g4 G
sync ();: N( X9 p1 ]; M* Z
if ((val = *addr) != 0) {
6 C' k" x c/ t( h /* Restore the original data before leaving the function./ g% w0 V( b e7 R4 M+ f/ P# ]
*/
/ w# f# Z( \, Z) ]$ f0 K0 r7 e sync ();) i' ?; c/ x8 W
*addr = save; L0 R* |9 w& l3 J9 Y! k
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {& S' N/ K* O/ }6 Q, l% O# ^5 y8 t
addr = base + cnt;* s+ g" l4 {1 x3 e I% j
sync ();
$ F6 W2 {% S' |* o *addr = save[--i];
' K1 G, _5 D7 j$ \# a% M$ t }! [, {: n# d# F
return (0);9 {$ ?( P; V3 y; D: ^
}
& X: t7 F3 H/ k0 _% I5 S; z9 |! C/ y+ b1 B# x: M' |: p
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {2 p0 ]4 ], n( k; g. k
addr = base + cnt; /* pointer arith! */
9 r5 L# K( [. L val = *addr;
_1 a, V. G) i' Y+ Y *addr = save[--i];
8 r+ P' d$ K9 s0 s) U" R) ~; Y& v if (val != ~cnt) {
9 @2 ]; |- K( M V3 } size = cnt * sizeof (long);
9 Z( q X3 E+ N& E /* Restore the original data before leaving the function.* p8 e; A5 \8 s7 P2 k
*/
- V' Z; B& ^& ?) c) k. |/ j for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
% Z3 Q; k8 Z2 w1 N" h addr = base + cnt;: c" B* C. j7 B2 H* R
*addr = save[--i];3 {0 E) r: ~" n1 @2 S* ~: N0 \
}
& t, B) a( W G# F4 T7 s! O! ` return (size);, i9 y6 I0 w* i
}
9 @/ r; |& C& P7 l }
% a& {# c+ M0 K8 Z! ]9 O/ q% r) u9 ?! C6 S1 F% K: K* X; c" Q
return (maxsize);
1 ^& w1 i9 n! ?7 n}
' X' l, ~) T5 vint dram_init(void)
0 L+ c6 e. Z; ?# D{
2 Q! T4 Z( }8 ^$ k/ p8 ?' \ /* dram_init must store complete ramsize in gd->ram_size */
/ G# H* M: u1 R3 W gd->ram_size = get_ram_size(
% @/ ^1 |' d/ N0 o c/ R8 I (void *)CONFIG_SYS_SDRAM_BASE,) G) q6 t$ a3 F$ y
CONFIG_MAX_RAM_BANK_SIZE);
+ D6 \5 b, a% d, D% n" b( u; S return 0;6 m; d. W4 H: E% A& n
}
& k' k+ o8 y3 p" q* P* M( s$ T- l. _8 W6 t
' f4 i: T# h- G( g+ n- v4 Y! N8 ?2 b! n
. x* O, [$ M) o2 @ VFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!& S! l- c) Q: ]# O( i4 b, D, \; s) f1 D
2 S8 `- c! D4 a
$ L' X2 N) H/ Y: p" }3 P1 \! l; E' u: N* n6 y
|
|