|
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
! a6 m" Y3 K1 s' W/*
& y1 [0 ]- U- m0 P* Check memory range for valid RAM. A simple memory test determines
1 H+ v- R. E/ G' n4 c* the actually available RAM size between addresses `base' and: v7 [, w) l" `+ X6 ?; ^
* `base + maxsize'." K( `% i) j& B/ X9 u
*/
0 ^& J( @: m& `: Z) v9 dlong get_ram_size(long *base, long maxsize)
/ e: K8 k% v+ B1 D. ?3 F: R{
5 A, r% Q2 `% l* Q" h( U volatile long *addr;
% p3 e: h: f: I# X5 s* D long save[32];
4 _: n! W3 E2 ^ long cnt;4 E/ _$ T; R& ^2 d; W$ p
long val;- \/ j4 r2 k3 r, ]
long size;' @" W$ y" l" \. X/ I. _
int i = 0;+ W$ U# E, Q' s
^8 U9 I0 N+ s: `: w
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {' a! R( i% q, s) H" @
addr = base + cnt; /* pointer arith! */
, _1 e! m" g6 i3 {( _ sync ();& }+ G% ~$ A: W2 \! j i; \$ F
save[i++] = *addr;
+ l7 g& w) ~! X) ~7 H W1 d sync ();& g4 N1 u& |4 m& a7 l
*addr = ~cnt;; O2 j# l: |9 m2 \% q+ `
}
9 Z; q5 l( u Q! U% J- L
* h8 e m* C% h" X! x addr = base;
3 V3 ~ s4 ~" d sync ();( \. a4 V. v p2 c0 D. [! ^5 @+ h0 U
save = *addr;( i- }& r9 s5 j% k
sync ();
G! j7 c7 x# o. T% l6 q *addr = 0;
- K( V2 l8 \7 A7 m
. h! x0 O/ S! ~' h! G( ~* \- J sync ();4 k! U4 I( {- W; P2 c% N+ o& l, L
if ((val = *addr) != 0) {2 S3 {: t( s( q2 `" h! l0 R
/* Restore the original data before leaving the function.. n* Z) q8 p" z" g* P+ l
*/: |% q/ |% x0 i8 x6 D1 C" `$ d
sync ();$ x6 l: y4 Q, h; T
*addr = save;
, |- @! _7 N3 X2 X for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {) W8 ]0 ]$ o3 `0 I& {
addr = base + cnt;
, m9 N9 ]* h7 s8 Y- c; V sync ();
- x2 q* x7 \# j" r7 ` *addr = save[--i];
, U. ]# R0 R) L9 o0 d }, X# ?/ s6 I/ r h7 P3 }
return (0);
$ C- X: u. S' E7 R4 L }
% V3 y# w" u1 {- N% } B+ c+ M+ d
, Y4 s0 a6 j$ _3 D3 M- K0 h! ?: [ for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {9 a0 j: A/ J! R
addr = base + cnt; /* pointer arith! */
- ]( |. n- C* G. y8 V5 y" P2 x R val = *addr;
6 q8 i4 l6 _) K, S" i7 S *addr = save[--i];& ^- h) U$ P$ s3 F& f' y% X {
if (val != ~cnt) {
* a* J( R/ U9 y7 y0 V& L. ^ size = cnt * sizeof (long);6 B9 e0 ]1 d% K0 P) i
/* Restore the original data before leaving the function.# }+ M7 U* Y+ B. \* `5 c
*/: u! v. Z4 H2 j" k: E
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
& S: m8 m) z) e% S; r7 b addr = base + cnt;( V) U" |5 B" f* n
*addr = save[--i];& @! e! w& x3 x8 J2 m }
}3 _- R3 O; h) ]) P9 F8 B' d$ |7 P
return (size);
3 N, S9 x8 ] F" k! [ }
7 K& D% n" z& l, Q0 }, O1 ]0 ` }
/ E6 ^: n p& `6 Y$ N4 B
- i3 U' M" C2 M$ \7 j8 }8 y/ D return (maxsize);9 c3 L9 J0 P3 u$ U. ^, k u
}- \3 r. h7 b# H0 H% R
int dram_init(void)
# x6 G/ Y* K# W; q- Y{
t, ^0 p4 ~* i /* dram_init must store complete ramsize in gd->ram_size */
' Y$ l1 d0 [ l gd->ram_size = get_ram_size(3 Q0 b1 n2 U! u) g9 D
(void *)CONFIG_SYS_SDRAM_BASE,
+ v- ~/ F' h9 s# ]( ]$ [1 f6 ` CONFIG_MAX_RAM_BANK_SIZE);( y: P9 o( F( u: l$ w' _
return 0;
( a% \* v! x7 K; q5 Y# _; I}
$ { H2 ^$ \" l y; ]% o7 E0 E
( J# o2 [. C2 o' e( e. _) n5 m x) y
& |! I- Z: y# G( e( X9 ^, s! B6 a0 V* Q- y& e* Y$ m8 Z0 ~/ P
! c" j* u. Y1 X+ R8 o" A6 x Q4 SFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!- S* `! l+ L* s3 V4 D
! j: t: _( M9 ~% J2 s' P- t0 f0 i r: W# p/ P9 j `# N
9 ^; V0 z, r" `1 E6 m |
|