|
|
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:# j* d3 H9 G- g4 n; @, W
/*" p& U$ W$ m1 c% l; L
* Check memory range for valid RAM. A simple memory test determines
! a* E2 A4 s& I- T6 x; w* the actually available RAM size between addresses `base' and
' B1 k4 M0 o( @/ @3 D8 L$ q* `base + maxsize'.
" I$ B& G. Z% W' o! y8 _4 ~. f* A- F*/
) u* p9 s* }) I! I6 ]& Slong get_ram_size(long *base, long maxsize)
8 v8 T4 |& z8 c7 e' A# G{) W( a: W* `& j& c
volatile long *addr;5 [0 V) \: `6 N+ w" ^( c
long save[32];) J/ W2 k; T9 ]3 q" } | H, p
long cnt;0 G9 _# i' \; [2 F( `! {
long val;
' j7 a2 ]# W% {9 W3 k/ o0 h long size;. p0 }- C$ I2 q; j, \
int i = 0;# M0 D' u: I: p* O% q: I
% t6 N/ Z/ @8 ^+ L! ?8 B" }7 k) l* v
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
/ L7 X, n+ Y& q1 u9 r( \( ^1 Q: S addr = base + cnt; /* pointer arith! */% ^5 z/ ]* W- _& {
sync ();1 Z1 Q3 a2 j: ^8 F- g
save[i++] = *addr;
/ |" o/ w5 H& r/ [# i+ X; u sync ();7 Y& P/ k7 X4 P+ f0 H6 ?/ z+ S
*addr = ~cnt;$ [9 _ k- \+ P( q+ @0 c6 u" W
}
. {+ s: v7 A) x! x/ D/ r/ `
8 ?# X' ^3 B# ~' a8 X! Q addr = base;
8 a1 l' o7 j5 U1 A0 A% J sync ();
/ Q7 r- Q c! _ ~: u' V- `/ {4 X9 U save = *addr;
/ Z( p: \* c6 E' g' g sync ();
) ?/ j1 O/ \3 \, B7 V, F5 R *addr = 0;' H8 e' B+ j( K; J, j) p* V- A; D& z
4 u5 Y* k' y( `% K+ H1 d- E
sync ();
& S9 \: }5 |# ]+ I7 q; L! X2 | if ((val = *addr) != 0) {
/ m7 s* c1 B9 \( X2 o) t- W) R1 e# { /* Restore the original data before leaving the function.4 O8 m3 g; [ ]2 a5 P( ?% g- e
*/
6 x: B$ } Q1 \7 H5 x sync ();
- q0 h! M" v) s5 w *addr = save;
( `4 E g8 k" H3 F7 p' l for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
/ W T# T! l' K6 G addr = base + cnt;
; p R# F; ]/ i" c sync ();
4 K) N! e1 L# n0 i *addr = save[--i];7 A: ^0 N( L; A: j% c: a" O! F3 e
}
5 |# o3 P# a% Y' @ return (0);1 K; O) z6 M! d2 v* ?
}
! N9 F% }" w' |# e! \
]. ~" i1 f( t! } for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) { p7 C8 t% t* C
addr = base + cnt; /* pointer arith! */
; K* b, V: K/ I' a: W7 B# t val = *addr;& j5 q; C R6 ?! [# ?" U @, k
*addr = save[--i];
0 i' U9 A8 C0 u N if (val != ~cnt) {
7 [* q& ] ^4 W" d+ p% c; x: c size = cnt * sizeof (long);# E# f" n3 B8 Q8 u
/* Restore the original data before leaving the function.
; v" c9 }3 `* m9 D */
+ [) o- e7 R' b for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
6 \$ c, [' X! `- E; M addr = base + cnt;
2 `" W8 p! K% `6 I! g2 Z *addr = save[--i];& s% W3 o2 E8 n1 l- g
}
' G4 {9 ?/ x( P' w/ ~) @ return (size);
; k% {0 c# ~% N( Q3 x" u* \ }
q3 ], A; c+ i" o0 m }
. i% |$ r: k/ v5 ^
$ |! l3 |+ G7 z( d8 y. f. y! e return (maxsize);
1 r: ]: T) \. s7 N6 i! w5 p7 e}
! k2 ~0 L9 X" }9 O3 Cint dram_init(void), A( a0 M9 V& e
{8 P8 S6 @& M& L
/* dram_init must store complete ramsize in gd->ram_size */7 F2 V* W! T* }( o- M i9 m' x) L! C
gd->ram_size = get_ram_size(2 q7 K5 l+ R& X, z4 B
(void *)CONFIG_SYS_SDRAM_BASE,
6 L- q$ ~7 E6 d V6 h CONFIG_MAX_RAM_BANK_SIZE);8 l/ z8 d2 }! B
return 0;+ Y6 f5 A, P+ e* k% p/ V7 z" ~
}3 g$ @' R. z2 x4 m. E- Y$ w
' a8 o# P3 z; \& b: [+ L' {
L3 M, @ L8 @( N/ o7 K! G, V8 B8 _) y& m! U& q
" R, i3 }" M0 Q# n- k0 u2 i/ pFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!: }$ ?' Z o4 T
3 z* P/ B) w0 O0 Z' v
! O1 b3 I) {% w% X) s. g% u7 l6 ~1 N8 s; b
|
|