|
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
! G. d. f& V: q/ I- ~9 k/*
+ k& S; u( v, G3 T* Check memory range for valid RAM. A simple memory test determines
$ P2 Z, t' B4 Q6 T* the actually available RAM size between addresses `base' and
2 I+ z. f1 h& P7 b: q* `base + maxsize'.
% U7 E9 c) O8 [ H3 e6 a*/
. N1 N T- `+ H1 k4 N; B2 Flong get_ram_size(long *base, long maxsize)
5 k. ?3 e# y6 S2 i; _) i4 U{" U6 j* ?% O' |" \6 c E* k
volatile long *addr;
- W+ k1 V& c) K long save[32];
3 ]& M( f# Q4 d7 ^" T long cnt;& q0 A& y1 h2 v
long val;5 y* G6 ^" L* U1 h7 ]1 J/ } q
long size;
" K5 I4 u/ {. k* P int i = 0;0 n+ Y; t+ d% Q: f1 d* A
$ J3 F' P/ i" M" q for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {$ l" n0 X- }$ V1 I6 K7 M* d0 M! u
addr = base + cnt; /* pointer arith! */
; ~; c8 q( z" W& f sync ();, f9 m# l; i8 U2 X1 ~
save[i++] = *addr;
' l( O! j; Z7 e w4 \2 ?" @/ v2 H sync ();
p" ^% y! y ] e" ? *addr = ~cnt;
9 Z! z6 ^/ {- ]3 u2 B5 z }
. T9 O* n7 }3 ?- u+ ]1 U
! y+ L5 Z4 _/ T addr = base;6 F5 o% V$ S j7 F
sync ();
. J# N) s2 A% P$ P/ u" t" S. w save = *addr;
6 H% F- C3 s8 {$ x6 ^5 D5 ] sync ();
1 ~ Y2 p2 F) Q7 h) H6 s *addr = 0;: B6 _3 B4 {1 ^
6 a; A) g* p4 Y+ O8 c6 o+ d
sync ();# v0 A) I' S' x# W
if ((val = *addr) != 0) {
1 P5 _( `1 ^# b+ G! Z& Y, w /* Restore the original data before leaving the function.
5 I" U* ], c, c */
0 C1 @7 l; [6 w8 ]2 X% t3 T# O, ] sync ();
) y z& I6 V- j- Y4 c *addr = save;$ z6 M6 S! d: M5 b: n: g7 ]7 n4 ]
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
- M2 F' s( I$ Y4 p: L, u" C" G6 J addr = base + cnt;0 S$ ^) D/ I% l0 K2 r s
sync ();+ O3 S$ B# k5 m$ n" u3 ~6 t
*addr = save[--i];
5 q b* ?% c4 G6 K! y" U6 X: S }
& F- `+ z/ Z b' ~8 f. U! i+ r return (0);6 y' S) u4 x+ M. D' @3 Q- S- {
}
$ r5 C( l+ p$ m+ m! t
" z! Q' U* b$ U for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
8 ^( E( U# K+ }. C' E addr = base + cnt; /* pointer arith! */
: a5 _8 n0 i, x( r& R+ P. F val = *addr;/ ^* U/ x9 a% Q) y' h: k9 ?' w
*addr = save[--i];
$ K' D: Y( L3 [1 R8 p if (val != ~cnt) {
/ g6 |1 y: u1 ]( k5 e: V size = cnt * sizeof (long);: E* Z* m% X) e( s2 C
/* Restore the original data before leaving the function.
8 E1 X! ?" ]2 d, s; h4 ^& }$ K */- R: Q" N; J9 e# O+ B
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
) T8 L6 L2 C+ O/ r( u addr = base + cnt;
5 c$ V3 t: N& V S; H2 W4 v *addr = save[--i];6 J I f! q7 A, B* _& I
}- X. z# ]5 H5 w
return (size);, @8 u: y* V0 B) J
}( d) W4 f+ ~' `; j' ?5 H
}
6 l$ K, L% u2 [
9 j1 H) z. Y4 W& U& I* G3 C return (maxsize);* g. _! W3 {5 I! S1 x
}% l% I. N6 D+ {/ M
int dram_init(void)
/ A0 J; w$ g- D7 Z. |8 J( j{
) c' M8 j: X) @% @1 p; v /* dram_init must store complete ramsize in gd->ram_size */9 V, {) V( H5 Y# w! g) C Q4 ]
gd->ram_size = get_ram_size(
) T1 `- ~0 r6 ` (void *)CONFIG_SYS_SDRAM_BASE,
% c/ w9 W8 ?% r1 t' u* k# j CONFIG_MAX_RAM_BANK_SIZE);
# t. a) ~. H! E1 [4 b) [ return 0;
! p( y4 _. B. `}
9 h" [* k- i' k" k7 `0 v
7 P. H6 o& n, k7 V, b: W& }/ O5 m: I G
/ G0 N7 Z) v/ y- }
; C) D) N0 F5 \; LFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
+ }! |4 F7 i- f; r) u/ B
# [9 }2 V# Z5 T. g& }
2 y$ `2 C8 r- w6 W$ W2 H5 y, J; v# O+ G* i6 }* _
|
|