|
|
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:5 H" ^. Q5 I: A' ~' v1 l: p% _
/*
: q, \- C4 A% _# c% \$ q4 T/ ^# L* Check memory range for valid RAM. A simple memory test determines
' Z7 n' z8 c6 u0 z' }! Z- E* the actually available RAM size between addresses `base' and
0 g8 ^! P$ X$ S* `base + maxsize'.$ D$ y0 h! l( ]7 Z) G5 C6 j P
*/
# Y) H$ s. \. K, \) ]0 Ilong get_ram_size(long *base, long maxsize)! u( f, x2 P7 q8 x4 q$ Z
{* \# O& y# [' ?# | |
volatile long *addr;3 A* z/ T6 S5 [$ v/ |- R) h
long save[32];
/ y+ b7 W0 [( s1 K F$ a& {0 { long cnt; \4 i8 l2 G. L
long val;% x2 u! X" Q5 d j4 ^; z6 f& I
long size;- \) C3 I; v* ]% d4 z
int i = 0;# z) h+ D Q# a* w3 q
. V5 q/ R& @% |6 J1 A* S9 ~ for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {) y, W K1 U" ^& q% z. D: P6 N# V
addr = base + cnt; /* pointer arith! */4 `; ?7 K5 f/ p- R! I/ x" g
sync ();6 g; L# w% V& H( ^# N& r; R
save[i++] = *addr;7 ]2 X: I6 f- v) z/ ~$ B
sync ();
/ E U) r# c$ }+ p$ ^- ^2 i *addr = ~cnt;
4 y9 r p3 u& d! P/ i& P }
& d9 V& @9 N. s) e# @( s- f# Z# Y [2 s
addr = base;
" b& |: N8 k: a1 Q& o sync ();
6 m, b. r& Y% |$ S+ _: h" r save = *addr;6 n& G7 t8 a0 @) I; ~# u
sync ();: Q9 P# i6 ^3 s3 {4 U
*addr = 0;* [: l* z' ~6 x4 J
9 w: K2 N5 r# i# G sync ();
; L% U! P+ f3 L! |0 G if ((val = *addr) != 0) {! U7 O4 A; V( ]8 R
/* Restore the original data before leaving the function.1 L0 R# R/ A+ A; l6 O! k* X
*/& Y ]/ o5 p" |8 L; j% n4 g/ e5 A) w
sync ();
, m/ h) ?! T6 \7 x. v5 r9 d9 g! r *addr = save;) ^) S" R+ l. ?: ?% A) p& m1 t
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {; p y3 q7 w3 C% H9 _3 ?
addr = base + cnt;
0 J, e) G' B5 Y1 H! u; c: c- ] sync ();
+ Y9 O6 M- d' _7 v5 h% E *addr = save[--i];7 B0 S% d/ a6 z
}* P- A$ q( ^5 \* z! ^2 [# B, h+ B9 v
return (0);8 ~ T" k0 G, x' e8 q
}( U% V A) n- w+ |! D
. A; {0 p, a+ I for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {3 g9 f- c5 l' H4 } i, k& `
addr = base + cnt; /* pointer arith! */
4 n1 l# T, M4 K val = *addr;/ D2 F& g/ V5 `; V u
*addr = save[--i];
9 S" r& O: ~6 y) ^0 c if (val != ~cnt) {- r" E: b, _% H# I. V* N5 q
size = cnt * sizeof (long);
$ f1 F/ l. N" C8 ` /* Restore the original data before leaving the function.
- E; n# u$ o! Y; Z1 u# x* o */% p. l, ]0 k6 e# T' W9 Q
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
8 I2 Q$ R$ o# h6 `$ H addr = base + cnt;
4 M1 ~ n0 K9 Z+ m& k( b ?/ {! _ *addr = save[--i];4 R I4 C3 o4 A* ~7 H/ L* ~% L$ B
}/ B z4 }$ P" K7 O* J: H2 `- h2 P
return (size);
: w+ R% _' b0 Y M! P }
) [' y0 Z& p: V; a$ ?: z }$ d9 Y$ n3 v+ z. W4 y: Q7 F
$ K1 k; q& V: L5 y. A return (maxsize);( Q9 x1 ?. @4 } y
}6 c8 ^( |& T5 I* d4 z9 N! p
int dram_init(void)
; S8 W4 y3 U- v1 Y: m& V{
% |8 Z$ ?! a8 s& l# Y( m /* dram_init must store complete ramsize in gd->ram_size */
0 _ W s [% s, ] g gd->ram_size = get_ram_size(1 b: P' |0 c M! ]8 h
(void *)CONFIG_SYS_SDRAM_BASE,8 Z; j. \; ?5 O( Y/ G' P. b6 P
CONFIG_MAX_RAM_BANK_SIZE);3 ~1 F! F: Z& X: O% j+ Q4 K0 R
return 0;4 [# Z3 m; I2 Y3 X8 g* {, \
}# t# m) e: s) j& |
6 w5 n& C) `: c* B" c. Z
" }$ i8 _& T8 D# P0 I: k" O& C; a, g9 c0 H0 J3 }' i6 R2 e& S8 H8 i
+ f7 h1 L J1 \* h. {. a
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!( @/ y/ Q# [0 i z( X7 p
. n+ E6 N2 ?) ~( R2 [9 ^
; @% c! x" n) u6 q; N0 U1 F) \# I
; a" N4 @8 ~3 S# F4 a |
|