|
|
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
* _- O( `4 U- p8 Z/*8 y( P: H0 ?: d8 P6 R
* Check memory range for valid RAM. A simple memory test determines/ n) Z' C0 b$ ?6 z1 X
* the actually available RAM size between addresses `base' and( I( ]9 L" M, A X' Z; d. m
* `base + maxsize'.
. f4 }1 d2 Z' e* ]/ D. T8 q( G*/
' r1 H! X" f5 ^, D% ?5 |+ [5 h$ Klong get_ram_size(long *base, long maxsize)' X- m6 z# ?( O: v! S
{
& {6 e. U/ j& V' U" X6 I6 ? volatile long *addr; |5 X1 b7 r: Z U" O9 ^
long save[32];
* q/ u6 i( F% A: T long cnt;
/ R9 v. z; f1 G4 I- H long val;
- U( l6 r3 z& i/ W* A; o long size;# r G8 j& W `
int i = 0;; y. @4 I. @6 C0 ?
( ~3 P8 r* _/ W6 {7 F) c for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {2 R# W* G9 G/ z% H' A: ?
addr = base + cnt; /* pointer arith! */* z# F, I5 R# P5 U* `
sync ();
8 c' T! ~7 p$ n save[i++] = *addr;4 h+ Q4 p; ]) p9 s
sync ();
% D! E- g- g6 j; f *addr = ~cnt;% B4 \) R& l0 y4 T
}+ T# m6 z$ v( f2 x, p
5 T$ l/ c: X- W* P- F) k
addr = base;8 L/ m! y' m* n
sync ();7 h6 o8 I2 T# c5 i& L: j3 ?
save = *addr;
! L7 }1 b- O! S" h3 j% C( ^) j sync ();
: e# t6 O* i# j1 B+ R# ^ *addr = 0;
7 |" @ m/ {! R* Y, Z- a# ]
* ?! A; g' k) i# i( e& V& | sync ();0 K1 G* Q) |. D7 ?: { V
if ((val = *addr) != 0) {
9 f1 O4 Z( m2 F) }+ |5 _ /* Restore the original data before leaving the function.
7 Z9 d* T9 e2 k: k1 t2 n* v* K! ^ */
7 O6 z) Q0 @# r8 u# F+ ^ sync (); t+ O* N! Q! e: L, G
*addr = save;
6 W6 e# S8 p" a8 [; M for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
* D/ K& r; U! N' _. A addr = base + cnt;: f! F& ~# `* p0 L# a
sync ();3 S. |7 Z* _- I; J- I* d
*addr = save[--i];# D* n' M' z# C9 w& a/ ?6 D% V
}. ]% m# U! K/ v2 j1 E
return (0);! h2 {7 t. N& E
}
! u4 o+ d M- M+ |1 a( V0 J7 C1 W1 }' w2 ~- h' S; C1 Z/ N
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
7 ?" ~9 R9 z4 Q/ \ addr = base + cnt; /* pointer arith! */. F5 v/ }1 Q/ `) M& m7 I
val = *addr;
# x q* ?/ S: F *addr = save[--i];" K: U. p) E* ]: B! X
if (val != ~cnt) {- L, C0 U a2 T: e
size = cnt * sizeof (long);% g% T% O9 ?* [/ u) I
/* Restore the original data before leaving the function." i" @ i$ O* B8 S: W% E: {
*/
4 j9 D. S# P8 M3 |" G2 W8 N/ d- N for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
0 T3 ?+ y5 v8 w; O- b1 t( K- ^ addr = base + cnt;
1 Y+ d5 P. f1 u% F *addr = save[--i];" m5 _+ x; [: E9 {( L g( \
}
4 E+ D$ S) o* C/ ^% ~" w J! u return (size); l, T* T a0 r; q" ~
}$ z8 F5 Z m* s( P
}
: c- }, H s1 E& l
0 w4 x( r" j4 Y5 Z1 q return (maxsize);
. x: M/ S1 r! @% @% g}3 K* t% b. \, E% G+ w
int dram_init(void)
9 D& a- }4 Y9 H3 U9 W7 w7 X3 ]{" d$ N# f& R, E1 ?9 x; J0 t
/* dram_init must store complete ramsize in gd->ram_size */, E3 Z- t: d& J! [, b4 B4 J0 l
gd->ram_size = get_ram_size(
; k! L8 R3 B& j$ s+ n (void *)CONFIG_SYS_SDRAM_BASE,5 }% k& ~/ f% R i
CONFIG_MAX_RAM_BANK_SIZE);
6 h: A% Y! B( O0 m+ E4 v$ z return 0;5 W. e* l: {0 X3 D# D% z @
}
5 }0 K3 P+ [9 ], o
- B- A" h$ o5 E$ x d# b
9 N) U/ u4 E) D9 Y
! H l: j2 g& o5 z3 D, c2 X& u) b L1 Z, r( ^9 o8 T. f1 p
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!% c1 a d) }0 }% g
& o$ V- \# U6 z5 h( p/ o
$ u, N9 A3 x% L- g; j8 R: A" a/ E8 t1 h7 o
|
|