3 t& b+ Z3 z2 x. o A$ z) `4 H是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了? ! O% ~% c. U2 h5 u [$ H, e* Q4 f4 \5 h' b. ~ 作者: 2532609929 时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:! }- O9 o6 T7 k2 i [. o
/*1 B$ R+ G. J/ }! U$ c$ Q' Z
* Check memory range for valid RAM. A simple memory test determines ; t* p1 r8 g T5 Q; T3 a* the actually available RAM size between addresses `base' and( G0 F" E$ O4 l! E- S8 d8 M6 k8 h
* `base + maxsize'. h4 {! X _2 G8 Q$ c3 p*/9 m/ C, v! P: P2 |, Q8 d% g& e. Y# `
long get_ram_size(long *base, long maxsize)3 t' Z4 Y- y& V ?- [! ? e
{ : i2 q7 r, L5 p$ i* h M( }5 X volatile long *addr; . A ^9 |' r0 Z7 S% ~9 r# d long save[32]; * v( e v' z4 e. a( H long cnt; 1 @9 O3 P3 o% g2 Z long val;$ l' g- k; N2 Q# _
long size;& }$ P7 g8 ~% i/ X. n* i! m! B) V
int i = 0;) Y% q; O1 ]5 H2 S
! H) E8 d* J' ~% G- ^# s for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {' ~" t! n7 U2 B q; j* ?
addr = base + cnt; /* pointer arith! */) t" V. v. u. Y
sync ();' A' s$ r m1 l* K
save[i++] = *addr; f5 b: e. v& A
sync ();+ n' u2 ?* {- K' D& x# N
*addr = ~cnt;* h; @( e" O! I3 R7 F0 f M5 r
}$ W4 ^, z% J4 U7 s9 k
2 Y$ l& P# ^# D3 h+ d7 \5 H- |
addr = base;0 X1 `, A7 P4 G8 Q
sync (); ' H2 u( r: k9 g) O! \0 G' m6 V8 R save = *addr; ; H& j! P& y7 l. Y# y# ?# D sync ();. y1 O! P7 ]1 v3 x
*addr = 0; & X4 v5 y$ {3 y( @ 1 j% u4 |& N+ T3 r sync (); ! c/ x4 o3 k0 f7 @" w1 f7 W. } if ((val = *addr) != 0) { 5 }& z& A, v$ ]$ Z' e /* Restore the original data before leaving the function.2 K- I$ k% S. X7 F- I
*/ * p+ c3 N5 J8 O$ a* V sync (); 5 u3 I* K2 ?# u5 i' M) v7 x *addr = save;* m( q. h% S5 s
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) { - E4 z" j( N+ c7 P6 o4 o% z+ l& f addr = base + cnt; % [8 v3 y$ j. [$ `) h& C9 K sync (); 3 @. X: `. |9 t% w *addr = save[--i]; " p& L5 x4 P: Z6 r# }" {1 _ }/ G& O+ [& S! I' m& e N6 r4 b" @; A: K
return (0); 5 U2 b7 I$ ~) T( X) Y4 o } 0 k( Q7 j* {4 S/ x& s# l / W' d: T; s5 t2 Z. u( A6 `5 h for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {& f6 ]6 p0 {/ c( [/ s. y3 d
addr = base + cnt; /* pointer arith! */ 0 A! e* z" ]& ^ val = *addr; / ]5 i$ ~9 B8 N2 d% h/ H6 _ *addr = save[--i];/ c- a8 I# G! c& ~
if (val != ~cnt) {* O2 B* _ M3 j8 e" E
size = cnt * sizeof (long);5 y) f# `( w: g4 Y" v8 r* V! J& M
/* Restore the original data before leaving the function.6 E3 m; d+ |. T& V5 T
*/' q' A8 R; |4 r/ u' W
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {4 A; p5 @4 _# \4 b
addr = base + cnt; @7 ^$ \, W0 ~" C C7 r *addr = save[--i]; I8 b9 X# @. Q0 G' @3 l) a }: u6 ~% ?6 i ^5 c7 s/ n6 E
return (size); 6 \) V4 E W( e$ A } [; m3 j9 s* Y% r: X5 U0 _& ` }, P$ s$ I8 F- A8 q' i2 v
" j( l! O' K- t" Z return (maxsize); , {) v- v$ n s) m} + N$ }5 C( r4 y4 {( \ ^int dram_init(void)5 J: I* T+ q9 E/ o4 m8 ]6 ~: U
{ / E' c$ Q! X v% b /* dram_init must store complete ramsize in gd->ram_size */ / G% J i; z/ e, a0 v3 J5 U$ P& w gd->ram_size = get_ram_size(3 C; e5 ]6 }' B$ V
(void *)CONFIG_SYS_SDRAM_BASE,3 m3 E4 S2 V6 O/ }7 _
CONFIG_MAX_RAM_BANK_SIZE);& h/ g P. c) [) i3 t# f
return 0; ( b' s f M4 B }- a( x- C} $ \7 |. q9 _: _/ d* H6 { % D+ i9 z# E: q- l4 z. u# A0 C * O/ e, C1 `3 |, A0 [: O' C- p8 [ O
( ~4 @/ Z3 O* y/ g! x( ?FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!" [5 Q0 g# q- k
* x2 W( e% i) w