|
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
3 }5 p" x' _- Q: S0 M+ ]; Q/*! }. S4 o/ E4 }! i* d( U% ^
* Check memory range for valid RAM. A simple memory test determines
% N# g, [( W2 w y. l/ L* the actually available RAM size between addresses `base' and& C; [. B, P& X# y. r& w8 r4 p
* `base + maxsize'.% e d, a* D" g) u+ q8 X! Q
*/$ H. o9 r7 I" z* d2 l! w# k m$ x, p
long get_ram_size(long *base, long maxsize)$ Q# h6 v! w) F6 d6 t
{
& Z' X3 C3 ]( R* e volatile long *addr;2 w. e: i% J' _/ s9 O
long save[32];
4 E* G& _3 }0 N long cnt;
6 v: ?' K/ _ I long val;
# s" f1 d5 _, W0 X long size;7 q$ x( c$ I0 ~( A$ v9 `- o" R" ]/ W
int i = 0;$ Q' J& ?$ p+ `7 v
7 T0 L; ?- i# m: G for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {" R. |( M& x" C9 {1 b2 G
addr = base + cnt; /* pointer arith! */
4 V5 ]* N7 t9 U1 p, x$ C; g sync ();( V% Z f1 Y) p2 }. k
save[i++] = *addr;9 `2 Y4 s( i' F6 E+ {: i( A6 e8 D; k7 f
sync ();
' p. N$ [+ W3 _ *addr = ~cnt;
( S" F5 P" N% \2 m7 S }
; i7 ]1 V) k$ V+ z4 Z5 {! L f; J1 F
addr = base;4 d5 R- M1 Y" K |9 `
sync ();- J: V( v1 V* V; t
save = *addr;% d6 I" A# K/ a( X8 ^ k0 b
sync ();
% L7 R6 g1 z5 h, L1 w *addr = 0;
2 x7 E4 E& O( O# b B" M' {. }. [# q* w( J6 [( `" x0 n
sync ();
4 ?$ s4 J# e9 j8 J if ((val = *addr) != 0) {
8 k( f' Z6 o) n5 h" Q /* Restore the original data before leaving the function.: C5 Q* r; H3 b& ?
*/
& ^$ G2 h R/ C4 _ v p. X2 l sync ();3 _, v. R. d9 @7 j9 u6 O- P4 T
*addr = save;8 n$ ]6 s$ u* S: s
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
3 V5 j) T9 [3 m2 n$ L addr = base + cnt;- {* \* C$ r8 i" p- _& j
sync ();. ^! f0 R+ z1 w6 f7 I6 o
*addr = save[--i];
& A4 T4 q/ |3 G$ E0 v' \3 [* J }
$ t- r- C/ ?+ z( Z( v return (0);
8 g* E7 Q/ x1 i( E0 G4 S }, m$ m: ?) I9 v4 v& q+ i& y4 D
/ w! l( S9 O6 I, I5 p for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {: c" ~8 J4 ]; [5 M) s
addr = base + cnt; /* pointer arith! */
4 L6 r* n6 P/ c+ g4 F4 d/ K val = *addr;
5 ` q+ d0 Z: ^ *addr = save[--i];& w. U2 L3 g# Q( Y3 n0 L. V
if (val != ~cnt) {7 d( }! i7 S' Y. K q7 t7 E
size = cnt * sizeof (long);, A% o) }7 z+ C6 H5 o, {
/* Restore the original data before leaving the function.
/ I; d2 T* s: O8 v: F *// ?& e4 |/ A% O; `
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {9 u% t+ C% ]2 z9 l" L" s g
addr = base + cnt;
2 f" o/ |! D0 ~6 b% d4 K7 N# I *addr = save[--i];% Q* }9 }+ I% T& j( n
}+ ~: |$ n1 ^7 x' M
return (size);4 W% |% H7 b* m& a0 j$ Z$ s
}/ X! ?* ]7 e* e8 h: Y7 B
}) N. X. W! U/ i; @
2 f) I) ]! W) B return (maxsize);
8 ] r& x" f7 a D# |}
0 n; z5 U% }1 d- @int dram_init(void)
" |$ g7 {; J& r2 M" f1 _& s# z{5 o" m& h, r( G1 [9 B2 p* Q! ]8 Q
/* dram_init must store complete ramsize in gd->ram_size */
. T# {8 t# _- w- n gd->ram_size = get_ram_size(
# K9 w6 n; q& q9 g (void *)CONFIG_SYS_SDRAM_BASE,
; J7 F% C, ?; b# [. U CONFIG_MAX_RAM_BANK_SIZE);
8 w; B( p8 j" S1 K return 0;! I* a5 [& v; v8 M; S$ f
}
0 f- ^& e$ S" m( Q0 U' j% _5 d
' }4 [6 m9 B$ Z( |* W
- K4 Y9 C# t% h# a; U6 P8 R( c
5 v, o' H. P9 n( R' f" Q, O1 k7 G. g- ?$ h5 I/ ^. d& D0 C$ Z
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!* ~4 e1 G+ {# z/ s$ O; s
& ~1 t1 e, L. x0 T' n2 u
; ^- \9 k7 Y% i2 I; H+ p
3 Z5 ^& b$ E* v) u* N3 N* X |
|