|
|
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
2 D z# i3 c. u' J) {1 g/*( A6 m& B5 J2 o+ u
* Check memory range for valid RAM. A simple memory test determines
0 r. [ h2 U( L$ T# {" H; q5 u) D* the actually available RAM size between addresses `base' and
! Y+ V1 n5 S; @* `base + maxsize'.8 v) g$ G$ E3 p! h
*/9 D) b3 @/ v; ^1 U
long get_ram_size(long *base, long maxsize)1 g( o0 ]" `( c* @/ h& X0 j
{
# o) R/ \( L/ V5 W volatile long *addr;
0 y5 V# E, }3 n* K1 ` long save[32];
* n8 Z5 B% p/ I7 @& `3 f long cnt;* F `2 }" l6 [) J
long val;' p5 M: t2 H, ~- f% q3 V
long size;
+ K( i$ U" r/ x: i& B$ \3 [ int i = 0;! h: Y- e- ]- l/ p+ `8 S
, F9 I2 I3 O0 X4 s for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
5 W. y% o% R" R7 ^3 S" p addr = base + cnt; /* pointer arith! */
) ~5 Y% i% Y" Y$ V7 O% \. V" r sync ();
) G+ U- ^ |& f m/ a save[i++] = *addr;' d ~/ n) k& T- F0 X' _
sync ();
3 {9 o* t7 j; q/ t% U0 q *addr = ~cnt;
$ [7 O! q5 o, C }
6 H _& @1 a h# x3 V- r" f) |" w/ Q1 d
addr = base;
* z; H" v/ {" { h sync ();, r- C* A0 G4 o! t% M; l* |
save = *addr;1 l( E1 D, S X& E2 O1 v
sync ();+ ^ \8 [7 q# ]: B; U; F
*addr = 0;
1 A: T1 ?! ^+ V; R( M) C7 ]( U/ w7 z/ [% g' Z4 D4 F- g2 \
sync ();
9 g9 }2 K; F- t1 q4 i if ((val = *addr) != 0) {
& S( m0 C% C! P6 j+ Z+ W. P /* Restore the original data before leaving the function.6 o8 q0 g h! m3 ^- O3 D
*/
' ^4 K5 B6 f3 P! O+ A$ |, F* V sync ();. R; ~. Q$ \8 p
*addr = save;2 _; W( [1 p, ?2 {, J5 P' A
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {- N! x o7 T! P# O1 [
addr = base + cnt;# S* S, C% f6 r, h4 n, ^! K# G
sync ();7 x) E/ v8 y+ \0 O5 a
*addr = save[--i];
3 t% [! |; \" n7 q7 O9 K0 m* m }
) W& C3 ^$ T0 |: l return (0);% u9 O, x1 r; s
}% {6 N& R" \% Y' m" p* H
/ T9 H0 K; `* N7 O& t: O4 C for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {7 Z7 V2 w8 H5 J; ^# k4 o* p- ]& C
addr = base + cnt; /* pointer arith! */
' E/ ]' j& C# m4 P, d& _# D val = *addr;
4 Y$ m3 ?8 z7 O* a0 m *addr = save[--i];
% L1 `/ q/ K ^* L' i2 O if (val != ~cnt) {7 d7 v" C6 T' x: \0 n
size = cnt * sizeof (long);
* ` N2 }; s& ~6 }; d q' g& o' u( H /* Restore the original data before leaving the function.
2 J+ M6 z' \6 T- x7 K */3 y! ^, @0 P# ?) q, ?
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
e- ^% Z% \2 T addr = base + cnt;$ ?, N- C* P3 p. x" j
*addr = save[--i];
, Z1 z$ a$ n$ O/ j+ U3 z( W6 w# N }; h. M4 q9 c* O1 B; }$ I! m
return (size);
1 s9 _4 F7 H9 _# p; r }) ]9 w4 p4 q( o- m* u" y
}) G/ ~# R3 {& A$ E. T
: }5 i$ c; |" V- r* C
return (maxsize);& A4 @' W8 o' R" \% s/ l( U2 M
}
: w* q* b! s) r4 z" M. p# ~" xint dram_init(void)+ R9 s, j$ @2 B* S# j5 T3 c3 W9 i
{
* W% m; k% C p+ T( e8 O4 M /* dram_init must store complete ramsize in gd->ram_size */
" }& X/ }6 p4 y2 {. t0 | gd->ram_size = get_ram_size(
/ L! t! f0 r; P1 [$ V4 p (void *)CONFIG_SYS_SDRAM_BASE,1 e1 f0 L) R; e: O+ M: C; Q, H9 ^
CONFIG_MAX_RAM_BANK_SIZE);
5 V6 x. Y! `6 E$ R4 z return 0;8 b6 I' S( w/ B8 r8 [ C2 a& _
}
- H/ J7 G& t, i' p6 Y) h
( ?$ g: b5 V% O1 L( P2 |& M) d
2 ~4 q, w" l0 J! e7 |- A/ E( |5 T1 m" C9 U7 A
! s8 i/ b; ^6 l. t
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
7 i% [. q3 J* V2 K; w5 y' Y! d/ H; {1 \/ _/ O) |/ v+ Y
& j: \6 G: y0 y# r6 }/ U
; j/ P2 o8 r4 a6 d |
|