标题: TL138 uboot是怎么区分配置两款核心板的 [打印本页] 作者: Mr.Loser 时间: 2014-9-11 09:33 标题: TL138 uboot是怎么区分配置两款核心板的 核心板1:DDR2 128M Byte NAND FLASH 4G bit ! `# ~5 w$ m! ^' e) \核心板2:DDR2 256M Byte NAND FLASH 8G bit 7 d# H) h+ L/ E* A" ?这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?0 Q4 W4 Q, U% c! m' b- x$ ~3 w+ A
" [2 K2 u+ u9 F! x! {8 h
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了? - i4 O/ x9 r% O) q& r! k 4 T z: C- y+ T9 _( T5 w9 e1 ^作者: 2532609929 时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:% z1 N: L$ e2 d
/* ( @% v1 S" ~* T5 I- K- N N* Check memory range for valid RAM. A simple memory test determines' c3 }) A" o! [
* the actually available RAM size between addresses `base' and 0 d+ e; u8 b, I) W' p* ]" q* `base + maxsize'. / O k2 i. r0 ]: i) s5 ?7 p*/! _$ I. E) ~ w& d
long get_ram_size(long *base, long maxsize)6 o4 A3 c1 K& m4 b2 l5 O7 K' U
{ ) a: E: D6 V, U3 g volatile long *addr; ( t' w0 |: m9 s2 s3 X v8 ?. b long save[32]; 1 W0 A# \+ X1 k- j6 r long cnt;- @( O s1 H; F7 ~( Z3 [5 f# B: o
long val;2 }0 n& _( t" @$ I+ u) d: a
long size; 3 M) B/ N) [/ q6 l2 D1 i, R) u int i = 0; - u' i, k% Y4 w$ I C* Z8 T i0 V! ]6 B' j2 Y
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) { , d) b- F, j- K( {/ V addr = base + cnt; /* pointer arith! *// @' B6 @; K, x I$ v: r
sync ();, @/ E; E0 N S; z! k
save[i++] = *addr;8 W/ i+ Z9 z- q
sync (); " J9 r& S5 X) V! B- M) O; ? *addr = ~cnt;# ^( A+ h2 V& A1 k# c0 M4 E3 v
} , Y- v3 ~3 g+ D 5 R; s+ _6 c1 Z/ k1 v5 D addr = base;- B! m% r, `7 \+ B
sync (); # X+ d# w {) ]7 I# r0 e) R, ^ save = *addr; U" h3 w/ [$ e1 d sync (); " o |/ X* \; u) n) \5 O1 U' h _. i4 _ *addr = 0; $ ]' n- w p2 Z; j( [, L8 i% C% v- N" t ) D9 ~7 V k( W, B sync ();; o! m9 A) e4 N1 c( s- e
if ((val = *addr) != 0) {! j* x4 w9 C& {3 a ]
/* Restore the original data before leaving the function.5 b! i' S! a# R3 F4 f8 r- c
*/- p+ T; b0 B' g/ p0 W* f! G. `
sync (); B, L, \. z5 E8 L *addr = save; 4 _2 q3 ?8 H6 d$ Q( K1 X. T* C# l for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) { 7 q, R+ E. a+ X addr = base + cnt;3 D4 C& q1 W" j4 [5 ^+ S6 E, L
sync ();& n% {+ `' m6 P6 w- |
*addr = save[--i];% D2 Z) X1 E9 ]
} 7 j& i+ E- W S( W- W' J" Z+ G+ a return (0); ( ]# `( d! a- O* M; X% ^ } 2 e8 o) X) ~9 S8 {$ u* T; B1 C# U) z {! F/ b2 o. X
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) { " F$ [) K4 P# A4 j" @" @ addr = base + cnt; /* pointer arith! */9 t% R: C6 `, @/ ]+ w7 g4 L
val = *addr; ]! |( o5 ?) D! M3 A) [
*addr = save[--i];! H& C1 {2 h' \8 a% ^% v) p
if (val != ~cnt) {4 u2 n0 G# g- d
size = cnt * sizeof (long); & H; p' I0 e$ J6 i /* Restore the original data before leaving the function.) Y$ f! L% K1 p g% ~
*/ 9 g% x8 Q9 [6 v7 V( [ for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {2 V$ f* F. u8 Y- ^% i) u
addr = base + cnt; ! d2 y! {) s7 V: X *addr = save[--i]; # |0 g5 [7 p0 [/ Y } % m/ V, G2 \( ^% k9 _+ O( s return (size);: Q0 I) S. w) ?$ k1 ^# m* |; k6 c% g
} & j/ N' R1 B2 g. h& `9 T }* k* C& a1 Z. S# P& V5 G; a
# d- e& e X+ T! g) s
return (maxsize); 6 ~/ ~" ?3 J B* f2 X# K. t} + j M. `; r/ n" _$ J: W7 R9 Sint dram_init(void)$ K3 t& w$ f$ z
{! _9 l4 a* V6 \& A$ Z- ?
/* dram_init must store complete ramsize in gd->ram_size */ ; X2 ?- q2 M0 j. g& s k4 t gd->ram_size = get_ram_size(/ ~3 g' z/ S z( \+ B3 E- y
(void *)CONFIG_SYS_SDRAM_BASE, , k) q* M( J, }8 R5 ^ CONFIG_MAX_RAM_BANK_SIZE); 1 |+ B2 f) n Q2 V return 0;! O, M }4 V- R% B7 ]6 Z. ~
} , `* P- y _8 k0 o$ I& [6 g; z9 q6 V. t9 ?4 n6 q- Z
2 B0 O" q/ \0 j4 l7 w" v T. H- k6 Y: B. n5 j0 h( ]$ I' p
- r4 a/ C. v/ H8 O
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助! - _/ T* P5 Q, u. N' H T7 N9 W" J+ s
' M. [8 }5 t7 M2 b$ q! _. |' W/ R9 s