|
|
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:+ A j! T0 r; V! G( A% ?' n9 t# Q
/*
/ t b6 z: ]( s* ?- C* Check memory range for valid RAM. A simple memory test determines
# O, Q8 H3 L8 o r& o$ s* the actually available RAM size between addresses `base' and: t/ S* k( c2 p
* `base + maxsize'.0 h% |! {9 y- N% z7 U
*/
$ G+ \# Q# ~1 B& Nlong get_ram_size(long *base, long maxsize)% {4 A. {4 b4 H* a/ h. L
{! }/ Y' N, L( ]. r( M- J* G
volatile long *addr;4 [5 b/ C* m4 z, K
long save[32];
2 H+ P* N6 I. q! o. ?+ \! l$ A9 P long cnt;- Z d5 T! _& A( H2 v
long val;
* h. W/ z( @/ B9 p7 Z long size;, u, V3 O, ^0 W. L
int i = 0;
+ _1 ?. l) s7 |! |) L
. s7 K* S7 S0 s; R for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {7 R( `+ e3 w) g7 x/ p1 }
addr = base + cnt; /* pointer arith! */# }" H q8 z3 Q$ \% k& n
sync ();* }+ b! S. g9 P
save[i++] = *addr;
1 |/ o' E3 i& @+ s' Y sync ();9 h- L1 W2 z, E) \
*addr = ~cnt;8 A0 Y- G1 a$ x3 u; }/ U- ]% N
}
+ R2 ~! C4 A J
3 Q4 O& p% K2 Z" L* { addr = base;
7 i* C- \, |0 g8 _* R0 B sync ();& p3 g5 W' }( y' `% ~5 m
save = *addr;
A% I. r6 g; D sync ();
: `2 P; X3 f1 k, }! a *addr = 0;9 r2 \+ d- q( }1 V' m# H+ r
4 B% d7 ~6 f3 r' Q1 @( h! V7 o
sync ();' h0 A9 K8 t3 F& B3 S3 I' k
if ((val = *addr) != 0) {
/ ~0 W- F8 w8 L* } /* Restore the original data before leaving the function.
5 B. v) c/ t6 ` */' o- i. G* n5 s/ k
sync ();
" Q$ L4 o9 u5 ]+ W/ i *addr = save;
# m9 g- r0 }% N! k* P2 X- G for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
* @0 O6 o3 g/ H. w0 d( t0 y addr = base + cnt;
: K! C3 [* F7 Y% R0 E# ?) r7 } sync ();
: e& G7 C3 G p' V. l4 ~ g" n *addr = save[--i];
) o4 V5 K8 \# D* F6 ?& t3 z2 E# c$ ` }/ T% P! e [1 {: ~+ q" ?$ F& Z
return (0);2 {& t9 n1 R1 B
}
- j* s3 c+ s) D6 ^# ~ k2 F- N8 p
5 L" I$ J9 _3 H' Y9 a for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
; a" d' z2 u4 \5 T; ^, \ Q, @# I addr = base + cnt; /* pointer arith! */
7 N/ U$ R3 [9 |) X: I8 V val = *addr;$ n- ~+ d- }- ?) @
*addr = save[--i];
; e! x% n' t, Z$ n! x2 s' Y+ I if (val != ~cnt) {
* q) p! y' m' ?' x size = cnt * sizeof (long);! V9 J6 H: v" |3 o9 R! J$ k: h; v8 \
/* Restore the original data before leaving the function.% \( `2 P% p6 R9 U B! K
*/# N: R" {* t1 e
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {/ l0 h0 y! A+ x9 S' z: Q
addr = base + cnt;
1 V3 Z- j4 q* o. T) @( ~3 @ y) V *addr = save[--i];
' E- K* N' ~8 w/ X6 m }
' C3 S- a1 y2 [2 B' ] return (size);1 o+ X6 G# ?& o% r4 [
}
9 d7 T4 Z i' e. A( A n* w) e- m% y r }+ v$ G$ a/ [: c& x% D5 N3 d8 P
7 w4 F3 W& b& ]+ W9 p: y8 F
return (maxsize);
% J7 v: t( x, _) Y% L9 V& R8 j" ?; I}( n1 f! {$ ]0 e3 ~& r2 G$ S+ r8 v
int dram_init(void) {; h: u9 |. n( a; K
{
; i# B$ i! V( X% S0 I( X1 X/ P) D /* dram_init must store complete ramsize in gd->ram_size */
, e1 r- r- U0 J: r6 o( E$ h gd->ram_size = get_ram_size(4 U, _, z8 B2 U, K
(void *)CONFIG_SYS_SDRAM_BASE,- [2 ~# R- ]# C! Z3 _- }
CONFIG_MAX_RAM_BANK_SIZE);
a8 r: Q: u; L% M4 n return 0;2 {9 Z, X" ^1 R# L( X. E
}) f/ \, _" U X
0 o# _2 E4 k4 K, S& \7 `, u$ f. @2 R% o; y. T
' x; k* S$ G9 K0 |/ @3 T' y( t1 C1 T9 t8 `8 y
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
6 O! c8 N9 H( K( `9 q" h& i& S* |& ]2 R, j
; p+ K2 r8 y1 S% M+ C( o' k; T4 U, o3 c& A8 b/ c7 s4 {
|
|