标题: TL138 uboot是怎么区分配置两款核心板的 [打印本页] 作者: Mr.Loser 时间: 2014-9-11 09:33 标题: TL138 uboot是怎么区分配置两款核心板的 核心板1:DDR2 128M Byte NAND FLASH 4G bit4 }5 K0 W$ U& e- U1 c) e
核心板2:DDR2 256M Byte NAND FLASH 8G bit2 Y5 A7 K8 \( Y7 X$ k. G% y
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢? / u1 ?/ {1 B+ |8 x! h g" A4 ^0 E, D是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了? 0 H3 ? a% i5 [7 b4 |* a! o " a$ p9 e. Q# {' o" J- w& M作者: 2532609929 时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下: 9 b) W/ v( `0 l* f' h/* 2 j8 d( c, H/ E4 o2 u* Check memory range for valid RAM. A simple memory test determines . C) }& g9 f7 k. ^* the actually available RAM size between addresses `base' and( U5 R. b7 G, T" _5 Q% w
* `base + maxsize'. w* {( Z! A0 g) U
*/% Y4 [( u6 I$ y R6 M7 F1 x4 ~
long get_ram_size(long *base, long maxsize) 0 r& K: R, Y. {' C+ q5 P( y0 X{ $ A1 f( o6 E0 H volatile long *addr;2 A5 {5 n! c0 c0 M( ~
long save[32]; F! w# E5 p: i' ]- ^/ u long cnt; & J( `. Q# w+ [- m long val; 4 c0 U/ X! Z7 X5 O5 k( i long size; % i$ @ {8 ?" t8 L, j* v int i = 0;' L" h7 e- z: \0 `$ y3 e) a7 i
1 H2 P/ E0 g& V1 j
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) { 8 l _: z# s3 S( T addr = base + cnt; /* pointer arith! */ M+ w1 V l% C: C sync ();# E. h, _& p9 A- z" d
save[i++] = *addr;7 T: j' Y: u$ R' r2 B; E7 p, K$ F
sync (); 8 M) j- Z7 Y$ X/ T* G. J *addr = ~cnt;; W% z- }4 e; Z. l2 l
} ) M! M, v8 G( ^6 `6 s! ` 5 t* c# c/ {, w% R R9 ~3 o addr = base;0 v5 _) D; W2 H3 m8 A8 R
sync (); 0 U8 {" T! G5 \ save = *addr; % s$ _- Q/ @, F: q sync (); ! T; _% X" a' v1 `0 G" ] N *addr = 0; " r9 \* A9 h& b9 Y . s2 }6 S# X1 \+ n: F9 U sync ();, V# {5 Z0 P0 { x
if ((val = *addr) != 0) {6 S h4 f% t7 n1 t$ F) j4 ?
/* Restore the original data before leaving the function./ t( m5 q$ E' R4 T
*/ ) f2 `0 w7 _9 d1 K! [ sync ();- P8 S" f0 U8 `
*addr = save; : O8 v# O9 ?- F7 T for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) { 2 ^ f# [) j1 y4 K# R addr = base + cnt;8 Y- \4 E: B) T# R7 Q" \
sync (); ; J* [. A) D0 _# {1 s7 _/ E *addr = save[--i]; - w& f+ i" y# |' f3 | }/ E( I. H, z" q2 A9 I- ~- F' ~; j
return (0); & @1 g& t( O7 {( `; M* R }. _0 [" H+ a0 T' K
+ N7 n' r$ H! b9 I: w( @* L' @
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) { r4 n, `- S( e4 i# ^9 s addr = base + cnt; /* pointer arith! */1 n4 J7 Y, g" q" Q- ]! U4 Q( L0 B
val = *addr; ' K- y; e8 I0 E9 t* ^9 | *addr = save[--i]; 9 w( U: W8 k) d n: A+ b- x+ x/ ] if (val != ~cnt) {2 I: d; L4 k& d, L4 [; g3 l, W
size = cnt * sizeof (long);/ m3 M5 @! r& w7 p+ w- P
/* Restore the original data before leaving the function.5 Q* V5 {. v+ [$ ~% T
*/: o- T1 g9 e+ S( b" ]' b' x y
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {( S: |1 ?- @3 n7 i4 C
addr = base + cnt; / e* j8 e' @) {( q: r4 F& K *addr = save[--i];. C; ]% D; A! Q d' S- V6 F
}& q J! b. f9 e, N) \3 N/ L6 D
return (size); ( @( @/ p& T8 b2 V. W } , e& B0 A6 {2 W& E6 L } : ^& U+ }( Z7 {: j) u, W ' G: b) Q2 U0 p- _# g return (maxsize);- j7 d0 |( f8 C" I
} & l7 _ n8 e' R+ J& K& d) y( [int dram_init(void)! k7 l. F5 q$ w. w4 @' b; }
{ 9 a0 B0 H. o- n: u& R+ y1 J /* dram_init must store complete ramsize in gd->ram_size */ % [# W7 s3 t5 L% r7 Q gd->ram_size = get_ram_size( 1 ^7 A: p8 h" B1 X8 Z2 F (void *)CONFIG_SYS_SDRAM_BASE,6 d: U2 Z+ J3 q1 E
CONFIG_MAX_RAM_BANK_SIZE); + s; f9 B# p8 R& K' b' B) Z- L return 0; : c! E$ {, P2 [1 J}& n& R& ?, v% f, h" l" ?. a5 A
, M" f! e/ G# z8 b) f! S' K/ w. w
' p9 M- U. I6 k. V9 Q* w' J0 R1 c/ C' r) {5 t. y
0 h. r% C0 j; w$ [
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助! . q: t( {3 p+ q4 U7 O' I, X O- j. q1 `* b7 @) V. {7 l