|
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
/ X) o9 T/ f; b8 M3 N/*) h0 v( ?1 J; p4 N. [7 w
* Check memory range for valid RAM. A simple memory test determines
% T- h1 U! p, ^* the actually available RAM size between addresses `base' and( c. |! i' _- P& q4 |
* `base + maxsize'.9 ]8 o3 h0 l/ t$ ?7 o& a
*/
7 m2 D9 Y/ G! P' ^# c0 ~, Xlong get_ram_size(long *base, long maxsize)
7 w" w; N& r# C( Y! R' }/ P. j{
@( `$ w( ^: B/ O) f9 j6 _ volatile long *addr;6 B" T ]% M& I0 L4 |
long save[32];9 t5 {! a, ^- i
long cnt;$ W- U" c5 Y* E$ l$ {- {" f$ Q
long val;
6 a* }1 C1 n [: t) r. i long size;* @5 X2 x1 c6 J( w
int i = 0;8 g8 F2 B, J1 z1 y
; @" H6 ?$ E7 }/ U2 X for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
, R/ G3 D2 I% ^6 F) {- W) y addr = base + cnt; /* pointer arith! */
! d2 W5 j; \+ W& {# T sync ();5 m& O% J' r! ?" S2 ]' K: A
save[i++] = *addr;
& Y! S* T) Q3 a1 x' u sync ();
. g% m; \) A8 ^6 @* L *addr = ~cnt;
( w8 C/ e0 Y$ y' G# p4 i }) h3 A' |2 g3 R4 c
& f7 y( G; t/ M4 T. b" V addr = base;# h! D; \' T, E5 f2 b
sync ();. N/ V$ m6 A- e5 V. F. ~
save = *addr;& _8 u8 j; u8 r2 t5 w/ e4 M
sync ();
- ^3 {8 _3 m2 Z0 e. \ *addr = 0;# a& j8 i0 N. X; B! G
& n3 W( e& R6 R, }9 O$ z& d sync ();& {* v" P( p$ G Z+ ?. ?- Y% z0 R
if ((val = *addr) != 0) {) o% H. F# `. F1 E( V6 J7 \
/* Restore the original data before leaving the function.) P1 E$ `3 o- H6 E9 J% U1 S
*/8 o& Y0 _' N0 q( ?; x
sync ();
4 u; V' N7 {5 w& N7 G) e& x *addr = save;1 j- k: n& _5 Y
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
1 \5 `; d2 n. S$ V. m# e) g4 J addr = base + cnt;
( k3 ?/ a* [4 N& j0 n: L+ B0 \! T4 W sync ();6 b" G W. S% M4 k% ~0 X
*addr = save[--i];2 |+ p+ x3 ^9 F
}) Z* P# M6 z% \% O! o
return (0);5 |! g- B2 W- T9 \
}6 U4 X% V7 h. L+ G1 {7 R; a
, D( X2 c! z* N" ^0 M, A1 Z4 q. a for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {* S# k0 g$ z0 E6 Z6 V8 w
addr = base + cnt; /* pointer arith! */5 H0 D5 x0 {8 F. G
val = *addr;
( r2 q* r* a3 n' L2 q *addr = save[--i];
% t7 M8 R5 I& h9 w if (val != ~cnt) {2 s5 G- f3 |, w( \% b% g
size = cnt * sizeof (long);
& C$ h' ?9 D6 n6 w) b /* Restore the original data before leaving the function.
" u+ M& d4 k9 p7 X0 ^6 `0 L */
9 i0 a* N! F) S t' n$ ]. {1 a for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {: e( z; d6 W! D# _5 D: q' \( S1 ~, ^
addr = base + cnt;
4 l6 \9 w. y! r1 K$ W) k3 B+ \ *addr = save[--i];
' P. d" |! b- K }
' J; F a% F; {2 q7 ~$ N return (size);6 |9 C# a" S. c( t: ^
}
m" A/ {6 Q0 t& [ }
R$ E3 f6 h* Y6 Q0 C, ~ x
3 T0 Y2 j5 a% B2 `( X return (maxsize);
# K) f8 U% B- \/ d& ?' L/ O* B+ A}8 m% p$ a- i: V: r k |: d# g
int dram_init(void)! X" `! n+ K4 ~' e0 ~9 r3 H5 m( R
{) z7 r |, @* ^0 j
/* dram_init must store complete ramsize in gd->ram_size */
- g( T$ d. _: b! J) \% j gd->ram_size = get_ram_size(2 s; t2 |! n6 K* l. |( Q
(void *)CONFIG_SYS_SDRAM_BASE,
" P# l% ]) Q# S: c CONFIG_MAX_RAM_BANK_SIZE);
- i" [# M4 _7 o5 O8 e' @! |! V return 0;+ k3 x: F& @$ d5 b0 Z1 F% P# X
}
0 l0 T/ E- p! `* a3 |
. A; ^7 z7 k j: H: ~
" o0 t5 ^ ~' ?) d1 W. E
/ W- I6 u, p4 e
# c0 v/ g; D; {; V9 YFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
6 [8 {5 k4 k& H. I: q
+ o8 K; j( P$ ~- q( u) I
, q/ V% \) h% B+ E5 N$ l# `0 d' U. S. E' }2 H
|
|