|
|
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下: Z6 r% W( W4 _: Q: b
/*8 Z: r! ^% h1 b8 [8 c2 T4 [5 O
* Check memory range for valid RAM. A simple memory test determines, H! x' u5 x- v- M
* the actually available RAM size between addresses `base' and9 @" f& }1 Y7 `% X, v
* `base + maxsize'.
+ G2 E7 v6 J" c% U*/* e% C, x+ Y: f) U- j
long get_ram_size(long *base, long maxsize)
/ Q A" @* e5 n# }8 f# V' ^{
5 v) S5 \ V/ N+ d& t volatile long *addr;
$ L( \! k# K l long save[32];3 G, k* y' J2 d/ h
long cnt;
) {' Y0 q5 h, X! q/ N( W( {+ G9 N' g long val;
# M. {9 d) b* P long size;
0 L' M4 R5 i2 A; V1 a' d int i = 0;
% O% z2 s$ S! }
4 U8 v6 {' N& E6 z for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {$ F& G$ y$ u& u$ e
addr = base + cnt; /* pointer arith! */ x7 p9 R! \" C/ Y7 i
sync ();
6 D- h) v9 r8 Y1 E& v save[i++] = *addr;( X$ `- b; Z( V$ r8 A+ q" ?
sync ();
, U' D" V$ | j *addr = ~cnt;
; v+ a7 U2 e- R6 D7 L9 R2 a }2 I+ c0 b9 D2 }: @4 U5 x* ^% O
, E6 U& o. O, {* H
addr = base;
& {# `; G+ i7 Q/ [6 f- B! }% B sync ();
/ }. m9 o) I& L save = *addr;
' z) G. c+ F$ l' C0 M7 n/ |0 r sync ();
+ v2 ?. ?" ^! p *addr = 0;
2 L! {3 ~& M4 j# F* u
9 p- b, M1 o5 g6 G- j7 U sync ();
3 c3 \- ]8 t' M2 E if ((val = *addr) != 0) {: ?. b9 T7 U1 H0 i8 e) X
/* Restore the original data before leaving the function.! S. ^3 r% X. ^9 w* x1 Z
*/
7 R* A2 b& h7 G( }: w sync ();- Q, a- x& Z! {( q
*addr = save;7 Z* U2 l3 E3 N) C& W+ H- K
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
/ M( ?7 b; D4 u2 w+ j$ v: M6 U addr = base + cnt;8 a, t. I% O0 j6 O, o& o' O
sync ();
2 u1 g0 ~$ g& W( ?4 O# A *addr = save[--i];: d% D( D3 C: y% q4 i
}+ t7 K0 G1 f& z' _3 Z6 _
return (0);% w7 _& O% H5 ?: S. ~9 q" k
}/ v, S& n7 x% K
( I' u1 d. Z, C* o. Q+ f. |& U* n for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
+ B/ r1 j$ G" t6 A/ T addr = base + cnt; /* pointer arith! */
0 Y( U0 l- U8 v2 e( _ val = *addr;/ A: y. o& K |$ S) a
*addr = save[--i];
' ~7 e( O6 a1 C1 ~2 F if (val != ~cnt) {9 K, |8 H" {8 \9 u0 J$ h8 E5 h
size = cnt * sizeof (long);
( x( [/ q' u* q/ b4 r /* Restore the original data before leaving the function.
& I7 A- r, c& r0 \+ N9 B */$ K) B- S+ m& k3 w- Y
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
, @! M$ G$ m9 O+ p addr = base + cnt;
" Z5 f& R& o; w) a4 o4 {$ e *addr = save[--i];
9 b# T( I# u N8 \' i2 Z }
: ? E7 T# O4 V x return (size);
& z) {" F# O& n: b }4 @3 E) k7 G6 P6 {
}
@0 L( F6 d9 P" z" V6 {# \' x
o2 j' _3 C' a8 i: r! }+ M# t, d p return (maxsize);9 v1 k1 G' k4 m
}
% u- d' m/ ]2 u$ ]+ rint dram_init(void)
- T% T0 A2 Q0 |9 B{
5 K7 h8 z% L0 {- r' x /* dram_init must store complete ramsize in gd->ram_size */
, @% b: t3 J+ E. X gd->ram_size = get_ram_size(
9 T7 G3 V( n4 |. e. h (void *)CONFIG_SYS_SDRAM_BASE,
* ]5 v- a; j1 I CONFIG_MAX_RAM_BANK_SIZE);% ~( k2 F; L5 c+ d0 R
return 0;
; i' K4 ~" t% K}
0 O0 Q- N4 A1 a) R! l8 }, r9 j$ o4 @
0 [* x t `5 y
% ^% F, p9 F- _: ?. m8 j* w6 X% `1 K0 ]: P" _8 F4 m! {
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助! e# y2 Z9 _; G7 B" N2 s
- e9 O3 x8 f; _* s0 Q/ W: k! U$ A
# \- L1 e6 ?( a9 X! \0 l$ O( G% i" ~& H* \
|
|