|
|
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
$ c8 E3 K7 F: W: W% v- Z9 t/*1 [, L$ h/ {& E# u5 X
* Check memory range for valid RAM. A simple memory test determines
/ t6 _8 ?7 N4 |) b* _* the actually available RAM size between addresses `base' and0 b5 ~5 W' \' u- e
* `base + maxsize'.
# b1 J1 v; q9 b" O8 L! X# t8 V*/
_/ F/ }3 }) y+ e7 E, J" G3 tlong get_ram_size(long *base, long maxsize)& Y) s& w3 O1 r+ ~7 C
{8 C* p* ~ Z$ o9 v2 b8 @
volatile long *addr;
5 G, b; E! X, T5 w5 M5 G; F# |: { long save[32];
# A. W( i2 _3 P! R- S long cnt;
& d% o2 s# k% I0 Y6 e% _ long val;
( S. I. t9 R/ a4 |) t long size;+ e1 j. m) p' ~3 d, u2 l% n
int i = 0;" R+ F% n6 c. _: v& {
4 I7 h4 b; @5 j1 [$ U for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {3 j( e7 I7 _) L/ u$ V
addr = base + cnt; /* pointer arith! */$ i+ V: L: P* R" R! u
sync ();' J: D; r7 A3 K$ y7 N0 ^
save[i++] = *addr;/ R% M8 |9 X' b
sync ();
7 m( `( [+ J3 [6 q *addr = ~cnt;0 m5 @! g8 P- z& m6 U- |+ A
}8 A1 g6 \) T# v i$ X5 I* }" T
1 U& B" v, U- R9 |+ n
addr = base;
/ c" I* ~8 H: k) S$ q sync ();
$ T2 @+ b3 l, ]/ }7 e3 d; u save = *addr;
0 d' U* Y7 Q% L1 C& F" v sync ();
o- [. e1 _) Z2 o, x& M *addr = 0;4 q9 F0 u& | u! l. U
7 G/ s% q% H y' O
sync ();
& e. Y( H: k& d9 _+ j if ((val = *addr) != 0) {9 s* U% C% J5 Y
/* Restore the original data before leaving the function.
6 Y" i8 ~4 G; g2 o */! K+ b( `8 R# o8 S- ?2 Z2 {: u5 v
sync ();
# S8 }; _3 r4 W *addr = save;
6 C: k5 u- x9 i6 ?4 F+ M2 f for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {' R* B! \5 W, {& }5 c" V6 a1 g
addr = base + cnt;
/ n6 a- Z* w% p7 Z& R: @ sync ();9 E2 d0 J' z" p5 _3 P# v
*addr = save[--i];# `8 M) f" P) ~3 u' M
}- S" p' _# p* h
return (0);! o3 i8 S+ _# G. g7 G9 ?
}9 k0 Q9 s5 E( z* p* \# ` n1 j
( Z; P' s; ~' Z- H/ z% q for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
$ g4 S2 Y; u) |9 w- Y: t1 e; H( F addr = base + cnt; /* pointer arith! */
8 T* {( r# I; R val = *addr;# x1 b; c3 x, q3 {* Q' y; Z9 S
*addr = save[--i];
# n+ _; v! i- T. U3 [ if (val != ~cnt) {
q) |- D8 J( T1 h# ?! |4 v size = cnt * sizeof (long);* k+ q0 M. Q. j% I
/* Restore the original data before leaving the function.
8 ^# i9 R0 r9 b2 a8 t! B- e */
$ S6 ~) \( Z# ^+ L1 V% f for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
: }) p5 s$ N4 V: }5 n4 X- ?7 K9 b addr = base + cnt;( o8 ~( C) a/ w% L4 _
*addr = save[--i];
4 g" K: \$ C$ Q4 d% k5 i }: {4 k: h& T2 w: f4 W8 w1 _
return (size);
7 C" n7 M, c. E8 j }3 o. M7 }# }) [3 r9 x8 O
}
) v. o( Y$ h9 e3 Y8 L! x3 v% x
return (maxsize); d% w' V, ^# C& o
}: ?, Z2 z; [! t. R; T
int dram_init(void)7 j- R' {2 b9 D0 Z) \
{
! V8 {* ] H$ E* [7 r6 v0 i' A( @ /* dram_init must store complete ramsize in gd->ram_size */& a, K' w* y k
gd->ram_size = get_ram_size(! i p7 E3 k+ c" r
(void *)CONFIG_SYS_SDRAM_BASE,, v h _: h( I" B
CONFIG_MAX_RAM_BANK_SIZE);
; m0 J, t" K1 j8 S' h7 r- }' ~ return 0;
' A6 U! R% c3 U2 h3 e/ D}# j8 Z K+ b" L% Y1 f* a5 B
4 O' k3 j/ Q+ i0 Z6 I1 j8 s2 a; b/ }6 z8 _9 j
$ c6 m7 H9 I" q' Q9 g, F0 R* b: _4 l! f( N& Q9 ]9 v) d- V% u
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
; d! f! ^' U9 A: o6 k& M
: ?0 O% h' R9 P2 A$ z# A2 | a6 O9 ?# G. O) X' j& C% l
; g4 G, X. k# {3 L. }8 |1 p
|
|