|
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
- \; H5 F. g* L: m' V/*8 j: ?; ?- I. v) j3 `* x# B
* Check memory range for valid RAM. A simple memory test determines
$ M, N! ^/ q/ x, B7 G% t* the actually available RAM size between addresses `base' and6 f) ^2 i/ z, L6 I
* `base + maxsize'.
' ?' r7 [0 T' Q' E*/8 Z; Y9 S+ v! `/ F# h
long get_ram_size(long *base, long maxsize)
0 p3 O5 H0 `, w{. j$ Y8 D/ k6 n
volatile long *addr;
" |- u2 p8 V3 E, H3 g- f long save[32];: H; Y. e) a' c+ g
long cnt;
/ n; B; N' i' r' Y0 K long val;
8 e& H L( O& l, {' b# k5 m! R long size;
. h9 h0 E0 }1 Z; F. [ int i = 0;8 M7 v+ e$ R& N/ ^ m
: l, ]$ o, m( |* j for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
3 g" w- u! r/ \# H addr = base + cnt; /* pointer arith! */2 Q. ~6 d1 x2 t* u" v( k
sync ();% w: K( b+ J p }3 P5 C, D# d/ i: O
save[i++] = *addr;
2 M7 w3 @* _. x# X sync ();
@1 g3 T( u" F8 x/ I8 x *addr = ~cnt;
& s1 i* p7 C5 c/ X7 m% I }$ k# D1 L1 O( Y6 y( c8 \
( m+ e3 h1 ~2 c+ U6 B. z6 ^$ d$ |7 ^ addr = base;
/ I+ X- t8 q9 p sync ();
+ V# h' G9 I* K, {9 U) B5 _ save = *addr;
1 Q. g: H7 K3 V, m sync ();7 b& n- E0 w5 o
*addr = 0;* g! M6 `" ^) ^( N F# a I# K
! _4 U/ |0 E4 H6 B& n8 O; u
sync ();
8 I8 M4 e0 c0 c0 z if ((val = *addr) != 0) {' {# D& ~$ u+ q+ T Y. \
/* Restore the original data before leaving the function.
( T. N; w) ~9 R; \6 {5 A8 O) x; T) m */
0 Z' z) I. a0 r3 {4 a+ e sync ();( z! y! H! h$ B6 `" p
*addr = save;
2 q! B9 o t( V for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {% r- [1 z* N. F4 ]/ M/ O- `
addr = base + cnt;0 }# M: H3 l: u% Y4 x% e
sync ();
% G& b% `" C! _$ y- U *addr = save[--i];, ~9 G! m* p* C- Y3 f; Z: j6 _% R
}
. w y- a2 n8 z/ Z2 q% \ return (0);. {: V9 q3 V6 D3 v3 t8 j
}1 M) W {$ w9 ]1 ^/ R
( l9 T% ]' J- N# E* Q for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
, o% P$ c2 v/ P3 i- f) C; d addr = base + cnt; /* pointer arith! */2 \/ n% q; k/ ^* W
val = *addr;; {* Z6 \" l- \
*addr = save[--i];; ]( E( K6 V# Y l2 g
if (val != ~cnt) {
' Q1 } m& M# r$ c% J; l! Y size = cnt * sizeof (long);
- l" i8 E- v( q" W7 [/ _! x /* Restore the original data before leaving the function.
% _3 m; E6 x+ o1 E# M */
5 v+ K& \2 E' N for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
: E1 V7 _4 l Y* K1 u+ G addr = base + cnt;
8 t ^: }) |+ _9 q3 M/ ]" B# n' o *addr = save[--i];
7 B1 o6 g# w. U }
* @" T5 v9 }( p4 e' i2 @" g* r return (size);
( \$ Z+ x6 r- f1 [) P' |) \3 d }
1 y1 S% ]2 i3 ~1 p }
* H9 o' r4 |6 Q0 l T
) e, w- X& r, }4 x return (maxsize);* ~+ Z& d1 }0 I2 s
}: J9 @; N$ a6 Q2 ]; D# K
int dram_init(void)
8 `! F2 x0 S D* G) E0 f{
7 f2 d0 C& ~) W. q a* ]) B /* dram_init must store complete ramsize in gd->ram_size */
* P$ x" G9 B. V5 M gd->ram_size = get_ram_size(8 p( R7 v9 e! D6 {" _: @+ r
(void *)CONFIG_SYS_SDRAM_BASE,4 b& g( l) ?/ x) N* R0 `2 h3 }
CONFIG_MAX_RAM_BANK_SIZE);
% t' t( }% R. ` z6 [6 [ return 0;: B( P" G2 {2 L8 U0 ?$ H" K
}1 O6 x" i- v2 ~
3 p2 d! f( o7 Z+ y* }" C7 X' T$ _ u9 h& x
- x+ Y$ G% P/ j R# O+ k" _7 m6 T: L. j, o; Q) l
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
' _+ s( @: e: \& ^2 G6 ]. Q: v" P4 c( I( Q
2 ^- E3 \! W& R! j7 M! Z
1 ^2 [# W; _6 J) d' a F) y2 e |
|