|
|
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
# ^* C8 w2 |( w# R# i4 v1 l/*
$ _0 ~" f" O* U2 a! W* Check memory range for valid RAM. A simple memory test determines
" C% ?# X0 E$ U% {* the actually available RAM size between addresses `base' and C/ R+ r( h) f1 }
* `base + maxsize'.1 f& {; ^4 w6 m, w4 K6 m. m% g1 N
*/
* {3 M. ~: a2 j+ N* f0 [long get_ram_size(long *base, long maxsize)
) f F x* H+ i G% W/ m1 k{8 l, \/ e% s8 K: p9 r, \9 X& A* U
volatile long *addr;
9 p& A# S, ]. r# x e long save[32];
9 ?) I* X- v2 Z: e long cnt;
6 p3 c- Q# @8 c& Z) \9 ?0 v6 N long val;
6 H K* r7 ^) _; }/ v" O Z long size;
$ u0 {! b/ s6 O7 l& _0 n int i = 0;" u7 o4 ]. \3 \& n! W- Z
j" M. I$ F5 f for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {! P# T# x: \; a0 x) y9 f
addr = base + cnt; /* pointer arith! */
/ i3 `5 R( A# Z8 t% e sync ();
9 C& t1 Z7 g3 R! k( g3 {5 X0 F( {2 Q save[i++] = *addr;
0 ]2 f& ^' k( K' K T sync ();
5 H: F, F" @0 l% U, t* j& } *addr = ~cnt;
! D) R3 L% X3 F5 P; s2 @( C# k }1 ^/ F- X% W% p3 _3 Y. J
( s+ M4 n' G0 x. T7 l4 n addr = base;% [ J, Y& n$ F. ]: N$ Q1 a
sync ();* U7 [1 Y) U( n: y; L N
save = *addr;
$ O. T q( U, h, B! u sync ();) {3 ]$ B; T( u3 T9 ]/ r- `
*addr = 0;
* w/ i) f( Y! S8 i
, J4 |6 o& ?6 s" g% T" t sync ();8 n H7 H# |; p J0 t3 [) D/ C
if ((val = *addr) != 0) {
4 N- @, Q) a% o2 I6 ^+ ` /* Restore the original data before leaving the function.
* ?. h/ Y7 Y- N2 h2 z" B9 V# y- A& z */* x; @. j0 ^$ s( w1 Q
sync ();9 p0 X" e; s8 o `) V
*addr = save;. p) N: Q- h. j& @/ O; |; S. h
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {9 Y) S3 M) v) b4 k6 q
addr = base + cnt;
: o/ z+ f2 z% X sync (); J* q2 m* ^8 x C/ A1 U6 E: G P
*addr = save[--i];: i7 h. ^- G% d5 R1 ]
}5 ? ~8 q6 Z8 |7 J
return (0);* A8 b j. C) c+ v; ^7 X/ Q$ S
}& \! }/ j2 f' O
# I$ G# U3 F3 E% }0 ^! m( S' O9 n& P for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {( K$ o' y: A6 n% w7 Z7 n
addr = base + cnt; /* pointer arith! */6 a6 j4 Q" o% p% v1 |. h- N/ g
val = *addr;7 O) z; u& R2 {9 ~
*addr = save[--i];
" W! P' D2 X& Y3 R$ ]' h if (val != ~cnt) {9 b+ z8 x, z0 o
size = cnt * sizeof (long);7 _5 i8 m3 q: S1 B2 w. @! j
/* Restore the original data before leaving the function.9 f/ v8 l6 o4 [0 L4 |5 a
*/
* D6 @% y5 D9 b+ {& [: ] for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {; y3 d% X/ F7 T4 g% a; ^; w7 C
addr = base + cnt;
: n6 ]( X3 s) G& n! P0 e. i" e *addr = save[--i];
1 F0 ]! F# f- H! R, r }0 ]/ e$ }# f& Y$ a; a! `/ m
return (size);
* y; j9 ?) {* x/ ^' ^4 t! d3 K1 M }4 e( h- a2 Y8 V! t9 I1 I1 B1 ~
}' _! ]' f) M R5 J
; J/ U2 K! S3 ^) r/ n5 V
return (maxsize);+ ?7 c1 u D. i
}
0 t7 K, u! j5 e" z5 Q( d' a7 ~int dram_init(void)
7 x4 Z/ P9 S( \: j# r{
+ J6 P, n$ m" U% \3 `# x5 p/ `% b0 z /* dram_init must store complete ramsize in gd->ram_size */2 ]2 L- L: f9 V4 T7 l0 H
gd->ram_size = get_ram_size(
" }. b/ J, A- m) o3 p- N, S6 S (void *)CONFIG_SYS_SDRAM_BASE,
% B1 L+ r8 R- H- b& N3 M CONFIG_MAX_RAM_BANK_SIZE);, F; A: [" q7 @. K: W
return 0;; n2 U1 ]1 b) j" s8 P' G
}
) T& }3 }1 ^6 t8 s1 R+ h* I
6 `+ }- Y j @ n2 r' C9 F
9 O X+ V ~$ d9 K/ j4 f: ~: ~
# l2 g; s0 J, q
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
/ g1 Q2 I. R1 N& r
+ ]3 D- D0 O) ~! k& }6 |8 \5 @' L( _* E' {. S, c
) r; n) @5 o) f3 o* D% o |
|