标题: TL138 uboot是怎么区分配置两款核心板的 [打印本页] 作者: Mr.Loser 时间: 2014-9-11 09:33 标题: TL138 uboot是怎么区分配置两款核心板的 核心板1:DDR2 128M Byte NAND FLASH 4G bit! ~0 }9 K/ O: u
核心板2:DDR2 256M Byte NAND FLASH 8G bit ) {2 e4 b8 T7 \9 `# U# o5 Y6 F这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢? . t: q5 L* ^7 W5 k H 0 x1 Q$ A+ e8 p是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?0 ~+ W5 _, }! T1 q
' R3 s4 e, x) }7 G; e7 u 作者: 2532609929 时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下: " a' x8 N) {( G1 s' v$ i2 t/*7 E( u$ Y5 k+ j: c; d
* Check memory range for valid RAM. A simple memory test determines5 `( N3 u! O! R' ?
* the actually available RAM size between addresses `base' and # j5 @* r" c' @- X* `base + maxsize'. 6 i3 m2 L; l' [$ z; ^*/ 9 X7 v( f1 t5 z6 n9 blong get_ram_size(long *base, long maxsize)- Z2 ?& W! X' V* V$ C, g. x L8 F
{ U6 |: X8 j* Q5 O. w" n' D, T
volatile long *addr; 0 C% g( i5 k5 m0 e6 t7 @ long save[32]; / M8 M5 K0 N3 V: W9 a' ? long cnt;( J$ M& Y8 B3 h7 S1 R) _0 ?' C) }* e- j
long val; + q) B3 }- Y3 R. D! w( z long size;- M" o5 V3 t4 T4 ^7 _0 A/ U& @
int i = 0;' M9 e5 G2 L2 }" @+ l( ^2 f
5 p% h/ [- |4 ~
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) { . `4 m, U( Q0 L8 R5 F9 L addr = base + cnt; /* pointer arith! */ ; B+ K4 p* }9 {* r4 L* D' q8 m3 x sync (); . Z0 t" j( s9 y, p, W( ~5 g' Z save[i++] = *addr; " r4 w% v: K1 U: \9 j+ }2 T sync ();9 [; T/ u, r% r [( U5 ^
*addr = ~cnt; % x* r, c5 O- W" v" O1 @ }( F0 f* `9 B6 \/ x: R1 H
5 N0 t# t6 z3 j8 K* ^) L addr = base;. Z. O5 `9 `( c8 \4 m0 }
sync ();1 Q! u C- Y9 a7 {
save = *addr; ! `$ _# O1 {" y1 ~ K) Z0 f% {* x sync ();6 o" F' Z5 h- V: T5 H! j
*addr = 0;4 V* M* T6 ^7 \# R
: D! K$ O- K8 E0 q' z
sync ();" M1 @+ G) ]3 w( p& N$ |
if ((val = *addr) != 0) {, {! [" u0 P6 t, w) |+ q1 q
/* Restore the original data before leaving the function.7 Q. p$ B: F! ]' n: |# c
*/- J: B8 c! L6 h
sync ();. O" R4 X- n! S3 z }# o
*addr = save;) |7 X6 H+ p( F7 r
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) { 2 j. ]) r0 F7 K1 W% u& E addr = base + cnt; 4 H j- y! } O5 e7 { sync ();6 o. Y d; M( _
*addr = save[--i]; 4 Y6 s% g7 j; W/ n1 x% o; \$ L }. g1 P/ H0 }1 V" `
return (0); 7 w3 p! z& J# Y, N' D0 ^ } . T. Z v/ P# y% C- D 4 p+ ?4 {7 M8 K ` for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) { 8 {; F4 U: |6 W* t6 t addr = base + cnt; /* pointer arith! */+ n; [: O3 o' h, `$ P2 ^
val = *addr; 6 M8 P0 Z9 g5 g( B; h *addr = save[--i];9 Y# p1 l$ m p
if (val != ~cnt) { * L. T6 d' ?+ V/ R6 i3 v size = cnt * sizeof (long); & S) ?# A; k" f; e9 w" M- k; T /* Restore the original data before leaving the function.* ]' q1 B. z$ ?
*/: Q1 V; M6 G" r! U9 @, S3 M& a
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) { 2 R0 ^- r( X; C% \ addr = base + cnt;" i7 m; Q, \: b0 G( L+ ^
*addr = save[--i]; 1 L3 `* N/ t z" o0 G }, Z2 I, q3 O- _
return (size);0 s$ s, H9 N0 a ~: P
}7 r5 Q/ ^8 t- n, P$ Y8 a3 }5 b% Z
}% ^' F: ]. O9 v3 ~: i! l
3 D' m. ~: \) y+ ^ return (maxsize); 3 P& r. _; L% R3 h9 o, e}8 o; B# t# `1 Z! q/ S- V' Z% g
int dram_init(void): h6 y8 n& e8 d. u
{5 a* c& P7 B/ Q8 T
/* dram_init must store complete ramsize in gd->ram_size */* g8 G$ R. G& p/ I
gd->ram_size = get_ram_size( ; R6 x/ v2 j8 Z; y& ?! ^& _ (void *)CONFIG_SYS_SDRAM_BASE, $ ?- B$ R- c/ \+ S1 p, L4 h. F* K CONFIG_MAX_RAM_BANK_SIZE);3 [' o s" z: }- p
return 0;( H, D2 c" v; J. K7 c
} 2 T# `1 u1 q( s1 L8 h: X 9 u. c& `6 F |3 ^5 j8 v0 w+ \: @+ T+ b S [1 v3 Z, p
8 X0 o9 _6 z( `) d4 }! `& E( _* J4 H! N/ c9 r, R2 E- W* n9 \( r4 A' l
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助! ; U8 e9 z8 s& _ b' E: x % N" f' I; V. |# s- V# ?/ h! Q! m! i! L& r" I A9 r# n ! H# q- S: h ?+ c- c5 ?& n: A+ b% A }/ v