|
|
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:3 q+ N0 h( ]/ m; M: f8 v2 A
/*
3 f. M; I7 C' f) P& k* Check memory range for valid RAM. A simple memory test determines
# t+ @2 }1 u2 ^* the actually available RAM size between addresses `base' and
, o" Z& t0 V; O, }) _6 v* `base + maxsize'.! p" s1 f" O' ?% L# H
*/
7 F8 J. j2 O/ J- U* @1 _long get_ram_size(long *base, long maxsize)
0 L5 j3 K D2 A5 I" g{$ U. d% ?; a3 P' v& E4 A* ^, `9 }
volatile long *addr;
0 I, r J# ^$ |: v, e long save[32];0 |! M D ?3 }# ^- a4 n
long cnt;
6 E& x, }3 t/ O" _3 ? long val;
6 u" ` m" ?' c* H" B4 x% ] long size; F2 Y$ O* I& ]0 A% Q: O* ~- H" O
int i = 0;
" k: U9 d% ?7 N5 Y9 z: U4 Y3 X/ ^: p+ n' C$ O% q
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
& v8 ]3 |* d2 u6 s addr = base + cnt; /* pointer arith! */6 o3 a8 Y# h k! i* {# k
sync ();* B6 @' Y) h+ r: H3 P6 |
save[i++] = *addr;
; ^' i+ D, F2 y6 h) _ sync ();7 E# x# n$ Z7 }7 ]" Y5 |6 ~& h' X
*addr = ~cnt;
2 c: U: J! _+ W8 w& n% r; O" p }
: G0 l9 ~1 C0 r( [( C+ |, f0 r: u4 ?9 {9 D' }. L- ]& ^
addr = base;6 h& z3 L% U1 l2 a* U. h D) M
sync ();
8 p+ I) Y$ Q# a" |- h$ | save = *addr;) U" T* Y" n% B" c7 G8 a
sync ();
1 y* E* V0 b; b *addr = 0;
! M; r) r1 Z0 p( j3 ^; m# @1 g: E" c2 h* T X \
sync ();# }' g% o* v, w" X' Q
if ((val = *addr) != 0) {# ]. P( \( z n: x6 y1 x! J( ^
/* Restore the original data before leaving the function.; ^. U2 p4 m4 g) J! w
*/
9 ], \. r, i0 ~+ j sync ();
' j: Z( q0 H' P, I *addr = save;
4 d% k- H% o# r; j5 `$ p4 k3 {5 c0 c. Q for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
! C0 X5 r. |6 n$ r addr = base + cnt;
4 ?, x+ Y2 o7 \7 n& P6 i7 i sync ();
% ~# C% {1 m- W& L *addr = save[--i];
5 ]( o- h; L p! Q: A; { }
/ u3 i, o1 f7 N' K5 N return (0);
$ s, K2 V1 O- _, j0 U }( m R8 M9 c9 N) k9 A: a. i) I- m
2 L5 H& [! ^2 Q& \+ E
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
# c6 p, ^+ o! G5 C addr = base + cnt; /* pointer arith! */# @* F' @! U* a/ f7 W
val = *addr;5 |2 V5 _' n& }
*addr = save[--i];
9 Y8 s1 _! ~! Q' B( H J if (val != ~cnt) {5 O9 b2 X7 T3 s" q; S- e7 I$ o
size = cnt * sizeof (long);
6 {% v& h6 I6 G% v /* Restore the original data before leaving the function.) S% |! P3 X K" O/ M
*/
' k2 y* \" [7 f9 N' v; e& o! a/ G for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
* S' \: p* b) V& l* Y, W4 a- D0 ^ addr = base + cnt;
2 g7 {6 E' p; j4 C. c7 t *addr = save[--i];, b; k2 B- D9 r+ v, H
} y3 h0 `' y) Y0 l% U: J' W
return (size);! c2 S7 w6 l6 I. Z# u$ t8 w
}" Q z+ Q7 C, E7 W5 P0 K
}
; s9 `) k( S3 [& X+ ~+ q) j/ y2 \% A9 n! i& u! y$ @
return (maxsize);4 l) z8 d) q' D+ H+ { @
}
) [" F! v$ t$ w2 a( n' `& G5 j& E7 Pint dram_init(void)
' N# T# u2 ~7 Z1 H{
6 ?* @. r2 W) c* d: G /* dram_init must store complete ramsize in gd->ram_size */
( t. n. F* w% B- ?: W gd->ram_size = get_ram_size(
3 V3 \+ {. _3 F" K" Z (void *)CONFIG_SYS_SDRAM_BASE,
( e* ^/ Q% t2 c: L- R6 _0 k CONFIG_MAX_RAM_BANK_SIZE);$ O- s2 g7 f) d# q* K% r% s
return 0;
8 H2 ? X8 z3 r7 h6 L# E}
. S- K( j$ F: w: \7 J. [, k1 v% h) ~
9 g% S, Z# X& o9 u8 A) U% ~3 |0 G. x8 [) P2 Q$ H: H) }9 w
0 [" G$ y( ?1 L: s+ R5 {& s4 @7 B
! ?" r1 X! ^: C0 X( j) R* TFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
/ ]" e7 e( A, X2 Z' }% z0 A% P: B8 f% g
5 p6 w6 q, t2 |) E
; Z' C2 T$ p+ |. @1 |
|
|