|
|
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
% N$ D$ w2 L8 M5 y! N$ E7 Z% M0 V, e4 v/*0 o/ V* K; D4 l
* Check memory range for valid RAM. A simple memory test determines
0 C$ T5 q- K5 E" |3 P2 c X* the actually available RAM size between addresses `base' and; u0 N6 D# }/ F- J! p% A9 t
* `base + maxsize'.
9 g2 R: x, O6 w*/. \! V. \3 Q( M2 C
long get_ram_size(long *base, long maxsize)
, t9 ?+ l* C8 S6 _+ p% t{
6 K5 j( [: q* T2 J( I3 s volatile long *addr;6 ^) E6 n0 s. @) z' A
long save[32];
: s) T! e+ i6 x long cnt;) p+ E: e1 d$ E
long val;
2 G; c5 r/ x4 A# K2 z8 h long size;
. a U9 P0 B6 K# P( A int i = 0;
1 D& w7 r1 p: L7 g6 q2 Q U' }+ f) Q {- m: l
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
9 G4 m3 W' H! H( Z$ B addr = base + cnt; /* pointer arith! */; P& E. m# C& y# X3 L, V, Q' g) \
sync ();
' V. S: _, z* k& u# G, s save[i++] = *addr;) @ p) A: }/ m
sync ();4 D# L4 [( | p- }( w& ?# _
*addr = ~cnt;) _8 Y. m; |& `3 p9 b
}
9 h H: N" U! p" C3 C) Q, b7 i) h
addr = base;
/ @1 Y3 ^4 |+ j. z sync ();
Q9 I' H0 N3 N0 M save = *addr;& @9 O* h L5 F( _
sync ();/ K( |+ E3 z+ o2 j: ]& o; V1 J! Y
*addr = 0;0 f; R$ r8 r% p; s
) d- Y$ X4 J/ H
sync ();! }6 e0 T) [8 u: t, c
if ((val = *addr) != 0) {% L: H) U6 Q+ J3 d, s
/* Restore the original data before leaving the function.) N+ y; p( S$ s9 b2 A J- ], N2 D" F
*/
/ l% u9 X$ y L M sync ();
5 `/ G {8 y7 }1 l# b- O *addr = save;
, k1 E7 o4 M& @$ V _! b for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {1 | I7 O4 C8 r7 B. I. x1 k9 _
addr = base + cnt;/ [# d0 r! I( U5 [ @8 A* j5 \
sync ();
, [& T6 v" \+ Z4 [/ I *addr = save[--i];
$ M8 p2 H! T1 H0 h6 D% c }$ N, o# ?' P0 @& V# `$ O
return (0);
) e- ]% Z2 X3 n* l }4 P: d2 P9 N+ N+ {
7 v/ K- U: |) X
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
3 d4 Y( r8 d* { p' ]5 Q1 d# T addr = base + cnt; /* pointer arith! */
- D& x$ s+ f! m% X7 R; C5 d" q' } val = *addr;
5 ?! B# Z# D% U" G *addr = save[--i];
' c; R% E& n w& u8 K5 t, ? if (val != ~cnt) {" Z& d' h: B- \9 Y
size = cnt * sizeof (long);( {" x$ s K' w. ~- F T( j" A
/* Restore the original data before leaving the function.
3 Q1 l9 X! g0 c7 @" g, y */: w# m) ^5 p+ z+ ?7 b' u; m' x
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) { k9 @5 t3 z2 m0 Y
addr = base + cnt;
& d$ l3 b. W" G t# I. _ *addr = save[--i];
3 | [# V: v% r% q) Q }* q+ N6 I+ h$ N/ \, R
return (size);
$ k D! a8 x9 ~- Y$ [! G# A }
' I% u) T8 ~6 r7 N# ^/ i }
- q& R+ p- V l% \
/ B' ^) x. _; _5 o' b! \ return (maxsize);
4 q# Y) I. ^2 [% H1 I1 K}
& @2 B7 v* x, a; Wint dram_init(void)+ N8 y: v( p% V
{
3 k w% ^$ a0 ~% o' l, r a; m /* dram_init must store complete ramsize in gd->ram_size */, U, \' _7 B, D! b6 w9 f
gd->ram_size = get_ram_size(
, g; i5 g5 Q Q+ b0 t' _ (void *)CONFIG_SYS_SDRAM_BASE,
6 n" ~' D6 l! ^! m, p8 D- J0 R+ ] CONFIG_MAX_RAM_BANK_SIZE);
3 O$ K- |" W; O- k. R return 0;9 Z8 C9 X$ {$ T6 u, L) C2 y
} K5 M; K7 ?/ i1 K7 ]7 D) k: g
! x1 A w K! [+ ~9 \ Q
. w: w0 f' b. K1 c- |, G# D
# {( P2 z- e, m, y) \2 U
h, q3 B& G% P; z) d7 X3 TFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
! e* S; ~3 A; S4 T3 v9 i# K- \1 K% V) ?0 {- Q9 s
" d+ z0 b: @6 l$ n
7 @4 s+ s! b5 e2 T+ [ |
|