|
|
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:% x, ?4 Q& R* U. t. W" [1 p! h
/*+ I. L. u# ]1 f* ]" m! G; d
* Check memory range for valid RAM. A simple memory test determines5 g- H1 L' F% b) H( u
* the actually available RAM size between addresses `base' and
0 E: c' O; Q. O) y* `base + maxsize'.
' I" Z, ~% S( ~& q! w. q. @*/6 R0 u# e) k' i6 H$ Q/ q- f
long get_ram_size(long *base, long maxsize)
/ h$ \6 L9 ~7 O8 B6 k4 ~4 A8 i{
" H, p- k& G2 x7 Z: k+ e6 w7 T volatile long *addr;
: g; P% l& m- g( L/ Q& m$ ^ long save[32];+ ~. o" z6 H8 K9 V6 T# j
long cnt;
* l0 g2 {' q0 R7 z( c+ T& y long val;
# l2 N. |* N& `& P* ? long size;
; G% x8 j+ d2 |' [4 e5 I" I int i = 0;
H( V3 P, k! \( W5 e( n0 Z$ ~3 g0 D1 n2 _3 ]" }6 z/ Y- K
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
: ~+ L% g$ `4 D. j addr = base + cnt; /* pointer arith! */2 z* ~0 `$ q3 v' u7 W7 z$ Y0 U# ]
sync ();
% u0 I% q1 N3 ~0 N0 } save[i++] = *addr;/ F: n$ C0 q: m$ N
sync ();3 R, m" O+ ?: N3 `! n& C8 A. W
*addr = ~cnt;4 W% e: Y; M/ \2 ^
} Q# ?( R; \/ i
6 U: d9 ]$ r: S- G& x9 m
addr = base;
A x1 M. {# A7 F7 N1 M sync ();5 u1 e- T; B2 N' z1 a7 u
save = *addr;3 k J+ R R. j& ]. n$ O$ {
sync ();
4 l6 p- p9 X' t! S *addr = 0;+ |- O5 ?: K' |. R4 l O
1 y8 N4 R$ l' f# X7 i* w) C7 v sync ();" o/ k8 u+ P1 W+ G! a
if ((val = *addr) != 0) {
9 u, `' a. `& f) P6 b1 x4 ~ /* Restore the original data before leaving the function.
( q: v9 k" ^# o7 s, y2 o! R( G */! D6 M* g+ L) A* y2 v
sync ();( o; F; D% [& B6 O/ Q
*addr = save;
: o& e! B' }0 B5 C4 m1 ^( F1 Y; Z for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
) s( J9 x: ~, N I! Q, [. ]) C7 j addr = base + cnt;
* a5 H' z( ~4 D2 M sync ();9 \5 i" {& V$ a' }* r U1 \
*addr = save[--i];5 W9 A# i* m3 E, S5 y4 A1 A
}
8 N/ j4 V* W8 @ return (0);0 T7 Q& X# j' u4 ^6 Z5 h% L- L
}
3 k) J2 Y) r/ ^. Q
- F- v/ b g `4 }) v for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
2 D! P F; Z# H2 |; c+ U addr = base + cnt; /* pointer arith! */
3 }' J# o3 z. E val = *addr;4 J5 b6 V+ E0 e8 C! M
*addr = save[--i];
$ [- f4 P; l& j if (val != ~cnt) {
: e9 L$ e, {6 J size = cnt * sizeof (long);/ h8 U1 C! U6 s" z3 m0 C6 `. X
/* Restore the original data before leaving the function.8 ~9 a& b& L6 q5 a. ^( V* f
*/) l% I( [5 P$ {- t4 u
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {7 c8 a, f+ e# M4 w+ `* ~2 M& z# i/ r
addr = base + cnt;
5 C' t2 K5 d( l% x- a *addr = save[--i];/ T/ ^. T" o* O$ l/ f$ x9 [- L4 T
}
' G8 R) D9 c) A& ~; p. ~, G6 p4 i return (size);
( X/ \# Q4 |( v; M4 V }
, c6 m) @$ J8 |4 l0 k' z) R2 s }+ I& l3 h: D$ ?8 E) q
. k( c- ~$ J# y% r: w
return (maxsize);7 G6 [4 T: s) a" @5 C {
}( Z" u4 X$ c7 a0 N( {6 z
int dram_init(void)
( A* s' u" F/ ~/ \- l( Y{
) Q. X. E; [ N( g! \1 f) M s+ C /* dram_init must store complete ramsize in gd->ram_size */
" O- x( Z6 T: Q7 Z gd->ram_size = get_ram_size(4 V# x, E. [, J$ g' g1 W
(void *)CONFIG_SYS_SDRAM_BASE,: L* l% G4 F$ @6 u1 D- x9 \% G2 H, o
CONFIG_MAX_RAM_BANK_SIZE);
7 m( T9 m/ i" e' y9 N, V; K return 0;
. @0 } Y8 Y4 L+ O. a& B}
9 x) `& a5 c# P2 J* Q- T
* i+ @; e- r) e `4 w% O
k2 {* ?" T4 t' w
* c2 i8 n* i+ R* |9 u6 G4 m$ q& ^( P
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!9 N% i9 Q5 G- I$ c; x8 J
* ]$ E9 Z6 P1 l8 B k' m9 B+ V
5 `( G* |/ H1 ^; P. I* q: D" W
. I1 c; H6 W- ^! \" W( x: E+ o6 u |
|