|
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
% `1 W0 y7 P' Y% x9 T( T/ {5 x/*
( H! ^# J# q ^3 m( h9 d* Check memory range for valid RAM. A simple memory test determines
1 q' U& t* Z* n, B5 U* the actually available RAM size between addresses `base' and
4 y# y: W' W( e! S( N! K- w& i* `base + maxsize'.' G3 K7 n5 h) v8 j
*/+ N1 O( j/ h' a) z
long get_ram_size(long *base, long maxsize)
+ z3 ~! k5 g% C0 I8 Q6 o6 E' {7 z5 V{& X! Y0 B4 w, w9 A; v( ^- ]5 ~
volatile long *addr;
8 V) h5 j1 F( n! a" ? long save[32];
U9 W$ n L* X2 U long cnt;
) h2 D# m5 N' l! ` ?/ t% o( m long val;
8 |7 q/ Y. C# l' c" W# E long size;9 w* n7 ]: V% ]. a+ `
int i = 0;# s8 @5 F' f( F- A M2 c
5 ]0 T# i8 H+ j5 ^" h4 w
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
$ J! o8 g* s1 V: m8 D# p+ @' A addr = base + cnt; /* pointer arith! */
1 ^; X% Y9 R1 e4 D0 a- i sync ();
8 f* \+ s) T0 a2 I d, f& O save[i++] = *addr;" p! Q/ C; T' H; l6 |6 o1 i( F" T
sync ();
; M- D1 _! G( }2 W p: c2 S# M *addr = ~cnt;
8 d% C6 d/ }! u5 ^1 N! N }2 [$ j: q, E7 R0 C
* M8 a; C; h- B3 _ t
addr = base;; j x& U. j8 y# [% C* d
sync ();
- O. I, ^; N1 a2 n$ { save = *addr;+ V8 n7 F4 F- ~, |
sync ();
# D# }5 [8 G" G5 l5 W *addr = 0;
2 Y+ v% C+ p5 H k/ Q5 |: F% c) \! d2 t/ R1 p) y: a, g+ M
sync ();/ L0 h' D# ]# ~- q
if ((val = *addr) != 0) {/ e: @6 t4 y1 l( d9 o0 p
/* Restore the original data before leaving the function.
# \4 w: T7 k, V; [4 T! B */
# P! S7 y0 H! y- Y sync ();* e8 A. B. s6 c# y
*addr = save;) a1 I4 M& w+ J7 S8 y" W; [6 k! k- y
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {4 i+ X" H+ @, W9 a1 u, q
addr = base + cnt;* o" t/ ]9 F( T$ N3 v7 h& z
sync ();7 _% C2 O8 P5 K* `# g1 k3 ?- ~
*addr = save[--i];
6 d+ }! G" P0 p$ a }
% z9 u* ^' g0 N/ o return (0);
7 F: S3 l4 g" e) { }
5 K. H4 C3 l, b5 [
# R+ C5 L' a! O N- @1 _: U! W1 h for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
% B6 u! b' W/ _6 d4 m addr = base + cnt; /* pointer arith! */
' D1 P2 I' @4 u. k5 B val = *addr;
& ~: r+ i% Y* H" b* S *addr = save[--i];
% {+ `& m1 h# V3 A4 v% |3 X if (val != ~cnt) {
/ v6 @& N8 d4 C* J" z size = cnt * sizeof (long);
3 {3 C! A' q3 y* q& j' t: f! s2 R /* Restore the original data before leaving the function.
$ Y/ z" h) Y# t& t, r */
3 y% H) C- z& E) z6 g' W2 p for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {: F1 \! @% i& A7 k& m/ a
addr = base + cnt;; v# v+ b" R# b0 _6 c8 E2 B7 M: i
*addr = save[--i];4 ?; t4 J4 I+ G' m4 a8 V
}
7 |/ d9 r# T. n2 M) L; H return (size);
( B- ]1 D* ]3 v* J7 s! q }
5 I$ D8 k9 _" Y# s: L- q) Y! x }
% _5 D; n2 F2 ^5 ?. H8 n5 A. l, M5 \
) s( B0 |! c [0 q+ { return (maxsize);
7 S H& F6 T, k% `}6 y7 q3 f, P/ o% S
int dram_init(void)
4 q" A! d6 P1 z" Q{
3 X4 v# H1 Q; i8 } /* dram_init must store complete ramsize in gd->ram_size */1 q# J |2 k. n' z
gd->ram_size = get_ram_size(: S, T2 c% g# A& h V
(void *)CONFIG_SYS_SDRAM_BASE,
, N; A% @ y& G9 d1 _" P9 K CONFIG_MAX_RAM_BANK_SIZE);
: @3 n0 L+ c6 | g2 N9 ] return 0;
* h( w5 i* t" d4 U8 |}1 s( l& C/ S9 g* }" ~
: F5 c2 i& }; u5 d% e
; K7 d5 D: o2 W( }; V+ V( @7 b( {$ X* Z |; y
2 U0 p+ i% x! w! L9 E: |FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!# u: R' o2 K- A3 t2 E
9 n# M9 m! T/ h7 ]' a% j
; m1 n+ r% b$ T& @+ i8 U
( y- K/ A& ^5 @4 P8 t |
|