|
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:) }5 e X, z+ q2 |! J3 {9 d
/*6 X) S' S9 Q+ N* R$ ~
* Check memory range for valid RAM. A simple memory test determines
% B0 @, R: C0 Q$ R$ G/ E* the actually available RAM size between addresses `base' and
0 H# m6 ^3 A4 u! ~/ G* `base + maxsize'.
8 Q. V9 {" }3 \0 v6 r*/4 o5 j- C8 l/ m4 l2 R
long get_ram_size(long *base, long maxsize)
$ n& Y. j, n& r: c{0 i( }/ V% P' i+ r6 z
volatile long *addr;4 K* V4 V5 _# d/ B2 u9 T0 v! D
long save[32];
) o8 d3 c) I) J# W/ w2 C long cnt;8 W4 n& }8 n. ^! \
long val;& z- |2 W# k4 X2 h, N, {8 m
long size;
* x9 X8 r. G5 r1 g# u) R. S4 l( j int i = 0;
' Y# u q$ k/ A1 E
9 i( t" q9 m2 l. D5 g for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {$ L2 \7 X' G. R( O
addr = base + cnt; /* pointer arith! */% {% v, E4 D1 ^) {8 M# V
sync ();) T6 E9 q6 h- t- \: [: U; h$ Q3 F
save[i++] = *addr;
) G3 O! N: {9 a: Y sync ();$ }9 [% E, r) g9 J1 L
*addr = ~cnt; H& w! g" \3 r$ y$ @7 C
}
' }4 x8 z* @1 M9 v& }' F
, d$ y- j5 y- C. K5 h- E, v4 h; x addr = base;
3 o- r" w; M7 C3 _5 F0 N+ | sync ();
. ^+ e" j6 K. z2 c save = *addr;
( W* h/ N. x5 d: V7 |$ A A sync (); h7 ]0 s( y1 b' ~, d
*addr = 0;
! x- a, b7 }5 L Y# T Q, V/ O1 _8 {; n
sync ();
; ]1 k* b" R' E: O if ((val = *addr) != 0) {, K5 H* X( \% n
/* Restore the original data before leaving the function.
. l: y/ h9 r! r$ i( r */0 d' T7 K! C+ A9 U- u; s
sync ();/ U7 }. d3 b5 e+ ^7 K
*addr = save;/ d# @; d/ P# D: L4 X/ A& w
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
6 R( M1 v/ D, R) Q' s8 r7 V5 l addr = base + cnt;
9 z9 l$ a+ I0 N' e( q sync ();
4 s: T# N8 W0 a! ~! ] *addr = save[--i];1 r( k, ~9 [4 O0 O4 z9 z
}% t% X5 }; A/ ^7 s$ C
return (0);' I' `0 e; @3 w: W: o) s
}, I2 j+ m' `, C i
* C* d4 F" j9 A9 s. X) S* S! B
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {$ B3 T# o! S; A. B. v
addr = base + cnt; /* pointer arith! */
" w( \/ S% \8 j- S: M0 u1 e+ u val = *addr;
8 S3 [# X. {' N, E- U: m; R6 C* G0 G *addr = save[--i];) x8 u6 {. |/ i; |
if (val != ~cnt) {
6 n$ z6 r/ x" B; X, X5 q( T5 W size = cnt * sizeof (long);" b& B" f! \' O4 F. c
/* Restore the original data before leaving the function.) l* U2 S- ]) L! |
*/3 ]3 z* J$ k, g
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
! g* b1 T6 o& n addr = base + cnt;, @/ X2 i* y- W
*addr = save[--i];
$ _6 ^: i6 v! Y* y }$ A; F- k3 j% u& i* X. d& A7 B
return (size);
+ K2 X( Z4 Q/ j* ~: E/ {1 u8 w4 M }
" ] r4 U4 p: e* S1 D, b }
3 R' s1 H$ t4 p# [3 M: a7 U- J0 Q; s3 f3 U
return (maxsize);
: X. W: |+ J% e) [% H}9 w: ~. Q) L" Z+ d2 s* }% u$ H
int dram_init(void)
6 X, t4 p: a Q2 I9 u, J{
. A3 W- J+ n8 h) B5 [ /* dram_init must store complete ramsize in gd->ram_size */+ f8 [% @$ {! j! H. y* F5 y/ i
gd->ram_size = get_ram_size(7 K/ x5 W% W6 n! x
(void *)CONFIG_SYS_SDRAM_BASE,
+ B2 Z" G+ [$ j% o; p CONFIG_MAX_RAM_BANK_SIZE);$ L- x) [6 M# v% {, t; u% H8 q
return 0;, ^; o8 y" B" P/ e4 s5 ]8 W
}
; b& B, u/ o8 d* M0 X# ^- Y
* e3 j) T8 |% D) `( X
/ ~7 K% y# {4 D, J+ V2 Y& `0 ~! Z% `. p8 P+ k
6 {' E6 C) y+ }, PFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!$ ?* U$ Q7 N; c. j8 u. s4 x
% I7 V9 K0 }$ i, ~
# H4 ^2 p- \1 Q% x8 G! R
0 g3 y% D# ~6 i& l% J5 U |
|