|
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:0 v2 `# [; H l/ m. F; c
/*; u/ }( ]4 s% ^$ S G! i
* Check memory range for valid RAM. A simple memory test determines" ]" a% E J1 H2 x- i; ~8 Y
* the actually available RAM size between addresses `base' and
" a# ~2 v$ [, U( u: M+ y* `base + maxsize'.$ R4 }0 E/ }5 n' @. Q2 Y
*/9 h% o) u% g7 B, z
long get_ram_size(long *base, long maxsize)
7 N1 m: M% g4 H9 s' s* E% O{
% w7 l# S! c1 S volatile long *addr;
& B3 f% M5 `; i, r long save[32];
# F7 q- a. e" }# Y4 k2 Q5 A long cnt;5 J! _9 r% R8 c2 E* I* ]; B
long val;" T/ e, w# t0 C
long size;' X6 F0 g* H* A& R) B8 k% f
int i = 0;
; P6 |, B5 w; d( u
% b0 d3 p# h/ H% C: @ for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {# @& p1 _ O/ i1 I7 M
addr = base + cnt; /* pointer arith! */, P$ w- y. z7 ?2 G0 K
sync ();
- ^2 I. W4 H, o* Q save[i++] = *addr;
& v& m7 q7 ` p F7 i( r# Z& P sync ();
4 Q: n4 f- v! j) B$ w$ m/ S *addr = ~cnt;/ f% l; S+ v- i6 t& _
}, I, `, c$ L% d! z; g* b
; d$ p/ X" ]. f$ f
addr = base;
0 b/ d9 _$ o5 L5 ]4 `0 [* { sync ();
5 S" T& I. r2 j! J save = *addr;4 {' t8 E* S2 S, t& I: W
sync ();1 L% R/ @) a& B
*addr = 0;
% _: `' e1 p, T/ r) k/ H F8 E/ i
6 [3 S' M( W X7 x8 `& t4 F sync ();
4 R/ g- y W$ a( N6 }3 A5 U& B4 l if ((val = *addr) != 0) {
) }& z+ f+ Z7 n /* Restore the original data before leaving the function.+ \5 \$ u k2 \8 K T. I: ] u. q
*/
. e4 C. U7 i/ i+ A/ H7 V% V7 ]# t sync ();+ W% Q2 v4 U5 R/ H
*addr = save;: Z2 r9 e- _ W9 |) I$ [
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {. F1 `. Q/ S6 S* @! R3 S
addr = base + cnt;
2 S% l |) D3 |5 D" h( w7 y sync ();
: U3 V$ N0 l0 S# T5 X *addr = save[--i];2 Z( R0 q% n A, M' \
}- v" n* r4 o n* c
return (0);, {1 B9 ^3 R& u+ p" V% l! f
}! R2 o8 X7 A9 l3 `
6 P( N5 L2 R$ F for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
6 A! K3 m: n+ o* u5 E0 L addr = base + cnt; /* pointer arith! */% G9 v. v3 k6 D7 l( k; Y) \# \0 W
val = *addr;
# n" f# Z) u, v/ Y/ n9 Z g *addr = save[--i];' k5 ?" m* D5 ^/ ` r; Y. l$ O
if (val != ~cnt) {0 v5 L8 W* L. z+ u
size = cnt * sizeof (long);6 ~ E" p8 C7 |( A1 Q' u0 Y, U
/* Restore the original data before leaving the function.
/ @& E: U; i7 V2 @8 g */
6 M; u& w9 E+ u$ v, U4 O for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {9 a5 D t$ q/ o+ {
addr = base + cnt;
8 u; N0 O+ ?( ]' s' n% |1 z *addr = save[--i];
0 i7 o3 A9 G8 p' } }* t: k1 `5 L& P/ ^
return (size);% ?4 x: ~% K6 j. y5 s
}
/ N/ f9 ?& _& K+ t6 P; G- r/ a }
1 x4 i& o5 Y; r8 e: y) L; p5 Y( W; S& I3 S
return (maxsize);
2 T) Q1 n$ ^) J0 P}8 A9 H, l- J% [- ~' |
int dram_init(void)
: i6 k" l! `; A! z# ?! ^: H{# A: l% \6 y4 ]
/* dram_init must store complete ramsize in gd->ram_size */. h. j- ` C: j. X: |/ D
gd->ram_size = get_ram_size(
`3 d* d' V' T L( k$ I (void *)CONFIG_SYS_SDRAM_BASE," g& u5 t, b$ J2 I3 X
CONFIG_MAX_RAM_BANK_SIZE);
8 g. c }/ s) k* e/ ] return 0;
+ g o4 f7 {2 F3 O& J# M7 L}
& [, @' L2 X) `4 b2 }8 x: j
6 O, Z0 U+ y/ }, G9 z8 T
. Q: {# s* O: B8 `. g1 P6 Z1 R; z; |4 ]- d1 X9 c
% Y. |% u; v5 e% QFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!! {/ \* G! V& ?0 q) X8 `
( F0 n6 w* L: X, w# y
% K) c. D/ g, n8 }! o
1 f1 N. q% N1 {6 p
|
|