, v. e3 _' w# y5 d- ?是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?# ^. e, B2 J. U
; y+ F0 b4 `' U9 R* ^# Z 作者: 2532609929 时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下: 0 Q- b' {5 F. q3 x, q6 v" |/* " `6 i9 R* X) T4 K* Check memory range for valid RAM. A simple memory test determines Z# j. l, `6 i2 r. d
* the actually available RAM size between addresses `base' and" k1 @- O$ O+ u8 [) h: \5 T
* `base + maxsize'.: y5 `# [ e4 Q5 j
*/1 d+ v( `4 w$ E
long get_ram_size(long *base, long maxsize), ?+ W6 {9 S8 ~+ ?
{ $ f1 V: z/ j; r volatile long *addr; + R% a- _6 Q9 ^/ }! n long save[32];8 `% Q" V: P' k3 V, t: P
long cnt;6 d v) o5 [; {: D- T
long val;: i K/ v$ g0 `. S8 S
long size; 8 M$ q, u# T9 s6 t int i = 0;, q8 L- U3 L/ h
) M! b& a2 S! x% M: L: \# i for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) { $ r( g' P h' V6 u/ r* I addr = base + cnt; /* pointer arith! */ w' ?4 K; Q% b& [3 G# Q8 k
sync ();( |+ A! u1 d4 ~# r0 k; z( i# f
save[i++] = *addr;- o. x3 |& x9 L% h+ y" G
sync (); 0 L4 i' G4 V% E3 z; O v& I *addr = ~cnt; 6 T$ }' o2 a) z; x }. n& ~% {! l* a* |
5 ]* a1 U2 Y( P% H8 W* T }% F- _* Y) e
addr = base; 2 ?- y' u% n3 z' |0 a sync ();2 f" C7 U1 ~9 B
save = *addr;* W; }$ L4 T& Y$ x5 R" d
sync (); y! R* K! g6 x *addr = 0;+ \3 _ D/ V" j! |( c. i4 \1 y
/ e( s+ y8 R2 e! J E& C; \7 E
sync ();8 x% F0 Q: x/ b7 `& v+ f7 H& {
if ((val = *addr) != 0) { ) e% z& \. `9 S /* Restore the original data before leaving the function.' o; D% Z) {, l9 s$ c
*/ % F0 k% \7 T0 }" M1 R sync (); " C1 u u7 b O, M$ J$ `" E *addr = save; + G0 l2 r* ?3 O( U; \ for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {- V. g* u& l& z% H, }" z$ \# }
addr = base + cnt;# r: J* y+ }% i
sync (); , a M% W4 V2 F) j" h( r4 y# I *addr = save[--i];: F8 {3 K) l" v; A( m
}4 |. y( ]8 {: s' o: b8 W% x1 q
return (0);7 H9 c3 s, Q" K+ p
}0 E' g) M9 A. Z1 w5 J. b. S6 U6 M
@' f8 e' r$ Y( j, e
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) { % L. R! z B" d9 i" k addr = base + cnt; /* pointer arith! */! A/ j- z" K' u" r, I7 R
val = *addr; 1 \3 W8 z: h# ] *addr = save[--i]; ' D+ Q% z/ h) u. A if (val != ~cnt) { / a g" t5 I' v8 o" n& s; w# H size = cnt * sizeof (long);9 l- g N/ O9 A7 F* A+ _( s
/* Restore the original data before leaving the function. * s$ Q9 a8 i% [ */, ^7 ]0 |* a+ G2 f+ H3 V7 z+ k
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) { & b9 n9 p, Y e6 J) M addr = base + cnt;/ y4 V- d% F6 S
*addr = save[--i];2 f( b7 i" \+ V: ^# Y
}* O6 Q% w2 B2 \7 Y2 m# L# F
return (size);+ N% ^0 n. s9 U( j
}, g$ J D& T( A9 D. [. f, e4 H7 l
}7 c0 F+ o* v* ?" T
2 l. l% ]% l+ a
return (maxsize);6 c: T& X/ }8 x* T, x4 t
} + f& u9 ~5 T9 H2 {5 w/ q( kint dram_init(void) * [# G! e4 \9 }$ r{2 t6 m* Y# `- c: A# O* R/ j t
/* dram_init must store complete ramsize in gd->ram_size */8 u) p: L" o. w7 g, S; @! W2 W3 v" p6 B
gd->ram_size = get_ram_size( 4 R4 C' B+ w2 b) ?1 P/ p$ c$ ~ (void *)CONFIG_SYS_SDRAM_BASE,# j$ z; M% ^/ J# I( r; g, s5 Q- p9 S+ N
CONFIG_MAX_RAM_BANK_SIZE);4 M) j) F' D9 X3 S& J/ w+ v! t
return 0; 1 D0 E' R! u! _, k' P8 v} 3 c/ \/ H; @7 _- ?' D/ v: s, W) W l! P- S# u! c& I5 E: X" C3 I 0 D- [) o1 |, i9 h % {8 Z/ `6 q" G 1 r& j' Y# u2 u" g: TFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助! 7 G( ?+ q5 l+ d4 ~ % @: @1 V5 w6 o+ ]1 e2 o0 [ , M$ L% Q: ^2 {- K3 P }! Y4 o* ?) K& p1 U* A