标题: TL138 uboot是怎么区分配置两款核心板的 [打印本页] 作者: Mr.Loser 时间: 2014-9-11 09:33 标题: TL138 uboot是怎么区分配置两款核心板的 核心板1:DDR2 128M Byte NAND FLASH 4G bit/ f) r' C" S: P2 X1 r
核心板2:DDR2 256M Byte NAND FLASH 8G bit 0 [# Y4 d/ \/ H+ a. \这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?+ N: l& J+ j9 Q. N' h5 N; S
* z( g( R0 w- N6 a3 B: w+ ~是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?, R+ F7 Z- w2 r4 c3 Y% Y
) [4 V. _- D [! P! H' E' i, U 作者: 2532609929 时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:; n$ l1 ~% m# m2 l; w
/* * \$ u2 {( {. g6 s, X* Check memory range for valid RAM. A simple memory test determines: ]8 m) U6 J4 }- ~
* the actually available RAM size between addresses `base' and& P2 B" h$ x7 F. E
* `base + maxsize'.2 J& ~5 M9 M- t {/ Y
*/ U0 W1 k+ M0 W/ b+ C
long get_ram_size(long *base, long maxsize)0 @+ @! `* ?( S% U) j
{/ a' c- T7 I2 u$ X% A) k8 y# |
volatile long *addr; + L8 c9 } Z S. N: k long save[32]; ' Y. d8 w. \" R. F! L: R long cnt; $ R. w. Z! t' a8 A long val; ) }6 H o ~! X' P& ~ long size; Y) Z$ V4 `& t( X/ x+ b4 ~7 O int i = 0;/ I j3 H- V& n: `
$ M: r. W9 u: Q0 p# I" j for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {4 ^1 R/ q2 c% r$ K& ]
addr = base + cnt; /* pointer arith! */2 Q! t/ S* k0 \9 `
sync (); , r; H x; m% W) i2 D" t save[i++] = *addr; 7 T z1 _8 N+ _8 `# R+ v sync (); 0 O5 ]' v0 Y" ~6 m. k *addr = ~cnt; ( c+ S' m* p* O i }- N7 Z8 J$ ]7 h2 P7 u
" i! F7 {7 b1 l* D/ u/ v
addr = base; & x# w- t4 W9 B8 w" H sync ();. k* }6 h) ^! y* l% c. a- ~
save = *addr; - N+ Z& y0 }# O# v sync ();4 Q1 T. C- ]# P4 s; j6 q
*addr = 0; # N. Z7 S; j1 X/ }$ |/ B$ y$ q $ n$ U7 U. v, G; \) Y* Y5 J: c7 k sync ();1 t' K+ B$ r% Y7 x" k( U. T2 }
if ((val = *addr) != 0) {# ]. {. @9 J/ {0 \) A( q/ D) b
/* Restore the original data before leaving the function. $ J( J* }6 m) S( Z- R */ $ z9 e0 H2 m5 a% n3 G sync ();3 }2 C. m; r! }0 {. z
*addr = save;( e$ F" ]# u% t
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {8 j" y/ r) Y' S1 ~8 e
addr = base + cnt; 8 J6 U. a) r" V+ M$ v- m sync ();8 R+ }6 W8 d4 ^* L& C F) ^' p- p
*addr = save[--i];7 P/ f2 m9 X/ P5 f7 o- U8 A
}; k+ c+ r0 E, r7 F r
return (0);- {6 p* f# f+ d
}5 E0 [1 D n- `) W) F0 f) W' r
2 e, L8 w3 Z8 a for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {# Y' m9 k" Z6 v6 u h4 m
addr = base + cnt; /* pointer arith! */ $ n# `. U0 Z0 W. {& J6 { val = *addr;- F Q) u4 g+ c* V1 T; |
*addr = save[--i];, v, d7 ^- n0 f( [; j
if (val != ~cnt) { 7 B/ J( [( a% N# F7 h: N size = cnt * sizeof (long); T( K" A1 v4 r; O /* Restore the original data before leaving the function. + v8 ]+ Q7 L* ^6 w& o */ , }8 c! p+ K1 K9 c- I+ Z D for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) { 9 r4 h6 N1 p7 Z4 v- d addr = base + cnt;/ P* W; X. F# x. E% S/ l$ Q% n
*addr = save[--i]; 7 e% q" ]- ?2 V( s5 ?9 n }3 J6 D: c, @( q. y+ m
return (size);2 [* e c. x! G8 u, y0 X% U
}8 y- G4 y' y0 r
} + y( E+ m2 n8 O2 {# _5 i3 H4 y- V( d- z9 V. d! i
return (maxsize);& j( X3 _7 X* t* i% {
} 1 Y/ H7 q* s/ eint dram_init(void) ; s D T1 e0 r$ `# W" c{. s3 m! P$ K4 {: j6 y8 b0 p/ Z
/* dram_init must store complete ramsize in gd->ram_size */, z( r3 w; m: }. o0 t$ m* q' u
gd->ram_size = get_ram_size(" V' q$ {! e$ n3 G
(void *)CONFIG_SYS_SDRAM_BASE,) N9 P, o, k/ h' y9 B) Q
CONFIG_MAX_RAM_BANK_SIZE);1 S$ k' v9 l* T; l5 {
return 0; % o l* v# G9 ~$ U+ i$ ~# ], u} * z% Z# t9 U& H7 F& X4 u: T1 ]- R- B . C/ \7 Y! _: m2 T ' [, d$ B0 h& A I5 { h* A* l0 Z1 X