|
|
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:, s9 w& W3 y; H2 m9 J" ?* Q
/*2 x$ J" e" _3 e+ p5 |0 W
* Check memory range for valid RAM. A simple memory test determines
. P+ E$ X/ W- P1 r' I2 u* the actually available RAM size between addresses `base' and7 G' c3 \3 R0 n5 h
* `base + maxsize'.3 k- x6 K% h9 @# b3 i7 ^
*/ d# v& s6 `% N
long get_ram_size(long *base, long maxsize)8 J% n( y# s5 p& n
{; `' e1 Q' x4 D" B: Z0 d
volatile long *addr;; o9 T# o5 Z1 l _5 z% C
long save[32];
" [. c, a8 A/ B( x& u long cnt;
9 J j8 v. L7 n" q! {- g2 B" h long val;
0 ]8 k9 Q+ @$ f4 C2 H! l3 f5 {/ g long size;
& B& i1 V# q" r; K9 H0 T0 Y int i = 0;
: z: ^: O; J( F; e& Z6 A. z- K3 {7 h7 ^7 G- _/ k
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
+ o2 M1 H* j5 z( Y- q6 p addr = base + cnt; /* pointer arith! */, u- D6 f6 x0 o' L
sync ();
, Z1 p% u/ t& L* \+ a save[i++] = *addr;7 h" c0 i7 a' P5 \0 b
sync ();7 O' ^8 t q6 V
*addr = ~cnt;$ o- E9 G/ n+ P1 G
}. A7 b* A( O3 Z3 V
8 E6 ?- R" u7 H' ]% ^0 g1 O) d, Q addr = base;6 ]3 |" T6 o, p$ p
sync ();8 u% K9 u% c6 g, W. e9 ~3 \
save = *addr;
: ^- @0 e3 f. |( b( O0 y' X sync ();& @& e M7 J8 f3 I9 S) m8 r; R
*addr = 0;$ [0 C. G1 e8 s* e. F8 ^( E# Z
5 r& K5 v" U1 ? sync ();
$ d* i* Q1 F0 v# F9 ` if ((val = *addr) != 0) {
9 i# R, Y# z: T& V H /* Restore the original data before leaving the function.
9 r; p, W7 O! ?6 H */( V7 d/ c" y" o; W! f; A
sync ();
8 f0 P5 B$ g7 a# x# p *addr = save;
w1 ^ E6 K2 j k4 J( ^ for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
/ L2 W2 Q5 k9 }; X, r( S) R addr = base + cnt;$ C9 G E- Y0 n! h
sync ();& F, M4 Z! o L( o- s
*addr = save[--i];
, C4 K( Y a& c$ E, l; P }& B. u _( ?% }+ e+ ]# U0 T. f
return (0);* Z" J# }1 t4 }+ U" Y
}4 F* V V7 t: ?! j( d# z; @( P
* _/ ^5 a+ V6 W
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {) O0 S9 t9 ^/ ]) d+ n" @
addr = base + cnt; /* pointer arith! */; A7 l, e S+ Y4 g6 g$ X
val = *addr;) [' K6 f' v+ r4 k2 M6 P- z
*addr = save[--i];$ ^$ C) z* C* e
if (val != ~cnt) {0 M9 |% P" {0 u( y& L' A" b) g
size = cnt * sizeof (long);
- D4 h7 _. u7 G; O /* Restore the original data before leaving the function., ], {2 V+ w! b/ K
*/
: Q/ x- }1 P7 B& [; N for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {5 j2 \% {. N& W: f. P9 `: H5 F
addr = base + cnt;
( E% e* b4 Z7 F7 C2 }. p) ~# x *addr = save[--i];
0 `8 D; R+ m% Y& O }
, L9 p5 P' ]3 }) t8 Z return (size);
9 Q g1 l8 Q1 V; H+ @ }/ K* w, O- J) z3 k
}( o: A8 a: f7 J% d7 n/ {! f" p4 F
, T6 r: y% Q! F/ V7 C9 ^0 b return (maxsize);
. n& X5 h. b& |; h8 d: K}
4 D6 h! J- m( F0 `# x2 A. a1 |4 Wint dram_init(void)( s! o9 S( ]: ^' j. M d5 e
{) Z, j# K9 S7 ^+ f
/* dram_init must store complete ramsize in gd->ram_size */ k7 S5 R+ ?& p2 i$ Y
gd->ram_size = get_ram_size(1 O; k, Y2 N6 V) F: N& r; v
(void *)CONFIG_SYS_SDRAM_BASE,0 x' t9 u5 ~* ?# O: `; R2 v
CONFIG_MAX_RAM_BANK_SIZE);. P+ B/ t3 Z$ \* g/ F* K" h' z! B
return 0;/ x7 x" S& k3 l8 z
}
" ?- F. a" T+ u7 O0 s% l3 u$ t/ _7 f' E6 @2 [
: O& _6 s; ]8 M8 l+ T M c* w2 a7 r2 i% {: x. L: S, q4 m' k7 m0 _' N
+ \! h6 G" ? |+ t2 a, QFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
# c& h: Q: s, y1 i8 |
& \) Q' N) v0 Q1 ^0 p5 Z$ Q2 o9 V3 T! Z$ |1 y' b1 f5 k/ r
- s+ t$ Z" R1 [" o1 G |
|