|
|
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
+ r4 O+ Y2 G( M! U0 O! S6 g+ Y/*
6 e6 _7 {) }7 K X# e0 R* Check memory range for valid RAM. A simple memory test determines
0 K0 a1 e6 s& J: g* G- D3 m$ F* the actually available RAM size between addresses `base' and. v! G, @7 c8 K2 n# ]
* `base + maxsize'.9 r4 }. A8 N2 v# s: B# [
*/) ^; h2 m4 ? h4 X; s1 M
long get_ram_size(long *base, long maxsize)$ a; l, o( f: M. I' y0 l* [
{
$ N! A I! V6 Y- @ volatile long *addr;- n1 B X s* s( T K2 y0 T. P' X
long save[32];0 y) E# l1 o4 z# w: N3 k# v& k
long cnt;# @. _1 V* o+ h1 }& r& n# `
long val;
: J, I' o0 ^( M long size;
, b& |+ @: n8 {( p int i = 0;
8 i L. n+ N% l! x+ C
8 C7 Y$ S2 e& ?9 N7 F; a for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
% K ]; }1 @ G addr = base + cnt; /* pointer arith! */. q- p: s+ b/ G7 g H( N" c& \
sync ();) d _! Q' @! l( o, C' ~# G/ P
save[i++] = *addr;) X7 U# X( s& ]: t6 V
sync ();
' I0 Q) j: V( R2 C/ R! P *addr = ~cnt;% J0 W! }- C4 j, f v2 J9 k3 j& H2 `
}
* r! L0 ]8 m$ {. j3 j5 b, e. L, {9 z Z/ A, y3 _4 W5 c1 v4 _1 S
addr = base;* q4 N/ I: J# z. G
sync ();4 Q# ^( d: ^* Z5 Z
save = *addr;
1 p7 R1 G! Z! g( G" G5 V: j r sync ();
! W3 G8 i$ q3 m- t! g$ ~" M6 w *addr = 0;# V( u9 k' T/ [
0 Y2 w3 L$ B1 \* F6 {+ z( s8 D
sync ();. f. r4 a7 }7 I7 {' j
if ((val = *addr) != 0) {( ~8 h+ t; T. l3 a/ l
/* Restore the original data before leaving the function.. _. ^3 V' G9 s" Z. ?+ F3 Z
*/2 [$ E# @/ z) p, z) N8 }. @
sync ();7 ?+ K/ ]6 r! K
*addr = save;) R: D0 F; Y: o2 N+ E/ j1 t
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
' {# {2 O3 Z1 @- S$ ^# ^ S$ O# ^; _ addr = base + cnt;
# f$ O" L" ^9 @: z0 T sync ();7 |, p- W: W9 N8 o8 t
*addr = save[--i];! S9 |- {5 u! i' M* S
}, j" ~ ~' Q- R7 v; S: R
return (0);
/ Z0 B5 h# V/ ] }( P$ l4 f/ Z5 d
, A' w F# m6 r/ {" X* ] for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {/ i8 U$ t, c" [
addr = base + cnt; /* pointer arith! */
0 L4 _, m% \0 a1 c# H val = *addr;
& n2 _. E Z) N2 \% K" h *addr = save[--i];
4 _% Z# P( Q2 X- E# @" b9 g if (val != ~cnt) {
) Q; k- ?' E$ t7 v' G$ U0 Y size = cnt * sizeof (long);; D- f% Z5 l+ V( o
/* Restore the original data before leaving the function.% I- }3 [$ T( R2 e# z
*/9 m/ P; O8 y3 \9 R3 a1 G `' m* L
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
7 H4 m4 Y1 a( H6 Z. p2 C addr = base + cnt;
# R/ C5 L9 i, }: c *addr = save[--i];
2 o2 ?0 \) U1 C8 P" i) H }
- G; k$ O# k! C return (size);
' a; S, t+ ?" \) C( p9 ~ }$ P6 }' B8 S) R
}
, B$ a2 f2 B- x! v' g5 }; R" _) a! }: c2 ]% [. o
return (maxsize);3 s! r+ O; Z: j. b/ Q
}* b' W$ `; E. K
int dram_init(void)
: M. L* m4 E; g' K{
) y. A$ X2 k: ]% `) F' l2 u /* dram_init must store complete ramsize in gd->ram_size */* K: `: `% k7 _; b) S
gd->ram_size = get_ram_size(
1 |( M5 f8 |# { (void *)CONFIG_SYS_SDRAM_BASE,) B# w1 r& |1 U, ]$ E1 p: }3 v
CONFIG_MAX_RAM_BANK_SIZE);# u" B4 T. G" ]6 L+ }
return 0;, S/ V& c# G. \, e# r# X$ _
}/ b% e! O7 k9 z# c, t# ~
; V/ t1 J1 L h+ x1 i2 W& O- r, w- C9 V
% m* x/ G6 S. h# L. @6 E: A! c/ j4 f( n
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
1 |1 n d) U4 Z$ B& \
' p1 w& X7 T7 h" y' _
, x, d( O! J) q& r' I' `: P* k" l; @( X6 U0 ?9 b$ g( q! [
|
|