|
|
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
4 s$ O9 _/ ?# y3 A6 E) Y$ O0 _/* q2 l+ K0 w( m, u% j2 x* x
* Check memory range for valid RAM. A simple memory test determines$ u$ L' ^+ D n+ y
* the actually available RAM size between addresses `base' and
' `: ]- `; P4 K }: F1 ~$ K! q* `base + maxsize'.
% [+ z+ | q+ U" b*/% r% K/ Z1 M& |& l9 t) \" e# v
long get_ram_size(long *base, long maxsize)
9 ~8 F6 X# ^( a" S{
$ d3 V$ n0 y8 O$ n! T5 h- I* v volatile long *addr;
; G* Q: Z8 N. T9 P' N) k' w8 Y7 q long save[32];
% x" n% N' n2 X1 z( k: C( A7 K. K long cnt;
M8 g# r# r# G1 W) q: P0 P long val;/ p# h4 U e5 F7 u8 W
long size;0 v, {: V ?2 o9 T5 l
int i = 0;
, ~, M& A% _' t. f
! Q: b, Z8 ]( H7 v for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {7 y9 X: F+ h; g1 O
addr = base + cnt; /* pointer arith! */" D+ |4 a5 i2 M* A# [
sync ();! u. p7 F; s* ], q
save[i++] = *addr;& I/ b& l4 ?& q! o; Z
sync ();" D) L/ m4 g6 Q0 F4 N; B$ ]
*addr = ~cnt;
. Q H$ s" T/ i k0 @4 b9 z& V }
. ]4 K' s* q9 U! x* W! `. s! V9 P1 A; Q1 d! C2 q4 ]
addr = base;3 Q. @ R$ }( v
sync ();& b% y2 E' c# Z
save = *addr;
3 H; ^9 X* A* X1 N0 y sync ();
1 i* f: `' A/ { f; A *addr = 0;
B- ~. y! S: X7 m2 M0 e& z5 A3 D( N; r6 @0 m8 T
sync ();: i8 P- M3 s$ [- X5 O
if ((val = *addr) != 0) {
) e+ `! @/ g) S4 j* K /* Restore the original data before leaving the function.
; p0 D" p4 s* O2 N: _4 T */- v! g1 C+ H$ Y2 _: }, H
sync ();
+ d2 f( \) I% p* G! } *addr = save;4 |' z$ ?+ B+ y5 V
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
7 y; `! Q* I8 s9 ^ j addr = base + cnt;
+ E/ p- M7 ?& ~- [$ ~) u Z sync ();# V3 Q) y4 F& S. i. d ?% E
*addr = save[--i];0 D6 J: f1 _/ _$ i1 l2 l$ K8 r
}
$ y0 y/ F$ \9 q& G( W0 q' H return (0);
( d5 A$ K! S8 G ` |+ }1 k }: `8 W9 `1 F: \/ C" y( g- S
3 m% l6 m2 Y1 [, p2 B1 d$ t
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
9 W+ u* }( m5 a; v6 z/ J: G addr = base + cnt; /* pointer arith! */% F: ^% N6 t/ n) z- K% D
val = *addr;
, ?0 s# ^! T+ m2 S, Z *addr = save[--i];
' h! }+ \* p0 ?* t4 _6 l if (val != ~cnt) {/ a" l8 z5 G# ?/ K
size = cnt * sizeof (long);7 K. N& z" y4 C+ j2 J8 [- [
/* Restore the original data before leaving the function.- f/ _9 F3 |. z. [1 H) [
*/: k* X; K7 @8 a( K1 f- }
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {6 `6 W6 X, }: F9 A' j
addr = base + cnt;3 ^. {6 g+ {% Q
*addr = save[--i];
) ^! N/ E- ` k1 v1 i- H7 | }4 I5 \! F! [- P# Q
return (size);
$ D. t$ ], q t; u) l8 Y) s( p9 g8 W }
$ \# L2 r6 T" C# |& o6 I; v }, ~4 i' b6 P* H& O
1 E% w0 u$ v# r M# J* }
return (maxsize);
, T0 e I& b; X}
7 t& q" ^ Q# q& U1 q2 S# qint dram_init(void)0 J$ g0 G2 E8 s6 a! Q
{
4 [. _, Z) C# n: r; }9 n+ t /* dram_init must store complete ramsize in gd->ram_size */
2 O) k* C* t6 k( Y+ l5 {$ j gd->ram_size = get_ram_size(
" w. g0 k, h% V- k (void *)CONFIG_SYS_SDRAM_BASE,
1 A( g" J1 ] o+ O CONFIG_MAX_RAM_BANK_SIZE);* `* d6 f4 G' V9 m. f# Q1 w6 C
return 0;7 A+ F& L# b# m' R! N; y/ ]
}+ C+ n/ y0 o8 [) C% M/ f/ D; ]! {
- v( A+ ^' b: a* W( q; ~
: L; x# n7 K7 C# L; F* e8 A9 J/ {+ W( `
: W/ ?1 i* s5 A3 }& g6 ]7 d9 m5 p1 H; {; C# b" L1 u; T
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
; J. ?8 h! h& Q/ b0 l7 h! A- [: Y. j0 a5 P3 J0 S
( d9 l2 h0 m2 b# `) M8 ^
& }# ?3 w2 C! R7 N. j6 S7 R* U* y
|
|