|
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
+ N f( N+ R- B/ x! ?/*
5 S4 a3 f7 @. w+ M$ U5 B( R* Check memory range for valid RAM. A simple memory test determines$ T/ J; |" b0 i4 c- R- |
* the actually available RAM size between addresses `base' and9 s. ?; ?+ H5 ^; T) u3 H
* `base + maxsize'.# G3 \- u2 [, S% j, ]1 j2 ~
*/% q$ F7 D' V8 L5 {% L
long get_ram_size(long *base, long maxsize)
7 N$ r' U+ O1 n6 }0 ~{
$ h; s5 t$ S% h g/ ~& y" d! X$ e volatile long *addr;
0 W% D/ ^% O4 J1 Q# u long save[32];* t1 ?! g* Z: c& [' W9 r( M$ n+ E
long cnt;
Y. R9 G K9 d! u9 o+ l long val;
# Y2 h, z: b- I+ t2 m7 m' I long size;# u" I8 ^, `, G: Q- M
int i = 0;
7 i+ i$ T- D) r% i: Z
3 B, C" x4 u. b/ S& e for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {) o3 T3 Y- Q- }* u
addr = base + cnt; /* pointer arith! */# z# e% g4 _8 F: {
sync ();* p- q, B! K7 k8 q7 v) u6 K) o7 J
save[i++] = *addr;, _1 B7 ]9 A' d/ W- G
sync ();
1 B- U' D0 F; N" f# Y& H# {6 V *addr = ~cnt;
- O* }9 z! K- W6 q7 r+ v6 ~) l% Q }5 t# @- H8 C9 {& _
- c! r# w2 v; D0 a; Q8 S
addr = base;/ \6 i# ^1 r$ B4 f/ v) b9 W, Z9 \
sync ();5 M& K! C5 b2 q9 l
save = *addr; e2 W. ?3 R* w2 g. f$ A4 }
sync ();% ^3 J6 u0 o3 i# A5 P5 j3 F
*addr = 0;
) M1 K2 g7 s G% E- X$ y
0 q1 k4 M# J- W sync ();
% y0 f3 v- q5 ?8 k1 K if ((val = *addr) != 0) {
" P n# K6 V$ E- z /* Restore the original data before leaving the function.
' t4 r( m7 N% M. \ */
- c8 E. Y( {# s4 d) M3 u sync ();
7 A0 J4 G. n1 C0 s *addr = save;
- c3 R7 A5 x+ B7 ` for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
4 m3 A9 |2 m( M9 W addr = base + cnt;
j8 Z9 M! s, ] r( y! H- y7 a2 O sync ();$ F) I8 @( {6 L- A4 `
*addr = save[--i];
! L0 M) l4 T/ ]4 f$ B }- J3 }) w" K+ y! X6 q
return (0);: ]/ B5 j9 M6 D& N. `7 ~* w- {" n
}
5 {4 {& K9 g3 ]2 i( H
# _ X1 d1 v$ G% I. K J for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
, _! `5 ~5 q" W$ y- W addr = base + cnt; /* pointer arith! */$ g& E3 b5 K H5 J$ q* r8 S8 P
val = *addr;
0 j& `" s# z9 t6 O3 x *addr = save[--i];( D9 v0 E( U8 v* F; y
if (val != ~cnt) {7 \: h+ F9 P1 L' Y
size = cnt * sizeof (long);
* k; P/ Z# c9 u7 v6 I /* Restore the original data before leaving the function.: m) j k0 N( Z/ O
*/
* s8 @2 A9 L5 ]0 ?3 y for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
% w w) K' N. p$ L7 \ u4 g addr = base + cnt;4 m) J0 I2 Y, N4 w0 J/ l) h
*addr = save[--i];) w( G0 {! E# C1 D z
}
4 H1 A; k6 S& M- E( ~0 g return (size);3 f/ h8 N: `' }6 `* q
}
9 ]% d$ y1 P- q2 o3 n U }/ x, B- j) j! _3 [* N
' w0 |+ ~: W D0 S# ?: o0 H
return (maxsize);
- C/ F( ]0 @! {( I* F}$ M0 f" [0 @9 {0 j9 U+ Q* p( e
int dram_init(void)$ L- u* L, r' Q. T
{7 ~8 k5 N7 S& A+ B. D8 d7 L
/* dram_init must store complete ramsize in gd->ram_size */
9 @6 A$ X9 R4 i3 |" K5 }* ^ gd->ram_size = get_ram_size(
0 |; a! L+ z8 Y7 h- J/ J L# v (void *)CONFIG_SYS_SDRAM_BASE,5 i0 s; ?! d/ e
CONFIG_MAX_RAM_BANK_SIZE);1 f4 ~* m2 F' R0 N$ G3 N N
return 0;3 J9 L2 x8 j4 }
}
! d. r2 i8 ~$ T0 Y9 o) u
" x7 F4 E0 h! A, ~4 f7 G
# p4 ^ ~* d; ?4 d/ U! E5 d9 B( T
6 i6 G, o0 l& q6 u0 P" V( L6 B6 S3 t1 l: _0 v2 E6 a
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
n2 l3 l& [, S0 B- J5 S' Z
, J' a4 i+ Y5 r: }. Y' d9 T
- e' l& `% X5 P* @# U/ T
! k* v1 \2 J6 d; T |
|