|
|
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
3 F& {( x3 T. h, m/*
* q& t3 e, A; R6 v/ Q# ^- X* Check memory range for valid RAM. A simple memory test determines
3 o. y2 p5 T) T4 W; t* the actually available RAM size between addresses `base' and1 b) S8 G+ \, e
* `base + maxsize'.
6 r5 ?( j/ c# x* F1 j*/8 m# C, T& O; k# x- B
long get_ram_size(long *base, long maxsize)4 v7 B8 O+ T H i% ?
{- t% B( }' r/ j3 `* {
volatile long *addr;
) z; q4 b$ }1 }: d0 Y# V& q- X long save[32];
' g+ y/ y/ P+ X3 W6 ^( e- p6 ?! b9 } long cnt;* o3 e: ~4 L8 e8 \# @
long val;
9 Y! v9 B7 m2 \ r long size;
9 q- L" a' P- l2 ~ int i = 0;
0 k! ?6 k: `. d* r3 \0 R* p4 k7 J* |- j/ F' @
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {- l. e4 m! a: t8 d- N
addr = base + cnt; /* pointer arith! */
$ [2 U/ r9 ~: r' E( S sync ();
% F. N8 y0 P2 i; H# P, \- H save[i++] = *addr;
# d* Q/ C* U" V sync ();+ `' f# H5 f1 f8 R& p' Z
*addr = ~cnt;
2 W m4 _% A) V4 E0 u9 v+ \) ], A/ b }
/ J% z4 M! T+ [- o( Q& H) p' I! f+ X" n# B5 c
addr = base;
& P% q0 G. c7 M: f1 }9 Q" z; U3 h2 p sync ();3 E8 _6 N+ g* s% ~- }
save = *addr;
+ E$ v2 J d1 S: [8 x sync ();
/ ~, U4 F3 n. W/ X5 D! e! t *addr = 0;) h' s* n" x& \. r/ p- r' f
2 M0 |) F- K! R2 l7 v& y5 p3 O sync ();+ J" j1 z: T. w" `5 R4 g% a
if ((val = *addr) != 0) {. a) N$ L7 V _2 @) |; b
/* Restore the original data before leaving the function.% k# i! G! Q- t+ w* a0 g) {. _
*/1 e1 x# ]$ `' a# S) t3 E/ }. Y W) a
sync ();
. v- c! [ n! h& q1 t, _ *addr = save;
- L4 N, V$ r6 x: H# X for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
/ F2 @! f* t" X4 G- V addr = base + cnt;
, b+ G2 p: _( ^1 K7 e7 r sync ();
: o7 X- p$ @6 T *addr = save[--i];, Q1 x% w/ N6 H: P: M
}
2 ^1 k5 e; p2 X0 T1 `+ M7 L return (0);
; |! b% N6 f$ c. ?. O" J }
$ @' U1 J8 _/ @6 m
3 w, s+ M: g$ M for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {' ~1 m6 ~4 A% Y& ^2 R2 I8 U1 T
addr = base + cnt; /* pointer arith! */
7 F! Q8 D+ f% w val = *addr;" o7 ]+ Z# \: ?5 b/ r
*addr = save[--i];
* Q D+ ^# r4 T4 j; L. R; A; } if (val != ~cnt) {
& [( Q1 O" [; b/ G, k7 A size = cnt * sizeof (long);
- }- x, Z# j+ I* n u /* Restore the original data before leaving the function.
( _, N3 U& Q5 S7 D/ h8 x/ w */4 ]; z- j3 R. f& p
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {4 A$ c3 F) e8 c" V: s/ h+ o
addr = base + cnt;
: k* f; D* G/ P6 T i1 s, t: y' A *addr = save[--i];
) j0 W) ^" U+ L9 W6 _% ?: k }
$ L8 f, ^* D F& M( M- {' U return (size);; d6 H9 C, |( p( n( R
}& k6 ]5 o. ~2 ]- S: J3 F" ]
}$ A$ z( Q! r& T% ~# T
5 h, O' G/ K0 x3 Q7 ] return (maxsize);8 p9 b9 n' {% r
}8 B' R1 ~! z$ a8 W1 V
int dram_init(void)
# W5 Q0 T# w1 J8 I. B1 C, a{
$ D" {5 L7 \' o( y /* dram_init must store complete ramsize in gd->ram_size */+ M1 k0 r! B, a# L; K
gd->ram_size = get_ram_size(
% z) T1 c0 [0 ~ (void *)CONFIG_SYS_SDRAM_BASE,
1 G1 H# c6 t* m CONFIG_MAX_RAM_BANK_SIZE);
# x1 Y: @& F# c8 u+ | return 0;
1 G& R; C" R7 Q1 M1 k6 [/ W) v6 `}6 x% Y8 w: ~8 J6 W; p
% V: F* `& t* N5 C/ Z
+ |7 o9 ~' V3 L% V: ?/ g; \, k6 z) d$ c
0 D" _8 p. @& S2 c+ F: ]" J+ A# ]
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
a4 e! S2 B0 y6 e8 t+ F9 p# z7 `2 H
! ~$ Z7 O( i! d* @! n) E
: S/ @' f* N3 I: |( e
3 t8 a4 j9 H p1 [% \" K$ r |
|