|
|
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
8 x; a ?2 K* S# O+ E6 i/*
* ~' p: |0 l$ ]! |* Check memory range for valid RAM. A simple memory test determines
W5 B g% O" }+ S u, S& K* the actually available RAM size between addresses `base' and2 `- c) V1 y5 w+ }6 G5 s
* `base + maxsize'.
" w9 r1 O5 ?, l/ N# I+ I7 O; @*/9 {5 A- N8 O7 R! o1 X
long get_ram_size(long *base, long maxsize)
4 k) K- u) j# F/ |. V7 n9 J9 r! C{
( _( b5 `) H. Q/ O volatile long *addr;
( M2 D1 ?! b# ~) s4 x s2 a long save[32];
3 N5 G4 l' V# R6 t7 d# i7 S$ W long cnt;7 d! x+ x' u; r1 J& v( q
long val;
! i: U* V- G/ S% I- N' K long size;
* a- ^- t/ \( k( i/ e+ @6 J* ] int i = 0;5 m4 m0 D5 U" W" v4 g4 F9 n
& |; }$ M. x: P$ C" Z Z for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
8 l' o+ N0 o. k; d addr = base + cnt; /* pointer arith! */
% s: P3 R% E! H0 Z+ X! k sync ();7 I! k: i5 `2 j# M; l0 \
save[i++] = *addr;
5 w/ J$ w- n8 a3 d" ~* z* I' { sync ();! D9 J! y* q4 D1 m( {
*addr = ~cnt;
" {- Q$ w! K4 e; F# _( X }* q& L5 H; j2 } _& a& r
1 O3 o7 J. |, L# {! Z
addr = base;- t" X, a' D6 f2 }
sync ();& N7 p E% q- o
save = *addr;
. _, o3 s$ b; S- v1 ]: r' N sync ();
; b2 u! G0 J% t x% i% | *addr = 0;8 h1 @2 e) W7 \) {
( P7 w! ]5 l8 v! q/ U/ \
sync ();
6 ]5 g" Q5 V. [ \ if ((val = *addr) != 0) {8 m$ C. Y$ x1 v+ W+ t9 r K) T
/* Restore the original data before leaving the function.
" S0 |: w+ h6 S% p */
! R1 D: ^5 `, U sync ();
1 G9 [: q3 u0 z6 L4 _/ E7 \ *addr = save;
6 O* W j4 @7 }2 m0 j2 M- V* b/ | for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
% a" x, i0 w' T$ [ addr = base + cnt;& l$ v' _1 k' }( w' y; o6 W7 j
sync ();
7 c/ S( p, T+ z' k/ v9 ~ *addr = save[--i];5 Z% |7 \! O8 ~4 L% X# O4 e4 X8 Y5 R" O5 x+ a
}) \- @, W" B5 E$ \7 d- l7 `
return (0);
6 N6 ]2 U, M4 M0 ? }8 m5 y0 z4 b( h: Q) q7 B
# ^4 z3 D& F5 S; a6 M3 Y
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
6 ^1 t3 P, N: m1 w- }0 ? addr = base + cnt; /* pointer arith! */
; r9 I* W) P. ]' q3 O% O) F val = *addr;- Z7 N5 ^/ k r1 }% Z+ c! }6 P# I
*addr = save[--i];' K; v7 C, q r) o$ m- F
if (val != ~cnt) {
+ i, K" c' @& T- \% O& a) { size = cnt * sizeof (long);/ m0 O% Y: p2 d# h/ o& m! T
/* Restore the original data before leaving the function.) {9 _: a/ ?1 y
*/' C8 g% c3 E) ~- q9 p6 j
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
! M$ s+ g) j8 S* d v# G addr = base + cnt; B# e* Z+ T, [5 ~5 u4 G" j( G4 r
*addr = save[--i];; J# `) x& s8 x
}3 _9 R6 t. H6 g1 v0 U/ ~
return (size);
1 a: K# V8 X" B9 i% u8 c( I: L. ]' t }2 G* T3 a: o) p) B
}
2 @# {( Y+ k! f& V2 s& u2 G6 P+ G. X, a% u$ N% D
return (maxsize);
7 D# L/ ~$ m* u7 T# [}2 Q& f2 l0 A! d$ D6 C
int dram_init(void)
7 \: r; W. Y, g6 I& b) @{
! y1 X' x! e3 B$ Q8 q# Y /* dram_init must store complete ramsize in gd->ram_size */% `& I7 M9 Q) s0 a$ {( i
gd->ram_size = get_ram_size(
0 E ]) v) u6 O5 p (void *)CONFIG_SYS_SDRAM_BASE,
7 w, i) h% J/ v7 j! ?- X CONFIG_MAX_RAM_BANK_SIZE);
) y: z5 A4 w* ~ J" @) K Q return 0;. |9 Y9 _3 [! U/ M4 I9 p, B
}. y+ I! l% w; g) {( F, y, f
2 U, Q& L0 x6 G: E, f7 _9 @5 i# p! Q/ S1 Z8 p- G
; F( z5 X/ r# x3 `. B, E" ]' [. _: W8 c4 W2 L, p
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!3 n e: u1 G) s/ q- q
. w/ V% {- z$ B# I' C) e' k
' A/ V- M& u" {. ]* [' E& }- R; ]: f3 U3 c e2 y, P
|
|