|
|
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:6 D- {2 v& M: ^; H3 K9 o- N7 z
/*
4 [. o6 T' c# t9 m* Check memory range for valid RAM. A simple memory test determines" D* d. y' ]1 y# v# @. ?) e+ ^
* the actually available RAM size between addresses `base' and
$ h2 Y c: b2 N0 u5 A& b* `base + maxsize'.
* C. a% n2 `7 R N/ e, U/ @" ?*/
- }: t* }6 W: F% V. Hlong get_ram_size(long *base, long maxsize)
$ K' i( f* H: | A5 ~3 A{
3 {. c; M+ ]) h' M# w* j* Q) R5 | volatile long *addr;# R$ P' @8 q5 Q' G% A. Q; C( k5 I6 V
long save[32];
" N+ Y6 V) [$ k long cnt;( t. ~, [, V/ j# f9 {% a4 `; h
long val;& t3 V8 A$ j' u- [; g9 n
long size;
; j0 b9 T6 O6 X int i = 0;) b6 i2 f j2 y$ f8 {! s2 J1 J* f
* z* S- h3 r/ l3 J
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
' f% m% R; y" G1 [7 x1 ^; z( g$ N3 y addr = base + cnt; /* pointer arith! */
; F7 k% r3 x' o# O' k sync ();
4 X/ b1 X3 H' W, L! o& k save[i++] = *addr;
6 T. Y/ S+ w5 r* t$ E' a, B sync ();( E) b2 O" r, Y! {1 u: R- y
*addr = ~cnt;
?+ C3 B- W' c" b; ~) [$ r }
" j- e5 Y' Q8 B5 l
9 `% Z: K: h! r% [+ ~" m. U addr = base;0 |9 H) e/ v+ F6 M U
sync ();, I/ m% c, d+ Y5 y" O* Y- j8 V
save = *addr;
5 K5 ~ W% L3 a) K. { sync ();+ r- k# R* T. Q+ s
*addr = 0;
$ [) d. u( y4 g3 b& \! m
: }% Z# {# X3 u sync ();
9 `' N4 Y/ A( J# J; W% {- u6 T$ t if ((val = *addr) != 0) {
8 g' ~2 X$ N/ ~' E; I! S$ g /* Restore the original data before leaving the function.. x: {, x# g, M1 y2 D
*/
1 q& b( _8 a- ~6 M6 M sync ();4 ~! j# F$ v. f% \8 C
*addr = save;
- a$ z V$ Y c( t* K4 n7 \( @0 h, X8 ] for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {0 O4 B* ?1 ^) p2 ]
addr = base + cnt;
# t4 P) I! `4 d8 S sync ();! @* v$ [6 f: T1 z! D
*addr = save[--i];
. d% \9 Y7 J+ ~% l* a }
% X. I2 h! _/ Q* P. N0 P* Q return (0);
$ c% A! D* N: d1 H4 |/ y: O& ` }9 _+ c) W- I4 w3 j7 h( x* b
6 k4 m V: u# p' c. B for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
$ Z9 S' L! y" s$ p3 x addr = base + cnt; /* pointer arith! */
% G' j* i8 g" S1 J- p val = *addr;
8 G/ V- C9 }/ D6 r *addr = save[--i];. e7 o) t: K: \0 H0 N, |/ K7 W( b, P
if (val != ~cnt) {
( _7 G- Y+ V' u- v q; C1 g size = cnt * sizeof (long);8 g% n0 L" f# y
/* Restore the original data before leaving the function.
8 m! g3 [$ f- m6 P! }' d1 f */) y7 z$ O, ^. d8 R1 }* R' D. x
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {' |0 p8 z& i6 H" Z! o' C1 J* w
addr = base + cnt;
7 w' R- K' Z' R1 d; p *addr = save[--i];
7 W2 n: h* ]1 \& m+ \ }/ O$ ^* k, t3 s; t/ t# S
return (size);
, m7 a- J: j1 ?2 D1 {) q }; E" Y, s. g' }& J: H
}
+ t3 q+ w7 ]* u! ]* c4 X! n8 }( D2 g
( S# X8 C5 }9 X5 ^8 H5 T7 ] return (maxsize);4 G/ M7 ] p4 G
}- x4 b0 T, w; B; E
int dram_init(void)- p' B% z! M$ |
{
: X+ p! Z' \# V3 y8 N /* dram_init must store complete ramsize in gd->ram_size */
0 h& ~7 r( l3 A( y0 m' A' g gd->ram_size = get_ram_size(
- y% k; @" N( P/ U (void *)CONFIG_SYS_SDRAM_BASE,
/ Y9 ]( L% W7 Q, e CONFIG_MAX_RAM_BANK_SIZE);
' h. p( O9 |( E2 ^, q return 0;
6 H1 M- F! N8 W0 v0 N. D9 Z; B}+ K2 B6 B& k# d. k
0 k3 b% B+ M+ T3 K8 D8 A
% J7 t! |3 L+ N9 s( d' A+ |- S9 }1 A; c
/ \& d/ y W# K0 _$ s3 v
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
. _, o1 y4 V$ ]0 t+ c2 W! p! X; {7 e9 t* ^9 X* Q* Z/ k' p
1 p) _! @. q* i3 a
& O; P2 x0 f9 a6 }" _0 ] |
|