标题: TL138 uboot是怎么区分配置两款核心板的 [打印本页] 作者: Mr.Loser 时间: 2014-9-11 09:33 标题: TL138 uboot是怎么区分配置两款核心板的 核心板1:DDR2 128M Byte NAND FLASH 4G bit / w6 ?3 c. P! a6 a/ @6 t核心板2:DDR2 256M Byte NAND FLASH 8G bit1 O( f- }8 n+ X
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?7 y# D' T# b. }9 [
( V( z' |: l! s8 g" J
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?/ R" O. x/ _) I s! _* l
5 q8 j& p: @) J, C 作者: 2532609929 时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:! f8 d r& y9 U( W/ L
/* ' D5 j3 z7 y l5 S" M8 y* Check memory range for valid RAM. A simple memory test determines8 ~) A/ j- K. N, i: {
* the actually available RAM size between addresses `base' and ; o& c, b) X2 S6 Y& Z5 f# |" R* `base + maxsize'.# V) M y+ S$ }* [& \+ |
*/ ) Y8 B6 M1 [0 p; `long get_ram_size(long *base, long maxsize) 9 A# i2 q* E* C+ Z* N{ $ ^% [8 |7 ?4 Q4 D0 C2 V volatile long *addr; * |! u& G1 o$ X+ c long save[32]; ' r' {; M) o% x( R% W/ j long cnt; 7 d. l1 k1 f" s- D6 T2 g long val;2 ?3 n) }4 S7 t. q6 p# l! [
long size; G" h, h1 I Q$ ?! @- Z- J7 W int i = 0;7 q" t( [4 g( f6 ]1 @. C
& K5 R; ]5 _& P& F" }0 G1 `
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {$ o% v9 O# `' t+ |; W- N
addr = base + cnt; /* pointer arith! */2 s1 Z$ I& M) k0 w! {1 P
sync ();$ o- T9 {7 z0 S: R/ M
save[i++] = *addr; 2 d/ g9 m; U( T sync ();) y- K0 e. q+ `6 w2 G; r
*addr = ~cnt;3 f8 ]+ }% I+ Y7 {- \
} ! ~* H# o0 x9 f$ t# R ! c2 u9 q$ y* B7 F+ K$ c- |" i addr = base; , W' x3 W# V8 Z |0 P. {* L% J sync ();. M3 W6 g# g3 w5 ` V4 K5 M% v6 x/ y4 G
save = *addr; 4 ^9 Z# G2 m& `8 } sync (); & V0 B% `7 D+ v/ ]: F" s4 i *addr = 0;3 Q1 N/ L& v. M8 t
/ E7 a2 k" m# \1 {: ?% s
sync ();/ ?: A; w J: H" x/ ?' E
if ((val = *addr) != 0) { # l1 F" C- ~( [ /* Restore the original data before leaving the function.; x0 \; L% W' V! h* {0 J+ l
*/" _. q- i `& {
sync ();- h* c5 _1 F+ Y
*addr = save; ) t+ ? z: G$ }5 P for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) { " |. ?: ?6 u! B/ q6 X4 i addr = base + cnt; ( m* S P) }1 j sync (); " \2 _; H# L8 u: N* m' E2 a *addr = save[--i];$ ~/ l9 u5 u' H1 x
}: d! G' J. N" S; k/ |' ~: t9 q* p
return (0);: g$ }# @1 Q7 O* N' V
} u5 d/ ?/ }3 ]' D7 s
" q/ }6 U" e, D' g6 m7 B6 c, `0 k for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) { & I8 U4 y+ Z* q. z8 x0 x addr = base + cnt; /* pointer arith! */ / W" U6 A6 @4 {; t, b2 \" F val = *addr;; r$ I" z9 s3 k7 x6 X
*addr = save[--i];6 F# w- |2 F: o. ~1 F
if (val != ~cnt) { $ R4 q _# ^6 H: O6 @ size = cnt * sizeof (long);6 u' a0 U5 o8 c3 X4 x
/* Restore the original data before leaving the function.+ a$ S: S$ N' ^. q4 W" ?; N2 d% k0 S
*/" T# h) L- R6 w0 c4 }
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) { ) w0 G4 v4 h! p addr = base + cnt; 7 i: j6 G" L/ o *addr = save[--i]; s M U- ]" |) K% Z! v' A } & j3 c; u' N6 D+ m& w return (size); - J$ C; F: x9 A, J5 p- J }( n/ Y, a- t, |) L8 z$ \+ v! ]
}- d9 Q* C8 n1 L3 T
l4 e- P r4 @6 b" u9 q: \: s return (maxsize); : n" t& f1 P+ q: G$ L}0 V. ] B' ~% `7 U/ w9 Z
int dram_init(void)2 T9 s" t! W) ]! W% R
{* y7 X( [8 @' U. [
/* dram_init must store complete ramsize in gd->ram_size */ & F1 x: K4 g- f6 z8 G8 k gd->ram_size = get_ram_size( : ^% C! j" v6 c* P( K% `" Y, T (void *)CONFIG_SYS_SDRAM_BASE,) Q3 d% d% a9 r+ K
CONFIG_MAX_RAM_BANK_SIZE); 1 \4 s b. e6 T7 }# \( h return 0; $ s- C) [* k2 T3 F, u5 u$ a}6 B4 {+ {( X) Y8 A' p0 U( I: A