|
|
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:. L- B$ P! q; i' N2 @2 \
/*" e5 z7 u+ D- E: F2 h2 u: Q# L6 D
* Check memory range for valid RAM. A simple memory test determines
O+ X1 k; s3 A- ?9 ^* the actually available RAM size between addresses `base' and
7 B+ j+ J# ^& b3 c( s5 k* `base + maxsize'.- z3 D+ D5 R1 h6 y0 r# a$ [
*/
" _2 \ |* c! {. Nlong get_ram_size(long *base, long maxsize)8 z$ u; h1 z+ w# \5 D, O' s
{$ V/ P8 O& D2 {
volatile long *addr;+ G' J1 \5 D& @ w2 n: [; l
long save[32];
# H \ s8 T3 i9 ^, W ] long cnt;& P, l1 z) l% {9 y$ @8 ?2 `
long val;
/ L1 i. m% t% [9 c5 v long size;, J$ l( M- f0 V; R J
int i = 0;
% r% U( _' n9 V. c# f! {5 t& }3 y
% I( U- \7 I" o( M$ s2 c4 G3 l for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
/ a, _8 n5 k! E+ Q( w! L( u3 R/ b addr = base + cnt; /* pointer arith! */
7 O. p1 _ O6 n& J sync ();4 _$ H0 g! j& O$ b
save[i++] = *addr;( ~& g( h7 l& f% F7 |* [- w6 H8 z
sync ();- w' v# f3 u. d8 w. m4 m
*addr = ~cnt;
# w: d0 Z, a6 J- ^1 \ }
6 k6 E% o$ T) h, d
) r- X2 }; Y: N addr = base;
) J. W2 W ]. ^6 }0 w: W; n. h sync ();$ g# O- R- z9 q G) m! G
save = *addr;
, {# ?6 ?- q5 w9 o3 S* C sync ();- O( {) Y) A6 ]+ ~' L i
*addr = 0;! S8 h7 b8 s1 {9 ?- H6 S
, Z" P0 W7 K. z* y3 K sync ();) M2 r& z; m; ~9 F/ I
if ((val = *addr) != 0) {; a& }7 ]/ i r+ k9 n' i+ }( L, h
/* Restore the original data before leaving the function.
. M% H8 P$ l% A8 S, ~* @ */
4 o7 h) e! J( } sync ();
) s! Q: Z( e Z& N4 o *addr = save;
+ H& d. Y6 X6 i0 n. O, ] for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {" G5 `2 K: F4 E9 J" _
addr = base + cnt;) [* q$ c. L5 i4 c g8 f9 P
sync ();
2 [) L" h0 }1 N v5 W *addr = save[--i];
& ]" J% B2 N1 m9 y" _ }- k5 S! r* [2 @, X( M. F6 Y
return (0);
6 f8 B# I5 M+ A" c; o }# e) c( n/ ?0 J
& e2 C3 _/ \% Z! _$ ?, o) o7 F
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {5 K4 P# O/ u* ?8 M+ u; D9 d& u6 y# I
addr = base + cnt; /* pointer arith! */
, @ Y) K4 Z" g% I val = *addr;3 [0 y* d9 I( v8 E/ L/ x2 X' B
*addr = save[--i];& E; f2 _+ Z9 i8 W5 J2 u0 S
if (val != ~cnt) {
' r& Y, w; M5 \& s1 ~: K+ x5 f( c size = cnt * sizeof (long);
# l& J8 J% x T1 p$ D1 q7 ~ /* Restore the original data before leaving the function.
6 N5 u6 f; E* T) W, R* C, g+ N6 h0 f6 G */
- k8 k: z0 n2 b& L a for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
# |0 }" U- @4 I% V- ?6 o addr = base + cnt;
* R5 L1 `! q" _! _4 p *addr = save[--i];
0 }- `1 N0 x! w, e4 ^* ]! a# v }6 w$ F% W) ?- p% |. F; f
return (size);$ r2 L1 s6 i) I1 |) ~, F" B
}; I9 J( u) h) @; a* g" {
}
- F0 k# t! u5 h- d* P6 G9 ?: c& j3 {7 ~9 L9 N% f0 t
return (maxsize);0 |& H. k! D) c: m* d3 Y
}# f1 L! A( L) l3 j) c& X" k
int dram_init(void)0 Z. h3 e$ k6 H _+ s# O
{
& G7 Y8 J) V0 z( Y5 @+ _" X* E; E /* dram_init must store complete ramsize in gd->ram_size */* H0 w7 V6 V" ] t+ P0 e5 y
gd->ram_size = get_ram_size(
# O3 W$ i( C; I/ j' s (void *)CONFIG_SYS_SDRAM_BASE,4 Q8 L0 p. k, l
CONFIG_MAX_RAM_BANK_SIZE);
( S! O6 D8 y4 W& A! [! j9 | Y# Z return 0;+ _- S( J1 E2 v1 J
}
% _# c) b: u/ n3 \+ J/ X9 f% V" U- m- C. V( [
?1 u1 O% L+ u: V" l) ~+ u' e
0 |3 y# O0 {& u/ E: Y5 {: O( H# G2 M" f1 r! e
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!# P4 L# A- N/ Z6 s: |0 W( R
6 v+ H6 v1 K8 g' W4 I
+ d. t! r y1 L" E* N7 M: d1 O0 q! f7 P* W/ o. i
|
|