|
|
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
! i9 p7 ~) [+ ]6 k4 w/*4 n: u3 y1 u* U# m" J
* Check memory range for valid RAM. A simple memory test determines7 ^1 U+ u: \/ u2 d% n F, D
* the actually available RAM size between addresses `base' and
) A! S7 P% h& k% l; g1 f% O0 @* `base + maxsize'.; k. ]9 v- F* J2 Y7 N
*/3 |8 q- n: _6 W: ? e
long get_ram_size(long *base, long maxsize)5 ^5 \$ E5 G' A9 d5 Z
{9 ?' n. F* l, E, J' h2 W+ R
volatile long *addr;
. m m' T4 I0 O7 m; P8 E long save[32];
: K, b* z* {* v, ^0 R7 `- p1 i long cnt;9 _2 B# T3 N7 m3 h. y+ L9 X# v1 Y
long val;
! w5 R) h! n( X' B long size;
7 U5 x; ~/ F" d1 I! a int i = 0;: B' z3 K( n. n% Y
3 ~" W; G) G2 k' g ] for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {. [. I) V& J/ u. g
addr = base + cnt; /* pointer arith! */) ^ `' }5 h9 _- q+ f; D+ V6 [
sync ();: l; ]; y- y( |; p6 Z% b
save[i++] = *addr;7 D4 T- K0 \) r5 b- P
sync ();, n5 a3 A( S K( I" ~
*addr = ~cnt;0 y1 [9 P& `6 N2 I- [3 r' ~
}4 P* h5 B9 P1 c4 @
1 ]+ I* A/ Y9 a1 e4 F+ {: u
addr = base;3 h/ ?: k8 e, ?- D8 \
sync ();) }5 f) j' |+ e0 B
save = *addr;4 }+ n" U( S1 z4 P: K
sync ();8 n/ G: O u Q! R
*addr = 0;' t, U2 u! J7 a! L, H
; W# A* F4 S! F# F* Z
sync ();
8 z- k' n0 X, d3 Q/ K if ((val = *addr) != 0) {
6 w* T9 o* q+ b0 l$ n, Y /* Restore the original data before leaving the function.
$ z( r3 d6 j/ C- i" t; n9 W3 s" U */6 S' i8 V/ F5 O! n* C! q- {2 L
sync ();
% f* F6 H3 e* `/ O( B6 ` *addr = save;
, r5 K3 Q( `5 q$ j1 J for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {' Z, |: t' l. f/ z9 |& x: B m( A
addr = base + cnt;" D3 Q. K1 R0 x9 D7 i9 x
sync ();+ F, M0 e! F4 b% O. H1 i
*addr = save[--i];
) C( h- r: s; N9 D0 Y# P }/ D: e: N- u/ q- t* j' A
return (0);7 w5 I' z; s- P, |- d G5 }
}6 N) t6 [# w4 L2 n% d! r5 I
( c. O3 C+ d4 p! l# h8 A for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
& k$ T4 G* F o* v, x addr = base + cnt; /* pointer arith! */
. @8 k) ]. F( B4 R4 c* p val = *addr;
/ |0 j5 r9 \( F& G *addr = save[--i];
5 T# G' n* a' M4 @ if (val != ~cnt) {
! J8 _/ R0 P4 t! e7 ]: P( i size = cnt * sizeof (long);
4 M5 r) Y! G" f+ i; c /* Restore the original data before leaving the function.6 H! x6 ^" [6 Z5 J5 [) K- x
*/7 ?; }6 _8 F8 G0 R/ Y" ^
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {; c) n, D7 L% D. r) g
addr = base + cnt;( z p7 W# m2 u; X; J
*addr = save[--i];
$ V! k) L8 T2 B) M! b4 ] }
2 ?/ E- a# q% q1 f3 h! h! B% E return (size);
* R! u# k( e: i# Q4 [ }: u( ]" _0 Q# D3 P% d9 a8 z
}
0 U$ i9 L: E P+ @" A4 U$ r8 H; P) ?
return (maxsize);. h" |5 N8 _# E* \6 V4 P% M" b2 D7 @
}% r" _/ i1 S! @
int dram_init(void), O+ P3 c; B ^" q. N
{
! ^( F7 n; ~. h' ?/ F /* dram_init must store complete ramsize in gd->ram_size */* P; ^; `8 D$ U/ R0 j x( R& [
gd->ram_size = get_ram_size(* |5 u# V9 c0 h [( u* j
(void *)CONFIG_SYS_SDRAM_BASE,
2 r' ]: q1 Q; H' r5 [) v CONFIG_MAX_RAM_BANK_SIZE);
b. n; l5 V4 | return 0;; U1 m* {0 O& G9 ^
}6 L8 F D( Z8 c+ L+ P W, a
* ]% y1 e" L) I8 q
) A( }' t* e' v" k' G5 X. m% C2 u: N0 [* d- x# H# k
7 C, v* d2 }: y7 fFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!) O: o$ _7 |8 G2 p, V" _' F2 Z( z
& |4 |( @. F3 b2 q3 r7 a% d/ p% C/ e: t# w+ ?
$ ]9 ^8 B1 i$ I% N; I& S) r3 W
|
|