|
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
6 W5 A s( }* n1 E- B/*
. [" u3 x2 [/ _/ g" B2 R* Check memory range for valid RAM. A simple memory test determines& |6 E2 m/ Y3 G" b6 z% C
* the actually available RAM size between addresses `base' and3 J! y( ~0 h/ v5 o3 |
* `base + maxsize'.
p L' H* M- R( ~ |*/
7 j* z3 d( B1 K M2 r) clong get_ram_size(long *base, long maxsize) T1 i/ [$ Y2 D! V
{
; T0 N! [/ H/ a0 h0 b: d, o, T' X5 C volatile long *addr;
4 G+ m5 P2 b* K9 U5 e+ I long save[32];% U+ L$ x" b3 ]$ j% u
long cnt;# @# H3 E$ b& @! W& x, a4 o
long val;) A# D; A0 y H4 q
long size;* |9 h. ~" Z% C- t% M2 U; _1 S
int i = 0;
9 w+ m0 c/ Y6 ^6 f
4 q, I6 G3 r0 E: C' s0 a" w for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {. [ p" u" R/ y3 A( ?7 A' D7 G- C( x% e
addr = base + cnt; /* pointer arith! */, |2 S. B! B( v! |$ {& t6 u5 h
sync ();1 P" a* r) U- _5 p+ a: F
save[i++] = *addr;
" G2 x5 ]: R8 y: P& H1 G" d sync ();
. f" `; l9 [, a$ y *addr = ~cnt;
" t7 U& L" {, `' G- r }
6 p% C, L: g( Z8 x [# B. r9 |5 z! ?6 o) c
addr = base;1 W' }3 ]) E& y( ?8 U
sync ();' @/ B4 R8 M* K M! I: A8 O
save = *addr;1 `4 e+ m# l$ o9 X% x% @+ R$ j0 e
sync ();+ q0 n& u" @7 ]( I( I' {
*addr = 0;
4 x! M8 W* ?9 r! h: L
9 _% a" N( b6 h8 [! Z R' o sync ();( ~7 j0 Z9 T3 E
if ((val = *addr) != 0) {4 Q; R+ o. d' D& }1 d6 L- l# @6 i+ J6 s9 [
/* Restore the original data before leaving the function.
& q/ U, Z( S& _ */ F: ?( |+ ^' ?& g# d- @3 _& P
sync ();
: d; _4 i9 Z* |! i6 u *addr = save;/ ?5 G @5 V( _, s8 t% G
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {* ]. Q. k q& f
addr = base + cnt;
) o" l+ n- _; u O1 o sync ();
1 G7 [+ M. ^% `0 D0 ?# m4 |! E, F *addr = save[--i];
8 U- k( }, P/ w6 Y; K }/ v9 R( o7 z8 X7 j- R' I/ l
return (0);! n, I0 n5 H1 L- R. _
}& F1 w# P1 c) ~% N6 A
% `3 O( H5 Z- K% F& ]
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
* i8 s" J7 ]* [ y2 V& U! z addr = base + cnt; /* pointer arith! */) |( b. l% [/ F2 D# h! K; `
val = *addr;" S4 `. p1 s* g& b& F6 q9 ^
*addr = save[--i];3 o8 w: L# v3 Y5 |0 t
if (val != ~cnt) {( l9 g4 Y- q" v- u6 ~
size = cnt * sizeof (long);
3 W. j8 \; ]: {2 F /* Restore the original data before leaving the function.* l5 D, w, ^. n' [: D
*/# N! W) @- v$ Y5 x' x
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
* d( \ P6 @; Z _4 P) Y- L addr = base + cnt;7 `' X1 E/ N( l9 W" {0 T, ^" l
*addr = save[--i];! K8 G% q5 e0 u$ W- F% h- s8 y
}
: x$ f1 S% W* E+ v1 {5 C return (size);
+ s1 \' f3 D+ \4 I. ?" ] }
( J. J7 b" v+ u5 y! E% ~ }
2 q v7 e& J! N- z" _7 z5 Y! J0 O& @$ @! b
return (maxsize);- y! {/ g1 i% g" z/ z
}
& M3 m8 j5 N/ ?9 lint dram_init(void)6 F3 Y& x% J' X: D. i" k7 T$ _
{! I) z% y$ f% ~; ?+ G
/* dram_init must store complete ramsize in gd->ram_size */
% S6 ?+ V# U8 I9 y7 i9 r2 ? gd->ram_size = get_ram_size(
6 _# t: S/ j7 ]# p ? (void *)CONFIG_SYS_SDRAM_BASE,
. I3 B+ [% c7 p3 R CONFIG_MAX_RAM_BANK_SIZE);4 x, d5 q1 Q' B" n% ]" s
return 0;
- N* h; a; {) a2 ^}
) h6 T. Z" c9 v3 D
) R2 j' S6 k# @$ J3 u& t# ~$ N* J/ ]2 ?
! n: a) P* _9 u$ D2 Y$ x! E; j
# k6 G! C2 f: m" Y2 I* I; f& G, f7 {FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!, h7 p& N( U; d, u; n7 [6 t
. x Q# ^8 K! O" ^
! n! b0 ^0 F+ Y0 K; _; q& j
+ E. [) b0 s0 X
|
|