|
|
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:- j a \* B' T) J
/*7 u1 @9 |1 V. p ?
* Check memory range for valid RAM. A simple memory test determines: m/ O9 L0 y; h- }* D$ b H! U/ L" E
* the actually available RAM size between addresses `base' and) x8 B# |' W/ ~$ n9 g3 w: }- Y
* `base + maxsize'.
/ L9 m* ~5 n. m; `, f' {" W* x( B*/! d+ H: I j/ U& W: o9 ]7 Q
long get_ram_size(long *base, long maxsize)5 ?, j: n9 o8 s
{
1 i/ H: A2 s. X% D% W volatile long *addr;; O7 f: B( l& o. z5 Y5 R( y) ~, V, \
long save[32];" |/ W0 p2 C# P4 p' g( Y
long cnt;7 x7 [" W! ?8 P1 U9 @5 r
long val;
! P4 L# ~$ V# M" ]& f2 s* d long size;
" Z, x9 k0 ?- ]7 d" z/ m int i = 0; \" ]! N2 `, m3 S
9 d4 S, k8 w0 g0 x# p for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {# g( _+ _( |& d* O8 M2 Q, S
addr = base + cnt; /* pointer arith! */7 P* P0 J( s& R+ i4 O: [- n
sync ();# A1 {3 I4 k7 u7 b& I4 C! [
save[i++] = *addr;
/ f# I9 c* s7 y; W B sync ();& @, d! u, k0 L e; Y
*addr = ~cnt;/ Y3 H9 w* k( _# {' g
}
$ w* ~% U# X; d- L! {
9 `, t& ^5 E% F0 m1 ` addr = base;( J8 Z& K0 Q T( x
sync ();4 G4 W% Q# Q, Y/ Z: h
save = *addr;5 T- A h' a' C, E8 U
sync ();% c# t; T' M+ K( A- x
*addr = 0;8 m4 C D6 S, k1 Y) @5 @
( d' x. O: R% B# X S# D
sync ();1 S% F9 X+ R9 h' i$ |
if ((val = *addr) != 0) {+ Z4 e; ^; e- a2 x Q
/* Restore the original data before leaving the function.
: R- a% E9 @4 Q% D- C! P: X */
2 Z8 ~; p/ |6 e; B sync (); p& }/ ^( {; s, u- j6 W m8 V M
*addr = save;9 u# w) n5 C2 B/ [0 K6 N5 f) k' j
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
! J9 k) \. Z' ]8 h3 \ addr = base + cnt;+ w& g- J8 |. _) f; Q9 j
sync ();
$ _% T i/ Y5 G8 E *addr = save[--i];
8 [( d& @' n8 W# f/ W( W; S }$ m( u, I: Q5 s
return (0);; Z# ^0 u- g1 C/ u
}0 }' m; q% D' I3 J1 V6 v5 \
$ ?& @4 Y# w* Z, a
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {; A0 J6 d9 [. R4 S, X8 s
addr = base + cnt; /* pointer arith! */
6 B& j: q) X. C val = *addr;
! C' r2 v/ ? r& X *addr = save[--i];
, y1 B2 M7 `+ X; O if (val != ~cnt) {
5 G* {$ Q% B o# k size = cnt * sizeof (long);
! T, P5 K$ Y- @8 [, U /* Restore the original data before leaving the function.
1 c3 C' o3 W4 U$ k$ g' a, _ */6 ~ T( i* Y( X/ j4 E
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
7 U! T1 D6 o/ I! i" j) G# K2 u& I addr = base + cnt;4 v! x7 U" _* m4 {& c
*addr = save[--i];+ L( y1 r" P U9 f2 N
}$ n! ?" `* F; K* Q) k# P
return (size);6 a" H- b1 X2 b5 q: o A
}
7 z8 }- I, j- S4 ^/ e' _ }) C6 S$ u X7 P3 k$ Y! \
* a: v7 Y/ n N
return (maxsize);/ }# X3 G) J- s# C+ z+ }% W
}4 I _; K1 W |4 r
int dram_init(void)
2 ?; s. q# O0 @% N& G; ~5 }{8 O6 f- u# v' ^# X! D% Q
/* dram_init must store complete ramsize in gd->ram_size */2 M: b- b& {; j, Z% [- w
gd->ram_size = get_ram_size(7 Y. Q8 f0 Z- I! F2 e0 y, S* v
(void *)CONFIG_SYS_SDRAM_BASE,8 A6 r6 s7 D& O. S( n# d
CONFIG_MAX_RAM_BANK_SIZE);
$ P! A3 X6 F% Z, W$ n) Y return 0;
- ~# r$ ]! `- m& E$ {( N5 m" m, s}, |' g, \' {+ o
# p7 }/ @+ }, S- h- S5 i' |& P4 Z$ r/ s( s$ p' n
' z# {) _# o6 g
+ g S9 y1 L6 O+ v N; q: [: M# x
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!3 q: d8 t& ?6 ~: L) y
8 h6 C: n M8 H: k6 _% L
6 J9 ?; l, y9 _9 J9 B3 X: ]1 K
( j* Y( Y9 P: B |
|