|
|
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:/ H$ d/ i q! T
/*3 M/ ~, `1 V7 W+ s" T2 q1 @
* Check memory range for valid RAM. A simple memory test determines
" h0 u- D: ^: k0 l) B8 e: _* the actually available RAM size between addresses `base' and
# N9 B0 _1 a$ _! Q4 J) V. L; \* `base + maxsize'., h5 A2 k2 u) M
*/$ u7 O$ d3 r$ b& a4 D' b2 r1 F9 @
long get_ram_size(long *base, long maxsize)' U0 L' c" w) W1 H
{1 g& f% i% g6 p$ [
volatile long *addr;8 k0 ] Q w- \6 T3 s4 {2 b
long save[32];
! P; n/ R x+ h p' i6 R# v% W long cnt;
7 t) i& N& u9 z; R9 U, g long val;! r3 E9 i! U9 R; i" Y
long size;( u, H7 \% n, j8 x U( b
int i = 0;7 i B; Y) y/ C* t9 ]0 [1 b
7 V" D. A4 U! `
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {8 O9 l) x7 v$ q1 r5 j8 Q( M
addr = base + cnt; /* pointer arith! */& W7 h+ F _5 ^4 V* o1 \5 A
sync ();! A' s% v8 M! x. {1 p
save[i++] = *addr;( R1 A4 s0 K" ]* \9 p) I; a
sync ();
! _+ K, d0 a6 [7 ~# S *addr = ~cnt;
8 a$ u% }5 P0 T7 \: ? }
2 r) ]8 T+ |; n! p2 U! T0 A: l: ]* F" C+ |; z+ I
addr = base;
* o6 i. g# ]& ^4 F sync ();
' r( _) ]$ I' V! U save = *addr;
4 V. I$ h3 P1 o3 w; G9 e sync ();2 Z" \% V$ E" t7 j
*addr = 0;. _' h& ?8 [/ \
( Z2 a; w, H4 }" A
sync ();
- i3 i$ a; [0 l, W$ D+ Y$ } if ((val = *addr) != 0) {
, J# Y* k6 K) L1 G' a) } /* Restore the original data before leaving the function.
: c' k" n! i4 D6 w% D$ D& l4 ^1 Z2 ] */
4 D* x; Y8 |7 H0 F( s sync ();
7 h7 z/ g! P% o; i& t; @ *addr = save;
1 h0 \' `5 n9 K% r8 i5 _ for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {- X2 {9 E( a$ J' V
addr = base + cnt;7 ^4 W" p* U- l
sync ();* L! z+ @) M+ p
*addr = save[--i];
/ d! E9 l# q- N6 k$ N }+ D7 u6 \& Y! U6 c3 V! O9 @& f2 @, v
return (0);6 p3 D X# D3 i- W! g, m. ?4 g7 E) o
}- W, a5 y7 X5 s' @$ m( d
% l) R0 h' U) n* \5 T for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {3 H6 E5 |9 I: A
addr = base + cnt; /* pointer arith! */
3 y( D) N" B7 H* m) K( L) P val = *addr;( s: t' C4 m$ @7 F4 @ a" c( Q, Y
*addr = save[--i];5 o$ E" \2 v v( m. E
if (val != ~cnt) {9 v! D* h* \& ]' h1 J F: E
size = cnt * sizeof (long);
; w e. H+ S+ J5 I$ K0 o /* Restore the original data before leaving the function. y, F4 M' d" i4 V( O
*/
! K! d+ R: J* J/ _6 L0 [ for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
~8 s3 V! k8 q) s* P) ^& V addr = base + cnt;3 O+ _3 f8 u9 i( h3 d! Q! H, t- w
*addr = save[--i];
. A2 ^# \1 n6 }5 X2 _$ B }
3 w' S, K2 M% o, `7 c q- M/ v return (size);
/ g; c) G% w7 p! G }
- s; z4 E8 H7 N I1 j7 e }; r/ E/ l. k/ E' n
6 P7 Q, \0 i. p8 l' [2 N- W( G
return (maxsize);# n2 B+ |% r5 \' K2 e2 G9 K& W( t/ z
}
& I% a. R$ j/ m% o6 ~int dram_init(void)
0 ^$ R( K: k( G4 O0 G{4 y6 R: U5 {, b% ~8 n' i# l+ n! d
/* dram_init must store complete ramsize in gd->ram_size */ |! y, D% ^! h& w+ X
gd->ram_size = get_ram_size(0 ~! ]0 C* k/ ?' M
(void *)CONFIG_SYS_SDRAM_BASE,( L. j9 w& K) F
CONFIG_MAX_RAM_BANK_SIZE);/ S$ c- Q( K L3 H
return 0;
8 E; j6 s! \) s0 D0 v}
7 F z) w7 O# ^8 b/ o) k, r# p7 g
! R9 X5 D+ k& s, [+ w& R% V' N- ]: M& ~. E& G
# e9 U$ |9 g, u
- P& {6 G+ l+ F: i6 I. q
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!1 P- x9 p5 n# ^% w8 b3 W: P
E5 Y8 L& D* V3 Q$ Y6 j" B" r% {# f2 L/ |: I3 x
* q7 J* [% P1 ]% q, _+ e
|
|