|
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
" y$ P5 U1 Y* o5 j/*
5 q, N; s: x' D1 u6 q* Check memory range for valid RAM. A simple memory test determines$ r+ e+ X, a" |+ d' S7 Y
* the actually available RAM size between addresses `base' and
( Q9 j; E# h) c5 }1 y' S- u% Q* `base + maxsize'.
1 G7 X: L- o4 p3 H3 X* f*/
' r$ n0 ^- c- J! Xlong get_ram_size(long *base, long maxsize)) o$ M( d) a7 M, ]3 B
{: j8 ~% K6 w* g
volatile long *addr;
/ z; P1 M1 ^2 @2 p8 m long save[32];
! {- {( O' m9 ^/ M- L# t long cnt;
" k# E- l7 S* A- Z$ j long val;
' x4 I8 x1 t( G' |$ n& N" M long size;* C# E$ v; a% m+ _+ ?. X
int i = 0;
: {4 U! L/ U5 o
8 ]5 I4 `' I' I. U for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {( b1 T3 w% Y# q( K& ^ r
addr = base + cnt; /* pointer arith! */9 G# P$ Y( e6 A! S
sync ();
/ h* T8 c5 H9 G G+ v$ ^ save[i++] = *addr;
' F/ ~: \- V" o) C sync ();+ l" X5 M3 w1 g$ B( r8 H
*addr = ~cnt;& {" A- n( a0 K& n8 P
}
8 P6 R, T2 w, ?' G1 Z3 }
6 P! E8 Y' L8 j' ]# I) E! n! b addr = base;
8 ~$ c% E- K$ V1 y sync ();- ~9 d+ k; T- P7 |
save = *addr;: {7 u/ H, _7 ^2 B! i- g1 n& n
sync ();& c' _8 E5 w3 |4 ]5 A
*addr = 0;- H, q$ ?+ @" V7 t
' o' Y' g1 |& u; m; ?! y sync ();4 W) ^( m. o; b8 M& D6 u4 a' z
if ((val = *addr) != 0) {8 c8 O: D' }% k$ g; _/ T x2 T/ a I
/* Restore the original data before leaving the function.# K+ \# U) o3 N
*/' H: c& ~8 O8 h
sync ();* |: G; A/ ~$ ?# Z% T. }
*addr = save;
* ?, t: C2 Q# P; R$ i! g9 I for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
5 t6 w7 ^ z, U" b addr = base + cnt;
7 ?# P: E, m F8 L% F sync ();
( z: a% N: X: Y [% y *addr = save[--i];
! Q/ K# D2 `+ a1 L2 x& w. T2 h }
- G3 S3 c8 E$ I3 \+ Y W return (0);+ ?- n5 ~6 r$ I& {6 x3 g0 ^$ \
}
\/ ]9 k, s+ g$ h/ n8 [
: U9 z! E' w3 i7 @9 @5 ` for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {2 ?$ b* i6 H) B5 Y3 [0 @$ b" C8 S
addr = base + cnt; /* pointer arith! */1 e% E) Q- G/ U+ N2 M5 Y9 A
val = *addr;; B+ i/ d! ?/ [1 ^# a: u
*addr = save[--i];
) p, Z" Z) ]# Z. F! q3 [$ O9 ?5 W if (val != ~cnt) {7 S ]! p3 J7 x, ?( o" |, e! [
size = cnt * sizeof (long);2 @4 Z' ]- j2 c$ y
/* Restore the original data before leaving the function." s. w. {9 h3 V! s
*/' h5 e i& S* I! P% |. m
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
& e1 O G& L* k addr = base + cnt;
# ]) E, ?9 w8 {- V8 h0 g *addr = save[--i];
0 d; P* @: u% ~ X }
' B! o- T/ R* y, b. S return (size);
& L% Z4 k. V9 l. @. O3 t! [ }; _ Y7 Q- ]' P+ V
}
3 X5 B) L7 c% P! G" v0 t
4 q9 x* L3 K* h return (maxsize);
, S- g3 C4 F# e$ S7 w/ L. T}
u- o1 D- w: }, kint dram_init(void)
& ?6 c+ Z5 o9 H, u7 X{
1 ?5 P0 m- A# ~( ? F, }1 G! A /* dram_init must store complete ramsize in gd->ram_size */8 P" w3 k/ @$ j9 X
gd->ram_size = get_ram_size(6 _( ^( X* z4 W. c9 W' `' m. \; V
(void *)CONFIG_SYS_SDRAM_BASE,0 [; i% _ @. t0 ^6 ~4 o3 J
CONFIG_MAX_RAM_BANK_SIZE);
! T% l# h3 K2 c; B return 0;2 J) o! ^- h5 a: P: l' x' \
}
* v+ U( b L. S
" a1 x( x1 [6 r) _ ]$ {5 z
- U8 G$ P5 ?8 C2 q; I1 w. I2 k9 V) i2 U9 {8 f9 A
/ q4 B& z, V$ k1 G9 F+ d0 MFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
7 S7 I" B: J% C$ { v
$ D. P! K ?& D1 e, |2 b. A. b4 k1 k# Q: \9 ^9 H4 p$ B- |
2 ?$ s: j! D+ A0 S: J3 [1 T" s; A
|
|