|
|
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:6 T' Z! U: U8 a
/*; P- w" T0 f3 m: Y4 D2 o) u2 k6 @
* Check memory range for valid RAM. A simple memory test determines a, v; T/ v$ {3 f$ g
* the actually available RAM size between addresses `base' and# E$ d( {8 |% W3 e4 l
* `base + maxsize'.
6 D6 S$ w. E; h; F+ \*/
5 _) J5 D% F Q# _# {7 mlong get_ram_size(long *base, long maxsize)
) B9 n# `% `$ F{
1 |3 ]3 N: F8 y' u$ t% J P# D volatile long *addr; b0 f# ?" J: ?9 E% r
long save[32];$ x, }# Z2 r1 x! X" V& v+ }# `' w& c
long cnt;6 j4 o$ F6 M- `8 j8 Z
long val;- b# F% c. Y- D' _1 h) a9 Q; B7 _
long size;
0 K5 S5 ~, Q1 ~- `! K7 x& S8 A' F& a int i = 0;
: ~, a+ {, l6 ]5 u3 J
/ W# _0 @7 Z) Z0 X+ r: ~ for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {, x B) _0 \: l
addr = base + cnt; /* pointer arith! */
- J/ ]- T; A( L sync ();$ y. n1 c& K0 s! D. \' v
save[i++] = *addr;" `) f% H4 e* n) {; X
sync ();
; P/ F3 a9 S( b: A" B2 E6 H *addr = ~cnt;0 M4 l8 B2 t5 w8 c% ^+ L1 Z
}' \ H. A! K& @8 A
6 Z' |5 B7 [' P* F9 r( O" O" n! m
addr = base;
) L/ ?3 A) J, t/ l( y" X/ W, R# i sync ();. { Z' u' B! l3 H9 p+ n$ c' c0 u# \9 \
save = *addr;
' ?9 h5 t# S3 i. i9 }; x sync ();
+ U9 g: A9 L5 B" I: S *addr = 0;* v/ `2 V& J) i/ n
. u2 z- |7 d( K! b1 W sync ();2 s& g; @6 |/ ] k& p" V& }1 f
if ((val = *addr) != 0) {, C% X9 s* ?) z
/* Restore the original data before leaving the function.
" e' s: |% b6 h6 b" Q+ Q+ c */
8 B2 u4 m4 T+ X& ~, u. | sync ();
2 p3 H) G' z4 L0 Q *addr = save;
, @. e8 E5 h* T3 y& P for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
a6 V4 Z0 @( p1 ]; _ addr = base + cnt;3 E* `" I; I- x! o1 e5 R* {" M" c, g
sync ();# w- t) R: W% y/ [) U+ ~
*addr = save[--i];
& o/ Y$ K! T {8 H% h( R }
2 b+ X# B, D4 f2 s9 [- h+ Y return (0);! o' t" A/ H; }) S# K
}4 U7 A8 J4 _3 W8 [# x
% z. k% ^$ J. o; ~ for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
$ P9 B1 P) h( F3 j% |% v) D: { addr = base + cnt; /* pointer arith! */
7 ?4 U. E+ @5 ]+ u' {5 n val = *addr;- v; u5 L6 h/ u& W; J$ w( c e9 l
*addr = save[--i];
3 s+ O+ a1 J P if (val != ~cnt) {
+ r: D8 @4 p$ b: K- r$ n3 X" C size = cnt * sizeof (long);
0 X# C, J& H$ u7 ~3 r, t6 Q# F /* Restore the original data before leaving the function.
, a* r( t( H/ D */! o! P) B u/ }/ H/ V5 A6 C, \7 |
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
+ L* e0 S, C! D Z& i5 Y, e1 N addr = base + cnt;
1 M7 [) g1 ]: {6 o6 N* r# k4 m *addr = save[--i];
( v0 ]3 {) m3 u4 L$ r1 P }1 \% A. u' b/ y8 H- S9 I3 h0 |
return (size);
2 x' U1 [6 y& { m, j1 C+ Z( L) r; W }! B# t( l* D' N" D9 [ D6 o: T0 X* K
}
5 p/ F& B v( z$ c2 {$ \) T. ~5 N
9 q8 p0 n9 y8 T* q: A, j7 E return (maxsize);# D& S& ?* |1 F) b5 Z
}
, C: o% j& ^ {! N9 O4 i5 Pint dram_init(void)% j9 ^. c4 F( ]9 s- _* ?6 _- @4 Z1 I
{& o! c) {& n! P- a4 y6 K. W) R
/* dram_init must store complete ramsize in gd->ram_size */* s* s! g; D, G- N" R* e. ~! m& R
gd->ram_size = get_ram_size(0 R) p1 K& p/ z( p6 x) q) b
(void *)CONFIG_SYS_SDRAM_BASE,
+ h+ C4 u$ {1 u1 Y6 m CONFIG_MAX_RAM_BANK_SIZE);8 }. L3 x/ p5 i# a1 K
return 0;
$ k% Y9 t/ S& l: u5 U" ~+ ^}
; h A. ]' n/ I% K% U) {+ H; F- B. E" M$ s# {: }! o7 T1 ~
A8 _" M( b: h1 r, U1 ^$ B7 w* _9 l7 m. ]
2 B9 z" f/ |3 f Z k' x
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
, ?0 m0 d" ^% T+ Z6 P+ {0 D. }: e9 ~! `0 g
4 W: d$ {8 S7 W* f/ @
& g% U9 w* C' G- L F
|
|