|
|
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
% m) k6 V9 \% {; b9 d' ~3 U; f0 U Z/*
' O5 S# e. U+ c1 J* Z4 g4 s. M+ O" }1 q* Check memory range for valid RAM. A simple memory test determines
% n1 X( H! B# j/ t* the actually available RAM size between addresses `base' and
P" b+ o6 H# m* `base + maxsize'.5 b/ K/ |2 d9 q9 D% I; r |3 ^) l" H
*/
: l8 R* Z; J' }! Y% Blong get_ram_size(long *base, long maxsize)
4 `; b( c7 b7 M+ p{
; Q" K# L A e! N) W5 P volatile long *addr;
9 J7 N4 v/ ?6 f$ S( E- ^% [ long save[32];, W8 r' w9 T( x$ U8 U
long cnt;
1 }9 `. m6 y; A8 _9 b: F9 H long val;. b, z# b# E/ N6 t1 J* ?4 f" W% `/ l
long size;
: \3 C8 _5 V! j, v6 U4 _0 P0 c int i = 0;
+ \8 ]6 M/ l7 D+ N/ q8 p2 `
( ]& [% }$ L; M s6 S0 k for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
7 a2 j! G$ x! f) ] addr = base + cnt; /* pointer arith! */2 n6 U5 N) u/ R f7 a& p: W+ n7 [
sync ();$ K+ e* R6 ]4 C9 p
save[i++] = *addr;" M8 S3 Q2 _* i ~- p3 ~
sync ();, E, v, [6 H- o& F7 H
*addr = ~cnt;
& }& V! a! ]5 C3 c/ T }
* D5 }/ ]: \6 s8 P4 G- Y! P
' [1 i+ C7 L1 D addr = base;
' S; @( `4 T' \: N1 J+ X sync ();7 e# d, Z6 o8 t9 o& D3 C5 ]
save = *addr;1 X& d/ G: p8 t! ?% _. p
sync ();
: ^% ~8 r Z, N6 r% U *addr = 0;; ?6 g% v* w" D7 I
$ E6 ]6 e5 R1 @3 S [
sync ();
2 `( H/ R! b5 d8 @ if ((val = *addr) != 0) {
! h: Y; x Y* [' O r /* Restore the original data before leaving the function.
4 s; h: ^7 s; y. x */ G$ J+ P$ o1 y! F! q2 U
sync ();
2 u7 r* K8 N: l4 J5 B; J+ n *addr = save;
: I9 r% t8 b6 \' n$ K5 H* g3 { for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {" q. t/ l7 R( K
addr = base + cnt;
) u2 m- `6 F/ x! Q3 N, S sync ();
& N R& {. h. L* s *addr = save[--i];
# U7 u" {8 `0 M) ^6 T; V8 A4 t }: u1 r% L K c2 p: Y2 V: _
return (0);. D' P( ^% R8 p3 n9 Q6 E
}
1 i- _ F3 k" b6 U: s) c
% i" S2 |+ H {( p% S# |- _# { for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
M; p5 c: B) ?% M* t" S addr = base + cnt; /* pointer arith! */
2 z( v, X X$ U+ | U% X5 p% F val = *addr;
! O- X- ]0 H8 j4 L& O* l) Z3 F *addr = save[--i];/ h$ ?9 J9 c D0 T
if (val != ~cnt) {
: C. M" Y8 x1 N$ g size = cnt * sizeof (long);; V5 `0 I+ f, r& M: t X$ ~
/* Restore the original data before leaving the function.
4 v+ I8 ~" p! ?/ M+ X, Z *// v6 G) G5 ?7 u% ^( }
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {3 n' a+ ^% ^1 G4 Y
addr = base + cnt;
4 @3 D# o7 p: i3 R *addr = save[--i];
$ w2 c+ t9 _! r6 D5 H% ?! t }
; D7 j9 u! u c- h9 F6 L return (size);
4 q8 Q9 b; M! K9 j& b0 T }
; }3 f0 X1 Q9 \' J6 Y }
3 T' {5 p' B' K' p. R- r! u* Y# c# `+ d* N& V& P$ W
return (maxsize);
6 P/ E: j: @' M% [6 g1 f5 Q2 y0 Q}
# I' z3 s0 {/ Aint dram_init(void)
. i1 `0 v. s! C' J{
7 p7 z( y/ c) Z) e# b& T' \ /* dram_init must store complete ramsize in gd->ram_size */, g5 ? B S+ `# e; c U* ^
gd->ram_size = get_ram_size(2 H% b2 v5 O! P. R( W& B
(void *)CONFIG_SYS_SDRAM_BASE,0 q; }& @- R" A/ [
CONFIG_MAX_RAM_BANK_SIZE);
7 P7 n3 l" O1 [/ Q+ |% r( i return 0;/ V4 z2 A9 V. e O* K/ o8 l
}
) ^3 O$ v/ F0 y H2 {
- {* t% h9 ]4 |9 o
4 G/ A) }+ g1 U9 \; ^9 G
7 e; R# O% K# p! X Q. W' v: [0 [ s a- b
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!' D9 Z! b1 |/ s: u0 m, h" z$ g
2 D4 r" Y: M8 S( r1 \
4 Q# [# L. f; q2 y" T1 Z
+ U0 B# z2 U6 e: t9 a$ t, | |
|