|
|
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
1 @$ o. |* `7 v$ l% V/* h, F+ T& O1 b
* Check memory range for valid RAM. A simple memory test determines
( z& h& A% y: l8 y' N* the actually available RAM size between addresses `base' and
6 G; N- I5 d# C1 y& F$ k4 }* `base + maxsize'.) t; @! X2 ~3 y, V
*/4 O- B4 T2 i' c) ]/ \5 R
long get_ram_size(long *base, long maxsize)
+ E! c$ g0 }( A6 X+ S) `{- A v, U, e' Y. X* D
volatile long *addr;
6 G/ n' h9 i) H: }( P% L long save[32];5 a7 J! R( p& `& O4 W- \7 N( n
long cnt;
3 Z: W: z# I, {8 U# [ long val;6 a+ a$ }+ L; e8 R
long size;
" g9 _1 d3 m# h- c+ V0 j int i = 0;. J# d6 O* ~( l( l" R" V$ c, M& l
0 p) ]. G. M& M3 q
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {' h) t W/ w- ?
addr = base + cnt; /* pointer arith! */5 @$ b/ B3 z) Y
sync ();% v+ A( e' W4 J( n7 @* R
save[i++] = *addr;; v+ d) r/ A+ v P* ]: f& \: k5 ^% A
sync ();& U2 C1 }3 p* m- ?# r+ d
*addr = ~cnt;
* g( Q% ~6 w! _. z( K. J }
+ Y; t5 d* s6 G: G9 z; p: b" \3 K! y' D7 ?- H
addr = base;, K# C% G, c; ]8 a
sync ();- C8 H) j; G6 l' q# @; c) c9 M% J
save = *addr;6 r1 v0 t4 I4 @( p3 }
sync ();
/ i9 b, ^1 Q! ~% y- N* \8 g. p8 F8 L *addr = 0;
* ]* K: D5 e/ f$ i' R+ q& l- y- w6 n- h& T8 k0 d# `9 H
sync ();! m9 ^, S, x, |2 [+ o d
if ((val = *addr) != 0) {, J5 i# |! I5 N x3 E8 u$ a
/* Restore the original data before leaving the function.
3 F) k0 s: t/ U; g! i! F+ |2 n */. e- O- u$ H, w" |* Q4 q
sync ();
- X1 {/ W+ l6 A# c) g! K( r7 E: t2 ? *addr = save;& r7 e+ t) [: C5 l$ M: U
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {1 {5 |# L& |3 g
addr = base + cnt;( g2 p( J" I7 a
sync ();
9 |8 G' c |! m1 d2 ]2 `0 K8 ^ *addr = save[--i];
3 f- V! {* c9 x q" U }
1 ?* F. S2 u# Y1 a; X return (0);
, X$ j6 y+ { W+ {: P! ]! [# v; m }
! y; {/ S" e" `+ L
, p0 r5 P8 N/ Y for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) { ^- W# Y- j7 _ W) T
addr = base + cnt; /* pointer arith! */
" n v( R) @/ W& O- u val = *addr;
& V3 g# `2 \' O *addr = save[--i];
6 y# v) o6 z; [" r7 P7 z/ b3 C if (val != ~cnt) {
- R9 C, C* c9 j2 E7 f9 L size = cnt * sizeof (long);
" Z0 n; m; \3 B7 S7 E /* Restore the original data before leaving the function.! Q; B5 R$ q$ }
*/1 }) T2 w% I% W5 K3 e H
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {: G8 r- ^4 y0 |: u# H
addr = base + cnt; I& E$ x) a; P6 r9 i5 q6 O
*addr = save[--i];/ H5 g$ y2 t) T, U; o5 V! v% }3 n
}. w2 F2 C8 S0 y7 K- x
return (size);% s8 N& L+ Y3 q) g) o0 z
}$ ]7 c: g- |+ i
}. J. p. u8 T1 q: [3 S+ u
6 m% [8 L6 ?6 N2 o return (maxsize);
9 O2 B; i8 ^' u, i% h2 l' i5 o}
- D4 r* \4 b6 D' T, l1 Gint dram_init(void)
2 A$ x8 j' N/ }5 L{+ I a- Y6 n* h! F+ X6 M
/* dram_init must store complete ramsize in gd->ram_size */ _, ?, D4 b6 Z' q% {
gd->ram_size = get_ram_size(5 W3 g2 f' e6 @4 b( B# J
(void *)CONFIG_SYS_SDRAM_BASE,8 u( w6 M# \! I/ \
CONFIG_MAX_RAM_BANK_SIZE);
8 X7 Q( _ o2 y* U! M0 w return 0;! l' `, C$ ?5 ?1 a* U$ |9 D8 Y1 u
}
1 b, P" L, j2 N7 E5 i7 N3 w* C5 v4 C- U; Y# R1 \
! F0 U8 b ]8 o/ K3 L$ n8 D& r% f' x
4 ~8 a# V$ y \; L/ ~) [6 P. C. ~4 Q Q
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
' `8 h2 ^1 D1 T7 F' {: g
( c( B O& v) _
( W4 L, \3 b; b7 a- B; q" p) p7 F+ a
|
|