|
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
& D5 [4 Y% [; M( D% }9 e- H/*4 B4 w7 v3 N5 R: U* }# `" L- f7 `
* Check memory range for valid RAM. A simple memory test determines2 I( \& k: u- \# J& S
* the actually available RAM size between addresses `base' and7 f( x' c: X( ~! P% w( Z
* `base + maxsize'.
; S, D' Y7 I6 U- v$ q5 o! f*/
' ]* j, J; a1 y1 p \long get_ram_size(long *base, long maxsize)4 K( Q3 X6 Z9 }2 C I6 k9 s5 Y7 S9 w
{
! e3 W. T+ q" c9 s& ^ volatile long *addr;
- [5 |) \# r# X) e3 u. ]& p long save[32];( O* |4 ^; u1 W2 P7 \+ n% J
long cnt;; W4 W' m* q3 l* {7 C
long val;: ?/ O! a8 i/ j+ k5 ]; {- S/ u
long size;
" K1 Z1 @) I3 s! q* s- M+ J int i = 0;5 Z2 W0 V4 R- s5 ]4 \
$ f# F+ o3 O* V for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
, `& H. S! h1 u9 U( n addr = base + cnt; /* pointer arith! */
* B* {5 T/ `1 h7 I. ~ sync ();
9 b& g1 Y% @/ t! k& m save[i++] = *addr;
" w9 I4 o$ b( P, K- X sync ();, ?- b, z& z- }7 A( B' ~! c& ~
*addr = ~cnt;
' L; i+ k, T4 T7 Y9 v }( z9 _! ^) @) S4 T
( {, {2 i( ]8 _ g4 {7 o+ W7 L6 } addr = base;
3 c0 E \/ x* ?' H7 u- A. Q sync ();3 R% h. r! c% o2 E
save = *addr;
0 \' m+ Z7 i/ w sync ();
' E* k ?1 i) k, [ *addr = 0;- f8 O! H* y- S9 ]2 s
# P" v7 y \5 \ sync ();
8 [8 A6 Q) A/ K5 C3 N if ((val = *addr) != 0) {
( _+ `0 d" G/ j4 Z4 W v) V) m, e /* Restore the original data before leaving the function.& t- L2 U2 S1 I9 s, P% C
*/$ D7 Q3 f' B! h
sync ();
* j M" }( O0 y% V: k. }5 M- b$ K *addr = save;
4 U% [7 Z* J. {; O for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {/ Y7 z: ]; \. b8 j
addr = base + cnt;
2 }+ n7 f# s1 B7 D sync ();
& x8 D9 Y$ l7 c6 A/ K. M4 d5 N *addr = save[--i];# H" Z1 R$ [! {9 T. c: k7 ~
}' J4 p, n/ w! u5 H2 B
return (0);6 Y+ i/ N5 y. `$ x
}
! [' P+ R: J3 Z
; H$ H }% E. \! G+ W: J4 k, r# o for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {& @, P+ m) @2 S( N9 u5 l/ a! X& r
addr = base + cnt; /* pointer arith! */6 |7 p. r- q3 z; b
val = *addr;
1 z1 G- l4 w% d: b6 b1 d9 w *addr = save[--i];2 ?3 v% F" Y( N4 j2 w) \! }
if (val != ~cnt) {2 G; ^7 z7 R4 k5 V& `! A
size = cnt * sizeof (long);5 | c) R* h0 ?$ H: k/ u
/* Restore the original data before leaving the function.; g, B' n% i, `- w! C1 \; X/ l* L! S
*/) }( O, P; v) ?$ K8 f
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
; O1 v0 O. L9 I, Z addr = base + cnt;
1 P& {; }. m M" ?# Z9 x% V *addr = save[--i];
) z8 G' J1 a% `, T }- R; t" C8 v" H6 L6 z7 Q5 M8 v6 o
return (size);: Q) |( A `8 Y5 {
}
. Z0 ^5 L- H0 T' c }/ x1 `# W9 j& C8 [
/ V7 _- @& Q0 t( w5 t" N" g5 q return (maxsize);1 H# t5 U4 k* x+ j% r# ^& ~
}
) ], } W! D7 Kint dram_init(void)$ a- ]: {3 j7 Z- C8 v& h- R
{
9 T; `; A3 U! N' v /* dram_init must store complete ramsize in gd->ram_size */
. b! c1 g0 ]- |+ C8 E& ~' D+ l gd->ram_size = get_ram_size(2 o- o" V- z; Q+ n- D7 d
(void *)CONFIG_SYS_SDRAM_BASE,
+ r2 ]7 c; ?+ B: y, O3 @ T CONFIG_MAX_RAM_BANK_SIZE);
0 i. H$ `! ~8 |2 l return 0;' \" }2 Z; I( H
}
3 J7 g) e" D. c! H+ t1 i( x5 Z+ X" y- v
i1 O2 Z* ~6 h5 q2 a
8 J/ Y, e1 m$ H
6 f+ A3 M* j6 G$ B
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
$ Z) s+ N9 V, y
) n% w* U9 p+ s% a! r+ O& e
8 A! u, Y4 r% R% ?9 W
. F4 @) }9 M! [" g# C |
|