/ b$ ~) Y5 u, U: T& ?+ ~8 x作者: 2532609929 时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下: 7 d& ~# @ N0 a$ ?/* ; S6 n7 v, b5 h3 }, ^: S8 Q+ q* Check memory range for valid RAM. A simple memory test determines. E. X0 t8 L. N, Y* L' J* i& z* \
* the actually available RAM size between addresses `base' and m! A% B2 v' R
* `base + maxsize'. , u+ O! ^+ R8 R6 f8 ?3 k*/+ N1 H9 S- y l: @% d
long get_ram_size(long *base, long maxsize) 1 }, h5 @5 x7 A# g& G# [{ 5 x9 ~9 x: i( p9 B- X volatile long *addr; 6 H! k. q2 T( t* w long save[32];) ?3 K1 \* N q( O
long cnt;6 d9 @ y" ^/ _' E. j& P a' y
long val;9 m' n" [0 k) ?' d! M
long size;) M5 L' Q' N! k/ V: ^
int i = 0;' j9 A% \1 Y+ d! F' `+ k' a4 B3 f( Z
+ q' A. @# e/ B8 \- j: N for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {0 m7 H/ h, b }
addr = base + cnt; /* pointer arith! */ % ?( R; `0 G0 d! N8 N @ sync (); " H. n. `0 B2 o2 Z save[i++] = *addr;( Y7 n. |& d1 H7 E
sync ();* n2 M: Y8 a: _/ U# L7 p
*addr = ~cnt; 5 w; b4 c1 w j, V0 z1 p5 ?+ l }- X, `( Z+ E: q; U$ U" Y4 h$ c
) K8 I" e3 M" A, G
addr = base; ' `& H, [8 S% q7 _# Q sync ();2 u7 H, n/ Z- K7 V3 c8 v8 Z- Z
save = *addr;- O* j1 m' N( Z
sync (); 9 ?& P6 G6 F5 n; n( P7 O* u$ Y *addr = 0;# q& E& Z" C. B# _2 q: z9 m F
0 Q2 |# [" f1 @: r: Y2 g5 D9 t sync ();9 Y" ?* P" I# P
if ((val = *addr) != 0) {8 D1 x/ L% e6 X. b
/* Restore the original data before leaving the function.5 u" f5 O: @4 K. s/ \
*/- D- h7 }1 ]; K+ b* A" c4 @# M
sync ();$ A/ I7 W2 V6 u* l( R; D8 I
*addr = save;) p1 |* Q& i) ~& a
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) { / v* x, E, |% E+ l. U addr = base + cnt;7 ^4 W6 m: c+ L5 U* J) E7 C1 x
sync ();0 f) e/ N* n- `
*addr = save[--i];# d8 L8 e% {% a% z q* p
}" O; y; I/ P/ V1 E" G2 K, [
return (0); 5 ?8 O" H+ ^& w }6 X4 J. Y) { } ! L& F" M' c/ x; P w& y; v8 Q G$ Q" ^' p/ X5 j0 S! z7 K2 U* r for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {* d& k4 _' V3 P
addr = base + cnt; /* pointer arith! */( q/ |3 J. ?0 B, O+ U* u. I
val = *addr;9 C" g( B3 X) N$ E8 G6 y
*addr = save[--i];5 n+ J. }+ e9 X( I+ i2 J6 Q1 x" ~4 g
if (val != ~cnt) { : R# h% m& E- o! e- Y/ ?8 W" M size = cnt * sizeof (long); " V2 r. d% G' M7 v' i% N0 K /* Restore the original data before leaving the function.2 W9 Y8 Q7 ]- X& n- d3 \
*/ , o( ^& A6 F: ~6 B1 T g' X. {1 O for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {1 D& k+ v% ^9 O
addr = base + cnt; : z d* h0 A+ A4 a. ~9 O; f* O* ~ *addr = save[--i];1 K. z# E8 |' O2 q* A* h3 a1 K, U
} Z, D4 Y% S! b return (size); $ {$ ^( F' J( Z" |, u! `, | }& r! N& v; H/ d/ u
} u& g& W) i8 z, f0 F5 N
9 j9 Y. V" n$ v6 }' ]% A& E1 P return (maxsize); 8 q! m0 o* X% G} 4 U) G$ I9 ~2 c# kint dram_init(void), A8 X! H2 X9 o" |
{ : G K5 W8 s0 b$ E' S5 t" } /* dram_init must store complete ramsize in gd->ram_size */ 6 G9 ~& R4 L% G v" n$ P' g! ]! f gd->ram_size = get_ram_size( - R; M+ u- I% ?# { (void *)CONFIG_SYS_SDRAM_BASE,- l, Z5 @* }- @
CONFIG_MAX_RAM_BANK_SIZE);& `" P B# @- k! X v* _9 K+ E, f5 z# J7 ~
return 0; # Z. D! Q1 d5 n2 r" T} # {- [) c! Y; p5 @. _ 7 b. F' t4 G" O+ s" G' I . z! j1 s X. L' j( ^" O; x2 j6 W7 P9 M, P
D3 B" o9 S5 K6 s6 I, l9 YFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助! 3 R7 P3 G w4 A% x0 J3 t! f5 P0 J; C & E% M1 p! T. C4 _" H$ J( W( P- ^) I' q1 p- E- N9 g 2 ^. m( ~; s# Z( L- G7 {