|
|
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:+ t0 _' r2 E" C w6 v- U! D
/*
0 x2 Y s- T/ f) g8 U% T* Check memory range for valid RAM. A simple memory test determines
: {5 m) Z/ Q; z* the actually available RAM size between addresses `base' and
0 J9 }: \9 K! w3 q7 K0 G! V0 o* `base + maxsize'.
2 |+ Z+ ?. Y$ {, G' A7 T*/
0 m! e7 u8 z T* q2 x% J" ilong get_ram_size(long *base, long maxsize)2 t0 g' d0 Z `$ n) E' O
{
9 x4 f: r! e: ~: X4 H( n volatile long *addr;
& e, M4 G d7 [ long save[32];' S1 c; S# z, h
long cnt;( x. \" Z/ m7 z1 b/ V0 ?
long val;
6 |- @9 P. J1 s long size;+ w3 ]8 i! D! \
int i = 0;/ O* t0 u3 t- l: C
9 r8 F5 m) z# b" W6 A! }
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) { U8 B& b3 _+ O, b) C% U
addr = base + cnt; /* pointer arith! */( l: J8 F9 F; g5 y
sync ();
* I2 Y* j4 g) o9 C S. _0 v save[i++] = *addr;6 U+ b& g% e N3 f2 M2 W
sync ();
& d: x% d9 q" }) A *addr = ~cnt;
# e/ K7 T2 Q: \) i* K+ [& [ }
m: o4 y0 O! {/ t. K4 _! `% D/ T; |$ ^& Y6 [0 [* K1 M
addr = base;7 g6 v. H$ U2 z1 |+ I1 J# A
sync ();
: ~ h$ v9 i/ O, H0 [0 ]& [8 X save = *addr;7 N1 e" f! ]$ p! l) o; X
sync ();
6 i* H8 ^7 J4 K *addr = 0;1 Q2 A# N& f ]) S" T6 X
+ P; u2 n! k; V( d# J0 [8 B
sync ();
* A2 D8 M. ^2 Q; {' y2 X if ((val = *addr) != 0) {
3 B9 _9 j* K n' p! a /* Restore the original data before leaving the function.
6 `2 P* |5 t8 |% ^& i1 d K+ H */
5 K( m& Y, f9 |9 u8 U% H sync ();
, ^( `) @1 G8 W* f5 K2 X- \4 D; { *addr = save;5 E" G( H! Q- @3 g) X
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {$ O) h1 W. b2 O5 S: f
addr = base + cnt;
; P8 }1 g0 e, t1 B sync ();
, @/ [8 B' ]4 ] *addr = save[--i];; }4 o9 p/ ], p' c. {! q7 B
}
7 y4 E: [. U9 Z5 L return (0);
. o; n1 l% A- F }
$ G$ V: o4 ]0 u- J1 w1 a$ T) P" i2 h: d& s Z: C4 O
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
# S& A( R& Z* Q4 ]6 K7 D' e# Y! i% z5 H addr = base + cnt; /* pointer arith! */1 K* c, N4 `4 W- Y0 Q8 Y
val = *addr;
8 S1 B4 F* w2 J0 P *addr = save[--i];/ z- K* R0 Z* ] I; [7 E
if (val != ~cnt) {& w7 K3 y$ u- R! ~7 X( w/ V
size = cnt * sizeof (long);
2 s! v( x+ g# S8 n/ k. h /* Restore the original data before leaving the function.! ]5 ]* }3 N+ l
*/
% [9 j/ N/ t- W- q! `6 s for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
1 X3 b5 G) v6 T# k+ _' W" x addr = base + cnt;6 P" a) A1 v7 s6 g e; m
*addr = save[--i];
9 Q1 L8 L, q) J# ~' h/ t }
) N5 l! y0 H. W0 L, n return (size);* N/ W- ^. i9 v8 e0 _
}, @, x* {1 U/ x ~! u8 j2 g8 c
}
' t/ [1 Y$ R) c l' |6 R
, k6 F1 _/ W* A( b% R4 r& a+ u; Y return (maxsize);& { H, B. }! z" B7 x% @2 B
}6 ?( V3 l% w# z; ?
int dram_init(void)
* W Z- u+ _5 s* b{8 K+ E: Z9 g+ z9 \+ K9 i! I6 @
/* dram_init must store complete ramsize in gd->ram_size */; [0 R3 O* _4 a v& T7 M6 A
gd->ram_size = get_ram_size(1 X: D' ]- D; a. C% W+ k, O
(void *)CONFIG_SYS_SDRAM_BASE,/ ]1 r' d7 ?* d% V8 r R/ ]
CONFIG_MAX_RAM_BANK_SIZE);
6 ^. V7 V# x9 r, B. J# Q8 Z return 0;
6 z6 q, L, T9 m# o2 @/ ?6 E+ S' c$ i# }}
$ i3 @' v" H1 j' {
$ k; Z Z+ F4 ~
, h' {' G; t, ^' ]( G" D. @
0 g: z! d4 t! O0 f
6 e4 J( G$ z1 T; w% [) R% U! eFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!0 u0 z: |' [* n% [+ R; K5 z) H
8 X8 Q9 B* l5 p0 a( R
4 y% b9 N( h: `6 f4 l# K$ S0 v) b: }" V
|
|