|
|
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
0 j% w0 z5 T0 K/** [, j8 B g! r
* Check memory range for valid RAM. A simple memory test determines9 f9 E' }. C, s8 w/ j9 ]5 [3 s
* the actually available RAM size between addresses `base' and+ D1 I6 a4 C' L8 ]2 j
* `base + maxsize'.; y/ u- e, |& b; D7 [1 a& \ _* x
*/% `# p$ }7 F9 Z5 _% a k" O+ C
long get_ram_size(long *base, long maxsize)9 ~' `4 j; t, a2 L
{6 D- _9 [' c2 k2 ]: j
volatile long *addr;0 d4 o2 I2 {2 h8 k/ b' A/ @
long save[32];2 G+ j, o9 Q8 P T! x: q4 ^, n2 x9 @
long cnt;+ ]7 k' E% \( v- w: K
long val;
% v5 N! X: K A1 w: h3 A long size;# d& D% P/ _+ Q/ f" V5 L. `
int i = 0;6 |& V; ?( D! s, f" g
8 B/ z' ^- f3 {# K for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
7 ]% F9 U; o2 q addr = base + cnt; /* pointer arith! */) e5 l. s# z) g% q+ y, b
sync ();. v/ U5 G- A" Z
save[i++] = *addr;/ h( P. j: U2 B" Q- d
sync ();
7 A. n- R! [! ^ *addr = ~cnt;
: h( T( V& A) l$ x* i$ a/ j }
- z. ?6 Q1 g5 a. W. \: M9 @. I
4 G6 g% [) J7 w; H5 B( }- k* v* F6 K addr = base; z- L( r( ]- e* G. n+ y0 n
sync ();
# J- x6 A5 _9 f5 [0 k. | save = *addr;
0 H1 p9 l: w8 [- \ sync ();
? O: E% ]8 W8 n8 c3 S9 X *addr = 0;0 e3 u+ F' v/ P% ~/ u
" W L$ F3 ]& z4 S+ p
sync ();" w. \/ v: z1 p9 X; \, w
if ((val = *addr) != 0) {
/ V6 x9 ?3 e$ `* p /* Restore the original data before leaving the function.
. g% `0 H4 {' B/ u: U7 S+ b */
4 _8 Y, N: \' T7 G sync ();5 ~) J6 g' ?) R" a9 d/ y
*addr = save;
+ \& V6 J$ J$ Q0 c2 h; J& c for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {; o7 e3 [! x/ B5 W; v5 v6 f& I
addr = base + cnt;
, q( Q0 {+ A$ w& \; ~ sync ();/ `& M& {1 q/ @$ O& m Z+ X
*addr = save[--i];" D- |/ C# q5 Z1 _# L) F6 Y V
}
3 W4 Y8 t. o7 H) g) _. T0 B return (0);/ {9 h( |1 M3 P s9 a5 i5 l, ^
}3 q9 ]7 {, Y! K- ?1 `, G$ a0 E
0 J" `$ R! ], Y
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
0 q; G5 R- A8 ]5 Z c2 b addr = base + cnt; /* pointer arith! */
- Y5 c$ E% t4 u" | val = *addr;
* R) ~6 N) j! S) D8 U6 c* P *addr = save[--i]; [' U% Q! g" L6 N" p$ { r- q
if (val != ~cnt) {3 W. B. p7 m9 n& Y M6 u" B
size = cnt * sizeof (long);6 I' N0 X$ I1 S" }% N# L) Z O) U
/* Restore the original data before leaving the function./ ~# `) x* e; J. [
*/
4 L0 x+ t4 Z; V, Y$ F" d$ B; _* C for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {- G5 l5 r$ n: B8 ^& x: R$ `% s) o
addr = base + cnt;+ @* W: q& Q/ u7 p7 v& G1 c
*addr = save[--i];$ V5 i8 S0 R% B! G
}7 a8 ^2 A+ W! L+ j& T
return (size);
" }( P. Q- p' p }
P$ K# l, E/ I8 K; _ }
+ j0 Z/ Z( Y5 I" ]' J2 A8 m5 M
& ]* N) A- q5 o6 ? return (maxsize);( i: H5 u+ ~1 Y" v# }
}
1 m. E+ E. C% L; e: \; lint dram_init(void)" a, w. g6 _4 p: C0 G, }$ O# ?* N8 l
{
6 h, S( _. b; X7 k2 q3 y /* dram_init must store complete ramsize in gd->ram_size */
3 p9 s; }& P' b' W. [+ ~; L" x5 | gd->ram_size = get_ram_size(
6 V3 Q' M* Q7 G. g (void *)CONFIG_SYS_SDRAM_BASE,9 o( Z& `' L$ C/ @
CONFIG_MAX_RAM_BANK_SIZE);5 x1 u3 f3 `# m# T# n: G
return 0;
7 c& V, @! P% Z# G8 [$ C' T" v @, b}; x% s$ b$ c7 _5 K
# \/ O* B7 X+ N* J/ z6 P8 n0 F3 O; d3 ^/ Y! v2 f& F
, ^$ j" h% h3 l2 ^4 r) d4 s _- q; a% K1 k
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
" P7 ~3 e# n6 \
" h w f! W" Z1 t: `" i) f& }7 p2 N% z. b( q
8 D- F# o7 s# R: |7 P: F6 k
|
|