|
|
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:. r- q- S1 Y: h9 H0 w* Q/ T% A& r. s
/*% ?" O6 g1 |1 g2 _4 A
* Check memory range for valid RAM. A simple memory test determines
1 P" t; s. v' ?6 _: i9 V: s8 k* the actually available RAM size between addresses `base' and. K. m6 @9 y8 |$ R* W
* `base + maxsize'.
7 F7 s/ o2 @# E( N*/
. n6 M O. y# i% V7 o3 f8 d/ W5 C4 v) xlong get_ram_size(long *base, long maxsize)
. u* Z9 {( E7 Q3 E- a1 s6 K{
! v+ K; z8 |3 a8 C& U- l0 G4 M8 K volatile long *addr;
/ ]7 \* M* r3 K5 t long save[32];: L& H7 A4 D5 ^' U1 p/ F0 @4 B
long cnt;, N5 w! N8 B/ i: x: i" [8 ~3 j
long val;8 D3 x. U0 Q+ `6 {- i5 \$ d/ Z
long size;
" M6 |& T' y* V" ?; l1 [ int i = 0;- C* @! q: h0 J$ ~0 a% S
, k+ J9 w5 y* e: n* M, o+ ~! h for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
# i' a( v' y/ T9 I' d addr = base + cnt; /* pointer arith! */$ K; ?& V3 b! x7 D1 H! V
sync ();
4 |& H# N/ I1 y. V save[i++] = *addr;( `" F9 H: P0 C) ~
sync ();3 K2 Q, P* d6 z; E$ \
*addr = ~cnt;
# ?4 R, A2 @) K) ] }
8 U" Y$ ^; e1 T; m/ K( l) y6 \- K
- K6 _2 h$ {3 d ]- ? addr = base;" h9 `' w! v* G6 b8 O
sync ();
* C7 Q0 F) a: n# U6 ?) J save = *addr;1 E1 b3 X6 C% I2 I
sync ();! f% A" s7 I) v; e- Z, W$ G
*addr = 0;( [+ M( t {+ N1 G3 ^' W% g
H( b7 @' \3 r5 j' _) ~( q
sync ();
! S$ z& p, Y# |+ E2 I if ((val = *addr) != 0) {
t6 P, `2 C6 S9 b; D" h /* Restore the original data before leaving the function.2 y/ u3 z: k8 K) V
*/% Y: P/ {: @7 E' z, K
sync ();/ S/ f* Z2 X4 a7 c- @4 n
*addr = save;1 F/ `8 @* e3 K3 H
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
# h# p9 z$ \: | addr = base + cnt;5 a5 J# y( P$ i7 K1 G
sync ();8 r( z- }0 X6 f& i1 E$ O1 z
*addr = save[--i];
9 S p8 w& z, r }
3 W1 D0 W* ~7 P return (0);
$ M' a% l$ s6 t }! l, p, S) w1 \4 h
* H3 \4 {, w) U$ ?
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
' V* X, J& `6 Y( V% h addr = base + cnt; /* pointer arith! */% [# ~; z6 m4 b- S! D
val = *addr;& z5 g j7 C" s1 O0 M
*addr = save[--i];
2 j/ M$ k4 C a4 [ N3 A if (val != ~cnt) {
$ B1 o. x5 H( t4 Y) z3 w size = cnt * sizeof (long);5 }* v1 _9 W7 s' b2 c6 |
/* Restore the original data before leaving the function.
6 T8 `* m6 N9 X; @- F2 t0 h- Z */8 l- Y/ T& q* K. v
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {- O p0 ~1 _* I. K( \5 f! J8 Q
addr = base + cnt;
# {+ d. e: J0 e5 y" N *addr = save[--i];
$ D" @ r, S; e( T# A } d' \; D2 N! @! C
return (size);+ a r( K/ ?0 v i
}
* N' `: i* f' [, w }
t: j# |. g9 D+ e3 G' o; A# R% E' c5 Z) J
return (maxsize);( z& ?9 m* V; ?
}
6 K' `) q! H- X8 R2 Sint dram_init(void)
* U7 e3 l$ G1 [) |, B# b5 r{
' N0 b% N* N" P9 Q5 @* k: q a /* dram_init must store complete ramsize in gd->ram_size */0 a( X h# q" G9 G) B( H. u
gd->ram_size = get_ram_size(' j0 o: W- {% G; G/ o
(void *)CONFIG_SYS_SDRAM_BASE,
+ W {+ w+ d" \ X: w' H2 r4 X. V CONFIG_MAX_RAM_BANK_SIZE);6 z$ ~$ v" q- r1 c; ^* l* `' p, K
return 0;
# ?5 {7 [0 v E' K7 R. I3 i$ [) ^. D}1 i8 i0 w$ k& Y) ]/ [4 A: B# h1 Z
9 P* A3 z* Y4 Y5 v, G
# T+ w& y/ V! i, |+ x! w M0 {& H% b% m i3 u/ _8 I8 O* _
/ L8 A% y) U7 L3 f' PFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!' p- ]' i+ _+ L' S
8 o/ W! k* m2 h% Y% z$ c
6 @6 Y. C9 [' J) U
) s: \ `* z) g/ M
|
|