6 e+ ]8 S: I7 ?- `6 p: T6 g1 c是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?" [7 z9 t. A0 X
2 a: l4 k$ S5 n3 k7 J 作者: 2532609929 时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:1 e/ ^5 ?& _9 a# j# n r
/* ( l+ A g0 W+ Y& m: G* Check memory range for valid RAM. A simple memory test determines% m5 n) E+ |% j4 M7 g2 [/ [: U
* the actually available RAM size between addresses `base' and 6 D) ^4 a( f, \) u6 b9 K5 v" P3 r* `base + maxsize'. B5 q. X+ k0 W ]( V9 z
*/ 4 I$ j! r$ c" b5 ^+ | d5 ~$ olong get_ram_size(long *base, long maxsize) ( S' s' _- k1 _/ Z' J5 M{) W" ?& S3 P. w/ ^4 Y
volatile long *addr; ) p6 U; y: }/ j" a: q: o1 N long save[32]; - t0 z+ R- Y9 J long cnt; * l8 ]6 K( t0 _2 ?# _& i long val; 8 u6 H% j% L" ]! J( a3 O1 H long size;5 ^ I+ g5 O- l2 `0 ^$ ]# Z
int i = 0; % U# P/ ^" F8 k* O 2 q! y8 j$ h% Z5 [( m1 K; U for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {8 }0 L; x) F6 h. Y
addr = base + cnt; /* pointer arith! */+ V/ O1 L- M. R; @. i- F
sync ();/ l; ]$ c% v: \
save[i++] = *addr; 7 J- a* Z) j" c' ~3 x. f3 ] sync (); : U% E, `9 p! t) I) ^' _ *addr = ~cnt;+ m" K0 X" P$ f: @4 p L }
} ) q# u0 k( t; ~; G* A! _4 v 7 c) k* l4 B' ^ addr = base;& E8 H+ b- C9 Z D& g
sync ();% ` g' n b% _' q
save = *addr;# ?2 X' a( r) o- j1 [" v' D' F
sync (); 1 `& f0 e2 W5 }) |% ]4 H *addr = 0; % @; ?* n8 m1 ?" v# |- S1 @% k% v( `/ M$ y7 {" m
sync ();% N/ h W( z: Q4 m5 c P
if ((val = *addr) != 0) {* l$ R) S; L2 j/ n1 U' }' }6 |0 C4 O
/* Restore the original data before leaving the function.. Q( Z. J- \6 S8 M6 a0 q' |
*/' G Q2 `3 o: t1 v# A( Y# f' r1 `: y
sync (); # |0 D+ ?9 Y) O *addr = save;4 M" o& l' X5 f" O
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) { $ Z. V8 p' {5 X5 M) A' e7 M addr = base + cnt; 0 ^' x( T, M8 w# B sync ();4 T; U, I5 p. B" L! F2 O9 }/ Q! [
*addr = save[--i];; H4 t" j2 p, x/ k6 [3 X" m; D
} & T# [# F, k, y+ M& \ return (0); 7 ]% R6 v. `8 Z0 Z/ V' a } 9 ^. D. {2 f5 R0 M& D% H+ T7 ?- h/ W
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) { K3 e5 X: `9 K addr = base + cnt; /* pointer arith! */ 8 k0 L% g; u7 O& C2 Z2 [$ |5 v- y* R val = *addr; & C* X+ ]* ] R0 y/ v! s) n *addr = save[--i];( ~" C$ E1 V- Y! j% D
if (val != ~cnt) { & T1 F% g! j8 v: l, q' v; C% g size = cnt * sizeof (long); ( @2 m. u' ]! b7 |* O0 K1 c$ q /* Restore the original data before leaving the function. / U1 _9 `, ?' m V */2 O. o6 p n& T
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) { 3 M3 a+ ?6 J+ u( x" i addr = base + cnt; % f6 e* U' h. ^! e' G& M# F3 h& O* [6 P *addr = save[--i]; ; o. b0 P1 Z' V! H# q+ a } t1 J0 P: U! K7 D, ^
return (size);! }% T# r& S0 X# {5 Y1 N
}, U r* C8 Z0 R) G
}% @8 Z+ e# W- d+ Z: h g0 b
- P5 T ~% d# _' ^( g return (maxsize);8 a/ G" G Y* G# V# H* d
} - ?9 J& C1 ]- |& Q' W V1 oint dram_init(void)) G3 b( L, ]$ L( v2 ?
{7 ~& e" i4 q) p( Y" j7 T/ X
/* dram_init must store complete ramsize in gd->ram_size */2 d- C" Q; C1 v
gd->ram_size = get_ram_size(. i. _/ k* T" Z3 Z' B5 u# R2 C
(void *)CONFIG_SYS_SDRAM_BASE, & B- H9 s' S. A) p CONFIG_MAX_RAM_BANK_SIZE);9 [& O, H7 b9 ?! C* d
return 0;1 t. L7 D2 B3 n, H/ G
}# ?3 {: D* ] t% u. d3 `3 r
* ^5 k. A+ }3 ]
8 p! J! O6 Z, s- N! p( o6 Z8 ?" L$ | F+ O$ ?6 e
- x+ Q; k3 @2 _0 M+ [8 E! G hFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!1 X1 b8 ]& d. p& p6 I( M