|
|
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
( y g+ L" U; w/*
) M* X# d7 ]5 V) `! E6 y* Check memory range for valid RAM. A simple memory test determines
; U* N2 u" Z/ r* W" V: K: P* the actually available RAM size between addresses `base' and' n' q5 D# o1 g2 w* f
* `base + maxsize'.
; u/ C$ ^7 \8 T6 W*/8 O9 n& k4 U+ ]# S0 [+ w: @# {
long get_ram_size(long *base, long maxsize). m' {6 w; `: _! S" F0 `
{) k) u/ f; [2 o$ r0 z* E% x# ?, f% w
volatile long *addr;
: b& j+ `$ Q$ u- h" L* z/ C long save[32];
$ c& J) C( b! q long cnt;
- B3 P& {& ] x- X long val;1 v7 L1 V. _. H& i
long size;
0 N; B! \- H E# f- X* Z% }; |, l; `+ C int i = 0;
- }- W6 p3 V! M4 K/ k7 J
8 q3 A( Q T, W- A3 U1 L9 F for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
/ M6 }) Q' p4 B0 i; c1 |+ N/ U) o addr = base + cnt; /* pointer arith! */9 ]% H2 P6 s. A& [& M6 a# S. I3 E
sync ();# z* ]0 h6 l6 q: d
save[i++] = *addr;. A D4 K4 n9 m* m( @
sync ();
+ z$ a# f( l/ x1 Q/ M& Y2 C# A *addr = ~cnt;
# J% t% D) f2 {& J0 V6 l }' x3 |! C6 ]+ ]* ~" v! x5 j
5 k. O' w4 a' ?4 p: X4 E addr = base;9 W. w& s+ Z9 C5 L& j' W. ], @0 C
sync ();# `" B3 x0 c! P# k2 A
save = *addr; C3 ~) z8 l2 B
sync ();: P6 I) F1 P T9 Y8 ]- i
*addr = 0;; b5 C) W* k3 H/ m- }+ h! H/ @" b) b
s+ ^1 y4 j9 P+ @4 s0 ~' g
sync ();
0 l: k: n* l, X) a+ N if ((val = *addr) != 0) {
& M: ~" h0 K, u/ {# n7 b1 W* c /* Restore the original data before leaving the function.- k1 S# r2 x, g& s: @6 d, y
*/5 t, u6 V7 U/ ~2 ~8 \& J: ?
sync ();$ v* B# u4 }& n
*addr = save;3 i! }* U9 `2 I n
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {1 Z0 F$ w0 t* @5 o6 Z9 y
addr = base + cnt;
6 S, S1 \! s& L7 B. [/ z+ X sync ();
3 ^" a7 S3 F8 N8 S *addr = save[--i];. A, p7 R. p4 x( I9 O
}
1 }/ M& O* w# M* S. m) u# O8 |3 N return (0);% F9 T6 K) G6 I% G
}9 ]6 R" C9 U+ Z. B! G
+ Q h0 ~7 V5 b$ a1 b
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
1 D. f( L: c V# ]' ^8 L0 \8 u addr = base + cnt; /* pointer arith! */ G5 j# g: @, x, s" C+ b2 P5 o% r
val = *addr;* v: W) A) n& g. m7 e& H5 b) z
*addr = save[--i];
9 n% f* h5 }+ ] } if (val != ~cnt) {- j/ Z, x. J$ e0 }# |
size = cnt * sizeof (long);8 ~3 L. D% `1 ^* B s! G, F( f
/* Restore the original data before leaving the function.
1 v& J7 V+ D! E' }* W) G7 u) A1 s */$ y: X, [3 R9 A2 @2 L& A j
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
& _ g- E2 [; j; u! D addr = base + cnt;
/ a& P, V% B! i *addr = save[--i];
+ A9 C" T u" i5 E4 E }4 p Q" g7 G5 a7 j# S% O9 T; C7 l
return (size);7 P- F7 r* f/ }' D
}
5 W2 W* i/ Y( b" j4 D! \ }
0 `* J9 x' `0 e0 V
) r/ M. `( a( ^: E' U( J/ q return (maxsize);( B3 }% y9 C; G5 X
}
4 }: c+ y' f: d+ \: tint dram_init(void)& @- D# W, u; @
{
$ k2 G# S& _4 e/ C! H8 A' A: V /* dram_init must store complete ramsize in gd->ram_size */( O. X- w; g$ R4 i2 a& K
gd->ram_size = get_ram_size(
' {. r9 z% h" H3 { (void *)CONFIG_SYS_SDRAM_BASE,' E' O1 V' M, n- P- ^
CONFIG_MAX_RAM_BANK_SIZE);& Q j8 H% G1 U) B: A, }
return 0;
( F) X2 r" @- }5 z ]}$ z6 l, d2 @2 t; b) a, u
8 |9 n8 N0 Y: P) {' B; p9 G E
+ I% z8 k- g! h9 Y% C" J
7 Q$ l- j2 F* k: O# J2 s& y0 n' ]
2 w+ j5 Y$ @, e& c$ sFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
7 h+ \# Y$ m0 [7 B8 U8 q3 G6 g6 Q9 o, i1 u/ R
, O! D9 H2 ?1 z6 v/ g
7 D/ F& v: u( c$ m; m& X9 x2 C$ @ |
|