|
发表于 2014-9-11 18:55:41
|
显示全部楼层
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:/ n7 _* F( y" ~
/*/ f. N q9 P( `' _4 Y" Q$ O8 v# y. F
* Check memory range for valid RAM. A simple memory test determines: M, d5 j7 m& c6 v0 z
* the actually available RAM size between addresses `base' and
& {9 R9 Z1 Q2 Q" a$ }0 |* `base + maxsize'.
" n. }/ ]% d( e5 s*/
, O4 L( A( ^9 X" H7 ]& m5 along get_ram_size(long *base, long maxsize)3 x& v- w7 _1 N1 O! `7 u
{
3 ^& A* c- m H2 Z3 Z volatile long *addr;
% D1 Q+ v+ l0 w& e/ c2 X: a long save[32];
4 J2 B9 A% h. z# A long cnt;* D# C' U( g H6 p$ Q
long val;
7 v3 y" E+ f( [/ s n long size;
/ V9 p1 j! c. H1 v0 R9 C- ^ int i = 0;3 m$ D( j1 _ t# O
& E0 v' V& B+ P9 c8 R6 @ for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
3 L( F! A9 M: y# T5 Z9 v, ^2 ?! p addr = base + cnt; /* pointer arith! */0 v3 j# D- ^" \% W; n4 z
sync ();! ~4 d4 V6 S8 b# b% v
save[i++] = *addr;
, i9 h% O$ t9 d0 f7 \7 P4 [ sync ();- s* s* Z9 ^5 a7 i* f4 N! W& `) C
*addr = ~cnt;0 F+ v) v( O F% G& l9 J- V2 b a
}
0 e! l1 q1 W' H3 ^6 s0 i: c0 e1 B7 P3 W( W& ^% v4 ]+ ]. C( x
addr = base;
6 |6 e6 k! J% N; ^& i, Y% P' X0 V sync ();
+ p/ p1 X" [4 k0 A7 {) j* s save = *addr;2 t m S& N( {, q% G! D* L5 i0 E
sync ();
! T% N' A7 S/ p *addr = 0;
f K! {6 L" v( I+ G" a+ ?: c( H* z: V2 |% J4 @
sync ();6 P }6 t2 y0 H. s: |9 L
if ((val = *addr) != 0) {" \9 n: X4 _1 x3 g1 \ J
/* Restore the original data before leaving the function.
8 ^/ v( U- U$ D3 O- F1 y7 E */
6 l0 j! I; Q! H: q$ Y sync ();
0 _0 T# D( T4 V$ _0 i/ X- @ *addr = save;
5 E/ s% F$ L% a! W for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {7 ^8 z% [% S. W3 J
addr = base + cnt;& C5 {# D/ K7 X X6 R' w
sync ();) I% ~+ p9 A" d; A7 ^6 u5 C
*addr = save[--i];
, e3 B8 c" P9 n' [8 U }
7 E% t7 \! g6 s( T5 Q$ L5 ] return (0);
" `2 ~1 ]3 c9 T- ^8 F% o) u) h, c }' E2 N* K( a: w1 v! ?: Z
/ A% Z, D6 g9 n, r7 Z' U' E# f
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {0 \$ I5 J5 X/ t/ z) {8 N1 r
addr = base + cnt; /* pointer arith! */
3 w& }, {% w6 ~" z% C) {6 v: @* x val = *addr;
- P& b M9 h3 N- L4 p *addr = save[--i];3 V+ D9 k, L. |* N# A; C* w* C
if (val != ~cnt) {
8 m0 j: H+ A! `* X+ n7 W size = cnt * sizeof (long);" W+ z/ x7 K- O4 |
/* Restore the original data before leaving the function.! N! \5 u' H0 a/ Q& B( }" a
*/
8 x" X$ }' f! k/ g$ @, ]6 z for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {) t) e8 V. q% m/ _+ ?1 m! Z* H
addr = base + cnt;4 B5 U2 H* g: q: X
*addr = save[--i];9 l3 G) K. X1 Y
}4 |" f7 G5 G& Y' R$ U* L6 h
return (size);
) D% G! _6 H1 c3 d& `2 w }3 f- p9 R) b) [( o. M
}9 H3 P4 d4 R& J5 b# y) y: j- F
" [2 z ^( E3 P1 i3 G! ^2 c
return (maxsize);3 F8 p0 s& C1 e6 ^/ s+ B6 K
}
7 F5 M2 `- b, |* ?4 Y& \int dram_init(void). {$ V, U, W* Y% I8 W6 Y
{" _: l( B" | z: }
/* dram_init must store complete ramsize in gd->ram_size */$ c! p4 r0 ~8 S' n. x' Y+ Q
gd->ram_size = get_ram_size(
- ]# G2 I3 \3 \ (void *)CONFIG_SYS_SDRAM_BASE,
' B/ w; @- l* K9 u CONFIG_MAX_RAM_BANK_SIZE);- e9 A% {# D7 Z2 d
return 0;
7 |9 R1 K6 p9 F! B- {, G% S}
& X+ K& ~# K) u S4 x' u: B/ v0 G- G4 @8 g
' u6 {) g, @3 _" F
& }" \7 n- z) R. U1 h
4 N2 X1 g- o. M0 ~
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
6 Q6 n2 l+ X4 |! r+ t/ Y5 P2 U. u2 s# y
( i" M3 s. z, G. I: Q' t
5 {6 ~& T: R3 ?" ?
|
|