|
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
9 f7 m- G" q8 S% |4 @% j5 u/*
$ O5 r# _2 M- F) m* Check memory range for valid RAM. A simple memory test determines
8 ]& J& @" x1 E8 U% a$ O* the actually available RAM size between addresses `base' and# A8 Q4 b! A4 `" C& Y/ G8 ~
* `base + maxsize'.9 v6 M$ l+ K0 |: k: s
*/
' _3 x2 H( H9 a. J/ r: h0 d. Mlong get_ram_size(long *base, long maxsize)
2 L: v" L8 i, ]# v: I{' C. m q1 G5 a0 f
volatile long *addr;) m9 c) R" n2 ~
long save[32];' Z3 I6 _7 O6 O. q, U, B
long cnt;
4 {5 x4 t( c$ s6 { long val;
7 _) R+ y, G) [. S4 q! U0 X long size;
/ {2 D8 e. x4 d int i = 0;
& H4 S; K4 J+ o) n0 G
4 B' \0 d9 ]# J for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
6 M! [# g' L* Y% k addr = base + cnt; /* pointer arith! */0 f6 J+ r3 b0 f; \/ s$ l
sync ();( W9 C3 V/ L3 i! r
save[i++] = *addr;
. \5 w6 S) T5 ^1 ]2 M% K sync ();
- `6 k0 T0 D1 C *addr = ~cnt;4 `" K1 S8 R* W2 m$ G3 F
}( j9 [! \ }& \# L @
, L& z1 q; g9 m1 B( d
addr = base;
$ k0 \2 D& ~0 _. E sync ();
/ n3 q& l0 Y7 A3 _! a# { save = *addr;
f" ] b. K. C8 W" P sync ();
% a" w- I6 R0 ~2 H *addr = 0;2 J3 E" h7 R% V8 Z- `( K- Y, g# O
$ A7 a( a! D! d' X sync ();
% D1 ^) t: `/ q3 M if ((val = *addr) != 0) {
1 e ]) Z' y' @! H# T /* Restore the original data before leaving the function.
: W M+ b1 `9 W: E" ]8 Q */
6 a3 B/ g% g: B! z0 e8 }$ g& @ sync ();, Y$ E! k5 y1 v6 F; l# ?) a
*addr = save;. T5 K- `0 B4 S9 V; @
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
6 s5 C3 j* e) \) W0 { addr = base + cnt;
0 y0 f2 ]$ z& }/ d sync ();
2 C. t1 |+ K+ K! I4 \: l! O8 O *addr = save[--i];* b% d2 b8 N# _$ W- i, \- k4 W$ X
}
6 V* i1 Z# {# M, u' Z return (0);
; m p4 w# d( \- l }* M' j2 v2 v9 o; {! e
2 O3 B# J* d/ z! Q
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
( ]( B6 s; |# P addr = base + cnt; /* pointer arith! */1 c, I" p9 \% y" c" X b
val = *addr;
7 ]6 r. y" d4 A m# U *addr = save[--i];
& I* i' r# _" P$ }1 A) B" `2 B% t if (val != ~cnt) {
: H7 ^( {, ?. C size = cnt * sizeof (long);) E% V0 `* u) [% a. j
/* Restore the original data before leaving the function.
% l$ }2 A& b; |! h7 J( n */6 ?) ^ L+ P) r$ C5 \8 P' G) [! b
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
% R, C* [" w- R# N# O addr = base + cnt;
" }( D8 [# h! S+ X *addr = save[--i];
. d6 d) U' ^$ v6 f }9 z2 e0 y- w1 K) C
return (size);: `+ o: n9 ^/ X' e! U/ C
}" F3 H+ x/ i, ~: T; Z
}
: Z4 w4 Z2 f( k" M$ }+ u, N o. T3 O2 o: a4 s1 x1 Y& |
return (maxsize);
" u- O1 X+ m& F6 d/ P$ W: u6 u}$ u q* \* B2 g, \8 H* j( ]9 F3 U
int dram_init(void)
' g$ n$ g8 z% m: r8 h( C A{" O+ w) i, n6 p8 `3 t5 \+ K
/* dram_init must store complete ramsize in gd->ram_size */" [+ ? p$ `5 F: G) E
gd->ram_size = get_ram_size(- D, F2 U* l0 I( e/ O
(void *)CONFIG_SYS_SDRAM_BASE,/ s4 S4 m- `% ]) A
CONFIG_MAX_RAM_BANK_SIZE);
9 v2 l5 o" _ L) @: ^ return 0;& Z) i0 \0 S1 V7 ~
}' g, e3 F$ z+ m& ? B
: G/ E+ E4 |3 F2 ]
- l9 [) L3 c% q0 }+ M! k
! L+ p) I3 c& R+ ]! U1 g
+ L6 |* [9 w. B- XFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
( h" N+ |" X) ^3 A
9 z0 @% g) |& w" r
2 c& ~) A3 l+ O$ m* m2 v1 ?6 H2 h& X$ u2 A/ k
|
|