|
|
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
8 @& O# Z( Q9 Q. s/*/ G! u( s U3 a& s% l
* Check memory range for valid RAM. A simple memory test determines: ?0 L- Y! r7 Q) g7 h
* the actually available RAM size between addresses `base' and7 V( C- \2 ^6 Y$ u0 ^3 n
* `base + maxsize'.
4 z9 v, w6 @% ?6 y, h*/! t( @4 d$ h7 K* G
long get_ram_size(long *base, long maxsize)
: t9 l+ q- k8 ~ K{
5 T# V+ g9 d) f' O |3 V3 W volatile long *addr;0 \; R/ f+ B9 t9 n" H
long save[32];( @6 J4 B2 p j# T
long cnt;! j7 a/ }8 h" J+ h8 ~6 L( B; d0 o
long val;; P) S1 A, |5 {2 ~
long size;0 z: T6 C$ a( Q
int i = 0;( N) k5 l$ [1 `
# @5 U' r6 u, I5 q! s for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
1 }/ S& m6 L) B addr = base + cnt; /* pointer arith! */3 {/ F* Y1 X# u2 Z6 t2 m2 s3 U
sync ();0 X: G/ I0 Z6 P T! C" Q
save[i++] = *addr;; P' k% R( a9 X* a/ `
sync ();
0 T5 x7 Y; M' @$ d) Y5 S *addr = ~cnt;
) h1 N# n+ c/ ]6 g5 C- @/ I. c7 A }7 O4 e7 n% @: p J5 ~3 c! F
3 Q# ~7 ]- u* _2 `7 j! c
addr = base;
' R4 Y, m) q% d; u& S2 ?8 E5 K* Z sync ();' T& O9 b- \! b
save = *addr;
F4 e( x: l$ r5 i3 x- t! Q$ W sync ();4 V( C, n5 ?- }9 _7 E; p9 N9 a
*addr = 0;
; X5 p7 @; |: Y0 q. p6 J
+ p7 k) q/ Q7 G. ^0 d' j$ u) {$ r sync ();8 I1 m s6 ?8 ^1 K( D& F; @
if ((val = *addr) != 0) {
( M9 }8 i) ` G6 U- v) { /* Restore the original data before leaving the function.
+ U" |$ T" ^: _ B- J */# r9 j6 L% h: K' q9 J7 ?% q% W
sync ();
" f; z0 X5 `1 D+ f3 q' f2 i% s *addr = save;% _3 t& I# l6 R* s" N7 o$ Q
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {$ x k2 c! R, d! M/ D- E: @3 ^: U
addr = base + cnt;
H2 ?# ~7 g3 C2 c; k0 \ sync ();8 U2 P+ v% w8 m- I% x7 u9 i
*addr = save[--i];
/ r- A8 p" o1 v8 Z+ z } t j5 L! V4 j9 ^1 x: y: \4 ^ Y' G
return (0);1 ^% [$ U" u$ T
}5 t S: j+ J, K/ f
- M5 R) W6 @$ z8 }; \ for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) { Z8 `. a3 K7 r% B% A* w# @9 E
addr = base + cnt; /* pointer arith! */
( B7 K `% f8 ~/ R( ]1 @4 p) u( c# A val = *addr;
! @& o( E* j5 T2 D; ` *addr = save[--i];
V+ \1 l1 W+ `4 n# Q2 Q4 G if (val != ~cnt) {% Y; d; e- L( j* ~) |! q* }
size = cnt * sizeof (long);
6 A3 n" E5 T w" S/ T /* Restore the original data before leaving the function. A2 l% G" a# O+ E9 F
*/
: @9 L# A- q0 T! |" y for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
* ?+ X) q0 L% k5 q addr = base + cnt;
) X: U9 n9 K8 L/ A* B$ ]. t8 X" ~ *addr = save[--i];
' P+ |: `5 P! ^: P1 Z3 k4 V }7 ?2 v, Z/ r: a
return (size);
2 b0 p9 _, J6 ^1 D# S }+ k) Z8 J- O& f9 X7 o4 k; S# A
}
! F! u1 I" O* j+ Z$ s' N: L" ~7 _
" {2 R8 h, b8 `* m$ h return (maxsize);
, t# q. D! j# w) S}1 L+ h0 B& \' h2 [' f1 |8 C
int dram_init(void)
: O z3 M1 R7 \6 X{+ D6 u, _- d( c; {% Q
/* dram_init must store complete ramsize in gd->ram_size */
/ }" a; {* F; S+ q9 v p gd->ram_size = get_ram_size(4 v. c7 x! Q% ^0 S4 i( |
(void *)CONFIG_SYS_SDRAM_BASE,
7 Q3 B" R" u% @! Q8 z/ J( B! E$ J9 J CONFIG_MAX_RAM_BANK_SIZE);
2 ~( ]: g: m! R1 d4 @7 u' q return 0;
2 O# P5 l% l* g" ]; }}
4 Z, _' ]) s- x
. s! S: \3 i& Q, ~5 \; {& a. O* n$ a: E$ v
) @ ]) u) `8 D. }- R+ l% e
& A. K. E. }6 ~FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
% |8 t! ?% B% C8 ]2 h3 O# K
; x8 p0 H! q0 f7 T# c
5 U5 {6 P6 d+ s( o/ S' f& T
) k' k5 p0 e0 P8 v# S |
|