|
|
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
4 }: E3 z P0 b* |/ F5 z& F+ G/ o/*! P) J( \$ h' `
* Check memory range for valid RAM. A simple memory test determines
, U" H; `7 F4 m6 s3 u" B' N6 z2 A* the actually available RAM size between addresses `base' and
! Q8 _% Y) ^* ~. ~% p! |* `base + maxsize'.
+ M# z. `# T! H5 ^4 ?' D*/
# [6 w6 _& y. k) o5 _8 Dlong get_ram_size(long *base, long maxsize)
7 L7 p( E. K; h# B- u6 G' \8 t{* b7 R+ V4 ^$ }3 o5 F$ H
volatile long *addr;
& a6 Y- F- N0 N) V3 [ long save[32];
. n3 @. Y% D! W+ {* b) f long cnt;
4 l; H( Y$ T$ P long val;
9 k' c* \+ Z1 x0 N! V) U. p" c long size;) x! m, W, `, B6 Q
int i = 0;. y1 }& H7 h/ L
: h9 ?3 H0 b( S3 M( Z: ~ for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {1 g# P K2 n. w8 m
addr = base + cnt; /* pointer arith! */
1 p/ i2 O# H& F0 R) w7 b sync ();
. f+ k$ i4 I6 y+ e+ e: t1 U save[i++] = *addr;
" z( X1 L& l' g9 P/ K sync ();
/ U5 q$ N; t- ?, q. K5 x *addr = ~cnt;: E& d3 c- b- H
}
' W, `6 ?/ I5 T9 b/ v; C/ c$ E( a( c! B2 N }8 w
addr = base;5 t* B/ e% S8 [& q
sync ();
! D! j% v; ?. M+ u; ?- @6 g0 R save = *addr;
$ P& l3 M' T+ Q. J" c sync ();
. _4 s+ y* I" l/ m( o* o, t *addr = 0;9 s% v" l( t; E# @; l9 g E+ G/ b; w
2 B8 f+ t. Q4 }6 t' Z L sync ();
: {) E8 N. P& Y5 p( U6 u if ((val = *addr) != 0) {
, R( P; V6 A! k, p/ V5 K /* Restore the original data before leaving the function.
6 \: ~1 D& P, l3 P: }$ b% c */
; C) Z- m6 S, M/ m! w sync ();2 e# z6 n G! ~; ?3 {2 p
*addr = save;, L- h! u% q% A. R
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {# n" N) y# ^4 \2 Z3 J' p
addr = base + cnt;
% x) `7 b% o. { sync ();
/ A. l4 `1 `2 Q& j9 T& \& b+ L0 \' q" ] *addr = save[--i];
5 [) ` L7 |5 ~# V }
1 n3 F5 C- Y9 E/ v; e return (0);
4 z8 n+ j- K5 m/ g" c+ k/ A }
" s# e& p3 G% z
; y& f$ n( ]' y" ~8 x# o for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {9 Q/ O3 `0 r6 m$ I
addr = base + cnt; /* pointer arith! */& m, d' `: s0 v5 u* k+ V; \
val = *addr;+ _# c6 e7 X' s
*addr = save[--i];
) C4 ~+ S. |2 L! e if (val != ~cnt) {
4 p: X2 T% p A6 V4 K size = cnt * sizeof (long);8 e& a+ b2 P/ y1 M2 I2 m
/* Restore the original data before leaving the function.
9 L* |$ O. m" g! M */
$ }- ?9 c% Y, x6 H0 Y ]; f2 M+ G for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {- J9 l6 r; `- }; s2 ?9 D
addr = base + cnt;3 \' I4 G0 D! g; V4 [$ A- x0 t
*addr = save[--i];6 ?# r3 U% F o+ S. Z
}
0 u# }- ?. E% k! [+ c return (size);
! G# a* I: O4 Y$ U! M1 ^ }
& k, b! l0 `6 ]- C }
( F9 v4 X; Z% `& Q) q, X' }: L1 t( n1 ^! Q" b3 c, Z" _
return (maxsize);
$ n! R% F. ^; b( d' n}) f8 l! g- T6 T% v4 @
int dram_init(void); g6 Z( y7 }% m" G- ?( t5 }0 g+ ^
{) w% Z: C( q% m( T/ ]: v
/* dram_init must store complete ramsize in gd->ram_size */" b6 j# X4 X! }6 ^1 d- E6 J) N# ?
gd->ram_size = get_ram_size(
, }9 m6 S4 E) v0 t4 O p( L2 d (void *)CONFIG_SYS_SDRAM_BASE,! v9 T% U0 p1 }' j, k
CONFIG_MAX_RAM_BANK_SIZE);
5 t3 ]# y3 Q6 Z7 I& j return 0;
# `% ]4 L- t' f}
' Z1 a* Q% G2 B x k
. F0 S! l6 Y. D; e( R; |
: q; T# p) R& `0 }* u8 J2 e0 [4 u. T" b7 ]5 w
+ p5 i8 D# B: }% C4 k9 y6 QFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!5 o" H3 F( B* Q
3 n+ k. q3 Z1 W& A& M$ `# {0 w& N
7 M# |: A# S5 E0 D( A
* _$ D( t0 O9 b; v! Z- Y9 J7 k |
|