|
|
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:4 L. ?0 F# v6 l5 T
/*1 U6 x$ K+ O( @
* Check memory range for valid RAM. A simple memory test determines
! l# W* e9 @5 G" K( E* the actually available RAM size between addresses `base' and
?, |; Y8 Q* L& v* `base + maxsize'.
M* |( K0 ^) S' z*/, O6 Y& Y/ H0 A/ c
long get_ram_size(long *base, long maxsize)( _$ n# y" F" ?3 |, H" {
{8 R+ C# B+ [) ~4 p4 y
volatile long *addr;# f: M, ?1 |- k/ P! S
long save[32];/ F6 W/ e+ F. R
long cnt;# u, P+ d8 V4 N* ^0 s4 ~9 s4 o% I J
long val;0 q* ?! d/ i; m' \
long size;/ j9 ]% D5 }' p; @& t# i
int i = 0;
3 E8 B' ^+ m' ~- }) @% x3 @5 @/ b7 z' Z; K$ s* w
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
: i; j7 o4 i- x. r addr = base + cnt; /* pointer arith! */
2 S4 g! V7 a, t" ^, ]! K6 }# J& H( W sync ();6 {( X$ A" [0 s$ A P/ _
save[i++] = *addr;9 N) T+ F. M9 @+ A
sync ();
' x" g; C& K, p& {/ z# @- h# U, R *addr = ~cnt;+ f" s* b' }( [, \. ?2 q0 [
}) ]* u Z. K4 z
& ~: x/ {: s. k" n5 L8 ]
addr = base;6 X( d t) ]4 s$ A+ }1 z# |
sync ();3 m4 `, o H/ k! {
save = *addr;- D3 b: Q4 R% s) i2 n6 b" U+ z1 r
sync ();
6 L! q S; z( ?8 `6 j9 Y, V e *addr = 0;
, {1 N4 N8 k6 `; J& L- O% V& R' G. \
sync ();! Q( Z- ^) S: R) P4 q0 C8 W
if ((val = *addr) != 0) {* v( H. e# x+ ~% r$ X- M2 Q
/* Restore the original data before leaving the function.
}+ n% }5 A8 ] */
4 D7 M+ Y( u, h* I* c% u sync ();6 G2 C: H* C" s5 L6 B
*addr = save;
& h$ L& v; P( g9 i% }. |5 y for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
0 @$ d( n. Q" c O# _" W1 } addr = base + cnt;& ?, A/ @8 _. e4 J
sync ();4 h' S4 n j" j+ u
*addr = save[--i];
K% j1 ^, [! C- r. N+ k& N }
. W0 Q$ G0 r8 C. s return (0);+ N6 L2 F& _; k7 a& U! h
}% ?" K. [8 V5 ^9 h. O C/ r% x5 Y
& r2 q) |6 Q# N0 x* T- O/ S for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {, s; b3 t$ h: U
addr = base + cnt; /* pointer arith! */4 x X& O( U0 T; z
val = *addr;) G7 N; q) F- X* _( z, w
*addr = save[--i];* h7 c) O& m; l
if (val != ~cnt) {
/ v- Y0 ^- z9 x- j4 F' U+ [& I! O size = cnt * sizeof (long);1 }+ w/ A9 ^6 q6 [
/* Restore the original data before leaving the function.
' z7 o3 E- p0 I6 f( ~; o */
, y$ G% B2 ~9 X( p5 o+ _: T& ` for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
% X: R x: k6 n% @( }% U addr = base + cnt;+ k- S7 E% H1 K' R9 f
*addr = save[--i];7 N& F7 p9 G! d" f ` r
}: O: X) n7 Y8 d) X P0 i5 l6 x1 l5 p+ Y
return (size); h) ?5 x. q; i8 U9 ~
}7 `( T; y# R# ?6 c0 a# J2 U
}) Z2 S6 q X/ s' q. J! k. a
. h& [. K; r7 V) d
return (maxsize);
. t: v: E3 Z, D}" I& \4 B* Y' i9 ?8 U2 T
int dram_init(void)# Z4 Y8 w# s7 p( t" y
{
- ^# D5 D: y/ ~7 q& G6 D /* dram_init must store complete ramsize in gd->ram_size */. U7 f! K( T, k5 g/ ]
gd->ram_size = get_ram_size(. ?" ]" d" Q/ m, K. f
(void *)CONFIG_SYS_SDRAM_BASE,
7 C/ V4 \ Z; [3 ] CONFIG_MAX_RAM_BANK_SIZE);
8 F4 _% t' g9 g return 0;- ~. w) b, T0 ^8 Y6 |. i- S3 p/ F
}
5 O, C+ `; S, J+ s# D4 z4 v9 f
! g) x. X( ~' V2 e! ~5 Q' b; p! e" D2 ?* j, i
3 z" q( q& i# l/ f; I2 j$ e4 h
/ I2 c' ]2 A8 O: ]: eFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
) H) H- _$ V0 z# y4 U; e" w4 B N- N+ C) _, h1 Q9 E) G
, u* h6 w9 ^: y1 ]( @& u7 I
: x- _" D* g4 A7 p `4 s |
|