|
|
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
8 E: ` \: a# e/*9 }8 M& Q5 j- ~ C
* Check memory range for valid RAM. A simple memory test determines8 x3 B. H0 h3 v5 f
* the actually available RAM size between addresses `base' and
/ k# e l3 A" m" Q5 W5 G* `base + maxsize'.
, x# S" _. `# R*/2 [9 L/ I$ T; D# i2 q# f* j
long get_ram_size(long *base, long maxsize)
& `* d) {& ]7 l5 ^- H{
* Q. u' Z' m$ s2 F# |; p volatile long *addr;
3 ^2 s* k1 T+ A/ Q long save[32];. x% y6 G6 L; D% r5 R2 p. m
long cnt;; ~; A% E; h. [
long val;
% x; N' C5 D) O; u5 W+ w) Y long size;! @- y; u7 @9 {
int i = 0;
; C _4 v& v7 `1 @0 h$ Z! K0 c; l. W( g& q9 ]/ p6 A% \4 U: N
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) { m. q5 d& q6 I1 T. J- i
addr = base + cnt; /* pointer arith! */5 ~) ~6 k1 ?8 ?3 F6 |6 c
sync ();
0 D2 v/ v5 D& q! `/ K; i save[i++] = *addr;
( n$ ?' `4 @9 k7 Y( r; M sync ();
9 ^/ L$ R- ~3 H0 M *addr = ~cnt;
1 A3 g; `* k3 w1 a9 O }
0 f& R; H; E8 E9 u/ w+ A- ~ N2 i2 i
addr = base;) j- d7 t1 P8 e5 V' Y
sync ();: `% w+ L4 C* b
save = *addr;% h- D+ d4 s, B( A
sync (); O) D4 ] C. e7 }
*addr = 0;$ ` n6 v+ f/ C, a% |
( o5 }* Y, g0 f! p1 y
sync ();
( S- K5 Y7 a. s2 ]. K/ v% U/ y2 o if ((val = *addr) != 0) {
\* E: A+ r& o- ~1 I' ` /* Restore the original data before leaving the function., a5 a$ C8 {+ I% |2 |6 V0 S
*/* a& _7 }+ C. M
sync ();4 l* B9 k1 ?9 u& f. H; g( V3 R
*addr = save;
: y5 w+ ` ]" z3 H$ \! d3 d for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {; ~( r' I5 N, O4 f' v" M
addr = base + cnt;+ v. v7 f- G* J! v/ t" Z% ?
sync ();
7 `; O! m9 I# n/ y- N4 V8 J *addr = save[--i];
, W! i' Z$ ?( j5 l C }
$ p$ V( d# Q4 k" z0 [ return (0);' B. b% K3 Y d8 t- d2 s% B
}5 M! W+ [& B. o A9 d. }
% `3 X- _5 X0 x% X for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
# I) A$ ~ D$ ~2 O/ Z* N3 T addr = base + cnt; /* pointer arith! */3 z! S1 s: y: ^0 b$ Z+ p9 |; b
val = *addr;3 v4 ] t' q0 p" Y' S% Z6 Z2 |
*addr = save[--i];% @& ?# @% N w/ k. N3 q2 l
if (val != ~cnt) {7 P! Y8 \, g! }# F& b2 H' ~; S4 e2 X
size = cnt * sizeof (long);- f" w9 ?. H1 ^4 K
/* Restore the original data before leaving the function.7 U; t8 w7 G1 Y- b
*/
) f/ ?/ e2 u% H$ w for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {5 _. t; v! l+ Q
addr = base + cnt;
* S( S( |, Q# r' G% Z *addr = save[--i];& I! W; a- `: @8 x. A' h
}
- ~8 b e$ g) M- _1 y return (size);
% K. l4 u" i1 ^$ C# u }# V" T5 f f& Z
}. m/ D: w3 a& J- a& [
, F ^. n0 V h) p3 Y
return (maxsize);
& }/ a& Y4 m. F6 T9 U/ ?- B$ u}+ }' l+ m/ v0 U; {+ \5 y
int dram_init(void)
' M7 t, H; }0 W0 [{& [5 \. e9 h6 z, F( L6 m2 i$ J" t
/* dram_init must store complete ramsize in gd->ram_size */
9 S4 A6 n' z& v; Y& t. h, @ gd->ram_size = get_ram_size(1 b j" q2 B# Q" O$ O9 `
(void *)CONFIG_SYS_SDRAM_BASE,
% p4 ^2 E( O& j6 S0 S; y G CONFIG_MAX_RAM_BANK_SIZE);
( z. ]. u# _3 m9 M7 I k return 0;
X/ E( D' n4 U* D}
5 _ q( ]# B2 e5 m$ R% ]
3 a" C* Q, x! [9 k F; H, F
% h; B/ D5 E" n0 c% u- k" c+ [' U) ]' z
4 E5 X8 b8 Q' O }$ ?9 c+ o
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
( s) N0 i) K* f- I! C% g9 n) Z6 W) S6 y+ |
0 G5 O( m# w0 _( Z: W& J$ y3 A( a. Z8 s
|
|