|
|
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:1 V( o% ]7 Q. V; U9 T5 ]) x
/*: U# W C3 K$ V! Y4 [6 [) s: q2 M% `
* Check memory range for valid RAM. A simple memory test determines
& `# w) G9 n& {( j; I* the actually available RAM size between addresses `base' and3 h# ?9 l3 {! B' \5 |2 o
* `base + maxsize'.9 o: s; z1 K9 Z" A6 y
*/
) N+ R7 Y x/ E2 nlong get_ram_size(long *base, long maxsize)/ A1 {! P' e* }7 |. ?# Y
{3 o; A& M* ]0 T& R
volatile long *addr;5 B2 N. l- H5 m5 B* k# m& b& v2 t; D7 I
long save[32];4 Y Y8 k& z* ]* ~
long cnt;5 t9 U( `# n1 x9 G
long val;/ `7 v" H) \/ l" l' v3 K. {8 y- {; U
long size;' ~4 K8 V; B! p l0 R/ y
int i = 0;' V% b) z+ T, p' `1 j% X
% G% f. T7 O. |( j, F8 z1 n for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {1 z' b5 n* x# L' i# e) \
addr = base + cnt; /* pointer arith! */
3 ~9 d6 ]5 n% G9 N, ~ sync ();
, w9 a. \3 `" Z2 L3 z5 \8 V9 [9 d8 F save[i++] = *addr;
+ H3 K9 ?+ _2 D1 j: w4 H- k* g sync ();
& z# Y6 m! o- f" j* e7 K K *addr = ~cnt;
' [! r, K- Y, g( k }# I3 N/ m1 y4 q0 {! T2 c
" i" i* M. L) p% z" [3 Y0 M4 H addr = base;
! ?' L3 w4 F' f sync ();
% W. _4 g# N6 f save = *addr;2 e6 Q: @$ }( v5 w$ j2 G
sync ();
1 U" a$ t0 Z; o( B2 k' u, L *addr = 0;
9 E: |: T' w' ?5 H* K) l, Z) q& q
' L- I3 i* T; S' p, z sync ();
) S! v9 y7 o9 f3 d if ((val = *addr) != 0) {0 N/ z2 G- f, Q& t
/* Restore the original data before leaving the function.% \" p D0 R8 M0 [3 c, X% M- O/ Y) b: D
*/
8 m/ g% w! H+ ^& E1 W" l" T; h sync ();
! @& O' U9 c. R& ]$ K- D *addr = save;( \) Q3 y/ |* g4 V
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {! b% T ^ i, N/ m7 x1 T
addr = base + cnt;6 }; W+ h* h9 Y9 E0 z2 a
sync ();& x7 m5 n6 R, L5 k4 @6 T1 x
*addr = save[--i];4 \* {& n4 A- G \4 U" g; V* m3 c
}0 o! T, s6 z4 J7 M3 C5 _% k
return (0);
! Z- u1 }% q5 {; G: q0 k }
# {, x, U* t P( h9 [- \7 X5 O( O6 |$ t! A
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {7 u' l: K, n$ _& w0 [
addr = base + cnt; /* pointer arith! */
$ [( K% N; |" C0 l! U9 m val = *addr;
) F1 c/ j. W: h% [: g8 } *addr = save[--i];
9 l- c, d7 g$ F8 P6 @) J3 f if (val != ~cnt) {
4 e8 r! C6 ?. i$ W/ {1 ` size = cnt * sizeof (long);9 p2 g4 f# b- r
/* Restore the original data before leaving the function.. T% r7 }4 Z( i2 R
*/" c9 ?; h" E2 i+ D# e
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
: D+ R$ Q3 v: ~4 H addr = base + cnt;/ ]" X* R9 U/ \& H C9 O9 {
*addr = save[--i];
! H8 J+ s4 h) r1 h* E" j# Q6 s* k }
4 ^$ ^: ~! ?, w1 A' V- C return (size);
8 u4 a: ^7 l, e" X2 C/ E4 J' J }
! A) Z1 q& W5 I, w1 d1 o, a }
7 T9 K% j; H4 g+ ~, c
6 p Q# o+ ^$ ~& L: j return (maxsize);
) W9 t9 |- `6 h1 p7 [9 S- o}
: Y* n" S4 B+ {int dram_init(void)
8 r0 ~* ~" a6 M{
* Q6 C5 L# V+ k, w /* dram_init must store complete ramsize in gd->ram_size */9 I1 [( Z) j1 \! p
gd->ram_size = get_ram_size(, T% p3 b. D9 P% Q. R
(void *)CONFIG_SYS_SDRAM_BASE,% l) A) p+ r: a
CONFIG_MAX_RAM_BANK_SIZE);8 ]8 s4 J' k/ _/ S2 o. _3 ]: s
return 0;
6 M1 B. X; H% K( j}% A& h; L/ o" ~4 r
' f8 M, p$ ~$ B# ]5 P0 R0 ^8 t7 o9 A: {
6 x* r# X1 E% h3 U- `4 A7 Q9 Z5 L9 q& U9 D4 e& ]/ j
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!/ q4 d" \) F% J, i/ ]# \
7 |- {# D2 m/ G7 y" m+ q# a% u- a/ V! x3 r, z$ e! e
! H% ]: A: k3 n7 q7 O3 v+ v! W
|
|