|
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
5 x% ~3 O* g& ^/*) W5 S, }6 n; X8 W4 l
* Check memory range for valid RAM. A simple memory test determines
- b: e, Y- t% O# I* the actually available RAM size between addresses `base' and
5 ~+ r3 [' }0 R _3 g# x* `base + maxsize'.+ a1 F1 u1 [3 ?7 x( g7 R9 G
*/
G! i1 F& g; Z2 c/ flong get_ram_size(long *base, long maxsize)8 w. E+ m: H; G( |( v, z, u
{
8 ]) C2 R, B) Z: g4 Q volatile long *addr;( s. t" ] C$ W8 U3 }: N2 m7 `
long save[32];
8 x# j; z5 u3 @& y% F; P. B6 D% h long cnt; p# V9 k) i1 d$ S% F7 Z$ Q
long val;$ u2 o3 m% E" u$ P% g+ I3 S
long size;
# `2 m, O. {1 u+ T# ]* Q. Z$ v2 q int i = 0;, T p% h J, k" |" i
& h' U- r; T; [' F* J }* Y0 y
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {. U! q. B, [& e; V2 g% W& [! F3 @
addr = base + cnt; /* pointer arith! */
! i* u& c: } o7 D: R, @" ]$ f sync ();
" i# B! N0 G a3 n save[i++] = *addr;
4 Q$ ?! b5 r+ Q/ \$ u3 k sync ();# `3 K' u2 \$ ^+ E
*addr = ~cnt;
9 j$ z* c1 d: y! |( c4 ` }% }! v: c8 H& c
/ j) `; J" ]8 g
addr = base;
( k% F; \1 O* M, r/ M5 [ sync ();
1 _+ I7 n- _% z2 x9 o5 X8 V save = *addr;' x; t4 Y w, b) U. s1 G0 ]* Z5 p
sync ();
q, O& v2 L4 I! K *addr = 0;
7 ~6 E" Z- Q9 b! u4 @; C
5 r# ~% E( T' L6 q. B4 @8 l sync ();8 ?; X+ t1 |; C/ b& ~3 f/ O6 R. M
if ((val = *addr) != 0) {
3 t' I/ l) d$ M( t& _- m, S /* Restore the original data before leaving the function.
8 u, G4 c; U4 c/ v' ?7 Z+ p */' s# W, n. R5 s, G& W9 B
sync ();
R. W. A- k. a, S; f/ Z0 w *addr = save;
! R% j/ q+ `' P for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {( ]$ J3 O* R0 b
addr = base + cnt;
0 d i0 a- x5 I) I4 H sync ();# Q8 r5 P* _6 K+ D) ?
*addr = save[--i];
/ ` M4 F5 E, P. } K4 F }2 ^$ O( A, A8 {0 T
return (0);
: h9 Z# W" k4 G# ^- S) x }
! X1 X, J1 K3 U* \3 \. a: x8 i' C. |/ ^( a) n- b. r- {0 ?. B
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {& y$ I z7 j! s2 f% x% M$ l
addr = base + cnt; /* pointer arith! */) s) r$ l* S4 q( x4 F! B& e
val = *addr;
2 l) [/ i1 M' O/ s1 P7 V5 X3 a *addr = save[--i];
0 R. y( A- c/ o( ?$ z, J if (val != ~cnt) {
2 H+ T, C( x! y% B) z) p8 Q size = cnt * sizeof (long);
! }; {8 k$ F& q/ s6 H( L /* Restore the original data before leaving the function.
1 N( k; P/ B1 x6 c6 y& v */; p4 n; n9 d+ T( z- I
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) { L; ~6 q" H% j @/ k
addr = base + cnt;2 v: j1 V/ q# T
*addr = save[--i];- f @1 l% b: L. k
}
- S- K( b2 m$ Q* S7 X return (size);" r- N. g# f3 F$ j
}
- a+ J; S1 O) T( @# ` }9 y4 c" R" S+ I9 A5 J7 v: q
) e3 I/ a+ j. _0 M
return (maxsize);
9 J1 G& Y' J6 |5 b# z}
7 w3 t9 C: E: Z9 o0 Kint dram_init(void)
6 {) e- [& C- U8 ^/ \{
; a8 F9 G; f8 |: p# b) v0 J /* dram_init must store complete ramsize in gd->ram_size */
4 [" w( a+ @0 m# Y gd->ram_size = get_ram_size(
6 j& Z! ^0 `; P: z" G1 s (void *)CONFIG_SYS_SDRAM_BASE,/ ^3 s" S( F+ X7 k# o3 o
CONFIG_MAX_RAM_BANK_SIZE);7 ]+ w, r5 p U: Q5 W) H
return 0;& ], ~' t# g" k2 @7 d9 _ O
}, d$ U/ S M- w* W% J9 i
* Z& h3 o( W- {0 {# G
6 U4 Z6 @8 g8 @. o3 N, k
( x* m( v Z. [9 v E, ?8 s
; B( x5 j% r1 |* ?$ j( S1 q( wFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
" p' ^2 ]# d# m
8 w/ `( L% Z/ A4 Q+ w2 Q
2 Q5 d5 A9 ]) I$ U; b' p: o, H/ @, v! U _
|
|