|
|
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
, W G) m: K+ B' z/*
( R8 j8 S4 R5 `9 D* Check memory range for valid RAM. A simple memory test determines
7 v: g* F, C5 U4 f g* the actually available RAM size between addresses `base' and6 L: F6 e9 C2 c1 s
* `base + maxsize'.
$ P. `8 ]" F9 j6 Y4 M; T2 H& I*/. j, {/ h7 ~* Z: |: ^
long get_ram_size(long *base, long maxsize)
( e- v D( Y4 }( i) {( E' T{
$ Z0 U- F/ t! A K volatile long *addr;
9 t* {" M k1 j long save[32];
1 I& ^4 J+ d( |( N' l* W long cnt;
6 Z5 d7 |, P# A: }- r long val;- I! R; U- T y4 b+ L9 T- I
long size;5 Z3 U# B, }. b
int i = 0;6 y3 O" c( n# y- R/ J: \7 H I
* p. t. t7 \: _5 b, m$ N: U8 v& X1 ? for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {) o. F5 V. j ~9 n8 {
addr = base + cnt; /* pointer arith! */6 _$ ]+ `( W2 c) ]
sync ();
k0 A. t6 O# e save[i++] = *addr;
$ Y+ D) P/ e7 v% w( b/ _, v. a sync ();3 R. C$ ~4 Q5 V4 N9 L2 f
*addr = ~cnt;
: [- A0 U3 n! @. D( ^7 y }5 \$ y3 n6 V/ u8 _
: B) m& ?! C6 C# O, t& ~ n* h
addr = base;; t9 n( f2 r$ g' n% ]
sync ();5 o, r. J# y/ W2 g# N
save = *addr;
a8 t# l: H ^1 I2 O$ j sync ();& O+ \3 e' a5 Q2 |
*addr = 0;
+ Z. @# H0 C; a9 J" x5 d
+ f* P! \6 M. P' }3 O. n q sync ();
3 Q: _) Z; ]3 M5 S! N! w7 \ if ((val = *addr) != 0) {
/ K4 Y4 i$ s! l7 X7 Q /* Restore the original data before leaving the function.
" j* [& X: e" D; x1 K */0 w) B, Z6 ^, q# Q
sync ();
3 o' V/ z: a( J4 _; O# M *addr = save;2 O$ f& y: `7 K5 s& Q& ^8 i
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {4 ^) T9 J1 ^% g$ r2 L! s7 R/ p0 m
addr = base + cnt;3 c7 r8 o( d; t% G( _7 j/ _
sync (); ?9 [5 H, R ]1 ?% D% R' P
*addr = save[--i];4 b O# b0 |. C
}% W& m; o, t6 _/ W% I
return (0);! v/ Z; k( i8 ~1 K& r% j# ~
}7 O+ e; A. q' e* ~! i3 e, M" l. @
7 [3 p8 d' X# w! b. P3 C5 z
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {" g, `+ x1 p0 H+ q+ R
addr = base + cnt; /* pointer arith! */
. X' h2 X! e7 a% |8 M' ]2 } val = *addr;
. V" _% z, q& a: x- R% A! y *addr = save[--i];$ z3 `- y, W6 n4 y5 G+ y" j: o- `
if (val != ~cnt) {
6 d% J0 ~; o% G x9 I3 p size = cnt * sizeof (long);, Z) f# H6 @/ I0 z) P
/* Restore the original data before leaving the function.! g* X! | v9 P" M. A
*/
, a3 \, k1 _8 `/ ^ for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {' ^, m) B' H9 W8 D
addr = base + cnt;
# r) p: R2 G- P6 b *addr = save[--i];
8 T; d" s8 y2 i# ~& x0 B }2 H# y% p2 d0 c+ U9 q2 X8 b* e/ |9 t
return (size);
% d) h3 u& h( j( d) m5 l$ K. } }
! w* K% y4 t/ ^# N5 u7 w }3 g) c8 A8 Q- @& G; |* z! ~/ R
0 s4 c# E; p* l
return (maxsize);
6 p( ]% O; ^7 R7 v}
+ K- g1 j3 t9 O& H# Fint dram_init(void)& @/ w) A' Y/ l2 `
{5 v: ?# E5 p. H& j
/* dram_init must store complete ramsize in gd->ram_size */* g3 d- [; ~ x% p( {
gd->ram_size = get_ram_size(
2 ]1 w3 Y4 `# Z+ u" c (void *)CONFIG_SYS_SDRAM_BASE,2 ~6 h: S, V1 g9 K/ l$ `& v
CONFIG_MAX_RAM_BANK_SIZE);
P8 w1 u- d% i4 d3 w& G% U4 f return 0;
0 v `5 ^! x7 C}& ?9 `1 k6 n W( _5 W* T
6 R' e* \" s# b
9 S/ ^% T1 m" H9 ~
+ v( p7 q2 f, v$ D
" E" W) g7 V8 K8 \( jFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
# c2 P3 \/ L x* ]' _) k9 ?! ~3 d. y* Z6 ^. O1 V7 p! t
. H( E4 b$ N4 E- K8 i
& y/ I( S ?4 k7 U |
|