|
|
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
7 |/ Q1 p0 J M- T/*9 y0 ?6 `* U0 r/ p+ m; o
* Check memory range for valid RAM. A simple memory test determines$ t) e& r4 p2 f, v8 {
* the actually available RAM size between addresses `base' and; T; \7 p4 y7 O/ u d1 M- n
* `base + maxsize'.: G; I. }' D+ y+ u6 q7 t. i/ [3 }
*/
. |. i# t3 A% A9 C: J9 b- h$ b, @long get_ram_size(long *base, long maxsize)- m8 {4 S; {5 X- @& X! g( t
{0 x. g: z. I- p- `4 m; A1 W
volatile long *addr;5 a( k+ \, H, I
long save[32];
o- W: [! M1 C6 a) `3 j, } long cnt;, r0 { n8 \5 D1 S$ Q+ P' N
long val;! m# A, O, h: T& d% N: S
long size;
/ l% y, t9 c) n- T3 d int i = 0;
6 ^$ c5 R& F' c' T9 P& j9 B- k& C" V
' X1 B' @, E: R I for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {; v1 _/ Q* y4 V" L
addr = base + cnt; /* pointer arith! */0 n* S4 d/ P6 m2 K/ t
sync ();
! t$ F9 B8 f' j save[i++] = *addr;6 F3 S. r+ f6 D5 |" i& ]
sync ();
, I2 f% h' l% b/ u1 p9 y *addr = ~cnt;
/ V4 e) y- h9 E; c( W: Y7 C. L }
2 f5 \0 K/ ] y6 g- t% F* k) J3 C0 }1 ?
1 Y( `$ T+ E* T3 O* @, M addr = base;7 o: o0 Z6 ?# w) y Z6 z
sync ();
0 K8 z3 g8 U$ z+ T, i! A D: W1 J save = *addr;/ [. g+ E9 o' L# M* j
sync ();
+ ~0 |' @# w h7 f7 l% k8 l. G *addr = 0;
# p6 y' h0 s9 \* N2 Z; m3 f) O0 J& g, E+ {0 m5 W3 Z1 L
sync ();
# l7 |6 l" m$ i- S if ((val = *addr) != 0) {( M. R; G/ r) y
/* Restore the original data before leaving the function.( @ x3 p* `. Q$ O
*/% o* Y/ h& s2 i; ^: N: e( J0 m
sync ();( O! x+ s8 x2 S9 K. u
*addr = save;% E0 e* D' I2 z, [4 x: W
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
. h8 l6 t J- [) H4 I addr = base + cnt;
/ x$ H1 Q" e9 w sync ();
, l5 N/ w7 w5 r L4 D, T *addr = save[--i];
0 v8 u- c8 u9 _& g6 _9 L& k }: U |, _6 O3 k/ D9 _% S, r" L
return (0);' p, S: W/ s) {# c
}9 k( ], ^+ u. V( ~6 `
" T! U* T1 ?& x0 K for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {% Q' c& w" R f4 R' E6 |! ]7 T' q
addr = base + cnt; /* pointer arith! */
: V8 K4 C2 I! D* H8 E! v val = *addr;
! p$ K+ @( I0 X *addr = save[--i];
" z0 F# e8 T* f% n8 I6 ^; V if (val != ~cnt) {2 T1 N8 s2 F5 c1 W/ `+ g4 @
size = cnt * sizeof (long);
6 B; L% ]* l+ B; m: `9 T( Z /* Restore the original data before leaving the function.* h( E1 D' c# x( Q6 P+ N$ P
*/! _4 T$ K) h4 R3 `2 g
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {6 ?: b) t0 |5 N' U5 Y
addr = base + cnt;
9 h* a( i% A7 C+ R2 p, h; w% z+ i *addr = save[--i];
/ \3 ~. N9 p4 x# Y! {) O2 M/ }( \ }
9 y; }/ ~( H% N+ O& c9 h& ~ return (size);
S! O. ^* K5 C1 H }- ]- {" x( E m+ P4 Q
}1 p% ^1 s1 q8 K
5 V* Q: n" D6 V" p' d return (maxsize);4 M* j4 e* y. x$ e( N" A
}0 N7 s Y' G- l1 V7 D# A3 C0 x8 q* b
int dram_init(void)/ V' M2 ]4 W) e$ Q
{
3 k& X. o0 q. t% q8 E" X /* dram_init must store complete ramsize in gd->ram_size */5 t' r2 S, f/ ^; [
gd->ram_size = get_ram_size(
/ z+ Y5 M; c# q9 `( N (void *)CONFIG_SYS_SDRAM_BASE,
# H2 U! ?5 j' d6 g9 i+ R CONFIG_MAX_RAM_BANK_SIZE);1 {( z, C5 A _7 m
return 0;. m, w: |+ q: P) b& r. u5 b+ _
}
/ q, z9 \0 Y# {7 s
6 w" ~/ e3 ], n/ N8 [+ p
7 a `6 ?* I8 ]; ^% j0 |- ^ ]
+ a% n5 Y; n+ H* C3 t; K2 v0 x, z0 q' d8 ^; V$ t7 P
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
4 I+ O. Z! k% _2 `) E4 V+ q% d6 i8 f" f: C2 B
4 a9 n& x2 C: l) r4 T
7 l' E2 A7 F& \& J6 Y
|
|