标题: TL138 uboot是怎么区分配置两款核心板的 [打印本页] 作者: Mr.Loser 时间: 2014-9-11 09:33 标题: TL138 uboot是怎么区分配置两款核心板的 核心板1:DDR2 128M Byte NAND FLASH 4G bit0 W0 Y' b' S% x+ x1 X: D5 O
核心板2:DDR2 256M Byte NAND FLASH 8G bit* z$ q1 `" l O A# ~+ u$ V* E
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?1 x1 a3 `! O5 l) F1 H
7 j, W9 b/ z) U/ u是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了? * I8 B* y, _4 L6 ~2 g4 j9 T* v2 J) U" d2 B8 h# ] 作者: 2532609929 时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:, e+ O9 u* D1 {* Y4 z0 c
/*. l7 I/ L. b# l+ [4 D2 _" n% a; {3 U
* Check memory range for valid RAM. A simple memory test determines( m; [6 O& K. ?" ]- m. ~; Z
* the actually available RAM size between addresses `base' and X- q3 z9 w( V0 A& z! B* `base + maxsize'.& B' y) r# E5 w9 L9 c! ]4 y
*/ 8 ^" B, A* a$ @" F J: [long get_ram_size(long *base, long maxsize) ; z$ ?% B1 t3 t1 v1 ]' e{ 6 T) t7 A: p6 M) C% A, M) j volatile long *addr; & p" l2 H- A' l+ h9 u3 S K long save[32]; 2 G& G' H/ o# j+ a- G v7 b long cnt;! }" S$ k1 q/ i
long val; ' I) \% T/ r6 m: o9 G) z& w long size;% _) ?: a |) |' c3 [' B
int i = 0;( ^2 B' h0 R8 d
/ P7 U% y1 F8 w for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) { , |0 i4 H! @3 \5 l/ {5 H addr = base + cnt; /* pointer arith! */ # Q1 [+ c: t" s- ^# r7 ` sync ();9 F: o2 T3 \ O; U3 H1 f. Q
save[i++] = *addr;6 g- c% _% {& I: z5 ]1 w$ ?/ y
sync (); # j8 T. `" h3 J/ p0 T; [ *addr = ~cnt; 9 S/ O/ f8 W' L }8 k3 U% ~9 {9 ~5 I& a+ J
# W C* c& ]6 t. s( W
addr = base;9 `: T! g p' u% `) |
sync (); ! g7 `5 m! i& t save = *addr;; d0 K C% @2 g0 u0 Q# v4 `
sync ();% Z: d. L3 |( \% P8 y/ z- A! g* }
*addr = 0;6 t; ^7 C8 @1 k' v# p, l. Z
. n$ R. ]4 G: w; E' C sync ();4 r+ H& r& w; O
if ((val = *addr) != 0) { ! }# j/ \: `' W" w9 u /* Restore the original data before leaving the function. ( m7 _! Z8 t- h2 U8 L/ m */ 5 w6 x0 \- |9 T, C- F sync ();; D9 F% Z& a6 c& z" A: N* r
*addr = save;% t. h4 x: C. [+ `) F. N8 r3 z
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) { $ {: ?( R: b/ p: Q9 J. @ addr = base + cnt; ' a: E. X3 `; D( B sync (); 7 u! k, g+ y8 i8 f. Q( P% Y *addr = save[--i];2 l' `5 u& B$ w6 _
} $ V% _% H6 n( h4 H return (0);5 b: V& ~( J1 f4 d, W
} ) g: u" L7 N$ c" I/ |; T; s9 x8 H, u6 j/ L0 q+ x
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {7 }; V' H4 y( N' x6 C% h
addr = base + cnt; /* pointer arith! */ $ d. V9 f0 S! y5 E& ~ val = *addr; : R5 w9 \0 {7 ]& `+ f& T9 z& f4 _ *addr = save[--i];) `/ a" n) A. N$ W0 ?
if (val != ~cnt) { , N; z5 e _ ?: J% t1 {+ y size = cnt * sizeof (long); 1 B x6 q9 _. J+ ?9 Q /* Restore the original data before leaving the function.% j" K4 N+ }# ~% {' j3 f& f" k
*/9 [9 g" F9 q/ R" N2 }' b5 ^! Y5 h
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {) s0 a! D9 p' d5 V
addr = base + cnt;) X* s$ F/ s9 W
*addr = save[--i];% j3 C |0 S% o# Y W2 a
} \! g0 `7 u% Z& @" s
return (size);9 Z) n8 J5 Q2 k
} : G2 D% w3 O7 h% W. y. ^0 l } 3 c: Y' N8 \$ B6 s$ D" {" X7 ? e- p) i: l5 _% }! U2 `1 k return (maxsize);& d# {7 b$ F8 p; f, R: [, r
} $ ^% ~$ |* g6 Cint dram_init(void)7 J8 c( T( H; r3 K% j/ s }0 x: w& ^
{% c& r2 ~, b. J1 }+ O6 U; i
/* dram_init must store complete ramsize in gd->ram_size */ / w1 U2 ^9 k2 |( M0 \ V1 x2 O gd->ram_size = get_ram_size(# i$ L1 _: `9 C" U" u1 {- c& m
(void *)CONFIG_SYS_SDRAM_BASE, 8 U" ^2 U2 \6 y/ h% s9 [; E3 i CONFIG_MAX_RAM_BANK_SIZE); 0 T, Z p9 Q7 f9 Q9 S return 0;& `, k- e8 w4 Y& Q7 Z, R& K9 U# ]( s
}5 O8 a, L+ C$ V& I! X
; \& ~/ W" D, t* l6 v) U* E 9 r$ Z& F; x. X" r! f z) P& m
: S% E* ^# U& g1 T% Y+ z- J2 j- ]
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!9 y( d' c) m" A& i" Z5 `
: ~' T% r& B' f0 o/ j 3 _1 ]5 b7 Q" l - f6 v! P- V% z. @( r* f