|
|
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
8 g: T" i+ S# @, C/*
. Y8 ~ g8 Q0 P1 \, n5 y! n* Check memory range for valid RAM. A simple memory test determines' ~) T$ A' P! o+ W1 ?
* the actually available RAM size between addresses `base' and- ~. N1 N* o7 J1 p4 I* W, Z1 m7 z
* `base + maxsize'.
8 D2 w: M) q& m4 O( i3 i0 e*/
. r% H9 X' i' w& n9 g N* ^long get_ram_size(long *base, long maxsize)4 p* t- ?/ P3 c4 |0 ?3 t
{
! |7 g: `2 o% c3 p5 X/ ?" \ volatile long *addr;% l& @! A+ H4 q: S4 m! @
long save[32];6 a2 H0 d3 S9 v! E" X
long cnt;0 a4 U5 n) l5 U, N* |
long val;; Z8 F! P- O( Z8 w, C
long size; l) O) x% b( b E
int i = 0;
5 i( J0 e8 [7 q, y6 }5 D7 g
/ r6 G( e& I2 A; l4 L& b" G! y7 J for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {0 J$ ~. e* \, X
addr = base + cnt; /* pointer arith! */
( g/ p5 u; ^9 x4 v" s% q! m* Q& ? sync ();
7 f+ Q, y) v% H" P0 e/ D1 U4 V- G" q save[i++] = *addr;
& y4 z. z! g; Z, k# A, o sync ();
% b+ S4 A9 _% ?# v7 J *addr = ~cnt;
( u% S4 G. P1 q4 P9 G! z } B5 I2 O) O! F0 x' |- b
( P, I# X% ?+ b; |) Z- y3 Z addr = base;5 G- K% e* ^, j% v7 E2 `) E* z0 ~, W
sync ();0 G* Z1 S+ o& Z
save = *addr;
: Y: n. X( t* o% G( Z sync ();$ U( e* a' Y/ v9 M2 l
*addr = 0;
7 f' x# i# Q" Z( d/ Q8 `
; Y' ]- @. q9 Q$ E sync ();& g" N5 i6 U/ d
if ((val = *addr) != 0) {
4 k7 M9 F' e# m, `5 s z0 T$ _ /* Restore the original data before leaving the function.
6 F! ~; F% ^# R# ~1 d. e1 G */
/ l& n c* h' \" w0 j) Y* M' ~+ P sync ();
- M0 ^' C3 u" [ d2 P$ }4 [! e *addr = save;. A, d1 K7 u! |+ Z
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {" P/ z* `+ ^2 P# g( a4 |; B3 _
addr = base + cnt;6 d8 S# T9 k) e9 l1 X
sync ();3 B4 M. a8 U+ E U5 i' O/ X/ @* e
*addr = save[--i];
4 I4 M$ I5 n8 z6 O- j }9 ?. I# \3 @, O! V/ {% n
return (0);1 j# L) {# x! i' ?. [7 i
}5 ^7 I% y7 o% f
; ~3 K; `, A8 f' o$ u
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
: A% k) p$ x$ a5 z# {0 t* c addr = base + cnt; /* pointer arith! */
8 J0 G4 G* h, Y0 }0 E8 p. m G% K* ? val = *addr;
1 E5 d8 U; `9 ?; F$ Y2 x *addr = save[--i];
- n$ z O) y, B% @3 a; k6 Z if (val != ~cnt) {
/ F7 B2 b: n2 J8 o6 i9 w; O size = cnt * sizeof (long);5 f; O1 t2 a3 q
/* Restore the original data before leaving the function.7 I! d ` k! k V
*/ a3 w+ P% ]: t/ N$ z
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {" l$ ^$ ^9 ]5 s' r1 J+ C7 J
addr = base + cnt;
- s( K$ c1 \1 ?) W- U9 z *addr = save[--i];
. W6 X9 s a \; P }" i# X# C! B& M& y
return (size); p1 X( s* [' p+ b; N3 h5 [* Z
}3 _/ ^8 e9 r3 u6 z
}
4 ]; t2 P) p; c; [; E$ U/ U* q" R2 G+ a& e9 {$ M! k8 i% S# [
return (maxsize);
" U. k( w6 k/ E}5 u8 }' N$ k0 h* x) V/ O
int dram_init(void)
$ E+ h5 V6 x5 o{- }& z: M, c9 n4 e# E5 ?; p
/* dram_init must store complete ramsize in gd->ram_size */# F, V# @7 d( ^5 e: ]* O1 R
gd->ram_size = get_ram_size(4 S8 n2 }& d5 s4 }- j! O* I
(void *)CONFIG_SYS_SDRAM_BASE,
4 E7 e2 ]6 g5 j0 C/ j G CONFIG_MAX_RAM_BANK_SIZE);0 A* c& J' v( f) d
return 0;7 N7 _- |9 j" K+ G% f0 l
}
9 ~- n- s% E0 a
4 B) c5 M8 X8 A: V3 x) s" q3 i$ I7 o' s S4 O2 T+ H
' T e u1 n7 q9 F+ V; w
5 c! I! v6 {4 IFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
$ f/ g. B. K7 Z o, q1 V8 p0 W; i) e7 Y) Y2 \1 ]2 r
$ _4 B5 \) l, ?8 n
, {# z% z- f9 H4 P
|
|