3 L" w9 G r# e, X: J/ B是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?/ J/ B, p6 g. P
, K: n2 M- i: m: z 作者: 2532609929 时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下: " H! n' T& G5 d1 v- q6 A/* + r4 ~; z8 Q2 \- d* Check memory range for valid RAM. A simple memory test determines$ ^/ c* `% x" o( O. Z, y; S) f
* the actually available RAM size between addresses `base' and$ i2 }1 b6 S# L5 Z4 \/ T1 K
* `base + maxsize'. 0 [, [. h. l$ X1 `' p9 l*// S- X; m b4 n6 c% M
long get_ram_size(long *base, long maxsize) 5 T( e0 ^' W6 U{ & w( }* h3 T0 s% o volatile long *addr; + S6 w3 A4 d$ |: Z2 O long save[32]; $ Z7 K: I4 M) a& l long cnt; ; D/ v/ e. A1 R8 a+ F8 y/ N long val; 5 }- k8 {3 ^. i* ` long size; ! X, w. j" [/ R9 H; p1 f int i = 0;9 N+ H' \" m6 l: I
" j) B* n0 ~7 L. |8 H for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) { 6 N. u. {/ [$ W2 w8 x, D addr = base + cnt; /* pointer arith! */ 8 o6 y; p, M/ j3 j; I y sync ();3 f7 d. z/ l' ]1 j; t; [& p& l
save[i++] = *addr; 7 R0 D( e b) X sync ();; v6 N) m6 _% m9 [. y* c3 q: r; e
*addr = ~cnt; 1 T# H$ J( Y8 _3 n5 \2 ^ } 8 q# X: t/ ?2 `, j; A ' [, W9 N2 r! p% M5 o( z# g: ]0 B. W addr = base;" R; J6 E3 g( a3 q R! M9 m
sync (); 2 H$ Z# a8 I% U save = *addr; * z; E, W5 ?3 N4 I sync (); + t/ F& F6 C A; u7 I3 K *addr = 0;2 _! j/ a: Z9 V# D
; E n6 B9 a8 I' I
sync (); 9 w' m: R, u. r& R7 v if ((val = *addr) != 0) {' c R. P, G2 y6 B
/* Restore the original data before leaving the function.) s/ T9 d) A" h7 M( ]' [
*/ . z3 |. c5 ]+ R* {% Y0 W) t sync ();/ B2 s! ^% p; Y; X6 p1 |& b' d5 T3 z
*addr = save; $ B& C+ O2 Q; B4 ^5 X for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {% G# _- r, o& s9 G
addr = base + cnt; m; c6 S8 z! q5 r B sync (); f+ Y" Z4 O$ R2 ]6 H' j5 J
*addr = save[--i];! p, }% k% U' _) `1 }1 u
} ( ?: J3 S+ Q% |, e) m return (0);8 l0 _7 [) z" b- L0 N2 r
}/ R+ s' {0 \; z
* q" c n* d. h" h7 e% z( N5 k5 e7 H# h+ B
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) { 1 t; V c' I6 k' I0 e$ W addr = base + cnt; /* pointer arith! */2 @* E) l8 o; ~# ]
val = *addr; ) ~/ `8 y$ {* q, E' s; T# z# j( ` *addr = save[--i];, p0 z+ f8 S2 }* P' F
if (val != ~cnt) { 1 }/ f, F- x' f! i5 S8 e0 G% K size = cnt * sizeof (long);8 y1 T1 M2 J' u# d4 s, f, ]
/* Restore the original data before leaving the function. $ o/ S% E. _/ ] */ " ~- @- u, Z+ `& D: C( e for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) { / I6 c' M) _/ n4 h: L% ] addr = base + cnt; 4 |7 Y, c w- w) b/ d& g- A+ C *addr = save[--i];! y( Z% S. N8 p* ]) |
} 6 J- P- e, K5 h# @8 Y' R2 V return (size);, F- O B& F' E# ~% t; i3 b, |
}& F4 P2 r% ~5 L/ T
} G( o! O! H7 R
" o2 }$ ^0 d( U$ j5 N) Y* R0 t return (maxsize);& Z! B4 M' R: R* P8 D
} ) h6 O1 r B+ E2 l; ^7 \6 Yint dram_init(void)3 y; g' d9 _& A% k- G
{( [) E" Q; h& J! ?
/* dram_init must store complete ramsize in gd->ram_size */ ( F ^& J4 G9 Z, ^3 D5 l4 `7 d gd->ram_size = get_ram_size( ) d$ s9 H9 k# ]) V1 j (void *)CONFIG_SYS_SDRAM_BASE,+ }4 ]$ e0 x# O( Y% Q! O2 M
CONFIG_MAX_RAM_BANK_SIZE); ( R5 n7 `. ?) n: r ?" | U# W$ E return 0; . o; N. I- I; z- A. L& D" C' k} ( M. X7 ~9 E! i# M# o : {0 O9 R% E3 j4 n8 x5 M, f# ~1 v. T! Q# H4 m) x( e6 T
- u0 K* N/ X7 p2 T! R: H 8 x/ ^( c2 h# e4 W) C) CFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!) |: U8 \6 ]: M& Q: R
, |6 Y* O0 m8 L4 y+ _
1 S5 Y& z; q, G% G7 ^* I3 E , m& p+ E6 y2 u+ d3 Z- l