|
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
- q" t: p4 K' q5 M* C) C9 H/*0 l Z0 G- p4 k8 o# d: e1 R
* Check memory range for valid RAM. A simple memory test determines: S: P; K$ e$ A3 E
* the actually available RAM size between addresses `base' and
* z" p+ h- ]$ o* `base + maxsize'.# F2 a- l( R) ~' T6 a' @
*/
8 d' A- S7 v- K- _6 Klong get_ram_size(long *base, long maxsize)) w6 ?" A2 B* `6 D: t
{6 C1 m' e: Y! x7 }" c- F
volatile long *addr;
( i; P8 C; u9 r) ] long save[32];
! c* ]6 p! l( v) ~8 M long cnt;. i7 a: \6 M& a0 S ]5 k: }. [
long val;
m1 O, ]* e' t! {5 k% q# M long size;
+ J# _- j$ H7 d$ k. i3 O3 {( A int i = 0;
8 F( N, v0 \7 ~7 v2 b. g
; U+ @& V* w" P* q for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {0 r/ l. F% G2 U1 h- {* q b0 X- X
addr = base + cnt; /* pointer arith! */
$ r1 U! ?5 O" [ sync ();7 G! M8 ?/ z/ d
save[i++] = *addr;% i3 \/ O0 A% B G+ m
sync ();
" B+ Y1 l) w5 N4 W) y *addr = ~cnt;
0 U0 D5 H+ E8 k b j) } }
* [& L" z5 V/ |/ S( D, g0 p( R& [' [
addr = base;
1 }& z# J; p+ e7 ]% n sync ();
/ e! [5 ]; v0 U2 X$ B; ^ save = *addr;' x# k* K; `. ^& c2 `$ {* U) L3 C
sync ();- H+ P" O, O: \. F3 w% @
*addr = 0;
+ f6 Y% y( g4 W8 b' P
3 P, s- t6 ?( [& d1 |3 Y, i# @- } sync ();9 V) T" G- E! {+ k/ W0 z1 s
if ((val = *addr) != 0) {
/ c9 e9 y B& R- B" S" n /* Restore the original data before leaving the function.7 L) j+ a' Y$ |' n2 ^
*/, x( Y9 c2 y6 I& `' ]4 g4 U9 D/ O
sync ();
- m2 v1 D6 E: n" N6 q *addr = save;! Q0 W9 T: J4 Y* F j+ m* E
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {3 H2 [) I! c4 a$ q
addr = base + cnt;& M6 V) ~( s( ~
sync ();/ ] h+ j' m( u2 ?& w# n3 [
*addr = save[--i];
: N! I9 D7 i0 K" U }$ Z: J, J9 A4 J7 \! o) z5 g
return (0);
6 x+ P1 w1 B' a' M8 W }
" r; l { D9 ^' h7 }8 D* W" D3 }7 @) j2 {( C# g2 c K
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
4 a/ O. ^& T0 [( m4 H) l+ h8 Y6 f$ Y0 L addr = base + cnt; /* pointer arith! */
( R3 b& u6 t6 k8 t" d: e val = *addr;
: H1 _) z3 U5 w *addr = save[--i];
0 f3 Z+ {4 f1 A) j' j if (val != ~cnt) {
' W: j6 O3 v: V+ c7 _* T1 x size = cnt * sizeof (long);0 i% M- i: C0 N: V) a% c4 e( d
/* Restore the original data before leaving the function.
, ]7 x4 H9 u P0 u1 [2 I. f */2 R t6 F9 w1 z3 ~- z- {: i7 U& H
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
. A3 \$ A6 ?: U addr = base + cnt;
1 y/ z$ W) \; e& N! ` *addr = save[--i];9 f- f5 e$ |6 ]3 k) t1 p3 K
}, x7 Q/ k6 | r K9 n
return (size);
7 b" ]4 z' I# ?3 c! v H }6 F$ y5 g R5 e6 w8 \8 u! }
}
5 b3 Z/ Z! g$ P4 P6 a. p9 ^% s5 m' Q! r( k- O5 b8 ]
return (maxsize);4 Q9 I. C$ d, q8 P2 v6 L( R
}- i; F- f( z8 y3 s( g
int dram_init(void)
( [6 l; E3 W8 T' J. C{) d% j" o1 r7 |3 y: N
/* dram_init must store complete ramsize in gd->ram_size */
) L3 N+ h/ C' p gd->ram_size = get_ram_size(
; V0 N5 z/ }* U! l' Y (void *)CONFIG_SYS_SDRAM_BASE,: i5 W. X* F6 l+ r* q- \# b' ]
CONFIG_MAX_RAM_BANK_SIZE);: E3 _2 c! h. L9 W& k0 s6 N' }" y
return 0;
5 y1 B3 t( ^7 h}' }" { o$ W4 L- r! d
Q$ `( }) X: W7 t9 v, D* A
; C- [3 R- O1 S/ p) \3 ?/ t. s* n8 k/ M
9 \ F' s! U' }FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
2 p0 d1 z# V& Y& y& J: a" t
0 `- W- [4 o# m3 R: x; B% F( Q' J9 `! p/ {& P
" Q8 m- P, }% E2 @$ n$ b$ E
|
|