|
|
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
1 y8 d; m g5 D" o* Z7 W/*
7 P1 H7 ?1 W5 H1 b4 }* Check memory range for valid RAM. A simple memory test determines
0 W; ] W9 v b' w$ @! D- I* the actually available RAM size between addresses `base' and
7 r& I& F6 P! D2 X* `base + maxsize'.
- A* y6 o" {0 X* c! {" @*/
6 q; L7 r9 ?. j9 plong get_ram_size(long *base, long maxsize)2 u, K" X% b S. o) |
{6 u: Q, E: O' g" ~5 ~! |1 E
volatile long *addr;4 q9 O0 X( `* {9 _
long save[32];+ o/ x0 A9 Q' A$ ?2 }
long cnt;3 l( I4 u% u- p
long val;
! Z4 F* b# J6 K8 C( R" ~ long size;
2 h0 K1 H: `) l int i = 0;
8 k8 @% H' |: q! B, {2 ~9 @; [' }4 R
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {( D6 w) I L5 g
addr = base + cnt; /* pointer arith! */1 Q1 l3 F) H) u+ M5 E6 h0 i4 N
sync ();$ Z' D' ~1 Z4 F% W% M$ l
save[i++] = *addr;& _% a( E% [8 ^
sync ();
2 \* K6 n& `8 s3 x: D$ g *addr = ~cnt;
+ Y m/ p& e5 P }' O' c9 ]+ m* J% K
) r1 h: o: X5 ]
addr = base;
9 L7 ?4 I3 v6 \4 {7 }; ~: l sync ();
4 o& d$ k1 z3 Y6 Z save = *addr;7 H( }/ ^2 t3 u/ K
sync ();. q8 H1 E+ {- R3 O" Q
*addr = 0;5 c! v+ U4 E: U# `# z% T1 s
: d% p R: l8 M3 h8 d sync ();+ N6 K/ g H3 W& w; x
if ((val = *addr) != 0) {6 t& X" z0 s$ ^! E( D) B# ?4 U: P5 e
/* Restore the original data before leaving the function.
" X' W8 }! g% M/ S */' F* }3 U5 Z, E* B# q, x, E
sync ();
1 J3 Q7 }' d' ` *addr = save;
, v2 j9 r M$ i7 {9 _ for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
! N' g$ I' n3 K% ~/ S0 \ addr = base + cnt;+ \+ P# B2 ?4 K
sync ();3 d8 n) v+ P3 ^9 d" @
*addr = save[--i];* e$ S; I8 A# x& E9 {! O& `
}: R4 x: q, m& ~% a* T# Z7 J" M
return (0);
+ N* K# @9 H# Y8 x; b' s9 } }
& B2 J* |8 T8 h, r9 e! f, g( y* s) \# m3 H0 ^% w
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {5 `0 b F/ J+ z$ z8 @2 b) Y
addr = base + cnt; /* pointer arith! */
- O; K9 |" U. q8 D l val = *addr;
9 h% R- z9 {2 x *addr = save[--i];
: }! B7 M- y& }" {" D6 \ if (val != ~cnt) {+ M& E! G' S" r* T. X: o0 i7 a) f
size = cnt * sizeof (long);
, m( }! [( O, H /* Restore the original data before leaving the function.
2 ?/ \8 J; p+ u8 p; ` */
. w; c S9 L- _ for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {7 P) p% u* U) v' @
addr = base + cnt;
: T5 B( c. r1 S# h1 N6 I *addr = save[--i];8 B+ e, r& M9 ?, B
}
' g: q" I$ r/ Z return (size);+ e, C" A2 G: @4 h
}
; k4 I3 z% G1 r% E) r% w }4 q5 I0 X3 Q+ r3 X C# D) B |! K
8 q) p$ x& b1 U& o0 u: k K) W7 Z return (maxsize);$ } F" J& @( e
}) @- o! d E+ ~4 p: U
int dram_init(void)
c7 I2 w8 s) |5 i# J5 e9 X; y w) I{- y. b# X# Z* v
/* dram_init must store complete ramsize in gd->ram_size */
; o3 |/ n: }" r! y$ C+ L2 g gd->ram_size = get_ram_size(: I7 H, u% e9 I2 E! g7 H
(void *)CONFIG_SYS_SDRAM_BASE,
, x6 Y* |# W# H; j8 e8 R1 v CONFIG_MAX_RAM_BANK_SIZE);# v! T! T+ U: q N6 N
return 0;8 ]$ e' U. a# f* B$ o
}
3 k% c* N: b+ z0 ^7 k. @' Z
1 x8 C2 D4 c3 l# n! a# Y, @- r5 t7 X
' u) I+ D% b0 e+ R) m$ d# C5 {) t# u2 j% P) ]- i
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
) P4 `0 q8 P V* u0 J
( i5 _/ \& s) p1 S& `
0 O7 J3 c" E: k6 E) k* z' K6 D0 m6 d6 |6 B& N' G; P
|
|