嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
/ X" B7 v: g( Y/ y
核心板2:DDR2 256M Byte NAND FLASH 8G bit
$ x# t9 a6 C" l0 [( j6 C4 j
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
, C; _5 N6 F/ S& E" s
U' f% J% |2 ~9 ]& O
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
2 ]4 o, t4 q* T4 _9 \
- U$ x# _6 W9 y+ f; {) \
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
4 }) o5 E- J. g; E+ ~% w, Z
/*
: A- s) W1 x9 p' D. d
* Check memory range for valid RAM. A simple memory test determines
! d, V7 W; p) V
* the actually available RAM size between addresses `base' and
8 ]( d, {7 ?- K" o+ \- W3 _- L
* `base + maxsize'.
5 K, Q6 G" _8 l2 R
*/
1 \, y6 j& K1 u. Q; z6 Q2 A
long get_ram_size(long *base, long maxsize)
, d8 }6 B6 z/ |8 H6 f
{
; Q$ Y4 z* C: ^+ @" f7 ^
volatile long *addr;
/ u3 c, q* |. _$ x7 V. x# Z/ w
long save[32];
$ \9 T. r9 c' B- X7 u0 o0 {. E
long cnt;
$ }, K5 P% a' V" `" z
long val;
* B; w5 c0 V' p; R7 t
long size;
1 i7 W$ u0 T/ ~+ z
int i = 0;
4 Q, n$ ~. r& l% s6 Q. z' ~
) s l# G1 W3 B# }
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
) v! G3 ~$ J F+ P. {% j7 n
addr = base + cnt; /* pointer arith! */
7 z% v. A' g r, a
sync ();
! E! E8 H. M' I+ _4 p0 u
save[i++] = *addr;
5 z& r5 T+ K! `3 k& P. M
sync ();
& X% |8 g+ ` m3 Q' t& U4 j6 @
*addr = ~cnt;
@3 B2 l; s! Y% \, V8 E
}
+ f) j6 M# h& T( A
0 Z- a1 o4 M0 n+ [ J* g4 Z7 S
addr = base;
9 o2 O7 g8 S. ]% n( s {5 f! @) H
sync ();
- W: H( E- a. G2 k; O
save
= *addr;
4 e, v' ?8 o. Z4 ], K/ D
sync ();
( I* W& N" r7 ~1 W4 |5 K7 m
*addr = 0;
$ T( w! m* [; I
8 _2 `0 X, x4 ~& G9 I! R3 Z
sync ();
& u) f; Q! y8 i6 @2 y
if ((val = *addr) != 0) {
: s1 B& |5 @- h5 X6 O
/* Restore the original data before leaving the function.
0 z0 A% f6 O0 X! L5 {: h X9 ]
*/
/ D: R3 e9 E5 Q& }" o
sync ();
0 {3 v' m, d" y/ p6 Q
*addr = save
;
) e% p" ~/ ~6 X! T
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
0 k; ]3 u- C, y1 q5 L
addr = base + cnt;
/ K+ {' k0 E% W/ Q$ Z
sync ();
" f: ]6 b7 O6 ]& b1 d
*addr = save[--i];
9 @% r/ P6 J9 T! G7 g% }. Z
}
* W) Z6 u6 F# B; ]* `7 r# ~. Q
return (0);
t' ~3 f% l9 Q$ `3 Y! Y/ p& P# W
}
) V1 b3 e( v; |/ D
2 L3 h3 G6 b- j5 b( n
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
, D) o! k' i* z* \
addr = base + cnt; /* pointer arith! */
. P, j* O8 @0 Y) p( L' N* X+ D
val = *addr;
: {) r: f7 d3 @! x* B
*addr = save[--i];
! @/ t: R- ~* H* w3 M; B
if (val != ~cnt) {
9 f9 X2 {: x8 M6 T2 t
size = cnt * sizeof (long);
: P. o* j# l+ Z% K
/* Restore the original data before leaving the function.
' Z* C. h m. X6 h8 O
*/
2 }* E4 O, ~ g* i$ S9 ]# j
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
+ J1 s7 g F h
addr = base + cnt;
* o% j% Y7 `# e
*addr = save[--i];
7 B+ C' J3 d0 H# u# J5 ?9 C( c+ X6 J0 L
}
9 R" T& k0 E' N, Q) z: u: E) S2 u
return (size);
' ]" U" D2 q3 W; ]' o# q# Z* H$ A8 c
}
# Y( K+ ~% ~4 m: S
}
, H5 Q' Z7 c1 D! ~. q
* ~ y- c( Q2 C8 u
return (maxsize);
) ~& @# o: @7 a' b" y
}
0 I, ?8 {. g5 a* L
int dram_init(void)
5 V- x1 K. U6 U2 j% S" C7 c/ i
{
% d) I* C# ~) D2 ~4 g/ R( n
/* dram_init must store complete ramsize in gd->ram_size */
- ~0 K" a% o8 Y1 n0 Q$ v( @3 m
gd->ram_size = get_ram_size(
9 {( {% C% c6 c& @ b5 x
(void *)CONFIG_SYS_SDRAM_BASE,
( H! \& I* q- Y. [
CONFIG_MAX_RAM_BANK_SIZE);
/ a6 x6 X2 A6 [, {* Q: x
return 0;
9 U( D/ D) {- h7 g0 \
}
3 Z6 d+ v' i6 G5 |& R7 }
5 b6 C1 z5 m) |6 S1 V
; L. W6 F/ P* L: P8 ~
7 z0 x0 H F! Y3 y5 g
7 J$ ]7 V. G* b
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
1 B+ l! m9 C* T: A6 `* [/ k
# Y1 E) D" m- S4 T
- |/ z8 g3 @2 K s4 G! y
8 x1 Z' L9 p, F/ ^+ N2 H: Q. w; O4 ^9 z
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4