|
|
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:( Z# y+ V5 `) u) }% i7 l7 A
/*
$ f6 T6 n7 P% r S* Check memory range for valid RAM. A simple memory test determines
9 Q+ y) c4 I3 M! e x' }6 ]* the actually available RAM size between addresses `base' and
[9 o( @% O" J4 c) ]5 `* `base + maxsize'.! f: y, [8 H% K* T. J& Z$ S+ C
*/5 z; }8 _7 X# v. J
long get_ram_size(long *base, long maxsize)
9 O2 H) p/ Z$ H8 e0 R{
" Y* J1 @1 ]6 u" F+ y8 d0 V, q' M volatile long *addr;
5 X' {9 Q8 [. o long save[32];! n: {. T% S6 T8 u' \
long cnt;
# c R. A x: p, b! j- F long val;7 j" z8 T1 T0 `; I. a, B
long size;. p; x9 `- p" }% ?, e$ U
int i = 0;
2 q3 C2 T! p# q* l7 {2 o$ W0 {6 h9 s) Z0 @& H; `
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
' N; C1 u3 @( J- n; l) q0 S, R addr = base + cnt; /* pointer arith! */
@$ ~1 L. X8 i1 P% s2 w sync ();
, b1 N% y2 v: W! Z" {! H5 w% H save[i++] = *addr;" h& O3 g$ U5 l
sync ();$ p% m# N0 p) B0 R1 Z- c
*addr = ~cnt;
- ?8 G; }9 i' T7 L' x* S }
0 @/ ^8 l( @; ?. N; u
" i# E1 N0 _! z6 Y9 U+ N addr = base;
) o' W+ P' ^; F' t3 ~! m" ? sync ();1 e& ^0 F6 e: \! K
save = *addr;: k, j" s; _9 |9 U$ e6 B% {! ?
sync ();
0 u" S' U, `7 o* U *addr = 0;
$ ^( z/ b+ M5 T: \6 d( J" U' G) |4 r' i8 M' d
sync ();
& J+ B7 u7 s. }+ g( r/ [ if ((val = *addr) != 0) {
' g: ~. a1 [' m /* Restore the original data before leaving the function.6 l2 J0 D- Q! h- O+ b
*/
; O4 h2 R/ U. R9 _& P2 C+ l2 b3 w sync ();, e9 k/ F* H8 `2 I/ K
*addr = save;
9 a+ [' @3 u- N# U" K2 z% }7 p for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {/ M6 G: w- b+ b+ J3 D
addr = base + cnt;
" }9 O& ?1 Z9 N# \ q" \# R, _ sync ();
2 [; q( L8 R4 Y- l# f *addr = save[--i];7 n9 H# Y$ J" u+ v5 s9 G/ S; C
}# C1 H1 b8 L2 ^2 h, F
return (0);
8 H3 g9 A2 @! N, Z( `/ j }* I9 n/ ?0 K8 l& O' X' L: H
4 ~$ w5 H0 R. \ for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
7 P: R8 A h1 E( F addr = base + cnt; /* pointer arith! */
. Y9 U+ k: U* d) y- Q val = *addr;4 w2 c I4 q) S
*addr = save[--i]; ~# B; z" C( w
if (val != ~cnt) {
9 t: v2 H8 `8 f& |6 i* v size = cnt * sizeof (long);
* M( E7 l& e Z /* Restore the original data before leaving the function.
4 ~2 k% z0 ^- f7 u3 K */
' j% J. D& V1 O% Y: J- g for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {/ L+ M( p; R2 v% z4 c) C
addr = base + cnt;
/ ^2 |9 S- x5 q- h) K9 T *addr = save[--i];8 B: ^* R p3 B! t
}+ [" c8 {4 r# a3 b2 O. t& N
return (size);
# ?1 K) I) J, [9 z' I }/ ]3 ?0 q; x3 M1 q8 Q* D9 m
}
1 I7 ]- _8 ~, b; z9 e; c0 V0 A/ \* d9 t L6 g
return (maxsize);
) T- b9 E' J$ ]1 d1 `- N}
; R5 P8 M0 m) w$ \+ o, ?0 I2 q. _int dram_init(void)1 \7 y8 N" U) {- d, A; k: F
{, V! F# g, q5 U* {5 u
/* dram_init must store complete ramsize in gd->ram_size */
) p5 U9 O, h4 Q/ {3 ?0 O gd->ram_size = get_ram_size(9 [/ z3 H! Q. V9 n
(void *)CONFIG_SYS_SDRAM_BASE,
4 {3 s( l& L- a7 D2 H CONFIG_MAX_RAM_BANK_SIZE);; H b" m9 ?1 _) ]
return 0;
, o% [0 h$ L$ ^) c}
6 ~! ~6 q% S; I. ~/ g# q+ s9 z7 J4 K& S
, \, U4 K9 r; f9 `& \' Z9 D$ l, p9 e% J. \% Z
( F. L6 E: q, r, G' t9 J$ [9 ]
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!& f! {+ r- Y2 C# }+ t
, g5 E5 W) j2 a% t# B: I N' b; g& z8 O0 q
/ s" @$ e% a8 y4 s2 r: T, Y |
|