|
|
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:, E. X# Z) R6 S
/*
: C: d% P/ P) O! L9 d6 ~* Check memory range for valid RAM. A simple memory test determines- j! [ p/ n) E. K# k& p( D
* the actually available RAM size between addresses `base' and
, ^- i% [5 A; [. R2 ~* `base + maxsize'.
9 c8 Z D# a' M8 A*/0 ^5 S5 j/ k3 J6 d8 ^- q ]5 o3 D" h
long get_ram_size(long *base, long maxsize)! T% h9 k# e4 k8 O, S
{
2 {, x! I3 ~- I7 X4 L+ r5 u volatile long *addr;
* R3 G9 Z& {+ o" l7 F6 W long save[32];+ C$ d& E6 E% D- K* Y3 ]8 c
long cnt;
& F& T l) o! P7 M' ~6 Z- p% n0 F long val;+ ]; E; T/ C* \, o
long size;
: i2 e% }* `$ e" ~3 @ int i = 0;
, g0 x9 x4 m" q( V. b; q4 N7 ~( e7 F8 g8 O0 D9 Q& G
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {5 h" E" C6 d% W' b
addr = base + cnt; /* pointer arith! */
& J3 n6 V7 F' B3 [ sync ();6 t& j6 f+ K3 V4 Q. n
save[i++] = *addr;
: n6 s" R/ v" g7 n1 P sync ();
' y! Y1 ~% {5 X *addr = ~cnt; U8 ?# r$ v- e9 w2 o1 I
}
5 i& Q" n5 L6 ]" U) ^) {' z% b9 i
8 G* f4 r# C, L5 u$ L& }- N addr = base;
; n8 P6 |# z# V3 D I# @7 I3 \ sync ();
% u1 ^# M/ g4 | save = *addr;- D* C: f) B7 r/ s9 T% K- |
sync ();
( U% T# r L* L. j/ d *addr = 0;
0 m/ x! _4 T5 h. `9 L- R7 i
8 \/ I, m7 g! `2 W sync ();
/ Q2 r6 M1 q) Y8 a+ I4 q _ if ((val = *addr) != 0) {1 g* a3 ^2 W" f1 a
/* Restore the original data before leaving the function.* Y/ W$ c1 j' d, O8 i! j
*/
; l4 c. Z- s2 A5 E! v sync ();2 y5 c$ E1 Q$ S( o7 N7 X
*addr = save;
; H) A1 `0 W1 p' `* J/ H8 }( _ for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
+ t5 ]. ]1 i+ [6 h9 a/ h. A# g addr = base + cnt;
5 S9 w+ i* g( i( u& y2 O5 z sync ();; B9 j# U2 c3 n# o$ N2 m: T
*addr = save[--i];- b# C$ ~. [# c" y8 }5 ^
}
" l$ y$ N4 O' v return (0);" I* ~7 t6 u$ q- Q+ k; W2 B* F
}
8 R" L) i: f; @" v! v- z) F/ `# t2 }. A
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
% y" w+ x6 L8 G; V( W addr = base + cnt; /* pointer arith! */
3 g% k: U" o: z# G; v& H val = *addr;
0 J1 ~$ K# h, w# r! q3 `( W5 s *addr = save[--i];
; w8 _7 k/ Q9 Z4 ]! Q i if (val != ~cnt) {6 G5 E/ p" {. C4 R) u; b
size = cnt * sizeof (long);
1 a1 E" m. d! C' E0 S3 d /* Restore the original data before leaving the function.0 R( D+ i+ D( [; B" O* D# q
*/) h2 h! \! Y% Z R J/ W+ [
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {; ~/ l* T6 y- w; I9 J: f8 b9 c: P( R
addr = base + cnt;
, W8 B. N: A) r" h+ [$ ^0 h; k/ ? *addr = save[--i];
! k( e4 x# N0 \ }$ d& n$ C! L$ {( W( X5 Q( X( w
return (size);
# J% F2 ~) L1 Y o5 W: j, `& k }
) b$ x: r# ]) X! | }
: n; Q/ ]8 h- l9 j6 t7 w
6 f- o6 V7 W9 f: y; R: ? return (maxsize);
9 i9 ^& n/ x' U) \1 \0 O}
& _$ O2 c+ c# S: rint dram_init(void)3 h- g# s# Q& \5 s8 n8 ?
{
# S3 L& v& X% R ^ /* dram_init must store complete ramsize in gd->ram_size */
' J8 Z) \5 i% C+ l4 p gd->ram_size = get_ram_size(
4 I: O, u/ F8 H9 {+ j2 h4 b6 o (void *)CONFIG_SYS_SDRAM_BASE,8 k. H/ J) ` p, {+ M$ l1 h/ `
CONFIG_MAX_RAM_BANK_SIZE);
7 o* u. @$ m6 F/ N- m" E return 0;* R# N2 D( l' Y
}- z- G. T, I' a6 x- ~5 j5 R
7 t3 |" m! R* t" y: p* ^
1 D: }6 i2 }% R5 Z8 L' H8 @
! d" @/ r0 M0 @2 R7 U, z
3 |: O/ D( g! F' }3 O5 V3 bFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!3 E. J; J8 m; S% w
+ S1 D# J3 K) X& `5 H; s, N
5 W( K. S. x" R- \( L1 n* B
6 A$ L: `! ?# s4 y! P) b$ Q3 x |
|