|
|
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:0 y9 w2 j+ P- S4 ~* w
/*
4 u+ ] N3 {/ r( U1 G* Check memory range for valid RAM. A simple memory test determines4 I0 y r, d: W8 t# g! N
* the actually available RAM size between addresses `base' and
5 {8 \8 s4 K6 h1 ^, K* `base + maxsize'.
* s7 n6 N5 W5 m3 n*/
% u M% m# Y4 N" C$ `long get_ram_size(long *base, long maxsize)/ e! S0 Y: o2 E- S$ T
{; S) o& v( ^+ g( e- S4 S4 r6 P: d
volatile long *addr;- x2 Z- m, V8 g) q2 ?6 e8 d1 [
long save[32];
* P& A- |. \# i/ j* C long cnt;% A. h; }: z! J" F& T1 X ]- q/ Q+ G
long val;
3 `7 l1 L) w; N* b; B+ y long size;
( Q* }: `( J9 Z. {. O int i = 0;
. I* q6 K6 u2 |( l7 J
8 B% |8 ~& h: M) G8 | for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {4 D) c: X5 ~. V( }* V
addr = base + cnt; /* pointer arith! */
+ j' V) Q- X, A& t6 I5 S5 l sync ();
7 p+ [& p: N/ A( T+ ^7 C( o" I save[i++] = *addr;& L3 J3 z& U6 S6 s) M
sync ();3 G7 Z! U& g3 `" S7 i, F+ v
*addr = ~cnt;
~2 I% D& G* @* c; t }$ _/ u/ A( E( U8 H" K$ R
' X4 h3 L' g! X# b* [
addr = base;% k& C/ l" u- D
sync ();
, F( g5 e5 V6 _' v+ ?" g6 r0 I save = *addr;5 Z; j' J: S" t
sync ();% q. w8 \- |9 ^) @ p, _5 I6 P
*addr = 0;
+ H I& S1 P' Y m* H8 _4 [1 G8 K7 Y n# K+ A1 a) @2 R3 o- I3 Q; x1 @
sync ();6 N2 \ B) G2 r) I3 A
if ((val = *addr) != 0) {" z; u p3 @# w, I d1 E
/* Restore the original data before leaving the function. _5 n, K( N* g
*/8 Q. Q9 @. |# v* o
sync ();! p& I2 @ U6 b# M2 M
*addr = save;
2 X( u$ X, ^2 t for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
3 r& v7 p. o, U% W8 M: x addr = base + cnt;
6 a5 I3 ~; g7 A' B$ I4 L sync ();0 X8 u9 u- R# l+ W+ u
*addr = save[--i];
5 F# v: C7 G: P }
. z5 s4 l' `, w' q return (0);
6 X% a# y6 t3 M w) R }( l0 d; q. ?0 h* B+ o
( m5 I1 m# ~0 r' X8 I for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
% c0 [7 D" A3 Y) q) c' T6 v addr = base + cnt; /* pointer arith! */
& N- a8 C$ o) R$ J( G0 }- H val = *addr;
, B; Z1 q, R9 X *addr = save[--i];8 s' t6 T5 M9 Q) N. J+ q
if (val != ~cnt) {
" T& V: ~8 n6 @" O2 G" X size = cnt * sizeof (long);7 P4 @0 g2 Y+ L$ ~2 m
/* Restore the original data before leaving the function.6 f# t+ T* I* b. L
*/
, ~4 h/ s, b B$ ] for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {7 O* p* S8 K3 q6 J) ?2 Y
addr = base + cnt;; z! n7 X5 v$ Q
*addr = save[--i];
( w9 F- V6 Y% T1 F$ v6 f }
& ~2 j( x8 y4 x' p$ e return (size);
3 p2 R* {0 }8 X }
3 e) Z6 P% }4 C }
) M6 a# I$ c5 T1 R( [. W$ K, R+ P! P. F. D) u
return (maxsize);0 H% k' g. g% e, H1 T
}1 T8 _9 ~6 m: c. j6 P
int dram_init(void)
" J# n4 O. R/ z# C: _{
2 C$ s5 f& \6 \' | /* dram_init must store complete ramsize in gd->ram_size */
+ P! {1 P. Y k8 Q gd->ram_size = get_ram_size(
; A7 ~9 b% _7 m/ W8 r (void *)CONFIG_SYS_SDRAM_BASE,
# ~- A5 a [7 l0 t CONFIG_MAX_RAM_BANK_SIZE);; O5 O) w, U3 m( u3 y- c3 w
return 0;
, E3 {) G5 b: L: P# v. U}
( R1 c% [4 t- [4 f# d6 W& s5 Z$ d `+ [- L, h! b9 d
4 e- _5 E# D9 {$ o1 o6 f
4 d; m5 B8 f( a: s( o+ b3 Z7 N7 f$ i& n9 j& _
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
& O$ {8 P5 b( f; i# T. o
* u+ N7 t( p7 n" r" A; g
: `1 r& Z3 W4 P0 k8 o" G
$ W8 W0 [2 i+ e0 e4 F5 K0 \, y& d |
|