|
|
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
/ P: U1 D$ R# U/*% |& r9 R. Y0 O3 o
* Check memory range for valid RAM. A simple memory test determines
/ G/ E% z) U* T$ L; p( V; P0 w* the actually available RAM size between addresses `base' and/ @% l2 Y$ J7 P8 w0 [. k% \2 k
* `base + maxsize'.
/ R# l6 h: j7 h& l8 S*/
, L9 `2 a2 T* A6 k& Y3 v. blong get_ram_size(long *base, long maxsize)
8 b' n* Q( N7 M: p{
5 ~( _0 B' v" Q+ y$ Q' } volatile long *addr;% J& a/ K/ u9 Y# G# Y2 J3 W
long save[32];
' i1 ~+ P% ]' f3 O/ c0 M long cnt;/ H+ h h% m! {4 B* Y$ \3 P% A7 a& B
long val;
$ G& C2 S" J! G# g/ J$ k. B3 l long size;
* U! v! l5 K1 X5 k- m; X int i = 0;( O# Q% Q+ @* `4 M. g/ P
0 A |; s+ ~# z- r& |" M. V I& \4 Y( X for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
+ O) M4 Z% ?* N8 F9 W9 X addr = base + cnt; /* pointer arith! */
, F6 l- U- D2 @* |# Y7 E/ {. v1 U sync ();1 G" N3 L$ N2 T
save[i++] = *addr;. J t9 d8 Z) X# ~3 f! w
sync ();( z1 l0 R4 l$ N* }* h& W6 ]
*addr = ~cnt;4 H# z$ L2 g0 B7 p: |- Z
}
) O$ I9 z' a! ~' W9 b
/ U/ z/ c }/ D4 p addr = base;; H) O/ f% s, w- `# Y6 O G
sync ();$ o. o- p! Z; [7 ~: Q! H
save = *addr;
! c; S% G8 V- s. X# t; N* x sync ();
* p& [4 v! @ c* Q6 B1 o *addr = 0;
+ y1 Q0 C; Z3 t, G& u8 i3 V! `( e7 @+ J% L+ {3 @+ g/ _7 h& [& t
sync ();$ U' b7 r' d& J0 a* H+ g. F
if ((val = *addr) != 0) {
% t m& d3 g8 ~/ f7 o /* Restore the original data before leaving the function. `2 y R0 N! ?3 }7 z- y! M
*/
# b/ e9 A# R1 d3 @ sync ();
& v: q2 A. l3 H+ d *addr = save;
7 v3 J& q* v# Y* j% @9 {" n" z for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {4 r8 ]* ^" |) v1 u
addr = base + cnt;- K D7 u9 j; y, S
sync ();: L! G& a: u& g* m3 W
*addr = save[--i];
3 ^. m. H0 \9 l8 w! A$ v }
: |2 q' C8 T% [5 u% g% r2 u$ ~$ W return (0);- g$ J, Q7 R1 {# F! W; c7 [+ y
}+ L, h: }& z6 {6 M. o4 \
, C/ J1 o* x& k( V0 f
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
2 ?2 ?$ w/ J. A- j8 o addr = base + cnt; /* pointer arith! */
' \$ L6 c' K. J- ^4 _! w' |2 I) i. v val = *addr;7 u8 w6 y8 Q6 S
*addr = save[--i];3 `; N2 y. H, B/ ]
if (val != ~cnt) {
/ s# f2 e8 v$ f; R- W% @ size = cnt * sizeof (long);
# a4 c! {5 ^4 W8 K1 }# _ /* Restore the original data before leaving the function.
1 ^8 v$ Z( H" [; J */
& B( K, }6 X L! X6 b: Z5 m' v: _3 e' o$ O for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {3 v) z. u3 u* ~( e& c
addr = base + cnt;
3 S* q# |. r( l0 B! Q x1 G *addr = save[--i];& m6 z# c5 p( X, U1 S
}
4 i+ ]8 O8 x: a) u6 O" v return (size);2 T4 W1 k6 N8 `* D; U
}
5 m$ I$ ^+ n. D) B1 y }
9 w) w* P4 L. P
. \- |5 p% N2 p! n0 y return (maxsize);$ L& j5 B/ I, E) |+ W
}: _5 ^" _% Y0 f, Z) A
int dram_init(void)6 a& s i' G$ f* _" D' R
{
9 d$ p) A1 x- t u/ T1 d$ S /* dram_init must store complete ramsize in gd->ram_size */
. F5 K7 t* q7 ~6 E3 Z0 u gd->ram_size = get_ram_size(6 X. \2 Y0 D$ U x+ k. S
(void *)CONFIG_SYS_SDRAM_BASE,9 ~( A7 O& }# s) B- `$ c: q) N
CONFIG_MAX_RAM_BANK_SIZE);) V. H% a* b0 j4 o6 x
return 0;3 h2 L" D6 g8 P* S
}
( n2 g7 p, d9 H
# u3 [: T! T+ m8 O4 |! k
" n+ O7 K* U- C& M& S. Q% d( N" h& d5 G% K$ Q: [
* k* p0 Z6 D+ WFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
2 O/ Y8 J5 d4 y, M6 K7 K; t6 t; S# B. a
% b; d' F4 w- `* _
5 g8 H( l' P* F4 R! S4 d
|
|