|
|
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
. p5 d4 W* I- @, P/*( o- z+ G4 m0 Z( o" k
* Check memory range for valid RAM. A simple memory test determines2 P9 A% K' h! e( m' w
* the actually available RAM size between addresses `base' and
# U: Q3 u( X2 V1 w8 L: V" A* `base + maxsize'.; I% ^, s8 }7 l& {
*/
0 ?/ n; n+ B+ F. ]long get_ram_size(long *base, long maxsize)$ l$ ^& {* j- z3 H' M
{
, q' j: g; a9 D8 h2 [2 B' n volatile long *addr;
! \3 }' G8 Q5 e* t( r2 f1 J* s5 j long save[32];" s4 g2 [8 c. Z$ i5 x
long cnt;
+ x0 H, M$ Q" Y" D& D/ k' @ long val;% C, e9 w. M- M7 B* b
long size;2 P$ n b' j0 S3 I1 w0 W
int i = 0;
. z1 E3 ^8 a2 `! V! a* @" A" u5 f! i# H* f
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
- E% [9 G0 |, T1 [% l; P addr = base + cnt; /* pointer arith! */
5 P' C$ [9 W6 D; u' ^& t9 ? sync ();6 u$ h/ M: k: N
save[i++] = *addr;0 v! i/ |$ g+ U L6 p
sync ();
8 W7 J0 W' O% B *addr = ~cnt;
' q9 M1 C0 ]- z9 a4 g% d0 j }
; {% W: K/ j. {5 b6 A1 S I- b6 {5 @& X* n* }. f L' N/ X4 |" v
addr = base;2 n2 F7 U1 x2 N. j
sync ();3 A4 D Y; |7 O: C! a
save = *addr;
3 t1 P; ?6 D" ~* m" t' x1 c+ W: U sync ();6 B# F$ J4 J- [: L6 m
*addr = 0;' @8 Y9 f) D( `6 g
/ G2 w7 X v; F% H. ~/ t# m/ ~# H+ s1 s
sync ();
5 ?/ V' @2 g2 c( | if ((val = *addr) != 0) {
2 q( H8 k' i8 J/ _; c2 D2 M /* Restore the original data before leaving the function.
( X9 q. r: @; D6 X! i */1 b" a! R9 w" G) ~, B7 K" Q
sync ();
7 x( W( k4 ]1 q) U: u; V *addr = save;7 H" ^7 O7 ?- r, z" U, t9 |
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {4 N+ B, y) X+ l2 W! d; Q
addr = base + cnt;2 u5 |3 T* u4 r+ C. p2 n! I* G6 n- x
sync ();( O7 e2 v" \- e- N& |: N, d
*addr = save[--i];( V2 Y. F% S( R! f: j
}4 R! S" {& d8 O
return (0);
% L- r3 X( v a ]' i }
6 D% C: L8 J! ]3 Q5 q; P, i7 _( S( B( x" d+ g" y
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {0 W. [: P1 A' h1 V# }9 w
addr = base + cnt; /* pointer arith! */
1 G7 u4 ^1 N. J* z1 ~' E+ w val = *addr;8 a9 N# P# G$ M8 O" z* ~( s
*addr = save[--i];0 h8 Y% e5 t8 M! q. t1 k, u
if (val != ~cnt) {$ K) A/ @, ]0 O# z
size = cnt * sizeof (long);
, b8 m; a8 i# Z /* Restore the original data before leaving the function.# }' S: u" D1 |( _ g
*/; y( a) K& E5 _0 ]" q
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
6 m) w+ p- W" E addr = base + cnt;
! a7 Z' J1 ]' q *addr = save[--i];( t, r" D5 b# Y- z, r
}
. B3 E* N- b/ o return (size);8 U: M9 e. R# E% N
}
$ ? `, C+ ?7 z: [6 V. E& R }' s( g2 q g3 Y6 N+ `
) v/ N; g! _' q8 t
return (maxsize);; f: s" p. P4 n. a% o
}
, p7 r4 J& Z0 m/ vint dram_init(void) w' T. R' D5 L9 ]/ O
{; K4 U& c4 h1 R
/* dram_init must store complete ramsize in gd->ram_size */
5 u; ^! s6 O+ ^/ B$ ~ gd->ram_size = get_ram_size(
! k+ Q% m' N2 D/ a8 n r% b# | (void *)CONFIG_SYS_SDRAM_BASE,
+ G1 L+ B3 Q$ W CONFIG_MAX_RAM_BANK_SIZE);9 {2 Z' W2 x1 e# K5 s8 Q
return 0;6 \. V' R4 Z, g% N" e/ {
}
& _) k$ X" U- ~" v0 K
" [& j, m0 D. L$ {4 K9 N8 X# @0 r. U; r, A& S- Y/ n4 g9 P% l
' m& w5 d$ K( \9 ]8 o1 n, a
" @1 V/ r: G$ ?! ~4 O
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!, U$ y( l! K5 h
# ~$ G. ]- N1 f7 W2 b; A
: `( ]& d- s+ ~, ]# L2 p0 |- }9 d
|
|