|
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
/ O0 j% w; W& }4 |/*2 V" U3 z1 O! P& ]" G
* Check memory range for valid RAM. A simple memory test determines0 ^7 E; A+ q' d( t$ d3 D0 U* x
* the actually available RAM size between addresses `base' and6 f# z/ I# J6 E8 ]% c7 G8 [- _
* `base + maxsize'.
% ?2 } g5 Y7 U+ m/ S# H*/
1 f/ `+ t5 z8 ?2 Q/ vlong get_ram_size(long *base, long maxsize)
" B: F7 S% G2 o9 D# A7 ^% |{7 T- y. p M! |
volatile long *addr;
0 s _2 ?$ G) I2 y long save[32];* z0 C6 I9 ^' k0 r; g P
long cnt;, U9 c( i- B* f9 ~/ R8 R( N7 i* H
long val;' q' Q$ B% C/ j4 w2 S
long size;$ v. S- `( f7 k6 z9 b' r) } [
int i = 0;
" n1 F7 r# w' t/ y: y1 D" M# j- X( n7 M4 X
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
0 h: B- ^% E+ v; z+ P- q$ P addr = base + cnt; /* pointer arith! */
/ U/ ^* y2 b; z; G. i sync ();% G5 @6 M m- w8 c
save[i++] = *addr;
0 c7 ~! c8 W5 q sync ();1 z' z" }% V/ ]1 J: I4 p
*addr = ~cnt;+ L) I5 |6 L: L, J E X
}* b* E$ X: o- l& C) O
( R7 m9 D: U6 V+ l addr = base;
' Q, r( E3 S: {! [ sync ();
+ O2 a0 v7 C0 T, K( f A7 ?0 w+ X save = *addr;
. L8 \8 E# `6 I" S6 E5 v, p4 u sync ();
$ N9 K) H8 a( T3 U0 T" \# Q, M *addr = 0;, ?6 l' ?. @5 G8 U% s# O
3 O. |4 z6 n8 h# [
sync ();$ I5 F, \! O( Y( f$ c
if ((val = *addr) != 0) {* Q2 m p' v' V
/* Restore the original data before leaving the function.
6 i! e" E: E; A3 y. o */
" b3 ?/ l9 c; L" H sync ();
% `/ H( d* m% z% e8 \8 E *addr = save;
" c9 j: G8 B) F0 J for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {! k2 K1 ?. w3 |! }5 D' X( n/ ~
addr = base + cnt;
9 Y5 {+ }) i/ Y" y sync ();
! a0 Y; C$ x0 F. D6 H2 e: D *addr = save[--i];& [" r% _+ M _2 i7 h2 z+ g7 B
} h2 C. D5 A9 E) t7 C# s
return (0);
( R' Z; L/ b( Y7 Z% h- k }9 A9 ~( u" h! S% z
, f+ N- j4 [ @ for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
- f$ Z; U: p: E1 C( v& j addr = base + cnt; /* pointer arith! */
0 f7 w$ e: d. X6 Y0 o) P5 l4 I val = *addr;, _: d- G+ |1 m$ j# @5 E8 j
*addr = save[--i];, C8 a7 k5 v. A0 M
if (val != ~cnt) {
* B+ \' R0 h- k size = cnt * sizeof (long);
9 W* x* e2 k5 i1 Q /* Restore the original data before leaving the function.
& P3 g( Q1 H, c i: M */
' L5 o* _& W ^* k5 Q- U for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {% ?7 [$ d) c# }) Q) F% w5 {, u a# O- |0 ]
addr = base + cnt;- D5 R: o. s$ K: l
*addr = save[--i];; L0 R- @" Q: `4 X6 H
}1 W- G: x4 b& F o6 R# Q0 N
return (size);
+ m2 `5 a7 Z, l7 u* p& G7 \ }
3 g6 l8 B2 q' A' L& G- K) Y p }
+ J# g( J- b2 @3 b
; \3 m/ h# ?) v2 M return (maxsize);
: A0 ~' ^; X. A6 n: o) Y}
$ b" w }6 h$ V# q# R. Nint dram_init(void)
; K6 ~7 B5 P/ [: ~0 i8 @ g{" r& Y4 E0 z r) N9 D- J, T: Q- y$ h
/* dram_init must store complete ramsize in gd->ram_size */) R+ X& H8 m+ k( i8 }% w
gd->ram_size = get_ram_size(
0 d' D! K/ o* y* g$ A2 p$ m6 f (void *)CONFIG_SYS_SDRAM_BASE,
2 h" d3 Z6 ~! n, O5 l% Q CONFIG_MAX_RAM_BANK_SIZE);) C2 Z! ^0 l* e
return 0;, l* D$ Z7 ]- l# u# p \8 f0 f# k
}
# Y5 g9 {% I. `4 U4 A( T2 X! Y: p) @" i% b1 d" k v
( Q# y* k; A. |0 @
2 H+ q0 ^$ x! A
$ b5 a. g* @7 ?+ D! x, U2 Q3 a, r: ]FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!. R6 z/ T5 l b: a# T' c) ]0 {3 d
: @' ]1 V0 E# K y1 R4 @! _) d
) V4 j; q; @3 V4 O, z5 V/ |! u' S/ w
|
|