|
|
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:0 _/ Y0 d, I5 v) a2 b0 F% ]
/** A+ C1 N2 E/ G# F
* Check memory range for valid RAM. A simple memory test determines
1 k4 ?. B$ s8 {9 _+ y* the actually available RAM size between addresses `base' and: w- w7 F, Z* y- F) H
* `base + maxsize'.
5 |0 o( `$ a L" u3 z*/
$ I8 C% W. q7 G$ f9 ?; n e& wlong get_ram_size(long *base, long maxsize)$ X. U$ x" g/ G, a4 q! y
{
4 Z8 V$ Z# u" s volatile long *addr;1 p* Z# e: ^$ H' H+ S) H
long save[32];
! l5 J- a9 [$ ]. w" N) ~4 { long cnt;
/ }! L& I9 N9 e' `9 i/ E8 d long val;) u5 K/ A; a+ j Z& q5 H& d& c' j6 O
long size;
& f% ~- B% D% ]- d# Y6 l* d7 E int i = 0;& V' Y& `. `: [7 Q' R, }( B$ r
! H2 p7 x0 j8 T; v$ ^: t for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {1 R# T1 i; i$ t0 ?! c4 a& h
addr = base + cnt; /* pointer arith! */
3 a" k& ^ z1 ~2 _; d sync ();3 f3 O3 {/ }# v0 A
save[i++] = *addr;
, O: O; [& ]& f3 R8 b7 h sync ();
' P; D% U' W+ R# u/ o j *addr = ~cnt;
4 H5 f: n9 F2 w }
. }, f& ?( |$ n- }" H2 K+ |3 G+ c. V" u& X
addr = base;
4 @$ K# I0 O1 M, q& _' c sync ();! v/ U* C5 t4 U. g" y3 `4 O; a
save = *addr;
( I1 k1 W' Q7 U6 U) q% o3 _6 ? sync ();
4 u4 ]6 _ l1 t* s, U) |4 @* [ *addr = 0;' w" l4 c! ?9 r9 ]
% w* m" Q9 O% @0 A8 @* k2 d3 k
sync ();# b( R7 N: G" J3 h* F8 H8 S7 f
if ((val = *addr) != 0) {
( a! ]7 i6 t# M, C6 D% Z /* Restore the original data before leaving the function.
. o/ y, W' f8 _3 l */
) @ v$ o# B5 n1 _ sync ();1 L3 M4 b% a, G% ~( |3 ?8 O
*addr = save;
1 K6 M* n# e3 ?3 p for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {# v O$ N) C8 o3 L
addr = base + cnt;
2 C1 P4 i7 P9 o( y; c$ O sync ();
" Q2 s- n. w3 r. d+ l4 Q *addr = save[--i];
) z$ A2 { ^6 ? }
- q$ J$ W9 Y7 ]* O& n' i. B return (0);1 X: Q% }, Y6 P8 o! ?" k2 O) H7 S
}
% O4 E. b, \8 r; b5 ^) \7 o* _& B9 h
6 c) t$ A! l# ] for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {+ I% }4 y; b* I
addr = base + cnt; /* pointer arith! */
' b* G$ @/ y/ d% Z val = *addr;
: ?' z% i- x5 T) H3 d0 R/ W *addr = save[--i];
% w- G! A. ?: q& e8 } if (val != ~cnt) {
4 }/ Q2 v$ A$ T/ E" M S size = cnt * sizeof (long);
# q: W2 O+ a S /* Restore the original data before leaving the function.5 R4 w- _% }. `% h# _$ \# h! k; ]
*/
3 O$ Y. h+ i0 U+ }) N for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {) p$ K9 v4 | L h/ y% e# L/ T# j5 t
addr = base + cnt;
6 m- X3 `' l7 j3 A. K *addr = save[--i]; {% i% i/ K; x: z/ L0 q
}! Y% j0 U3 S% a- l; _
return (size);: }' p5 R5 e. \ r G0 J7 d
}! A$ x4 A2 n2 B2 x
}# m: Y! `" t# m. w# A7 h. t+ t) N
8 x+ h, v v$ t! [/ U) I/ U
return (maxsize);4 ]# |7 N& L) z5 F
}
& v. ]0 g u( j; y0 f: oint dram_init(void)9 f- O$ T+ P' Z8 h) `
{% u% ?! V* @! s' y+ |
/* dram_init must store complete ramsize in gd->ram_size */$ e1 B- e/ n4 C
gd->ram_size = get_ram_size() ]* y, p: Y& s) G' m1 y
(void *)CONFIG_SYS_SDRAM_BASE,- }1 Q8 f" K% u) H9 z4 u3 M/ h5 U
CONFIG_MAX_RAM_BANK_SIZE);
: K, ]5 m, u" V- m* ~ return 0;
* |, w; V/ r: s+ q, o/ \! u}' t: G- m; J5 b& d- S* Z
. [ q- [4 |- q$ h3 Z3 ~
" ]2 x, j* a, t8 r6 w7 P: F
$ W1 q8 u, D9 l8 C3 p0 g* Q9 Z- d
" K+ ^3 z3 P( P5 O, r5 ~FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
7 s# L# j) L1 s+ ~% e9 Q* A/ F- ~5 W) h6 i( z! s7 R6 H4 n
+ |" W/ k' W, q- L/ W0 Y2 g
% u1 X- K# E/ B7 Q( f7 \. j9 }; R |
|