|
|
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
, u: G1 R) A# `2 [ b8 I/*
# F( \' S. h) S( p) B* Check memory range for valid RAM. A simple memory test determines
8 {! G0 u5 d8 {( [* M& u) [* the actually available RAM size between addresses `base' and5 g$ `: ?! C& \3 Y+ d2 C" Y
* `base + maxsize'.0 ]9 ^5 G8 s- u" Z$ U7 c
*// i/ q, }1 n- ?0 m0 ?0 N0 U
long get_ram_size(long *base, long maxsize) z0 x- t! u3 |
{% K4 t8 Y! s* _( ^+ V
volatile long *addr;
6 ]+ B: N: |+ a1 Y3 l* g, G2 i- S! ` long save[32];/ _. R) R% K' O
long cnt;
/ z' r; r N4 O7 a& @ long val;) \( W z/ T+ Y1 L! ^; w
long size;
. N! y- h2 y3 [* K int i = 0;' O1 }4 y( \9 N B8 [1 a4 v
; Y. {: P1 p. q
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
; c; t' l5 f F Z addr = base + cnt; /* pointer arith! */
# `. ^0 ^2 d' j/ Z {5 m sync ();* x: e% A/ q) t- _. E o9 ~
save[i++] = *addr; i `# j% W6 ~7 @" ^7 b: [
sync ();, E% e& [- T) q7 c# K
*addr = ~cnt;
! [4 r# M# W# L; c/ O- }5 ~. z, I }
- q) G# G! U' Q0 c2 N
. [; p. F. ^7 P2 d addr = base;: p2 I% b% p" L8 G8 l% ?& p
sync ();
- q5 p3 {1 G3 i7 h( ~. o save = *addr;
2 I& T; f4 ~# q0 G sync ();4 t' ~0 v+ ]3 Y
*addr = 0;
. A, Q; t( U5 e! W' n. m: i
& @/ [4 X1 J! N7 g8 z sync ();# }8 t- ^6 o d% k7 B
if ((val = *addr) != 0) {
* Y1 e2 t ~: o /* Restore the original data before leaving the function.) }9 ~1 O5 l5 L% X1 H, D6 [+ \
*/' N, \; q- i* ~' _
sync ();! q4 f0 `: b' y }* M
*addr = save;
( E% {* Y$ f( o; t, s- N for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
. l F5 P1 P3 t0 E" l, u. \( K addr = base + cnt;
4 s2 {2 q6 b: f; |" e. } sync ();
- F2 l4 r, K; l7 p, W *addr = save[--i];
p, W) a0 y' i x# u }& t6 p! L; j A3 ~4 T6 u5 T
return (0);5 i* O/ D# K, L4 `( Y$ `
}2 ]1 m( W# o: N! G: m* z9 y( E
1 z- d: M+ L; b) R for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
) d$ P" }! _+ A6 B% G5 H addr = base + cnt; /* pointer arith! */6 N9 r9 q$ _: _' {
val = *addr;1 O/ G& y: p. Y4 z6 m
*addr = save[--i];$ A" a. R# e- ~% L$ o5 V
if (val != ~cnt) {
1 k5 ?1 J2 ]7 a1 D size = cnt * sizeof (long);' O! I9 u, v, \9 |7 b+ G
/* Restore the original data before leaving the function. s7 L, p0 R# D) \3 K. {
*/$ m. @" ~* f, C N3 \3 y: j" {
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
8 K( `* G) g# _# Q6 q addr = base + cnt;
5 C9 g- j+ _$ o7 a9 x8 n' N *addr = save[--i];4 o3 D7 l+ I% R' C
}: {: F0 Q1 v% t1 T
return (size);, [* d% A+ T! G: T! v, W+ X
}
! [5 D2 b' `! z }& ~5 L" V& U7 G2 r7 q" F
- e% O1 r# d5 T
return (maxsize);; B2 F5 |, |* J0 \! M
}
/ H& |% s: n1 }* r% x' Hint dram_init(void)/ E2 `' Q$ b: k( r1 x) \
{, u3 N# h0 u/ Y$ |8 o: Q
/* dram_init must store complete ramsize in gd->ram_size */' z& R0 x- K+ r: a0 ~
gd->ram_size = get_ram_size() l( G3 {' N2 ?- o5 W' k
(void *)CONFIG_SYS_SDRAM_BASE,+ i/ U8 z" _7 n/ u
CONFIG_MAX_RAM_BANK_SIZE);
( G ?% r$ J' c+ B, J" F return 0;
9 E' h2 D5 D4 C}
1 s- U, E: G! M/ j, W# g' u' G9 u' s2 O4 H8 f
C4 G1 X' x( k
. z2 D$ E6 ]- M$ P# }
4 t$ t: ?$ ]! z) a" R0 O3 h
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
. |/ P7 V2 [7 k5 R" s' o' {8 \+ k# E, f0 r
$ u- T7 ^& a. o' o7 a( `. d0 U* a% R0 ]* x: ~* t2 s
|
|