|
|
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:$ J! g" [$ k' e1 B9 T: G7 y
/*
% T& l; S Q+ B$ Y* Check memory range for valid RAM. A simple memory test determines. ] Z9 U- | m8 D* [. j5 q: z
* the actually available RAM size between addresses `base' and. E8 N+ R i/ P7 k' _. j! O5 x1 ^
* `base + maxsize'.! D4 L& w- ~, J4 \- f
*/
o6 D# [7 t) N* {: hlong get_ram_size(long *base, long maxsize)9 @, k5 U7 y) a% s4 |
{1 s6 j- d ?7 s6 _7 V+ ]; k3 ?
volatile long *addr;+ g9 ]% L/ ` O$ ^8 Q! r
long save[32];4 q: f+ a" c( i+ g# M5 T
long cnt; k4 _' S1 p. u! z
long val;
: o; o' A# \/ Z7 y* u1 O; W+ M5 r long size;
8 C2 a$ a8 N$ Z# |$ H int i = 0;
7 R* H: T* | o' S% m* P$ s( T; K/ R1 Y
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {/ C$ w( c. o2 b1 N4 R( J
addr = base + cnt; /* pointer arith! */6 i' {2 N2 T! f1 C4 y
sync ();; n5 R$ u" d0 }& f3 b
save[i++] = *addr;
3 N6 e$ H+ x( `: J sync ();* F2 k4 G5 F2 g3 ~
*addr = ~cnt;! B5 L$ @! O0 G$ ]
}- u* ^' D% ?4 [) H0 A' r
$ ~! ^) ]7 n; F
addr = base;. {1 L# W7 o5 M g* A: x& {0 K
sync ();0 L2 Z9 c6 \8 ^$ Q
save = *addr;& Q: a* I ^' k; T! X$ F/ [
sync ();1 }$ g. q# l2 W/ n
*addr = 0;6 a2 H6 A6 g# O/ k
) ^: d) b7 C/ l sync ();" a8 l5 {6 s- k; ?6 _
if ((val = *addr) != 0) {
# V2 i. H |# X, g& u7 y; O /* Restore the original data before leaving the function.! `/ u) ]- |, q
*/) k' v$ @# V* B2 h5 ?* W
sync ();
3 w) N4 S- t" ]: P( b- h *addr = save;
B, } z( n U5 A# S) A' g for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {9 y: s' [ W, T: Q4 o0 u
addr = base + cnt;
6 u! w0 r. V0 s sync ();
3 o* Q7 G; r+ i) r8 z *addr = save[--i];
: A- N. k! h* P, O# J }
9 z; @/ F5 f. C9 y0 s0 Y% |* T return (0);
, f7 ]5 r. X0 q1 U4 ] }1 t r1 E$ r# g! K( F; m
) Q/ Z% Q- s" q3 s1 a5 G for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {. n3 N3 l; r& _/ \
addr = base + cnt; /* pointer arith! */
8 [7 e/ `3 u2 a1 R! D" Y9 M val = *addr;
+ j; u4 \. _" c- d! O *addr = save[--i];" n N( |; i2 j8 O' B$ T
if (val != ~cnt) {
9 d$ g. E& q. H* \+ Y o8 _ size = cnt * sizeof (long);: w! b) T2 f' `6 ^/ c
/* Restore the original data before leaving the function.0 T ?5 b5 f* A$ z. R2 }1 F
*/& e. d. A: U, N% [: T9 z' \
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
& A! M! h; N0 R addr = base + cnt;$ l* l4 K/ B2 R4 r2 S
*addr = save[--i];
. m+ z+ j- h) @3 \: |$ P }) R+ S/ z. Q+ W# B4 ?. M
return (size);
/ i1 {1 m5 X, X$ G6 m" @/ m% b9 \ }
; z1 h1 K6 S: N) M }0 _- l; ~8 N4 h6 a
! Z9 C a/ w5 S
return (maxsize);
t6 x* i6 d) p}7 ~: R5 h( Y3 n- X% [5 X
int dram_init(void)- B" \* u) P% L6 [0 z2 z& C, F
{4 D4 {4 f/ z& e
/* dram_init must store complete ramsize in gd->ram_size */- }2 C! m5 A/ R! e; ^
gd->ram_size = get_ram_size(' h( e( P( d* \6 n
(void *)CONFIG_SYS_SDRAM_BASE,
! `7 D6 ?2 t: x2 s CONFIG_MAX_RAM_BANK_SIZE);
# C8 Q! B# H0 A; E/ V, _) N2 ] return 0;6 Q" ] p5 v2 i; P9 F
}
. q. t$ V8 T, t& M' C8 u( z) J3 f/ g* d) J2 A
8 E$ D: A# g3 G" |' K5 a+ h
- l E4 ?- s8 B, d* U
/ L2 k. U- C3 K# T% p& M( MFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
# l. L1 Y( `. L; W4 o
% |: P8 |* E$ U: S8 L; h! r# I2 [6 P2 s& W- n# n( ?) c) g$ F- X
/ |% N+ E1 N+ U6 b1 R |
|