|
|
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
% S, m# W. ]% z' @0 }/*, C9 W6 X$ [/ T' q8 m$ i! }+ _/ z
* Check memory range for valid RAM. A simple memory test determines1 L/ u0 p0 @0 A; V
* the actually available RAM size between addresses `base' and
: Y" \- @) H( c* c, T) d+ a* `base + maxsize'.
# K) i7 e: d8 c& J*/
- b2 n& c8 O: z9 D. E" C% y: Ilong get_ram_size(long *base, long maxsize)
5 ?$ q: `1 N! K0 A' ^7 M{
c, {; K0 e. m, w+ K. }7 k volatile long *addr;0 E/ B; B" k% Y' o3 H
long save[32];! t8 E" h' R4 @& u
long cnt;
4 l/ R% |: X }' M. g* w1 X long val;* J: |- B9 Z1 z. |7 ~
long size;
( @* J5 O( Y/ }3 H1 n' } int i = 0;7 e- Q( r' ^" S/ F* z' S& e2 [
3 D3 t0 ^. O8 P; ]! Z for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {# Z! w3 F. B) i) r
addr = base + cnt; /* pointer arith! */
2 O( P0 C+ r* ? sync ();
: o/ z, I' ^' _( Z, r save[i++] = *addr;; [* K1 R4 B0 k4 H0 u
sync ();
3 l U. ]8 J8 W5 z& [% `5 S *addr = ~cnt;
1 ~7 j8 U4 e! E+ k& J, V" M }' o2 W- b+ A' [, b* B* Q
- R$ x' K, P2 C4 l* ]( j8 R
addr = base;# j# ^) b' Z( T
sync ();
' ]% Y/ \! c( [9 \ save = *addr;/ q) B ~ R. V- |( {* z( G- y0 t+ Y
sync ();- H h0 H! Z5 n6 w5 B4 [: t* N8 ]
*addr = 0;
0 _; \0 R: n2 ?0 {" F8 D8 |' H( k, E8 s/ d+ ~/ C- V
sync ();
0 c% k2 @& L) I( G: t) F) C+ ]; f if ((val = *addr) != 0) {
+ ^1 D* n% l6 K" m6 c% l- U /* Restore the original data before leaving the function.; P$ x% O: |7 S0 [1 o1 h4 v+ Z
*/. i1 ]2 q$ D% q
sync ();6 S% }+ m" x, _" ?) V# |4 T
*addr = save;
6 b- e! J& m) U& @) y( g for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
+ d; O- Z3 g# O9 ^9 i addr = base + cnt;
5 ?+ d& T8 |5 H7 f% s sync ();' v4 V$ C5 } o# G9 H4 X4 _- b
*addr = save[--i];% P, g9 n+ e! F. r; h: i
}; o& y4 a v" g P' s
return (0);
& o- L& p: R$ N# X }" s, Q( U7 l2 b7 G- e3 D' Y' A9 J
5 ^* j. F- Y0 K7 u4 l- o2 U
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) { Z* P/ k! d0 t) i
addr = base + cnt; /* pointer arith! */
' B. R- c$ K$ h. @. l6 J val = *addr;
( v# W5 p* D3 q4 l d *addr = save[--i];# X' ^+ s1 E7 j3 u) [4 i
if (val != ~cnt) { G( ]7 I: s [" r& Z9 @
size = cnt * sizeof (long);
2 _# r" I1 j- r3 \3 _ /* Restore the original data before leaving the function.% h( ]/ X; ]7 m+ [
*/- } j$ a4 {( @1 `$ K9 Y: I) j
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {$ f. P0 c6 b; v' n4 R
addr = base + cnt;1 b8 m# ~/ u& V6 L9 p- j8 K
*addr = save[--i];
0 b- l0 |7 i. s" e }' ~4 C/ u( C, o5 p3 D- d
return (size);
6 o8 s8 b. K1 i8 S+ }, T; l }
; l+ M( r9 d& C: u9 @( ~- b }7 _4 q: C7 l# T
( ?: r& D# V- N4 n return (maxsize);( ~! V, b( Q* ~8 Z: C
}
! i; ]5 X) F" H& zint dram_init(void)
: {2 m. n- A' R9 l{* | @+ `- \% f
/* dram_init must store complete ramsize in gd->ram_size */
: C# T8 b& l. {# w$ C2 C gd->ram_size = get_ram_size(8 z' H: M0 R0 M [5 C
(void *)CONFIG_SYS_SDRAM_BASE,9 f, m8 t, q7 O( |$ X* A/ B1 h
CONFIG_MAX_RAM_BANK_SIZE);$ x2 k5 l. q) k: n' v
return 0;
& O9 M. F$ I. T% B3 {# l% N* o2 k}
- o6 a- U: f8 G) B
/ g; h5 h% Z+ ?5 `% B9 o
J# O1 w: M" z, a; Z6 s1 k8 g% P7 j- O4 K+ k$ a# e
' [- c! p5 C/ A9 R0 l* }" |* Q
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!7 ~; o; `$ s' b0 Q
" P% L* F* V* J; l; R8 W: X# Q7 y' D8 X% r
; g$ B$ c- S: @2 {4 ` |
|