|
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
/ D- n6 A: j8 v/*# F. ~6 \- ^& `
* Check memory range for valid RAM. A simple memory test determines6 A* Q% A' h; [' p
* the actually available RAM size between addresses `base' and
: b7 L/ R0 s5 P* `base + maxsize'.
5 U6 o; x" Y" G5 u8 z+ @*/
5 D" ^ F* }9 G: n' Ylong get_ram_size(long *base, long maxsize)
0 ?/ y) u4 ?# t" `{
. V7 @1 t( p( c& I# z volatile long *addr;3 R# `6 S# Y* f- `
long save[32];- N" \ M8 V9 x- ]" {( h
long cnt;( y7 D, j6 F$ A$ W+ a
long val;
- O6 C/ ? I. a long size;7 R h- k$ W5 ~9 W& t: }6 a0 q
int i = 0;9 s& X. ]$ p: i+ f/ I
5 ~" M! ]1 x- d& _7 K6 {
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
7 _% C! d+ Q5 T addr = base + cnt; /* pointer arith! */
$ ~ g: O# c/ Q x2 n, ~: V sync ();4 H5 I* V+ F* |; x# _
save[i++] = *addr;" ]; ^8 x( a u' C, P r) O
sync ();
9 b7 [% S9 l$ h& G3 `+ s Q/ s0 r+ A$ P *addr = ~cnt;
/ c) _; n7 \& v }
+ z F# K! c/ S& Q. ^! h, @* P% L6 w
3 s5 j9 ~1 s i0 A1 x, t addr = base;. {: M; D+ b7 Z: m. p
sync ();. P& p' [. c* w# Q% m& J- G; q
save = *addr;
. v0 v* q% y' S sync ();
. S/ A3 ~) U2 } *addr = 0;
; k% Z3 t( {% ^
6 T: ]& |$ p1 q U- ^ sync ();% E( M( X" }/ d! k/ W' a1 l/ X: V4 D
if ((val = *addr) != 0) {; l5 p$ i3 \# n: `! _! v: I
/* Restore the original data before leaving the function.
' v0 N4 K, G# q1 q */
% e9 c6 R, u7 s7 M9 A5 G sync ();
# Y: o4 @% |2 d2 s$ X2 R: z& q *addr = save;/ ]* g" L& [; O& L( F1 }/ I; A
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {8 Z6 I! {' R2 R- ~
addr = base + cnt;
4 C# T0 D5 ^) @2 x0 _" X sync ();
% N; L* P! y' k5 D! J4 C3 d *addr = save[--i];! P" U5 X' o/ r6 c0 m2 t
}
* a! X3 M# i# G/ b return (0);7 V# A; L7 `9 ^( Y
}1 @6 Z( X4 l! [
' t# j' S% s3 a. K# f" Q
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {. _5 x: e# N3 ?6 Q2 Q# o* @
addr = base + cnt; /* pointer arith! */
6 i! \9 {& ?6 P! V val = *addr;
+ L2 I- |( n0 P* e- m *addr = save[--i];
( Z% s3 t4 j) D, ~ if (val != ~cnt) {
3 C- [+ K* a2 w) Z. @4 X, }! z5 } size = cnt * sizeof (long);/ p' K4 J1 x3 N
/* Restore the original data before leaving the function., H+ j* Y$ G5 s8 E& ]/ q3 Q- J; y
*/
) z W0 v& F# q for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
4 T0 y" t; {" O" S addr = base + cnt;
. }: r3 {8 }! f$ S% M0 G1 l *addr = save[--i];
/ P4 v8 w0 b5 Q6 k% a }
6 A/ \# ?8 k& o1 ` return (size);3 v6 }( ]- H# P) F) t
}2 a7 c0 q0 k$ k- U3 \
}4 P' g; }2 |: C, h/ w5 Q6 s8 W
1 e: b5 i, l" o return (maxsize);4 s# J* ?* X5 T F; z1 V
}
; p% _2 p6 [$ P# i, `int dram_init(void)5 c2 }! \4 ]. ?- U
{
+ m( ?1 B) w6 b+ T3 b3 I /* dram_init must store complete ramsize in gd->ram_size */$ T1 m7 F, w0 g+ m' {
gd->ram_size = get_ram_size(
- b2 H* h2 G) B% V& S% n (void *)CONFIG_SYS_SDRAM_BASE,' k# Z3 B3 v* ~( u
CONFIG_MAX_RAM_BANK_SIZE);
% L3 P& a' P- K( K3 m4 P return 0;
& e' n$ _, v5 t}% z& r; X4 c% w1 |7 p: B! I+ s
* W6 y2 k: V5 j u
0 k( T1 u6 B% k- w3 S' M, V6 c( I) r, w! ~$ n4 |( Q
, A z& Z. f1 `/ V" [
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!/ u% X) P/ ^8 U( Q7 r0 o7 }3 @. S
' @! w' A% T2 I/ W5 d4 _" v( D6 O# [2 t% Y; S, S
7 N( @( c: d/ R: [8 z# p: | |
|