|
|
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:; t+ k& f9 ^' m/ \, @
/*
3 z% Z5 L" h" @# K1 l5 ^* Check memory range for valid RAM. A simple memory test determines4 V$ e# g) r g4 u6 p/ y5 {: X
* the actually available RAM size between addresses `base' and
$ S7 a, x) l; V% {) U6 v- ]* `base + maxsize'.
9 ^# J9 Q; m- V* r4 F; K: |*/; z2 H1 [* p" z5 L# `; c) A
long get_ram_size(long *base, long maxsize)
% o! ]" m9 D V. D{
i' G! _6 [9 {) O' Z1 ] volatile long *addr;
% `3 @9 L6 X4 H: _) { long save[32];4 G5 k3 P8 f3 c8 u e. U* ~% }7 @' e% p
long cnt;
' I; y& c7 O& g$ R1 i) W0 S) j$ b long val;
. q) T% ?! A+ |8 j( z long size;
- c t3 }6 T3 A- z int i = 0;
9 _; n" z) C# }. f) n
3 c$ `4 ]8 l- e for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {# @0 Z1 u, b( k! k% G& y
addr = base + cnt; /* pointer arith! */
$ t7 D5 C# W8 \4 T+ E: } `( F9 E sync ();3 C7 @7 |4 b: ?. ]/ E
save[i++] = *addr;7 P* ?- O( ^2 O& N
sync ();
# a# C+ W0 `: d! A *addr = ~cnt;
; O {" e8 F% [: G. T( F; D }4 z! a4 _. O/ p; f& C6 D
, j0 T# A6 @; J2 C8 m3 ]
addr = base;: f! M8 e7 N4 U
sync ();
2 l9 q6 J) t2 p; T" C# F save = *addr;$ J( N" L* V/ {* H/ D8 ?6 I4 Y
sync ();. x2 `9 X) b5 ^2 {$ r9 z' I/ y
*addr = 0;! `( [4 Z5 _7 d3 m9 d! H( s( s. J
- i3 Q3 d! s: R1 p& w5 n3 t sync ();
- N' B5 q9 ~; Y3 R6 \$ P, K; Y/ U @. ] if ((val = *addr) != 0) {
) @+ T6 c) C' w0 Q /* Restore the original data before leaving the function.6 T5 ?% \" E& I
*/
) z' G4 D# y. B* g' c sync ();
/ t# z- A5 s/ [ *addr = save;6 n8 W# J9 A3 E. v/ @! T* |8 _1 L
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
; c& Y+ W$ d) k0 }3 n8 L addr = base + cnt;
; k& \8 y; e" I! q& R' ]6 S1 _ sync ();* R* e0 k+ | j$ r5 {
*addr = save[--i];7 }4 \7 W! y7 n7 ?
}. ?/ c' V" ?2 ?) P
return (0);: u* o3 L# V8 G8 r, X
}
: G+ k+ K% I. S4 ^5 n0 ^0 a
5 q6 D$ I! Y4 U0 }, h& C for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {& r9 I- E; H6 k
addr = base + cnt; /* pointer arith! */
9 d4 I5 s4 B; B0 e9 }4 { val = *addr;% _3 M- N; K7 D; c' Y5 o3 [+ P
*addr = save[--i];
+ b, s7 H- p% r- d$ z0 h) K if (val != ~cnt) {
+ v& o% X8 s- R* k size = cnt * sizeof (long);5 b& `; x# p3 C, p2 t3 Q
/* Restore the original data before leaving the function., Y) y7 M/ J w
*/: O, l7 R$ ?7 ?% T2 s( a/ Q
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
( Y9 q6 V9 R9 h# q) `$ t5 ^ addr = base + cnt;
5 F1 F0 e" I( k" ~1 _" O *addr = save[--i];' H; `( L- o* j* K* u. h6 ~
}% _/ T' |$ K+ b# s5 f) H* J
return (size);$ K3 b% r: ~; ?, ^
}/ F8 o- ~: S3 G) H- j* ^
}
& J% D. |, @, Z+ R0 D
c( {; X/ b! a l! ?& D! m return (maxsize);
5 \5 m; [8 H+ a# x}; V# t3 O/ q. X+ g* B- k$ N
int dram_init(void)
/ c: w8 F/ m: Z+ j{
* L8 o& G: X! L! ]1 S O /* dram_init must store complete ramsize in gd->ram_size */
& e$ \/ K8 t+ K! q. M" o gd->ram_size = get_ram_size(
6 G$ }1 l$ D- ]. q (void *)CONFIG_SYS_SDRAM_BASE,. F% h. m% T) h! y
CONFIG_MAX_RAM_BANK_SIZE);
: H" t+ C8 H6 U9 l) | return 0;, Y, r$ ~; j; T" K9 P
}% S) k( c( O+ Q) a/ b( G: \3 }
! ]) x1 }% T( Q
' m6 U' D* a) k) `+ C- M% `6 M" I) t) Z% p; f: k3 V4 q
1 E6 u6 o3 x% b3 m/ W$ `, `
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
" a2 o+ M/ I% l
' Y8 N/ o) B5 H7 u( `5 s
$ T! n# n2 x$ X- c3 F. Q, n2 I/ T9 }. g
|
|