|
|
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
# W: `" o+ h2 W% \/*
+ y$ |' |, Y8 b. _8 [0 {) {. E+ I3 q* Check memory range for valid RAM. A simple memory test determines" ^5 w8 R4 ]6 _" I; {% u
* the actually available RAM size between addresses `base' and
9 M5 C0 ^- Q0 k& o3 h* `base + maxsize'.9 }* F9 f9 N6 ^. K
*/
8 ^1 k1 b% ^5 a& i8 S; Nlong get_ram_size(long *base, long maxsize)
/ @: |" W9 q0 U( n; ?6 E* v( z- C{! r0 l3 H+ j3 x$ Q! ?
volatile long *addr;
& q" j! T E R7 R( g long save[32];" B9 m: c1 f4 g% S
long cnt;
* t' h; l& D+ g* @1 o long val;
, E; ]0 {% D8 R long size;
: S3 |/ R5 W7 l4 o. c T! V int i = 0;
9 T# o/ ]" a2 x- z8 |
+ L1 F3 Q1 Q' @9 e4 z for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {; Z8 C# z8 h; v
addr = base + cnt; /* pointer arith! */2 e9 `3 W1 a% o, K; V
sync ();
8 m+ B8 F9 B# F) t$ @ save[i++] = *addr;
0 z1 |0 F5 U/ L% O9 ?8 D sync ();
+ F, A( ^. s: W( ~7 x, a! f$ S *addr = ~cnt; {# h7 x4 z, G E4 @' V" B7 ?
}
" J% P0 B+ u, t9 \
6 d! f$ q8 V3 l addr = base;
6 ^# ?' f# ^2 r8 @ sync ();6 K/ N: F" ]) G0 k: y$ b! B
save = *addr;
" F) h6 b$ V) p+ u# g4 w sync ();/ @4 d& v! ^9 M) y
*addr = 0;
& l- g/ D" g% q. @8 q2 g8 ~. {% J& Y, q' m
sync ();
9 b( _3 @3 v# z+ J8 N, G if ((val = *addr) != 0) {
( O+ q5 b3 O5 Q9 H5 F$ U /* Restore the original data before leaving the function.5 A* u- ^! O3 i) D# \7 [3 c- h) C
*/
8 e5 f" k+ Z' _ sync ();$ e! t" e* H+ O, I4 z: d
*addr = save;% |6 {4 X3 E7 y0 C
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
7 o9 Y+ D# _' Q+ d7 a0 C9 J addr = base + cnt;& r( V4 c' M5 p
sync ();
2 J" g2 w' N9 J. X/ G *addr = save[--i];) M+ E% G& m* e! c' d; S
}3 L* y: q3 X Q; i2 X- E
return (0);! B) ?" a* P9 U7 O% L% L a
}
4 X# f& h+ g# F% t- K0 R( S' h: K+ r; v* S( M$ x/ o1 P& ~
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
+ b" ~) t# u- h2 {& D2 R9 V addr = base + cnt; /* pointer arith! */
" I4 q6 v7 l Z) [# L# ~* C val = *addr;, B4 q) M* ?0 i, n7 S2 I
*addr = save[--i];& X6 Y& ?/ ]2 W: b2 v
if (val != ~cnt) {7 l+ F+ u( n! I7 J7 c+ j2 C
size = cnt * sizeof (long);% c1 N$ R# \4 @( v# a2 @
/* Restore the original data before leaving the function.* i% i- Y* |- G# g
*/. p: c6 B- {& ~ a$ |
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
- k& P K, F* p1 s) N$ O% f addr = base + cnt;/ r7 @7 b5 I5 n# u! z% p
*addr = save[--i];
9 X1 ^2 F {# S }
* [) `* g) `4 c C+ G return (size);
; C8 v% o* i) |" G' i }
/ y, f& _' l" G2 Y7 `4 S6 c }
2 ~- g& O3 @0 z$ t9 g9 k. k+ j2 h' P+ [# J. A
return (maxsize);
2 Z. A- w+ x! a! d( ~/ M* ]}
3 m4 R9 {. n, a. G4 s' |, H! e; gint dram_init(void)
$ ~9 I* C0 Z) ~9 Z7 m{
: T1 ^& `0 b5 }( n2 ~! Z. Z /* dram_init must store complete ramsize in gd->ram_size */
; n7 F3 O {7 u; V ~1 j: X gd->ram_size = get_ram_size(, A1 |9 }+ I! s4 Y2 u1 H
(void *)CONFIG_SYS_SDRAM_BASE,
1 \3 E+ u+ S& m2 ~- f2 m CONFIG_MAX_RAM_BANK_SIZE);8 w' L( y7 d! Y8 @8 q- F r
return 0;
- f8 w4 X4 x6 ~}2 V' E7 e3 t! Y" \0 `) x: ?
% S0 ~. H# f! g6 Q# M4 y8 |/ W. F
" D1 a n6 ^ A0 a0 P0 Y. i+ p
' P! N0 F, w5 ?( [- F' ]; Q. q8 E: Q8 x! y! g6 @
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!: g1 E m1 v' g+ I9 [% B
5 G6 M ]6 n7 o1 O9 L F% W1 R
& ^! t! T+ h# R* z4 i1 _6 e. m
7 |/ D( E/ O8 i3 ?: y# h5 ~* I
|
|