|
|
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
$ w" J1 b: ^% w, T7 E' V/*
" o: m& J6 J1 Q* Check memory range for valid RAM. A simple memory test determines
% ~# q! e4 p$ O' n2 ` B1 n* the actually available RAM size between addresses `base' and
) n- B8 C- z2 I) {6 U- E* `base + maxsize'.+ [% T5 Q% q7 v! A+ R* e# W
*/
4 d7 Q- w3 \. along get_ram_size(long *base, long maxsize)# R _* [+ c% S
{% p$ S% B7 v& A# i$ w0 n" X" _- }
volatile long *addr;
" n8 d( {( d' e; P. d8 s long save[32];* z% [+ A: G7 ?6 F$ G/ q: H
long cnt;
* v! r% @5 ]3 }- w& { long val;
* q: {& e( K; y7 B4 L/ { long size;
$ d2 d$ z. j( [3 f int i = 0;
2 k: r5 \# l# l( j0 Y, f* a% W: f6 s: t6 \
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
" ^' l2 x; r+ J7 R k2 w addr = base + cnt; /* pointer arith! */7 c5 B4 k8 P9 e3 S, ^1 i
sync ();9 T, E4 b9 M4 M h4 [
save[i++] = *addr;
9 U9 }3 B9 k( ^! s* p. [6 I sync ();
# B+ W0 u9 t" u6 K2 X% J *addr = ~cnt;2 x' c: z9 ?! Z/ }
}
" d! z+ y* E" u7 h9 x$ x
/ R& M# O n5 d' X& Q5 b7 i addr = base;/ Z( E- f5 z3 h; c) [( I$ G
sync ();5 B: j0 I0 ]# N5 j3 _
save = *addr;
0 D P8 [! o: t/ [' y1 q/ Z' { _ sync ();
2 M: O6 \" ^! k# z" v+ d) u; l6 z *addr = 0;
# c* f; ~8 n7 b7 W% {' W& A. H, G" G- W
sync ();
- ^. m. s! x) r4 H* J6 z) Y6 `$ D if ((val = *addr) != 0) { y* J) R8 w @! k
/* Restore the original data before leaving the function.& }/ W* M# F$ R% W* N5 O
*/
: q4 t% f- v& } sync ();
# L8 l) ^5 } `5 e% @) c: ? *addr = save;
; _7 T N& ~1 ?% B& b) s for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
, \. B8 d! R9 {: h3 U3 @, @) R8 e addr = base + cnt;0 i2 G7 A& E0 [" o0 F4 X! [/ a
sync ();* ]9 u0 S9 H q# j" D2 s" p
*addr = save[--i];
p: U- \6 o+ i0 F* f/ ^ r( o }' k. {4 M$ C( k+ \! g
return (0);
3 b! n! `: Q: _+ @5 p/ Z }% f6 L1 F' M5 {: e. U) `. Y' j
2 ~/ o S% E* S* e4 g0 i for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
- u* N% K3 R2 W( |5 G$ ` addr = base + cnt; /* pointer arith! */
: u0 m( ]5 N( E val = *addr;5 B/ k/ x! v; c( u) h/ H/ {
*addr = save[--i];
! D$ b* T) u; [/ b/ e if (val != ~cnt) {5 J4 h- ~. g7 A7 x+ J+ X/ q$ K1 H
size = cnt * sizeof (long);6 _- I7 q2 d9 h1 {
/* Restore the original data before leaving the function.
3 T- w' W5 L# T- G$ r: Z5 \ */8 d! A6 a% H: j8 G) \
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {. ?+ k0 [$ {! @/ p/ D
addr = base + cnt;
! X; v/ t- C9 k4 M/ v) t+ H7 f *addr = save[--i];
4 X& s: h o* k }
" ^* V8 G+ f0 g return (size);
: s1 d }4 @# B4 C0 l* t: [ }
0 `6 V4 ^. v5 a }
; ^0 P& Z+ q" x6 b# B& b
) n _. D3 E; E1 T) R; ?# l- I return (maxsize);
6 J# r9 U* l( n" h}. P) `" x0 y. h5 W C. }9 [/ R
int dram_init(void)8 C/ p; q$ Y& C7 p: k4 ^8 ~
{! P4 U& C" y8 Z3 @2 }$ p$ y0 {# u
/* dram_init must store complete ramsize in gd->ram_size */4 A% T6 e7 r7 @. U, {
gd->ram_size = get_ram_size(, m8 J8 H& Z4 ~8 Y I8 h
(void *)CONFIG_SYS_SDRAM_BASE,. B3 r- P/ V! U- W; B9 i# ~
CONFIG_MAX_RAM_BANK_SIZE);
4 X0 @0 t' _' |# T- A; z return 0;
' K/ T3 a) b8 W, d; u( P* d}
8 p t0 v+ D) ]) ^6 ]& ]8 w& r3 G% S7 N ?( f& U
! U( s& @3 G; B6 Q1 m
w. _- v+ \3 V$ O5 S6 j4 \) v- c! {
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!1 A* ^) c6 q8 ?# |3 d6 y
+ J1 B2 _. e* O/ q/ S Z+ X
8 i9 J" y* s! l( D, L7 Z
" f5 n! u6 F( x: ?/ L# A |
|