标题: TL138 uboot是怎么区分配置两款核心板的 [打印本页] 作者: Mr.Loser 时间: 2014-9-11 09:33 标题: TL138 uboot是怎么区分配置两款核心板的 核心板1:DDR2 128M Byte NAND FLASH 4G bit 7 N4 b" v. ~# g F" d核心板2:DDR2 256M Byte NAND FLASH 8G bit 7 f3 ]' t* W2 c8 Q) m* X5 R这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?+ Z! i, d# F0 a8 |, m/ J
8 T4 U' M3 A7 V+ U. w
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?, W! ^0 r5 }. S6 p: G0 Z
$ I, y& V4 n E作者: 2532609929 时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:& m2 G$ @2 a t/ w; q
/*8 ^7 h: I5 y6 }. y
* Check memory range for valid RAM. A simple memory test determines& F# b$ I5 C$ T G; H7 G
* the actually available RAM size between addresses `base' and/ J. b; E- p v
* `base + maxsize'.: F0 \! ?, `% l" _2 Z& Z
*/' q2 s3 e, C3 n- I! _' w
long get_ram_size(long *base, long maxsize) ; k: p e( W% X) c2 h) h{% c V o6 ]# a# `( ?; P* P
volatile long *addr;/ O' E& {0 g% T9 ]
long save[32]; - d8 L+ R0 v4 A n long cnt;" p/ K8 ]" c: q3 A ~9 z
long val; / n+ o. c; b! K$ w: |1 @0 g: s' _, ]$ ? long size; & Q. y% h3 f: \, I* K int i = 0; : v* P' T! F2 I j1 ~4 T+ S u9 z, y+ q" F: y
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) { # u3 g, b6 p/ M, a+ ` m addr = base + cnt; /* pointer arith! */ 9 _1 Z2 G ]3 e, g* B6 ^# O sync ();8 {. ?" l. Y- b" D7 ^
save[i++] = *addr;5 X# Q+ ^0 y$ T( t( c3 \$ S
sync ();, m/ [9 ]' J. d) j: g
*addr = ~cnt;" W' b0 H) i: K% ?
}8 r) @# G+ F" v1 j @9 o
& m/ |& L6 r6 y) d addr = base;2 d" J6 n7 P- a8 q$ [
sync ();3 x. E2 T( \- w5 |/ O4 f0 {
save = *addr; $ i* r. N* h. p, {! `1 M7 H* v sync (); 4 v* m- \ O2 W& C7 ? *addr = 0; + G' m* w- H+ i* O! k0 B- R 8 X8 k7 d4 }& ]7 d3 j: Y sync (); 5 P& @/ b: ` `% R1 k9 _0 o! k if ((val = *addr) != 0) {1 T8 E! b( u- ]2 F# x+ e
/* Restore the original data before leaving the function.+ `6 y7 Q3 z9 P0 r7 Q% ?
*/ ) e- F- |8 T" Z) V$ x9 S# s; @ sync (); / e$ d% H7 r/ I" u" D4 ]( P& x+ } *addr = save; # Z0 N& c" N/ v) C# S3 P& a for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) { 7 D) _ w" z' m2 T9 V addr = base + cnt; 7 |4 P' ~$ D/ M sync ();- e; L4 u/ u# S$ m7 g
*addr = save[--i];7 N. x0 \$ ]& v) h$ m) j5 ?, o
} 3 Z# }, A$ d# V" A7 n return (0);0 \5 u, O2 @* i. }9 p
} ; j" b+ u: U; v x% H. j 4 q; R9 _+ N! o2 i/ I for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) { 9 _' q) E5 c" k0 G; ? addr = base + cnt; /* pointer arith! */6 k$ e2 e- O6 \& f
val = *addr; 8 a( q# e& d: M* T8 H *addr = save[--i];& _/ ? U- p4 E) m& r
if (val != ~cnt) {) w' d9 Z: f1 a4 I
size = cnt * sizeof (long);3 S7 c' A' ?) u- Y% L
/* Restore the original data before leaving the function. - T: f2 b' r/ \9 f! t* C/ a */" `' k2 _8 @- O7 G/ C \' A
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) { . ^/ X" V$ _! K, F. U" {& J* P addr = base + cnt; ( o3 R& T& B7 f, P3 Y Q, f *addr = save[--i]; 4 g% S$ R) f3 C } 6 F% {2 ~& J6 y* s. K: _9 i return (size); 4 t4 J. P! H+ U W3 v* g, V _ }8 _1 c! \) k) M# v7 |
} % T" J! ^' e/ v/ H. e4 Z, Y# a3 e* I+ f
return (maxsize); & l. u* w* ^" t" S' R}& E3 t+ V9 s. c% I/ G) U
int dram_init(void)7 p# g& w7 y# x* A& Q8 P
{9 b1 p4 m! B( @" a# |
/* dram_init must store complete ramsize in gd->ram_size */2 \0 v$ i0 [* E; a4 _
gd->ram_size = get_ram_size(, w- c" n% X6 |' ^8 S
(void *)CONFIG_SYS_SDRAM_BASE, 0 R2 x& ^* P5 ?+ U* `& Q CONFIG_MAX_RAM_BANK_SIZE);) ^- }7 \) b) F
return 0; : v- e2 l! ~2 \7 L4 I: P- J} # H2 P- _/ K/ L7 J ~2 E7 U$ z& A3 B 6 q0 _" ^, C8 J& y0 f; U- G4 I- |5 V% ^. @
# }) k' v* T6 y6 m
$ u& V) u! Q8 Z/ fFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!& J4 H1 z6 D. o! h! M: _6 G
5 G/ P7 q+ P: Z# X
! l# w/ D; k8 E4 E% E" f! p, [5 l' i ; V7 l4 s7 g7 b5 T3 d) M