|
|
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
* |1 ]; d" L6 b) N$ f6 a" o$ M/*
# [0 S; A7 W6 x6 [8 H7 g* Check memory range for valid RAM. A simple memory test determines: @' y; s) a9 |
* the actually available RAM size between addresses `base' and
1 E+ y. d) X3 [" z2 n* `base + maxsize'." d% z: ^1 s3 L; q! ]! h
*/- E2 X) |, q Q: H
long get_ram_size(long *base, long maxsize)# B3 ~. d1 z8 ~( I
{6 E6 q) L% E, q
volatile long *addr;
; `8 y9 J% D: H" \ long save[32];
0 R1 }0 F0 ^+ z7 W- w long cnt;- m$ P m/ B2 t
long val;& G3 `' ?: ~% U
long size;
l4 L0 h& F0 P ~. L+ f" k int i = 0;6 ^1 G; b1 v# q
& p: r1 Y2 s9 r: B
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
% _4 W: `; @; _- S addr = base + cnt; /* pointer arith! */
* n9 e) ]+ U& b: m! V U sync ();
/ I- j* N! q! i( c: W save[i++] = *addr;
- T5 V3 i( t0 D sync ();' k) `4 d( x8 }9 }
*addr = ~cnt;( A; G8 |' Q, U8 R1 a
}+ i! T7 e. U& z; X+ x% o- Y
8 z, y% K5 g. \" e# z
addr = base;) o, Y& u" E8 z! N) y
sync ();
0 b$ t. k- S2 H5 {: y save = *addr;: ?$ Q3 v W7 Y+ u$ z
sync ();
+ Z" B7 X4 C* |; @6 G *addr = 0;" x5 v. r7 X; ^2 P4 {- I
! P# z6 f) ]! o6 ~- g sync ();; O, H+ l6 _5 p4 i
if ((val = *addr) != 0) {' Q0 x$ p1 V) @2 u, r; i# h8 I
/* Restore the original data before leaving the function.
$ N% \' P4 `; N7 [1 ` */4 R. s% n# K: }1 l( ]
sync ();
. w6 c# n* g- u" P% j( u8 ] *addr = save;
9 g1 @) n. k$ V/ ~/ y! @) ? for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
4 O8 k3 R( Q* c; ]6 r addr = base + cnt;
5 \( u7 e0 x; y5 v# ?) I sync ();+ q9 E* j+ u- l( q
*addr = save[--i];6 o' V5 i* d! I7 s4 Z
}! |4 e1 W% s/ O$ ~8 e$ j
return (0);
+ W0 D$ J6 e0 t3 C: k) t+ C }
9 [' u& q$ W$ @. G; P7 i
, P* i0 N6 L. G" J3 f for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {# {$ V+ i$ j: X" [# r) i2 ?
addr = base + cnt; /* pointer arith! */
5 Z. ~( l; U; \% X% j0 U val = *addr;3 R4 W( Q! B# k# v; t, j5 f
*addr = save[--i];8 n- z& H T# z! o
if (val != ~cnt) {7 N. M% X7 N0 r: ^; Q& x
size = cnt * sizeof (long);
: O3 K% I4 j" {2 R: `* f: N /* Restore the original data before leaving the function.
7 e1 h0 N6 } }8 X5 l6 p! S4 c */
- x0 e. Z8 k) T6 A for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {; ]" N# O. t9 T2 b$ ?
addr = base + cnt;
* u" N, l' D' @3 E6 N *addr = save[--i];) ^0 b3 W1 ]9 b
}
1 @$ k- x# r* @8 {6 R return (size);
* h! R$ D" y4 \% o: D }
$ x6 R" f2 r% K. A }2 T& I: z! v. o7 c, A5 E
' Q. e4 v( Y/ l return (maxsize);
" O; t* N5 W V6 m: B( z3 z}$ _9 B! V4 O) M& B
int dram_init(void)7 |+ R; X: U6 s- p/ q/ k' p3 A
{
5 e* L4 I3 g; f Z2 I3 d. `2 y /* dram_init must store complete ramsize in gd->ram_size */- v4 J4 g0 n# C
gd->ram_size = get_ram_size(
7 r, F8 F9 u0 G) m; N- | (void *)CONFIG_SYS_SDRAM_BASE,
2 y, h' b1 Q( F4 t CONFIG_MAX_RAM_BANK_SIZE);) W4 _' ^+ ~; {( C2 W
return 0;5 H7 z8 t" T- K( H
}
6 b1 J1 }: }: F+ V' |/ m- ?/ H. r
7 ~4 o4 r) R- T- L
; b b9 {# u% d+ m% V, @! ?+ ~* z, t. t4 r- C
. l1 U7 ]4 O$ B9 ^FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
2 w: d( g/ d* k5 }* f& ~ {: g0 ]- d# a: Z
/ L' h5 b m0 x
3 d( q2 O, N6 Y# P& Z |
|