|
|
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:1 v1 z: j. G, i, P" O
/*
6 D* H) M# A7 u, ^ r* g* Check memory range for valid RAM. A simple memory test determines r0 z& b+ N: b q
* the actually available RAM size between addresses `base' and( R* ^/ _2 r' V; I
* `base + maxsize'.
) j9 b9 E6 M0 B*/
! o }; h3 F* @7 i% o1 I0 Zlong get_ram_size(long *base, long maxsize)
. i' v q( e1 M0 @& b+ S! F{/ X8 W w: i0 K* Y S2 u$ @" g; |" x
volatile long *addr;
7 e$ l1 D3 @/ s/ e long save[32];
0 J3 S; x! J( F4 ~7 {6 S" H long cnt;
, x% d* Z* E; c8 u: K- r* P long val;
( n" r0 r) i* L long size;* F9 m: L2 H! c" n$ w2 r
int i = 0;
" ~; {7 O! s8 |
4 N% }- e( r! `/ `+ U! c for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
0 y( M8 b' V( k8 s V addr = base + cnt; /* pointer arith! */% f3 r' h/ k" N" G# Z( O7 o
sync ();
: A0 }9 Q; z* n8 O; w save[i++] = *addr;
) x: d9 w+ T1 H, d+ O' q% e/ N sync ();
) q1 p% R" D: l+ [5 Y1 r *addr = ~cnt;" q# w/ S U& t T1 {( ?8 X
}
% M3 r2 n4 M6 V5 [8 c) b# z' A* L3 z9 b; A- F0 r" n
addr = base;
a I l& n, I( u5 q2 J sync ();! y h2 s0 l8 C& d3 }9 s8 a
save = *addr;
1 D0 a) `! g2 U0 f8 r% R sync ();
( V2 j% t6 }0 Y' N/ t *addr = 0;
+ w# O h* Q0 n* E4 l2 R3 U( G2 b" D; S0 E/ A+ X
sync ();
- k: a8 p2 @+ P5 N% g3 h" S' r if ((val = *addr) != 0) {+ s1 e; w' {5 k) G8 M/ v
/* Restore the original data before leaving the function. R. t% R( a, B! V0 B4 P
*/7 l" t& O5 Z% M/ u% |: e
sync ();
1 ]+ K0 C5 K; A7 J *addr = save;3 R) y, P9 N- k" }
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
9 z+ i5 A! @/ D) t3 k6 [4 a& r addr = base + cnt;; x! L6 L9 E: ~' f L
sync ();
2 l0 A% e. |$ a. o! X2 [- z5 e; V *addr = save[--i];% m( F& ~4 t$ G3 a! y
}, Y# r" ^3 _: o2 P0 a* r: i8 t* y
return (0);/ U# |- U5 T( D% K2 e6 K$ {
}
; k" ^4 T& n& {, C [( f& G9 Q7 k/ `& \; a4 `/ G4 W
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
. L% ?9 i) G+ a+ { addr = base + cnt; /* pointer arith! */ I. W* B( i" D! W/ N
val = *addr;
# J" y& | Q4 U1 p. L *addr = save[--i];1 t& l/ W4 J7 n2 i, Y/ {
if (val != ~cnt) {
! r/ N; O, I4 T- i8 f( T. a0 X3 a size = cnt * sizeof (long);
6 c6 d: H, h+ y9 X& T( @0 a- _ /* Restore the original data before leaving the function.
8 N |5 Q2 Y, ~8 t */
/ ]1 k/ J& a. k' q for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
0 A# ]! m7 s" R1 u' ]* g" d addr = base + cnt;
0 m8 f- H+ ~! Q2 V# v0 L/ c *addr = save[--i];3 h6 R& C" z6 k
}7 R( F0 r9 O6 ~
return (size);4 C8 p/ D) J/ p6 s$ q, d& J' m ^
}; K: J, _, h w3 r. a
}3 F; ^, o0 ], }# F6 a4 F$ a
+ ~7 l; B# l$ A6 o* }6 A. N return (maxsize);7 f4 B; o6 q7 y' Z6 r$ W. y- s
}
1 x% `9 l, ~; v F: F# gint dram_init(void)
0 M3 z( Z2 k s* b& M0 {! Q{
2 f7 I) j, Q$ Y$ X /* dram_init must store complete ramsize in gd->ram_size */* Q$ C D' w1 v
gd->ram_size = get_ram_size(
# ^9 y9 H( U; q2 I& Q, @. Y4 G (void *)CONFIG_SYS_SDRAM_BASE, C$ C! V( h+ v' j8 T _
CONFIG_MAX_RAM_BANK_SIZE);
/ e* ~ o2 U, `6 c: v% Y return 0;
e- V B* Q4 h4 ^3 y! C}
; ]/ Y9 D6 g: n: f* K: k" I1 Y8 G; ^0 p
" N9 h5 p' t; f8 K6 i9 G5 P* b" y3 z( C- O. T" Q
. P6 s3 N6 a1 s: O7 mFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
5 k9 K/ ]5 T; ^/ {$ q# x; K; b2 @6 i- W1 l4 n2 @" u. G7 u, G
. m6 l w9 a0 o5 O+ g' q5 k! S W0 C% O+ r
|
|