标题: TL138 uboot是怎么区分配置两款核心板的 [打印本页] 作者: Mr.Loser 时间: 2014-9-11 09:33 标题: TL138 uboot是怎么区分配置两款核心板的 核心板1:DDR2 128M Byte NAND FLASH 4G bit ! [4 ]. ^% ]2 A b/ `/ V5 L核心板2:DDR2 256M Byte NAND FLASH 8G bit& S6 B; o5 s5 p* i( T9 T$ C
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢? " G$ L$ o9 E U6 ^8 h% C* s0 |3 I2 _+ K9 Y( S
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?0 \/ F7 Y+ y p; _+ N0 \
% N1 \4 y U3 f& I8 m% @ 作者: 2532609929 时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:4 I' H) L+ D8 e5 g1 L. @) M! g
/* " ~' g# E9 O; C' y* Check memory range for valid RAM. A simple memory test determines 4 ]9 i" m& k, |4 l! G( u* P) w( R* the actually available RAM size between addresses `base' and * |$ i/ i( E1 u5 l* `base + maxsize'.( j% r8 g% K- f" P0 D: R
*/: ~, N. J8 l8 G. Y% u
long get_ram_size(long *base, long maxsize)7 _4 G8 {8 z. P9 P+ L6 y
{ $ Y4 D! K& _. h+ a7 R volatile long *addr;" k% n5 D2 S: Z# E6 X; t+ R3 j8 {! I
long save[32];# Y& C7 D! W6 {, [% Y
long cnt; ' Y: K: \9 |. l7 J3 B; [/ q long val;9 C3 [' r5 [: l
long size; . j" q5 |$ u) L int i = 0;# w5 y1 h# x* V7 D
+ D0 y1 P8 L8 Q1 g# r4 c for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) { ! ^6 t8 D2 j6 l% @, F addr = base + cnt; /* pointer arith! */7 t) @: H1 a3 M1 w1 {' o7 I9 z' o
sync (); $ B( E# @8 }& l! f save[i++] = *addr;3 q' |3 ^5 N1 u6 V8 _# U* D
sync ();' A% `5 U8 a* R, P
*addr = ~cnt; 6 p# R! T" D2 \* g, |% }3 s }6 P( }% d3 @( S: N, {; ^; U, N
/ a8 y" ~+ ]( Q) t* z! ` addr = base; 2 z6 w9 E, T3 h% B! m sync (); $ x% C8 v8 ]: ?& F5 @$ a0 \0 F. w- F save = *addr; , k" z7 `3 E: V sync ();3 d0 i( p1 P4 c+ n! l3 s
*addr = 0;1 a) ?. K+ p: K# y+ b) {
7 y* X2 \+ Q1 A6 o
sync ();, Q. F: y* [; U, [6 d. d
if ((val = *addr) != 0) {9 {+ y) Q$ P$ {$ v+ n
/* Restore the original data before leaving the function.# L6 L* T) G& V8 [* ]1 E- {
*/ 6 @& L# A; n/ |8 }! q8 J sync (); ' e M' }0 B/ e, h9 V. Y& l6 J6 z *addr = save;7 z4 ]6 n* N: p
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {& V" R+ m' m% ]1 S$ n
addr = base + cnt;5 H6 D5 P) l2 G! g K
sync (); & c- \* h, K: h! x *addr = save[--i];1 T5 v( g) {# e j" f
} ( j# r+ P& q- O( p( {, T return (0); 4 {5 @& ^4 ?+ \% Z; T6 F' I5 w }3 y5 `% D' J' Z% V) r
8 L( [$ a3 o/ n0 B$ G for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) { & t. X2 i6 T9 e: I addr = base + cnt; /* pointer arith! */, A* Y# |; |: W9 Y3 ~0 D* l0 W
val = *addr; ; ]" k) H$ d) ?! d0 c8 A& F( E8 ~ *addr = save[--i]; 6 ~% l$ z' G6 B/ Y3 X% G1 M if (val != ~cnt) {2 K1 d& V/ M4 f
size = cnt * sizeof (long); $ @( L- _; D( l /* Restore the original data before leaving the function.8 E3 Y# }8 C1 B4 O& E
*/& R/ T) d6 q7 F5 u0 {
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) { 5 S) g# j% w5 R) i& m addr = base + cnt; 0 G1 f0 G- t' {8 e0 l p. \ *addr = save[--i]; * S8 h. V* y! e& y } : | O1 S t- I& ^! q+ b; j return (size); * m8 M5 `# j. e1 u5 |; [ }# k7 `/ u' T8 t* r- `, D
} ; Z, n/ s5 O7 F7 X" x# z. w0 b2 i+ e6 l
return (maxsize); ) c- B! |" d1 x# x}6 \/ V5 m" Z! e8 m- t
int dram_init(void)& g2 ?& A3 D8 e2 x5 [
{6 ]* i) d+ e9 ?' v' a# g/ ~+ {
/* dram_init must store complete ramsize in gd->ram_size */" `& E: J# s. _: ~: o
gd->ram_size = get_ram_size(" w/ V0 r) w; ?. P; A! \$ P
(void *)CONFIG_SYS_SDRAM_BASE,0 c5 [1 ~ h' J) [ w' a8 v2 S& W- g, n
CONFIG_MAX_RAM_BANK_SIZE);, j, y! l, r6 k; Z7 W& ^3 d7 z6 n
return 0; & f/ Y" H: D& h! R7 u. j7 x. L0 n4 S} 9 H3 ^2 o/ K$ S7 G4 `, X/ D: ^) `4 z0 U6 }# z
7 S1 o$ m3 c6 R$ J2 a3 d- B
2 Q- Q4 n5 v9 [' @. a1 G + K1 U8 e8 i- _8 FFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助! & G( S! N9 w9 U, i% a ( f1 n+ N; w) ^4 p+ I8 I " C& O. }! |8 e, g2 d 7 k' }3 \) U! [ C& H