标题: TL138 uboot是怎么区分配置两款核心板的 [打印本页] 作者: Mr.Loser 时间: 2014-9-11 09:33 标题: TL138 uboot是怎么区分配置两款核心板的 核心板1:DDR2 128M Byte NAND FLASH 4G bit * H; `8 n% a5 c7 w3 g) w核心板2:DDR2 256M Byte NAND FLASH 8G bit 5 ^$ N! d7 k8 I+ t7 q8 M4 C这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢? , A& l- t( K. D$ R # c6 R$ ], c! s1 M O% w5 G是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了? ' w( K7 M0 d h( b/ }( Z+ T8 ^7 q0 W/ N 作者: 2532609929 时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:% e1 S Q) |% R$ [3 X
/*# w t) C9 v. T( ~6 T7 L
* Check memory range for valid RAM. A simple memory test determines ; S7 o& d5 I* P) V1 B- S* the actually available RAM size between addresses `base' and 5 l2 |7 ^6 ?' B- H( N! l0 T Y* `base + maxsize'.7 T4 u2 \2 [6 F
*/ C: K; p! u8 g2 W- e
long get_ram_size(long *base, long maxsize)+ X7 Q+ M4 _" \ `! U- V9 {0 R
{ 1 f7 ]6 |- d5 p5 l: Z9 [ volatile long *addr;9 U/ K& g3 y* N$ S
long save[32];2 I+ v) M+ Z/ e
long cnt; 3 k) d0 h; a. P X: i long val;/ P5 R2 _! Z; s- `
long size; 7 Q4 |' J5 U% x/ E# O. ]: {- ~ int i = 0;* [5 X* ~ l( _! g$ n
; j5 p* i. m! @ for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) { ' T4 J1 f" E3 u& h' l& {$ U addr = base + cnt; /* pointer arith! */: j/ S: X2 F9 T1 |# S
sync (); $ H4 g1 m' r+ e# U0 N& K. M! b# n) _ save[i++] = *addr;+ a# d; a9 p' J& y+ n& G$ D+ ^9 M
sync ();; y- \7 K6 m9 Z$ I$ m2 U
*addr = ~cnt;7 b' z7 h8 Q: S& n! V7 _3 ?- ~9 b
} & n2 u( O# I, T. f2 L" }- f* I % X5 a. F- f9 s0 @" y' ]% G addr = base; 4 b: s$ M/ B7 A7 ]! J5 P+ V sync ();" Z9 b$ ?9 `6 R4 o; K6 C
save = *addr; / p' W4 `- K5 e sync ();3 z$ I2 {3 L# `' K, B9 y
*addr = 0; 6 ?8 [8 K# ^5 ?: _4 D4 ^! G" c6 K' c0 G1 m
sync (); 3 @' p' a! A# g+ v( W5 P; x if ((val = *addr) != 0) {$ K5 w L6 S; f% I' b, K
/* Restore the original data before leaving the function.$ o5 v- G# v" ?# D- E
*/ 1 b3 D+ V& `2 W C, o+ C sync ();4 y) J+ ?* `* `* L% t& Z
*addr = save; * u- C, h' V3 G4 j for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) { - d \3 [3 S* h K- Q; K addr = base + cnt; " N1 o0 |3 M1 w" |4 R sync (); $ G8 y2 U) a) `$ g6 x *addr = save[--i]; ) e6 k8 M2 h( z, g8 \, T }5 ]7 ~- e2 N, u9 T' h. L E
return (0);: `7 E5 J3 G) z5 C- V% R
}, `4 ^6 g- @) ^: W: |
& h0 T' \: _3 o# y I+ c9 E' R
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {- \8 g6 s. p9 |
addr = base + cnt; /* pointer arith! */ 0 P$ L" U# }5 z7 }5 s" u1 O3 t" ^ val = *addr;2 u9 X- S9 x& a3 f
*addr = save[--i];% ~* C8 W5 H4 a: W) j$ y
if (val != ~cnt) { . }" @& K% T3 y" Z size = cnt * sizeof (long);: f6 S/ a @. x
/* Restore the original data before leaving the function." Q8 G: l" o* s9 ?: @) P
*/ 2 s6 A* M- n. U# \, N: q for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {& E$ H2 d$ l0 i$ V
addr = base + cnt; / W9 M A5 d5 Z0 w) n *addr = save[--i];/ s- N D0 f1 k
} ! f: }( ?* N0 \2 h/ e- ~4 e return (size);/ S" h! H3 E) V$ _
}4 U6 s G* B1 v( K# G9 }4 f
}+ _; ]1 l3 u5 l' G
/ [" N5 ^; Z1 W6 E) o9 |
return (maxsize); & D3 R6 I4 c6 h: P6 Q}1 Y- M! K9 n0 t _8 U! n8 ^
int dram_init(void): O. D% {" u4 Q8 o4 A/ Z, v) f/ M2 Q
{ 0 u" j: D( v) z! H1 @/ Q4 u1 k /* dram_init must store complete ramsize in gd->ram_size */% m! u Y7 `4 x
gd->ram_size = get_ram_size(* ^6 p9 @0 h$ ^8 z8 }: j
(void *)CONFIG_SYS_SDRAM_BASE, ) A% S% Y7 }& R- T CONFIG_MAX_RAM_BANK_SIZE); . L. O, `6 `# m+ a; [' E7 T return 0;$ W% F' M1 R! f' o, f3 U
}6 f) H3 E; @4 J( X
6 b$ k4 r3 }1 B- H3 D 4 I. T6 {# l' a' |; b) j) S7 } / ?3 D0 ?8 G2 R& i$ E m" V/ [. y, U2 P' H+ D
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!1 a7 H9 u1 k( H
k2 ~- m, f) U% R5 g/ A! [