|
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:/ @. J( k' E! Y% f% T
/*
: ?1 i5 e4 Q; f5 {* Check memory range for valid RAM. A simple memory test determines
* V7 f. P3 Z% _2 N: I* the actually available RAM size between addresses `base' and( ^6 K- u, J" h" B( U2 \& k4 _- t
* `base + maxsize'.
; n I4 q4 \8 k4 p" `*/! H2 a8 ~. n; I9 r* O4 L* O
long get_ram_size(long *base, long maxsize)
7 a2 ?# w) y3 h{& G9 f* v8 Q4 f5 a% R6 D; g
volatile long *addr;# S2 H( g4 A7 y9 V" B
long save[32];" `9 v+ M5 ]+ R5 y7 m, S3 Z3 d
long cnt;( q: ]! `6 M. t0 f# W
long val;. g. W( B2 N) ~5 J3 X" a: g6 h j8 K# D
long size;
; ^! ^2 Y* P. r0 S' C0 @7 c int i = 0;! K0 O5 }- E% M f; g+ x
9 Z" {% U, s6 J
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
8 i+ F, z! w* ~( B# N" }: n addr = base + cnt; /* pointer arith! */
! q! s! \/ e; J2 n, `) R sync ();! X& c* G- B: B0 E
save[i++] = *addr;
# w. [+ L- K8 s sync ();% \3 a) O9 H, _ b k% t& ]
*addr = ~cnt;, y0 K9 O, g0 r3 T7 b
}8 Y# e: t" S/ E! R
" \3 g2 t' J! C; V! W5 V8 r% s: | addr = base;
) D! }' }6 H: K1 `5 v sync ();* w/ y; A& M0 y: O
save = *addr;
9 ^0 s7 z4 ~) [+ T: n$ X sync ();, T' F' K* z2 |
*addr = 0;( \4 q( v8 B3 R
: V3 Q0 J8 g+ C& _9 Q' u4 S
sync ();! f) m6 l" @# M, d
if ((val = *addr) != 0) {6 k0 r$ ?2 p& W [, d; L
/* Restore the original data before leaving the function.
* [ H* z4 {& i; a7 ^. i( B */
% d2 m, Q$ U6 p" m sync ();, V. Y4 @: ]% z+ a4 Y
*addr = save;
$ B: s; @9 H$ Z' y8 @' J for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
e# C5 F# V L: Z+ i' @ addr = base + cnt;$ o. Y1 G3 g8 O/ N- m
sync ();) q7 O1 D" z4 s; J; M+ U7 G1 A
*addr = save[--i];# T* M; M+ l4 U% B7 E, m! {
}
3 K( F, k4 l7 N8 J0 C p6 ?1 \ return (0);
! O- r. H6 W' o4 q7 b }9 D4 X- f4 R7 r7 D7 l
: A) Y7 }! i/ |' { for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {8 y1 |' a/ _$ H5 Z- D/ ]9 h2 M
addr = base + cnt; /* pointer arith! */% p$ v6 F' p) T" P
val = *addr;
+ j+ Y9 t) D0 b7 j *addr = save[--i];# L8 d: T- k9 P# E" R
if (val != ~cnt) {' A; r/ G9 G6 E5 e* Q! R# I5 Z2 F
size = cnt * sizeof (long);( m4 S9 q8 [5 |+ W
/* Restore the original data before leaving the function.
8 @9 n. @8 p1 `' _% d */* o5 D* u" l" Z1 I0 h y" @
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
2 q: n5 l% ]/ w6 P addr = base + cnt;
6 Y4 ]5 A/ I% C* M6 M *addr = save[--i];
; t& T4 y% q/ G9 \1 f }
$ t' r3 H7 \9 o- z. g return (size);
: l5 E7 x1 O/ x }
: J$ d9 v9 d6 a8 q }
1 J/ k( C1 Q# ~ ?& j. k' \2 f/ z8 F3 s
return (maxsize);, B7 ~* J. M8 ]$ i8 z
}" ^9 i5 m% y! ^8 ?
int dram_init(void)
# J4 O$ `" ` a8 P4 t# C& l{
" {+ I# c; P* z @$ C9 o /* dram_init must store complete ramsize in gd->ram_size */
! x- s! f+ e) E% X! t/ I gd->ram_size = get_ram_size(0 H: B+ K' T! N; l) W2 K
(void *)CONFIG_SYS_SDRAM_BASE,
0 G2 v; J0 i3 ^3 L/ ] ^ CONFIG_MAX_RAM_BANK_SIZE);3 |* t7 ^0 ~7 Q4 A% x
return 0;
; c. }$ b8 E0 @2 h) V. `. u) s, z}
% @3 v: T4 I l1 m
9 V6 ]3 a0 A1 b1 |
7 h1 y/ M0 H: |8 s) a' `* @
! A# H: T6 c- z* ?+ w5 J1 I- }
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
M2 ]' w' ~7 t& U& f- \0 e! \5 q5 K. y4 U$ k: ~
: t* |0 T5 e) L( P0 M
& y e: H5 k; k |
|