标题: TL138 uboot是怎么区分配置两款核心板的 [打印本页] 作者: Mr.Loser 时间: 2014-9-11 09:33 标题: TL138 uboot是怎么区分配置两款核心板的 核心板1:DDR2 128M Byte NAND FLASH 4G bit " T# V6 i1 @3 V, t. X5 V2 O' T核心板2:DDR2 256M Byte NAND FLASH 8G bit # F/ i' J1 Z7 r5 q, o/ Q A这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?0 h2 c$ A) J& ~
2 J* {$ L( o5 d- }! o, [+ F0 n是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?- G9 z/ h. J% Y9 F
3 ^* Y7 e% I- R" a6 L 作者: 2532609929 时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:# Z/ \0 X0 U- }- L3 |, u
/** ^" P5 h4 D/ x2 W1 r
* Check memory range for valid RAM. A simple memory test determines " A& v8 d4 k+ @' |* the actually available RAM size between addresses `base' and. L0 g- I+ n! k. P T
* `base + maxsize'.# A4 \8 s( u$ v% x. c
*/0 ?" F/ R5 X/ C5 {1 O4 q
long get_ram_size(long *base, long maxsize)% t" Q0 L3 A2 K6 H: y
{ w* t, @( p' r! }% ]) B volatile long *addr; 6 H# _( O2 n+ m! z, { long save[32];7 t3 A, w/ w! x* Q8 ^
long cnt; " {0 ?- g3 b* C5 X5 N7 j long val;5 i/ i8 z/ t3 h
long size; 3 U( r4 I1 ]1 O/ N, u int i = 0;) a4 x$ j5 J. F9 v3 k
* a; d$ }0 t8 g2 p7 K! ? for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {2 H5 u# s2 V% `
addr = base + cnt; /* pointer arith! */ " G0 u+ D3 O; m( V sync ();1 p* |8 b0 N9 g! j8 b
save[i++] = *addr; 0 a$ `$ z- s" D7 ~3 Q( J- y% _ sync ();9 i$ ~+ j4 R! y v: t8 p
*addr = ~cnt; ! W0 N4 x: d9 Y3 @% v& T } ' g5 J2 ]( Z& S% G5 V 9 P+ Z9 N$ ^0 T' k addr = base;3 d, m. ~! T( c* ], \, \1 ?- d
sync ();5 N* r8 t d# O# o, l3 H
save = *addr;$ w7 r, Z5 \' b8 [4 O; i! D" y5 H- y
sync (); 5 k6 [( T; j! o% J8 c/ `2 o6 t% D *addr = 0;3 K1 e: M2 ~$ c9 Q/ f/ M1 n0 t
! x3 F! {( @5 v2 r sync (); 5 M) R5 Q. F( J4 u if ((val = *addr) != 0) {0 l% ?8 E5 ]" ]! Q, o
/* Restore the original data before leaving the function. H8 @6 D) N* @6 |9 ?: r2 \: _ */ 9 W' p6 p1 T- J0 c sync ();) b% H: b. u0 d5 w. d
*addr = save;* d5 D9 k# d2 |+ ]4 \+ ]' Y
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) { ) ~& n* m( O5 ~7 C M) n addr = base + cnt;) w0 S4 b! [: L" Z# m p; O0 J
sync ();1 n; r" l7 X! i
*addr = save[--i]; - q1 A5 n8 ^3 u }9 B' y i: p' W) Y
return (0); ( d+ t0 M& e1 D: s } @$ E) F/ S& d/ v5 {4 q( l- K( A8 A; r9 Q7 B; M6 ]
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) { w! a t2 k) C8 Y; d addr = base + cnt; /* pointer arith! */ `( Q9 U6 N4 T0 m; S val = *addr; % e% g$ g0 z1 N( z+ x *addr = save[--i]; % ~$ D8 g1 e1 y! w8 z9 ? if (val != ~cnt) {- Y7 Y4 P1 U8 }& B( J
size = cnt * sizeof (long);; s+ _9 O8 T6 C1 z& ?5 F+ l
/* Restore the original data before leaving the function. ; b# N% u/ U; f: |, z" L2 C- ] */ ) ^" K' h# Q2 h; w for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) { 0 d8 F+ O! ]5 G ~9 O9 ] addr = base + cnt; 5 m7 n) @; D3 F: _8 [0 m% ]% i# `4 p *addr = save[--i]; # X" e, V8 x, I L% O; w, m L } 3 R0 m/ o( X5 p7 W4 d return (size); : u5 o6 @; G8 m3 O } * y; S8 i6 W- W" @0 c } : B/ B& [# n8 F [: D; W: M( M; G+ E/ E 3 T5 w2 ]) K6 a" ?- [ return (maxsize);$ W( f' l3 a$ b/ I& D
}" Q' q; s) H( A; _
int dram_init(void); w3 j/ j% t3 C6 I9 k
{0 p; F5 A) A* U9 z' n% |" |: b
/* dram_init must store complete ramsize in gd->ram_size */ & a! I) Z5 p2 t gd->ram_size = get_ram_size(+ }- i9 ^9 c! j5 Q
(void *)CONFIG_SYS_SDRAM_BASE, $ y; b0 L" r; a9 }$ |1 o CONFIG_MAX_RAM_BANK_SIZE); 0 Z) P& b- W, v7 Y1 u1 X7 ?9 s return 0;7 |8 u1 d5 h8 L7 ~" H# v7 d
} ( N n( U; f! X. Q& Y9 E8 j# ]2 W+ d5 ~8 L! l" \
9 K/ ]/ |6 y6 W J) Z. Q
) |! T, K' y! h2 R8 F) [, T7 o) s1 @4 P
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!8 A0 e# o2 l/ m4 s3 k5 _- L7 D
. b: Q! U3 r6 ` U( u; Q# R