|
|
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
4 H# r( A! u7 d5 p3 m4 a/*
# H# A1 `" [- k' M# x* q2 D b2 V* Check memory range for valid RAM. A simple memory test determines& }' _ L$ y9 o; C7 ^
* the actually available RAM size between addresses `base' and: t4 V2 E* a; w6 C
* `base + maxsize'.' N4 b5 R b" b+ s
*/5 [2 r1 u U% y" I9 ?
long get_ram_size(long *base, long maxsize)
$ Y; O1 v- {4 r6 I{
# B* g. _( R6 p# ?. \( r volatile long *addr;
/ T, }* f4 I' o3 N6 Z) S long save[32];# h& q' G0 o J3 V
long cnt;0 y& w# o7 Q( L/ s+ n& \
long val;
6 W3 `3 q; M) Q+ u long size;! |. G6 k" e$ h2 G. j1 n
int i = 0;; `9 {3 V" X' O1 n g5 h. Q
% J9 j. l! P% ^, n" o: \, P9 m
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
6 g9 P( x/ E, c4 |4 R# ]+ ^ addr = base + cnt; /* pointer arith! */4 ]3 z. o; ?* b9 \! ^
sync ();
- w. y" l1 ?2 i' O+ p! b8 `7 [ save[i++] = *addr;
9 y% f0 a% p) m6 p F& f" L sync ();
2 p) }8 W# X0 z- J; L; R *addr = ~cnt;& E! V5 a8 M- F
}
3 i: g1 b" [5 I5 H: d! C% C; Y$ d3 W6 A7 ~
addr = base;, g7 v4 S$ r6 r4 A
sync ();
: I" S% t; E2 K! |3 B save = *addr;: b8 w+ E& Y. a2 ?$ p
sync ();
_% c" r8 c& S4 V3 F, u *addr = 0;, }8 b) Y; @6 j/ ]+ K
$ e' m8 a4 |/ A sync ();
& E+ f, L5 @: T$ c; E) V/ U if ((val = *addr) != 0) {$ D( O9 x- F n$ r/ B \) A
/* Restore the original data before leaving the function.0 P: c4 H! k! ]7 ^) y
*/( E) E; i' P e" {* u+ ^
sync ();
6 q4 J: c3 a1 Q4 r' \1 d8 I' ^ *addr = save;
7 |8 Q, ^) W$ U/ \# K' S- r for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
_& N/ L" l3 b# |2 @+ ]& l) g addr = base + cnt;
. M/ X8 k% k$ L5 z5 l sync ();8 J3 Q; X2 W& Z
*addr = save[--i];0 Q- ]$ w/ Q6 ^
}/ x2 B* K- u& [" `# J q
return (0);
2 U# @+ Q( V L% b: ]. t }
~5 C- r: }- \1 t% E, z3 \% j K6 r. h+ P2 @
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
. i( ]( A6 @4 b% W" S$ V addr = base + cnt; /* pointer arith! */3 q9 B3 ~1 g7 ^* G) }
val = *addr;
G0 A4 w3 T# ~4 l* ] *addr = save[--i];9 M# e4 f9 U; o+ G1 |
if (val != ~cnt) {
( S& ^# d4 l3 R8 n7 R8 k: m size = cnt * sizeof (long);/ N- N S4 S7 g
/* Restore the original data before leaving the function.
& d# [ d* Y4 h! N+ e! B */( F5 N1 ]8 M; n& u- f+ K
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {6 K G6 F1 l$ V- g6 q' ], }+ S: g
addr = base + cnt;
% y4 j0 _$ R# p o! e+ U! q *addr = save[--i];3 s( Q9 k$ f6 J) c5 T
}
1 A8 L- b' E9 b* z# r return (size);8 z+ h* e5 _ W7 Z' }
}
; Q# d; z: T* p, e8 | }" N* S3 `" k$ x& Z. `4 Y* {5 j
$ D' E' W4 X/ ~& i+ D4 D% X+ r
return (maxsize);* \5 [! c# e1 ]) h
}
' u' \" o% q6 f% i0 [- ?int dram_init(void)
G; p4 U4 j/ L" Z, B{
5 C, k1 X, V6 i2 y /* dram_init must store complete ramsize in gd->ram_size */
2 v. h; G9 H2 ^+ w& d8 ]4 u7 Q( q2 ~. M gd->ram_size = get_ram_size( G; s3 _) `! b$ P! s) }& Q3 M7 m
(void *)CONFIG_SYS_SDRAM_BASE,
3 I$ @: V) I2 e& Z/ J CONFIG_MAX_RAM_BANK_SIZE);4 n# ?* J1 C V- k6 r4 W
return 0;4 N2 z0 G0 }; l5 u% j; |
}) u$ v# Q7 G6 D0 V9 z# r# g
H/ Y* d+ q8 [% O! t- e r* T
/ J. R8 w! f( z( F
2 j0 p6 M0 \" R0 a: i7 a N7 G2 E7 ~7 V: f# P
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
- u" }7 a& T! U7 r" B A$ j$ i: B
6 V, D4 [) u+ w7 O6 a+ j
! _! w8 ^, l6 s' P, D5 K- O5 f l {4 a' d3 L [/ q3 n% s
|
|