|
|
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:0 i# b1 o1 y$ ]: J
/*, a! V; L. G' e: c# ?7 O
* Check memory range for valid RAM. A simple memory test determines e% b4 g. Z8 F
* the actually available RAM size between addresses `base' and
: s# l3 r+ I- x% |* `base + maxsize'.
1 D8 |) i1 L* v6 z+ C0 v$ ~*/
5 j% [+ \- |" K, y- z# s8 Dlong get_ram_size(long *base, long maxsize)
3 j" h9 D5 z" J8 l( q1 R+ Z4 H{
3 {: j7 P# O$ O W* T# C4 X: N7 x0 g volatile long *addr;
: W8 x" b ?9 E$ {7 D3 ?# l+ { long save[32];
6 N* Y f- A, v3 j* o# C6 g long cnt;3 r9 q# F) v) H: [8 y
long val; K: |% K) [- D2 S% ~
long size;
8 B6 `' H8 A) j4 B! o/ I: |& ` int i = 0;1 m M* i( c; i
4 e* X. f: X5 R% }6 y8 a. Q
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
( K$ w% |! m$ D) w" m% \# T4 V addr = base + cnt; /* pointer arith! */
% x& |% C' N, m0 m2 g: d# Z sync ();
, g9 s |, j" `$ g7 A save[i++] = *addr;
( I, r2 ^3 ~0 d+ Q1 F sync ();
6 z) A4 \9 \6 j+ H. {0 S( h% k& t *addr = ~cnt;4 C& S3 D/ I) N! C
}/ z9 i# K, V% z4 p* G& Q
* C8 b# ?, T9 O+ j addr = base;
: T+ l: T1 W! `- I, {' t sync ();
! G0 \7 h6 K9 Q5 b1 g3 o% O save = *addr;0 w0 ~ B% [% j/ p1 n
sync ();
+ W- I& n" z* m" }% E- n *addr = 0;
% G! \6 l6 r1 }
" l2 s& ^: }. T' |% w sync ();2 p! F! ]& h: l3 E! X2 ~
if ((val = *addr) != 0) {/ N2 K( n$ k8 N8 @0 \; O) X% \) v
/* Restore the original data before leaving the function.+ j. g3 x* X L& g# u
*/6 a" o& T8 Y" B0 U( D+ U, g9 X. {
sync ();- i2 G( k4 c m6 R0 d8 Y
*addr = save;
, W, n- }) I, W% e' L4 c for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
6 G7 w, g6 C } addr = base + cnt;
, t1 ?( ?" b J( p) ? sync ();
3 J7 [, p$ M6 U2 P( F$ N9 o *addr = save[--i];
* J9 X: K+ Y( U* o3 |0 X0 ~! Q }
3 V3 R# B4 ?4 j, C X$ X return (0);
3 r: a5 V1 P7 {. D* |3 w! ?/ o }& U+ L* g+ u0 c
0 F1 L5 i0 d, ?: F! g
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
# S% u$ D- J. z% r+ i$ `1 {8 O addr = base + cnt; /* pointer arith! */- x/ H% m" D4 V6 V8 ]+ S4 a
val = *addr;4 w+ H: j3 ~( E+ F3 M' W6 t) U
*addr = save[--i];
+ j* N+ I% i% f* l1 W if (val != ~cnt) {
# w9 X% E- [8 T/ C$ f5 A5 X size = cnt * sizeof (long);, y( }1 D7 p1 m7 s" {+ A! ^# a
/* Restore the original data before leaving the function.$ \0 M( G4 g$ N9 H( S4 V/ Y$ f
*/
6 @9 R1 o- k+ y0 G for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {: J5 ~6 X0 H; q B3 g& O* e
addr = base + cnt;7 W8 S) W' E( V" i( f
*addr = save[--i];
* Z2 u6 l0 `7 E2 m+ S* X* x }
3 L* }& A: F! Q! r return (size);- A6 I" x* M) n% L% [7 }
}% y+ R$ |. d( F; e
}$ j/ D q. m) s
( H9 g: K) P. S5 F* c" f" \5 w0 o
return (maxsize);
+ O" w# k) _+ a}
7 z& _" {# T+ X+ A Y% _+ kint dram_init(void)8 c; z) c+ {( v+ U3 o, ]
{, g1 `9 l% X0 }$ [5 P
/* dram_init must store complete ramsize in gd->ram_size */
" Q; a- W ^2 _. I+ b gd->ram_size = get_ram_size(( g' L3 ?8 K3 x. w
(void *)CONFIG_SYS_SDRAM_BASE,$ Y# P0 F0 v# y( Q. e- w( i+ C
CONFIG_MAX_RAM_BANK_SIZE);! P& K& r) W8 B& _. |( K" s5 r4 D) T+ s
return 0;
; _5 [6 m, C0 l}
7 v. q, `, ~, S/ x' v& b+ N) p1 Z. |4 e0 k! G2 m6 b
w2 i7 `& a c5 B4 t
$ D; {2 |1 M$ {7 C1 s( M$ Z! }" _3 W6 `( M% k
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
8 Z' m" t3 p( @5 i3 f- x* e# H
- _$ M. O: ]( J2 D5 J
. x7 @* v2 a' r/ {; ?4 p$ B, Y3 M+ j5 y
|
|