|
|
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
, y& s, V' h5 z3 E4 V( y/*
$ ^8 ?' y& N B7 \- B; z* Check memory range for valid RAM. A simple memory test determines" V" Q0 [4 W! B
* the actually available RAM size between addresses `base' and. M# ]! ]/ b+ v* Q
* `base + maxsize'.
. U3 \% H8 G; E2 R1 D7 D*/
. c5 L( t! r1 \3 d" Plong get_ram_size(long *base, long maxsize)3 ~3 I7 J' j- O# q
{
' ], C6 f3 A& c6 p) o: e4 @ volatile long *addr;; T- i1 D0 N! P9 L
long save[32];5 v# n/ p. h/ ]9 r* x2 C
long cnt;0 j* ]1 u3 ^8 V/ G% t
long val;( m- e, q* u; x2 s
long size;
6 W7 H. p5 h. z8 R int i = 0;# t4 |* `4 j L
% b! B; t: D+ F; C! p for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {( S/ M8 u J+ n
addr = base + cnt; /* pointer arith! */
$ C; i/ b6 s; s9 g* K8 p sync ();
0 K) x, l2 r4 _# y- N) v# f save[i++] = *addr;
4 Q! b2 h* b! z$ T9 H7 v sync ();
- Q. _( k" [8 v: M* h* a! y- P6 E *addr = ~cnt;
2 Y* b. E, R4 ? }
. c. u8 E) W4 |
( O7 V9 l: ~" U6 o" k addr = base;6 T( V5 M& e* e. r& v! ~; o0 B7 W
sync ();) |4 o3 h& j' D; g
save = *addr;1 ?) c1 _9 {& |# Y- S
sync ();" b% K9 }$ T8 P- q! U
*addr = 0;
' `2 z$ x* J! ^6 \: }- j8 r0 j) E3 t. u3 r9 X* n$ Z
sync ();
% _. U+ z* K/ z& C% _1 m& X if ((val = *addr) != 0) {
8 H4 @0 y& L. c /* Restore the original data before leaving the function.
! C' j( I6 h" a */
) g: b; k$ s' c, F3 Z sync ();
5 B: a2 R4 m* j) l *addr = save;% ~3 b2 y, ? C0 n
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {6 y" Z# \4 k! x. r3 h6 M
addr = base + cnt;! b4 U) N8 ]* B" y+ Z
sync ();
4 X J" \" P, k6 i *addr = save[--i];
3 C" e. _+ [. S3 }) U }
) J' X X! u9 z+ G6 s, L return (0);; k" a% k- `% O. |& {# E' f/ ]$ o$ ?
}
* U1 n2 z0 y2 n2 N0 o
8 S) { {9 _9 a( E3 h' P6 J" y" V for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
( C; ]+ r+ ~2 N( P$ [) [ addr = base + cnt; /* pointer arith! */: g: R0 x1 T/ C9 e: g* b2 G9 B
val = *addr;
9 R. P) V% O( V1 q *addr = save[--i];
( Z7 S& ] W9 p; j+ I! H if (val != ~cnt) {
& C. U) s: g# l+ y size = cnt * sizeof (long);' Q# l! }2 `3 }- S( ^2 ]) B
/* Restore the original data before leaving the function.5 ^6 S& O: a* } u, I
*// q( l# U, Q2 S* l! K
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
* r- N9 N) o) D& G% p q6 S% | addr = base + cnt;
* ~& L# u. c5 I& W& t *addr = save[--i];7 _5 }7 J7 A! q; H6 S" A' }
}
1 J, q4 N( q8 W" F( J& j: Y. D return (size);
f6 ^; D, T% w }6 |. z: x, S: k: z/ ~
}4 {2 j0 w4 A$ A' I; z& |! m/ o* r
; ~5 r7 {! x4 }; h+ W8 p return (maxsize);) v8 R4 K2 u8 M/ O* U
}* K: g+ p0 J) v6 h* L7 F0 H
int dram_init(void)
) N4 i- h8 X! |3 `* [{. O' c K3 u# q7 d7 x( _/ F
/* dram_init must store complete ramsize in gd->ram_size */
; P" U" f7 p3 V gd->ram_size = get_ram_size(* P8 u( {& s/ {! o) e8 Y2 s* X! z
(void *)CONFIG_SYS_SDRAM_BASE,: A1 ^2 S6 ~$ }. o: Q* s0 f# e
CONFIG_MAX_RAM_BANK_SIZE);$ h4 J {" |! p) |! v( Q8 W
return 0;% D o% W" t- ^- ~1 |
}
6 D/ f6 Z: D# M8 A" V7 l' F1 f7 p8 E
6 z7 j- M& p( |" Q! m$ q9 V
; F, M9 d+ t, y. x- S' d8 H8 L U6 y! f5 {/ R2 _7 v
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!5 T- _8 Y7 [1 |
' D1 L% |! R$ r. K/ V/ v
9 r! [. g% g' `$ S: t/ Q5 V8 }1 v* t9 O _
|
|