|
|
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
/ B/ p% s2 s3 l! Y! i/*
7 G5 d% X2 c+ Q* u, R* B* Check memory range for valid RAM. A simple memory test determines
# S5 W; i3 Z- U. z$ Y* the actually available RAM size between addresses `base' and
7 n# g+ y. r0 q; h9 \5 i2 ?1 S* `base + maxsize'.
# U) V7 I/ K$ w+ l*/
. }. p+ b9 s5 v5 }6 {' Vlong get_ram_size(long *base, long maxsize)% c! D9 _+ I+ S$ `$ z. J& ^
{
8 o- O2 R- L5 S$ A; G, f volatile long *addr;
* c4 Q [2 M, I long save[32];
- P( b8 {4 i O! D/ [9 S long cnt;
& E c7 ?4 K4 b( z! E4 q long val;( e1 `# k: v/ I) D
long size;9 y4 ?8 ]! l8 j9 N1 \2 t
int i = 0; `3 G) K0 Q% h1 r# Q1 Y: ^, [
6 n- a0 d+ D+ R. [% Z for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {/ @9 E+ A& W; _
addr = base + cnt; /* pointer arith! */( C; H9 J, @+ p; ?; S. m/ J4 ]1 B# ?; \
sync ();
. J/ r% |. k$ \4 L- I1 v6 K( U* z: P save[i++] = *addr;
/ q. ^$ B0 g5 w. D4 ~ sync ();
) M" y' L* s) C V0 G$ V *addr = ~cnt;: K0 u1 {1 Q& x
}
. X9 j0 l+ }8 C9 V7 e& T/ Q4 i2 D
addr = base;
) H6 S. _( ?/ G1 R T9 k8 f; k sync ();
: B) r9 ], y) D save = *addr;
4 t: A" l/ c* o. K7 d5 c sync ();3 B3 W- o2 ]* F( D3 ?$ j
*addr = 0;" S# o. c: b" R k6 W
3 K5 \3 Z: |2 e" Q sync ();
/ e2 }0 f I& x9 | ]' Q if ((val = *addr) != 0) {- X( O" x4 B9 \* k& B
/* Restore the original data before leaving the function.4 i2 l' j6 r! ~3 [; s2 w) _
*/! d5 A ?3 O4 N+ ^- m" {
sync ();' s- ?. W0 z# K% j
*addr = save;
. K/ o% P; H6 Q4 H. w" H- l. Y for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
# p3 Y! H5 L0 \9 L: r6 p addr = base + cnt; F/ N, w9 \$ G6 t4 X* y$ o' T
sync ();# u/ W* Q) B+ T# j; q) o. B
*addr = save[--i];
2 ?' ]% A+ S1 g0 w: L5 W, |: G }+ w b8 H+ J+ K: w m" [/ S" c
return (0);
* ^# [7 j$ T" z# l' t& I }" y/ J1 e& ?. A: {, L( ^
( C, k8 v) I, | for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
) l& I& B$ y8 J9 B addr = base + cnt; /* pointer arith! */8 z4 t$ U E3 [: Q
val = *addr;
+ n( R) W) P2 Z, a8 D. q *addr = save[--i];# @ u& |' s! w
if (val != ~cnt) {$ [2 q1 S! {" V: a7 c
size = cnt * sizeof (long);
( w+ V+ Z) P7 D" j' d /* Restore the original data before leaving the function.% S" f+ v+ i: b* N, [/ f
*/6 A: d& P' Z) Z6 R
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {+ V) ^0 X Y5 a. K( K
addr = base + cnt;
; @% z J5 G7 d( K% V% @0 H2 R *addr = save[--i];
T2 t+ i( e* R3 Z3 t }
9 J4 \8 \& G% Z6 O return (size);
, c" X+ q5 B+ k- s. \( W5 N. q }
( d: B/ a# o5 L) B }8 o+ C" d& L z( P
1 G! u0 }: n; q- ~" c! q9 A
return (maxsize);
4 x! c! q$ M. ] ?9 ^/ S5 |: P}; A4 j7 V" t9 I v* D
int dram_init(void)
7 W. w, D9 s0 X" ]: R% G{
. N/ z9 C5 C* l /* dram_init must store complete ramsize in gd->ram_size */
6 `0 B* }2 X$ W5 ` gd->ram_size = get_ram_size(
3 w8 m/ J) c$ D (void *)CONFIG_SYS_SDRAM_BASE,
; j: m) }! h6 o/ ^6 n' y CONFIG_MAX_RAM_BANK_SIZE);$ w, L9 {) P0 D
return 0;
# W5 q: T L! ^4 D8 G+ k} ]) r$ Z4 f6 w* e
: K3 I1 i* X" i0 A0 L2 @7 A
. k& L! z$ [ p0 F5 ]- D
2 {: A# F9 x, q3 T
! a1 H* f, E# CFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!0 w2 O% H! L3 M: m& z- p$ U2 g5 q
7 k3 ^; X& i" W8 p
5 F& z) z2 ]' K7 t
. }9 k3 j- @/ I. b
|
|