|
|
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
" }5 Z7 H1 s4 m( X- ^/*
2 d/ o8 E; P% K' |4 A+ b0 V% q2 x- g) `9 t* Check memory range for valid RAM. A simple memory test determines- `8 p6 o0 q5 G. F0 Z
* the actually available RAM size between addresses `base' and
- [1 i( v' W; y$ i, Q6 g; {" U- E* `base + maxsize'.) E5 V' k- n4 }* K: @, C0 W, R
*/7 u. Y+ t: I6 W0 J) z7 l4 u1 u
long get_ram_size(long *base, long maxsize)8 ` r- e( d% [- r
{
- h! k0 R0 }# O- _ volatile long *addr;
& s! q* m* Z3 m" d( [- ~$ |3 _ long save[32];
, y! r6 U2 o& x# b long cnt;" d8 ~: F3 F0 i
long val;
5 I: f) R- B% H% B0 o long size;
' a9 @, i2 p0 v' R int i = 0;/ X3 J9 w, I. f
0 `$ i5 L3 Q R
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
! G: |; _+ z P5 q addr = base + cnt; /* pointer arith! */
; r/ [; c6 j0 ]9 w7 o sync ();
0 u7 W i6 W7 b3 m save[i++] = *addr;
- H; j5 u; B( q; S" f. y# V sync ();
2 J5 |% {) C7 g: v *addr = ~cnt;
5 u4 A# ]' M# v; f+ e! y+ }; R }: ~4 b9 P7 u) q
* D! T/ U0 z6 a3 N8 Y addr = base;
8 D% z" [* I' L. B sync ();
" A; R K' C' F. _; U4 ?8 ^) `/ C save = *addr;
6 ?9 e9 N- a, a" ?2 F' Y, ? sync ();' }" T/ V8 X. R1 F& Y/ w( H- J
*addr = 0;3 Z- Z; _8 Q7 x
! _/ B/ e. t2 Q% G2 `+ A9 o sync ();" D# ^. z$ n" p
if ((val = *addr) != 0) {
( h B& J- L4 |" _/ H7 z /* Restore the original data before leaving the function.7 D0 v' l6 @2 v" i$ y7 u( K5 Q
*/8 _: P/ [/ |8 O2 X/ f" {
sync ();2 n) ]; C% H1 P% n0 r: \" E
*addr = save;
3 s8 F( D+ [# c2 x for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {: |+ q" g$ W8 q1 n4 X: Z5 D
addr = base + cnt;
7 ^. b: D& @4 |9 \# h* F* L sync ();4 }' E0 o1 Q, b3 ]4 n* Z
*addr = save[--i];
5 r0 J) w# J$ X5 e }
7 L+ M# k- z. X% a+ s return (0);9 L8 }4 `( {* k
}" V1 i& Y9 y' x
! o) U0 J# q6 Q5 l/ y
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {5 q1 W; u- q$ m! X1 E* ^* x
addr = base + cnt; /* pointer arith! */
& l9 E) r6 S6 u0 Q val = *addr;# L2 _: h$ H/ l- R) L* q7 k3 W$ W
*addr = save[--i];
! O* n3 \4 \4 ~ if (val != ~cnt) {
# R& D( ]7 l" S/ a' U- t& | Z1 t size = cnt * sizeof (long);, C- Z5 w( W* c) F* ^
/* Restore the original data before leaving the function.7 j# a9 R( ^" }, {
*/7 E2 p/ z0 _/ f7 u0 T
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
+ u8 a3 D; T3 g. r2 R- n/ ~ addr = base + cnt;9 e7 x. N, B9 M' U4 h% _* c/ W
*addr = save[--i];
$ \$ U# y- O6 h+ } }
\: Q* i1 R8 P return (size);
: T$ B1 t; D5 e8 g0 P }0 n, C% m3 l D# g7 k+ X- e! [$ ~) z
}
- E1 V: k! n) e9 A2 i" Y; R/ o* e% J: W' E/ ?
return (maxsize);
( e5 j4 c! B% C: U8 `7 I7 Y5 N' }}
3 M2 M! {5 b8 sint dram_init(void)
/ c# O5 |# w) N7 ~9 }1 i{
( j8 h, y }. V' e' A3 L1 R /* dram_init must store complete ramsize in gd->ram_size */
2 L1 p( j" @$ M6 Z gd->ram_size = get_ram_size(* Y" \: C) A) e' X$ M2 ~
(void *)CONFIG_SYS_SDRAM_BASE,& z5 |$ q) d; {
CONFIG_MAX_RAM_BANK_SIZE);$ e. A8 B, K# S( y
return 0;: n- K/ F z h9 F5 \
}
+ Y- [: ^+ g" D; ~* D1 o/ e
# R: h O; L1 m4 X
" |6 ]2 e8 l" k: {* m& Z- ]
6 X% B5 O5 m' G" l3 }7 `& F2 ^! `. i5 }1 [- f
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!: p* k5 }. ?1 @3 F9 Z) u
% E1 y5 g( i& x- j$ F
4 l2 D/ Z, c. [# ~
3 Y3 C2 N0 s8 i) a, r+ W |
|