|
|
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
( n9 w7 C/ m( r" U/*3 N: L. R' [6 |' n6 w
* Check memory range for valid RAM. A simple memory test determines I8 |3 | ^" a. l, ^
* the actually available RAM size between addresses `base' and0 g8 q+ p6 G4 W& ]& O
* `base + maxsize'.
4 A4 p- r9 H9 C' `& A6 G*/
2 O3 G' E6 b* W9 \! a9 ~long get_ram_size(long *base, long maxsize)/ C( f" I: ^7 \( ^& h8 s
{
0 F3 i4 z' g' K volatile long *addr;7 L. f+ W5 B o) |
long save[32];7 a1 s' o5 J3 ?% m" k9 S
long cnt;
0 |, U0 ?" e8 p* l* O, i long val;
3 r4 h+ J6 w5 g1 E long size;
' O% _9 ^/ V6 O+ ]5 L3 l5 I" O int i = 0;* `% h- q" W; U9 e
+ o8 y: u# G' u6 L5 G
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {; l4 e% \7 m/ U
addr = base + cnt; /* pointer arith! */; T, }' N7 @6 t! H( n: W
sync ();
$ F* j- a0 P8 ^0 k; p$ C- _ save[i++] = *addr;
( D( Q/ q8 H, ~3 ? sync ();" A5 b2 g3 x2 Q. q. r8 g4 c6 z+ v
*addr = ~cnt;; m* g7 |9 @7 W, m5 a' K
}2 Z. {% A1 B+ ~! P, ?0 {
* v' |* U. P; `* v0 z
addr = base;
0 q! z: o, M; D: x- V sync ();
, i8 ]. E* e& O Y% A& b save = *addr;
# J! I! x5 U6 f' f) K sync ();/ Y- R4 v6 `! c, X4 d; A4 x
*addr = 0;- C7 Z; P: x: U6 U1 E8 a
' V! l* d$ r; z- i sync ();
' w9 D5 @, E/ [$ R+ L* P9 d if ((val = *addr) != 0) {8 b' h1 _8 D, L! n( ]9 E/ @
/* Restore the original data before leaving the function.
* |7 R2 M* o! e4 b) T: E# P& s */" W) a" D0 Y0 R1 ~- T1 k
sync ();/ n% W4 J" L' e
*addr = save;
- C" J. g ?2 P" v/ p' Q for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {! I6 `4 A% x+ R+ x% o7 P, w9 I: |
addr = base + cnt;
6 v" u9 c/ ?1 n: V' ~ sync ();% ]/ }1 g, q# A2 y3 [7 |
*addr = save[--i];
( b2 e% N2 z3 r O k6 D }
" g" C p( G* R4 {( Q. B return (0);- n* I8 Z3 N$ R6 e/ }5 c
}7 S/ U$ A6 u& C& v7 e' o
% ]* u. ?7 `* O( p" p* y; T% w$ K. \
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
1 f' w$ m7 K# f# ` addr = base + cnt; /* pointer arith! */
% V3 d8 o( ^8 y2 |: Y8 v0 O9 e. \% w! E val = *addr;
0 q8 F( i$ d( I2 I: }9 J& q *addr = save[--i];: p; h7 Q/ D. i! O
if (val != ~cnt) {( E0 q# Z* @+ E3 M/ }% E
size = cnt * sizeof (long);
# r1 ~, y% M3 d3 f0 Z5 b /* Restore the original data before leaving the function.
7 [/ e. S3 F: j- c: _# p */
# S' w& y( e% V+ T for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {: I% ?6 Z5 P4 O' S1 |$ z, A! e
addr = base + cnt;
+ p) v1 p3 {2 M! O, Q* V- T- Z *addr = save[--i];8 g$ N/ i$ D. ?
}/ Y6 B$ m" N" b6 J3 V) G
return (size);( m/ Y- `3 a5 w# m2 g
}
4 O8 K7 g% }6 A$ F ~. K7 ]! F1 u }
' }; b6 u1 K8 u/ o$ A7 M
4 G. D5 z- V, C) W* {. i# L% X return (maxsize);
8 L. {. {+ O2 Y! g0 W, d}$ b2 x7 i q/ E& o! C j
int dram_init(void)
" h3 A, y4 a' E9 r2 j% h{
8 z# j, X3 Y( Y; _/ f' j; L7 y /* dram_init must store complete ramsize in gd->ram_size */; h% w8 c6 D' c8 S
gd->ram_size = get_ram_size(: h* H9 y2 L. q" W" X. v4 I
(void *)CONFIG_SYS_SDRAM_BASE,
! }6 m3 u; \! `0 J CONFIG_MAX_RAM_BANK_SIZE);; [" r$ t/ K1 e- ?9 D
return 0;6 u2 v3 Q6 s: h7 P, v! l
}
) v! H6 _5 D7 k7 g2 a
4 T" k" }( c Q0 K9 F, L, G4 q0 t% A; O8 c$ r6 V
3 C- V. v- F) U7 @5 A" T
4 c9 ~( C. Q. d; K
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
9 _% Y4 t2 V+ d, o) X% A. N" H3 {4 y0 A; L4 L
' q: u0 m5 m% q7 j+ L2 j4 I# d
l6 r4 N$ B9 s) [( o4 p
|
|