|
|
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:& J3 ^7 @' }. \+ N% G4 r
/*# s7 r( i" _4 F7 m
* Check memory range for valid RAM. A simple memory test determines0 t* ^, ~ U' \7 f1 l3 D* b$ A
* the actually available RAM size between addresses `base' and& T9 P7 w* V# g1 i% [, n( v4 @1 [
* `base + maxsize'.
* C% V. {5 ^- ^$ T3 U*/
( p! p$ h! m" h- M( ~5 e! Dlong get_ram_size(long *base, long maxsize)8 {/ A1 U- K. W( N. g
{
8 s: U4 A" S1 G" u' f% M" v volatile long *addr;
6 \3 _% E& p+ f$ ` long save[32];
$ F0 c# B' n) G! B: J long cnt;
3 [" X2 N% U& V6 ]0 Z long val;
5 ^$ H3 w2 P% C/ b' B, E$ [7 Z long size;
2 w+ p, U. d- n int i = 0;
8 C3 Q7 f% q* q5 R5 p
j) j" B) b$ v1 H) t+ d for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
' O8 X. [3 A4 \5 L% V0 {7 R, ` addr = base + cnt; /* pointer arith! */
7 A+ ?2 t" b) W* V& s: M; Y sync ();
3 v6 F3 I" ~) { save[i++] = *addr;1 |$ V8 f1 C. G/ [3 M& D
sync ();% M) s5 o6 v3 ~$ o
*addr = ~cnt;6 P% G9 r: a9 f3 T* ~' N- l* D9 U
}$ V) z9 ~$ Q; z$ T: M3 c3 ]: z, D
4 k7 S" d$ w/ V0 E: V- A$ q
addr = base;
6 q. V5 m( C, q- V: p5 Z; u/ M9 q sync ();) Z9 ^. D+ _- X$ H4 G" A
save = *addr;
( ?3 d& W1 f* N$ X sync ();
% @4 j' D! P5 a0 {8 _" _ *addr = 0;
9 @0 I6 t6 q" l- x! g
! h9 l& K2 C3 m sync ();
! Y3 l& o9 v7 g7 H. K% S if ((val = *addr) != 0) {) T# W7 T! E7 D% D4 \1 K
/* Restore the original data before leaving the function.
% t5 H. O. }. F1 h4 q; K% @& x */" N2 q& N. C: G# O
sync ();, R+ B# h" d. t) z5 O# [6 a
*addr = save;
# G" C: B( u* b% @3 W4 V, Z for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
% c0 Z, l' v, x8 C {' k addr = base + cnt;1 I" K6 S1 V, E& R4 D3 N. Y
sync ();3 o+ d9 V6 U, k; G' Z
*addr = save[--i];
5 o+ u7 Q) d. U- I+ U }# K& ^. V1 ^5 K5 S5 a1 t
return (0);8 l; @) S. D* C3 O/ v; C
}! n2 b* v; B t6 q
: V: O, x- f* m4 X& m |0 X
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
' F1 Z$ K' s8 f& y: Q# _2 W addr = base + cnt; /* pointer arith! */
( c( {' x, x/ E. J val = *addr;
' c3 c- C: o& X( H& ? *addr = save[--i];
+ Y6 {, r$ {9 Q0 t4 [2 E' S if (val != ~cnt) {8 Z) r) w7 W& F: ^' T( v
size = cnt * sizeof (long);
! v3 `% L( o! v: g" D q# o" } /* Restore the original data before leaving the function.
4 i/ ^. M, q6 X! q */
' s' L8 |, X7 ]" @9 v0 @6 T for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {/ v- e3 Z8 {2 x# U/ m0 [
addr = base + cnt;
" B) q8 j. J( X; U2 X+ B *addr = save[--i];
+ s3 m. |8 f8 a }
0 S6 F" N- v2 b" f! Q3 O return (size);- M* K/ z8 {! ~! ?5 Q; R6 W# Y5 {
}! M9 w% p5 U8 b2 N
}
& A) \+ p! f3 p( m5 Q
: n( _/ b' P& R1 A) v* o1 X return (maxsize);
6 b" N; v7 o7 F7 |/ T}
" G* v$ v* E+ P( o( n( c# b5 B$ f3 sint dram_init(void)& x/ h% B# B- D! ?) P
{
7 O# J3 p- T6 F /* dram_init must store complete ramsize in gd->ram_size */+ s/ S" a. Y' X1 w; K
gd->ram_size = get_ram_size(
$ v) Z1 P9 b7 f5 \5 N- y2 Z4 K8 l! i (void *)CONFIG_SYS_SDRAM_BASE,
' L* D( B4 Z }: I; g. N CONFIG_MAX_RAM_BANK_SIZE);
3 Y% X/ n# H6 { return 0;
4 X2 k/ m# |9 G8 I$ E}4 `7 c) p, E) D
. G/ l; i+ E6 O" N6 x9 j& _7 |: h+ |- l/ n# I/ p+ A
; W0 g' s* T, R K& `- ?# G9 I1 T C5 b0 a
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
$ B4 |; _9 M2 v
" H5 `: d3 h% l6 A, \7 \5 f5 T) z5 G
+ j9 a4 ~3 R% v |
|