标题: TL138 uboot是怎么区分配置两款核心板的 [打印本页] 作者: Mr.Loser 时间: 2014-9-11 09:33 标题: TL138 uboot是怎么区分配置两款核心板的 核心板1:DDR2 128M Byte NAND FLASH 4G bit & z7 D' K/ T4 }" Z. _, o核心板2:DDR2 256M Byte NAND FLASH 8G bit+ {! M* L" ^' ?
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢? ?" N1 `; u, T0 k( D. ~
5 s( ?, |. `9 G3 }' ~$ b' ^是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?5 p1 V' L& }! K8 Z. ]
# b3 @1 m- K! W: d; M 作者: 2532609929 时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下: , @$ O2 w5 _2 A7 T$ a/* ' T% ^7 K7 B7 P3 @2 a4 N& m% B! r* Check memory range for valid RAM. A simple memory test determines2 x, V# W: n( R4 M
* the actually available RAM size between addresses `base' and2 M9 e, G. H _# r2 \
* `base + maxsize'.% w: R3 @/ c9 b, P' d
*/7 ]8 u- V H! F" w6 j$ n
long get_ram_size(long *base, long maxsize)9 I; p; x( h4 N$ b2 M+ R" Y
{ - Q$ v* E( K9 l" ]" K volatile long *addr; * u8 b( y5 m$ I2 B long save[32];- L f8 A$ E: f0 Y, Q; P+ Y
long cnt;. t3 B d: |3 U3 W* I I* O5 C
long val;4 a. o# k9 k( l
long size;; A% r8 A( T2 b
int i = 0; . H( ?. Y$ l: D' \9 s; [3 `' l/ Z
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) { & g4 k1 Q. e$ s addr = base + cnt; /* pointer arith! */ 2 j" |) E& b" x/ M+ u8 G( H& T7 J sync ();4 X" s8 A6 o9 l
save[i++] = *addr; + r" I9 M) n5 r- O' t sync (); ; j# P1 }3 C B6 _* v2 ~. S *addr = ~cnt;& E1 v$ K% a$ a) l3 X2 C
} 0 y, `2 X& A, {4 i ' x9 z# I& ?$ l4 g7 ?( C addr = base; $ x9 l J& z+ u* k9 e sync ();6 j1 S4 s' X, L! L/ D, H) t) L2 x) J6 m
save = *addr;( f) a( l z: R1 p: \
sync (); / X4 W9 S1 q. ^; v% t% n! Y *addr = 0;3 U2 Y" ~( t! g
1 }& m: f$ d" i& P8 F sync ();9 N5 c) _) @" H3 u( o) N2 x
if ((val = *addr) != 0) { + W! b- [* u, w) m+ S5 d% c /* Restore the original data before leaving the function. % f9 W2 v" u+ j" X; H) b. W */9 X6 {1 g% z+ o/ \
sync ();' X8 e+ P% i* v0 V+ M/ g
*addr = save; , ~+ a' R- y. l6 k- o8 X for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {' p0 N/ i `" g; `
addr = base + cnt;2 T/ u! [5 _! C1 q$ q; v
sync ();1 Q M8 `( C6 F& O
*addr = save[--i];# a* Z7 j6 a6 _7 ` \0 v
}/ Y7 g7 l q) E
return (0); 4 h9 y( j- ^2 \0 y! P7 I7 s) S& w, k } o. [; m4 u& S
8 e7 B. w+ `% ]7 d8 f, s for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) { 7 V! L) Z8 f$ C/ k) d; i: M2 p, r addr = base + cnt; /* pointer arith! */ - ]: _# p5 \8 p' v4 _5 H2 H0 d val = *addr; 4 ?. A3 B; j h+ a9 ~ *addr = save[--i]; ) l0 d+ E/ Y. m7 e5 E( i; k* O if (val != ~cnt) {8 f- N; l4 K7 r' j0 \8 m/ i% x
size = cnt * sizeof (long); / g* g: b8 U9 {2 \- r: K /* Restore the original data before leaving the function.$ n o5 ~; x( D' X& ~$ s
*/7 G- ~9 l, |' l; q6 ?9 [- ~& h
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {) }' n }5 a" D; f3 ?( w
addr = base + cnt; 3 v* K2 W" `; T+ m$ f7 { *addr = save[--i]; ) Z0 C% B* h+ E4 j9 ^ }; ~5 E; \0 ~% @3 K
return (size);' m1 [8 ?( F/ P8 I$ _
}7 {! O2 l5 t. a( F- F
} 3 o1 v- q0 }/ p2 H* l( V/ k: R& t. ^4 |* x
return (maxsize);8 R- c# m: d/ x) _8 X; n0 ^
}! Z2 m& V/ P" W; U5 v, U
int dram_init(void)3 Q( b/ v! p4 ?. e0 |/ L; P
{8 c9 U3 s$ e; @5 L
/* dram_init must store complete ramsize in gd->ram_size */, c) b% J5 I' d, p8 ]
gd->ram_size = get_ram_size( 3 J$ x3 A! O( L# L+ k (void *)CONFIG_SYS_SDRAM_BASE, ) Q# i1 O$ P' A" H+ v% P1 B CONFIG_MAX_RAM_BANK_SIZE); ! I# p1 F. s- ~& ]" M) O return 0; 4 x/ A3 g3 L7 y} $ Y7 O/ F9 g2 ?; {% r: Q 2 {) l) Q' P+ Q8 J, Q0 V$ K1 G6 g7 q& }
$ v F4 }2 ^% K' q % x2 N' H. U9 T" q, U3 w! B. {/ GFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助! 2 e' _/ g: ? u$ Y, g0 l2 K, o9 X$ V0 r' B: }
5 z; N7 f. k+ S ' l2 v9 m, {2 S% }+ `