|
|
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
9 c2 C- B; E; j# V% g/*
5 r! C9 Q+ z. I! N! g2 W1 H% A* Check memory range for valid RAM. A simple memory test determines
6 z ?9 [* o, E* the actually available RAM size between addresses `base' and
4 Y* q2 N( _( a+ ^. \3 K* @* `base + maxsize'.
' k; q+ W/ m* X1 _*/# F4 P# u3 ^: h% S$ C0 C
long get_ram_size(long *base, long maxsize)
7 J% Q2 a6 e8 c$ o* ?3 s I3 ~: L5 h! V{9 u6 p' y) ]) s! Q! x
volatile long *addr;
( l: c u, F$ c! C long save[32];
' u4 E* m" x/ [. h7 U/ }- S long cnt;
9 K+ U/ v, U' t8 L8 A long val;
+ r) N! j& ^; G9 q' [3 Y0 l3 _ long size;
2 C% e6 G2 O& J" p int i = 0;( @1 o% x* b2 Z) i; g Y9 q
' k) W4 \/ |+ H* t0 }3 p
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {; \# ^- P l$ \- f2 M
addr = base + cnt; /* pointer arith! */
" B) _: g1 E8 i6 H3 Y: o F sync ();
, J2 g# n7 G, v+ u save[i++] = *addr;& l: q) n4 M/ [
sync ();3 R( P6 [7 y" v% t; H4 z6 y
*addr = ~cnt;
, i( ^- v) r w }: ?% _9 H, @9 U }* L9 q5 Q
# j/ q; i" v! i addr = base;/ h6 m. B( Y% p5 v( m5 ~' o& c
sync ();& E/ b1 u. F% v/ }# u- ^$ {
save = *addr;7 S& l+ k7 r" f1 b9 @" _: u S
sync ();7 h7 |8 U! D; A" ?$ D. w- l
*addr = 0;8 a, W" x/ ~6 U! G$ ]0 r
- Q8 y- J, d$ E- V0 j J sync ();
! X+ ~$ C( q! _ G7 B. |' d+ G7 U if ((val = *addr) != 0) {' v4 m1 @/ `5 [9 k2 S' g
/* Restore the original data before leaving the function.; ~- A, d$ p6 B) J
*/, [7 Z1 j0 R7 z3 Q8 X' l& ~
sync ();
% m( G; M( V4 S+ Y1 E' o' r *addr = save;
3 y3 h- m4 B9 p- E for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
# L; j) `6 r# |3 Q$ E: W T% j addr = base + cnt;" j" d! `1 J& p$ t
sync ();
" `# H @! U v6 @: ^. a4 }) C( c *addr = save[--i];
* D+ F* {6 ^3 Z8 \ }
; j. r1 r6 t# \ Z return (0);9 K; ~$ n T# i
}' }" F/ s0 R6 q, g/ I
; I; ` l! q0 d& g! P- d
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {, p/ P0 S6 D" a: [6 I
addr = base + cnt; /* pointer arith! */& u; t% D' j! @" t$ n/ Q
val = *addr;
$ `- N8 ~+ z" P: O *addr = save[--i];
7 Q; a% W/ P& n% ^, C if (val != ~cnt) {
6 ]7 W1 [. e+ {. x) r" ^7 S E size = cnt * sizeof (long);% P5 ?% |! c: W/ E1 q+ q/ S! J
/* Restore the original data before leaving the function.
1 a6 T* h, I" ~, z */$ F6 l8 Y$ w5 d+ i& G
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {6 |! l+ ]$ C4 {. p4 B6 v: n# m
addr = base + cnt;# J& O& w/ _9 @% \% D
*addr = save[--i];$ n% s: z- O* ]+ r$ N6 U
}5 u1 _# \1 f9 E4 b
return (size);* A: g8 h4 H4 W- b- M5 H) z
}4 E1 D. r* s) @- P0 }. k3 T
}* T/ o' v3 L8 F
+ @5 O9 L% L4 L# I/ r( b2 |/ t5 v
return (maxsize);" v- X6 L: M5 B( i+ I
} z( s3 n( I; v+ X
int dram_init(void)
" r/ M! f- n- [" V5 h% Z i0 A2 p1 g{3 M2 f8 j4 J+ k+ h: B j4 B
/* dram_init must store complete ramsize in gd->ram_size */
9 r4 g: B j: K) x9 x gd->ram_size = get_ram_size(6 o& J4 F. B8 F0 m# r
(void *)CONFIG_SYS_SDRAM_BASE,. y5 }4 u) R4 S& }, g
CONFIG_MAX_RAM_BANK_SIZE);
/ v4 T7 F/ I1 p. |. C return 0;
- K5 Q! S, {/ }+ U6 e! E}* m" |5 y/ C; q. i) {! w! G p
( i$ ^3 \8 J4 v
. ?: l/ `% Q, O( H9 G* {# u. ^4 Q$ E; z; e) j' O+ W. @- p" k
2 e( s, {8 s. }: |
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!) T& \; O; w7 Q) h
( |0 b p5 T) i1 G: R) U }! t6 `
! ^3 j' |% e8 Y1 o+ V, N
) L, h) R4 q; |) v
|
|