|
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
6 D9 s( C* g7 u2 a( E1 n% G/*
4 n+ E$ B) s# s* Check memory range for valid RAM. A simple memory test determines; g2 U0 A! ]' T7 f
* the actually available RAM size between addresses `base' and6 i% g; X7 g/ W8 U
* `base + maxsize'.8 j" `$ d2 w" f9 \) O8 t8 g
*/
0 L1 @" ^- K% Jlong get_ram_size(long *base, long maxsize)' S' Y3 n9 R$ l; ?1 K% S8 A
{- x+ c. k0 k& H
volatile long *addr;
. M" ?- H% J8 f2 {- } long save[32];; a$ i9 x! G# I
long cnt;$ `" x& [9 e2 Z4 Q' G5 J7 J s) q
long val;
; q" R1 i' C2 v3 J2 e$ P x q long size;1 a+ x! K$ a$ l4 t* X
int i = 0;
3 o7 J& n- i% ^2 |. [; I# M
% |( l! D" l4 s) w8 D/ @% `$ s for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {: Y8 I0 W- k; M: E5 x/ z& m. @( E
addr = base + cnt; /* pointer arith! */, b# b' j- A% ^4 o- j2 d3 Z
sync ();
" r% h! @* {/ F; [. l% e save[i++] = *addr;
* S. O' n. X! H/ r' k7 e sync ();
_6 m! e. V8 J9 _1 y *addr = ~cnt;
& i" N8 N# u: g( q }
9 ~9 ]" ]" E/ o) p4 h
+ }" ?# G4 c2 K$ r; g addr = base;
1 U* z. j/ [$ K; g7 T2 f n* v sync ();
0 Y! S8 k! E j8 E save = *addr;) w1 Y) C* k" f# C9 g& o
sync ();7 M) E) Y, v5 w8 J& R8 ~
*addr = 0;
. B% M* R" k# ~" k
# y. A: K; H4 F sync ();
5 } f* l& K$ q- ?, } if ((val = *addr) != 0) {+ t* a9 p* F; v$ D# t* G
/* Restore the original data before leaving the function.
& `% [( H& m" f2 {) r */3 o! _' A# D2 m7 n: G% C4 }) K
sync ();
* b5 M4 d1 a$ b' y$ G" X *addr = save;( r( b& T6 Z. o- M, T
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
: s5 j8 Y/ _) t( K addr = base + cnt;5 m: X0 p3 i L2 {' O* i
sync ();
; o+ P* g, Q9 |2 m& ` *addr = save[--i];7 M' E& P" e) L$ S
}
0 H( l! @( \; d& S" ]' y. ^ return (0);8 e) {4 m6 H* x4 Z" d5 C
}
$ B- T! D: A3 V1 {$ s( H
1 }( t- [ w% j( o+ S for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {, c$ H) @* z, a
addr = base + cnt; /* pointer arith! *// z6 X* O! {' n
val = *addr;
$ ^$ K6 D5 b4 }, a8 p *addr = save[--i];
, {" o$ L3 R6 c! V8 ^3 i if (val != ~cnt) {9 \4 v9 [9 j7 O; a* L+ l, Y# F
size = cnt * sizeof (long);
# Y2 X) M4 h( V7 q /* Restore the original data before leaving the function.- {! i. s' |5 A" P- s1 u/ H- `
*/$ T s% P: z5 T$ q _. f; t( f
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
" t% T1 v/ z3 K$ S* G, K addr = base + cnt;- i" v8 V) I3 A4 ^6 {# X
*addr = save[--i];
% z/ ]% J2 A+ N/ ?3 l/ T! t }6 S% h' z( ^5 A$ u# c" d8 V: J
return (size); T: u6 Q |1 b
}5 ^. q4 N" s* P/ Z @. A! J8 P5 R. \# }
}
" G1 u4 |/ |8 S6 X& r
# a+ u; a' \2 c/ f9 Z& K return (maxsize);9 F" u4 ]* k2 j% [, h
}
( G( ~1 H8 x2 E9 s: i0 v3 ~int dram_init(void)
7 }) w, B8 I1 t c0 |{! ~* ^% N1 \6 ?6 Q; P0 v
/* dram_init must store complete ramsize in gd->ram_size */
( q6 x9 t+ R& w) b" c, b' ~2 S gd->ram_size = get_ram_size(
! z) r' Z- Z W/ R3 B* a! t, A5 R2 Y (void *)CONFIG_SYS_SDRAM_BASE,% W6 |* O5 L1 T& l" v/ ?$ w( ?
CONFIG_MAX_RAM_BANK_SIZE);
9 o2 I/ ]3 ?& S: x7 m) [ return 0;
1 r6 i' [3 W1 h* y$ j}5 G9 R# N# k1 w7 @# [
) t& r) ~2 N+ g& W4 i' M
9 a2 ?; I- c. r8 I" ^- L% j: [% O
/ E4 @2 S5 M* v0 j# \; \( q; p
3 k1 l" R% r% R N
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!+ }( g3 S4 _ y
; \ I! O4 c! a3 R) k9 y' `9 \4 b, J& R3 x8 e
+ M: \8 k+ i0 k7 |0 y |
|