标题: TL138 uboot是怎么区分配置两款核心板的 [打印本页] 作者: Mr.Loser 时间: 2014-9-11 09:33 标题: TL138 uboot是怎么区分配置两款核心板的 核心板1:DDR2 128M Byte NAND FLASH 4G bit ) m# d. H/ K4 d4 ~) V) k+ k! {. {- Z核心板2:DDR2 256M Byte NAND FLASH 8G bit & _/ i$ N' V9 k这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?/ H l3 Z! H7 z9 c& s
9 T l; p Y8 ?, D* ^0 H3 P是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了? ( h& L, k# U( }0 x$ j , q( k, X0 h4 N! k8 P' B+ @作者: 2532609929 时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下: 7 g0 i/ k- {1 R7 o5 E( N/* 0 |/ w( Q/ g0 T5 }. p8 A9 F, y: y* Check memory range for valid RAM. A simple memory test determines: [/ i9 |' ?( D7 F* r
* the actually available RAM size between addresses `base' and ' V( ]4 _/ y& U) T) s* `base + maxsize'.% X# l e q: a* {! c
*/. x4 [$ O9 y& h [9 H
long get_ram_size(long *base, long maxsize) 0 n, `) a* ~) c3 g% N8 T D{* _" D8 o# L* G& r3 R
volatile long *addr; l1 Y$ ]% t3 T# z$ k* n* n+ X
long save[32]; - @- b$ W# I! m long cnt;, M+ b w4 @7 s
long val;4 L4 Z J. U$ }- k; I
long size; / M* g( i& A% n" e, ?# A int i = 0;4 ?# W# d* e0 O( a- A- J! V3 Z
9 V4 n+ J( a5 F; N for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) { U* q/ [# j2 H3 I( d8 J- S" o) N addr = base + cnt; /* pointer arith! */ ! }" z" z: d. N" p sync (); 3 ?! O8 z3 p# n0 r" Z save[i++] = *addr;! Y/ t( C; ^& _; E6 C p3 V
sync ();4 W0 a1 f9 u- O# x/ S" R# E
*addr = ~cnt; : x* a# t0 P! W9 i6 `5 [# |" G9 @ P/ [ } 3 l$ C; [7 f: d8 l + S T) z; _4 M$ `% c& j& o$ R8 | addr = base;! `) W+ f; _7 F" C2 v
sync ();6 D1 h- R S9 c' Z
save = *addr;' r% I* G& I( I, k' {2 W& m
sync ();! I6 A: G0 S4 z8 X) I) \+ S* W
*addr = 0; ' v( B3 O# R9 |, u( e: ^6 k8 G) K' A" M3 r3 I- G* y
sync (); * ~7 ~. K6 V9 D5 q if ((val = *addr) != 0) {7 K! u3 d! h3 J% G% m3 o
/* Restore the original data before leaving the function.5 q6 u# }# G+ _
*/3 X) {' q1 [4 m- f7 q9 ]. ?0 p
sync (); ) K' g# e& O& t4 i. c *addr = save; 8 q: j: X P" W: o& H O: j0 _ for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {" x. B& \8 G+ F. r
addr = base + cnt; ( _2 u; e8 j- O4 N' w3 P& x sync ();" M* o8 u8 p- A9 k
*addr = save[--i];- Z' ]8 H3 [# B' V I5 Z4 m
}3 t- _. g2 \6 r
return (0); * n+ q9 b8 a. M* q7 I5 J } ' y8 U; _6 Y! ^- J" `8 e5 m! L1 `. a* w! \& [
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {; h) i/ w2 Q0 a0 `2 J+ v9 ^
addr = base + cnt; /* pointer arith! */+ C8 t- X. h2 f
val = *addr; # U* L4 g' [8 }$ s" |3 p; C *addr = save[--i];+ Y1 V# R$ J) K+ d
if (val != ~cnt) { 3 F4 k. N& F& I/ _5 M size = cnt * sizeof (long);1 S; U4 M i; i& k1 U6 k! m: U
/* Restore the original data before leaving the function.% Q( p+ x$ G4 |$ b- h- z
*/* [+ [* L/ r+ U2 I+ w# B
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {9 i% S, V( `# M6 u1 D3 I; `
addr = base + cnt;; T0 L( E* n6 d' H2 A! I- S, n, N
*addr = save[--i];4 X* ]2 Y. O% f
} : u: w9 J( g4 x; Y0 V return (size);& a u) ~: P$ g: i
}( Y; ~5 r" c& ]; v! l
} ) `. J" M1 x3 | X* {8 c& E8 A" t 3 {, x0 C2 a, o0 n return (maxsize);9 Y s7 c8 a4 K
} G# N1 m2 K1 n, a# N" B
int dram_init(void)# K" v% O( K! r; G* c
{+ Z0 U! I9 l1 P8 v
/* dram_init must store complete ramsize in gd->ram_size */ 0 k) O& b) N. r' I8 R8 C( z- d _ gd->ram_size = get_ram_size( $ _. y% x1 y3 J( z" V$ V5 w3 M9 |) q (void *)CONFIG_SYS_SDRAM_BASE," n' t7 k& R9 L3 b4 r- m
CONFIG_MAX_RAM_BANK_SIZE); / J+ e( M8 x" @5 b3 S" O# x return 0;! X3 w: x& x+ P2 D' z. q
}, u7 i; `4 }& c/ p# R: N3 a' I# T+ [
, j8 r% K4 B5 M, y$ Z! L
' G: {; J9 X! I. n0 c: R
; H- d6 z: y) {$ N
; n0 s4 @+ @/ O- fFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助! 4 d; ?( ?: Y. S. A( t3 y( e: i. y ; }$ l5 f1 k9 z. p9 R z' C* o 7 q& Y) y9 z3 Q: _) y# R8 n. k" H$ n6 e2 @