嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
$ g' n5 S o# `5 Q
核心板2:DDR2 256M Byte NAND FLASH 8G bit
, l& j$ A+ k5 t# y; n
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
7 w. u. c ^5 ]) @
. Y" z8 H5 _+ S
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
* |1 G3 {$ [* | k
4 V4 ^8 o W: y
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
( K; t9 ]1 ?4 Q( w5 _
/*
$ i8 v1 \* ~7 d7 ~& ?/ I1 Z
* Check memory range for valid RAM. A simple memory test determines
. W+ L/ ^, t: ]; f1 Y/ N. V
* the actually available RAM size between addresses `base' and
& p3 X+ S0 a8 \4 B& H' K
* `base + maxsize'.
7 {/ B6 s, f$ L9 I3 p* p1 ]
*/
i; }/ u# D m( Q* C
long get_ram_size(long *base, long maxsize)
* a$ p0 y) H& C. m& r9 [
{
+ F: `, c2 e0 b7 \8 n/ x
volatile long *addr;
5 J" U: h) E7 D' c; v6 P' A: g
long save[32];
5 b* _; o6 E, q0 V
long cnt;
6 x- X* o4 g) l( a0 `/ d
long val;
6 _! w4 Z- [( H5 L
long size;
+ ]* _6 q8 r( l7 Z
int i = 0;
: N0 L7 h% v* b2 p5 D* |. B
. D6 h# y4 n. ]8 G9 e
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
/ O% @7 g3 D, w. J
addr = base + cnt; /* pointer arith! */
' S: A$ Z/ V: B. S4 f7 O
sync ();
+ o& W$ W% z% F) a+ }
save[i++] = *addr;
5 h! G/ E- P2 s p' X) c( i
sync ();
0 r9 |0 u5 B" K2 A" Z, W) ?
*addr = ~cnt;
( v P. J- F6 p# x" W
}
3 _6 O1 C q) Q5 b( k7 E, |
7 A$ @ A' _* ~+ X5 f. F$ V6 @
addr = base;
, l; `; S$ i% a
sync ();
9 v8 w$ i+ _1 g2 f7 ?; v* Y
save
= *addr;
$ L5 ^$ O# U& T) g
sync ();
6 d) q2 l; Z" G) y
*addr = 0;
. D( |2 A- R4 x
- K* `: f4 k5 D
sync ();
7 @3 D4 o. b5 ]0 @4 m% @
if ((val = *addr) != 0) {
j3 Q0 ]& h& I3 V. s8 N
/* Restore the original data before leaving the function.
/ [) R; j9 Y7 i0 R1 v8 x {
*/
3 e: \$ X. p- \0 ?) {( x
sync ();
0 f6 U2 k9 t, J6 ?. c c+ j- n
*addr = save
;
2 s: j: U8 C& n+ W6 o5 G% V( L
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
. J/ t( C" b' i4 |. W
addr = base + cnt;
- a5 r) e: n- P- L" C
sync ();
0 h, D* V6 X0 w% T9 p# Q+ ~+ z: g' g
*addr = save[--i];
# b3 H+ m4 k( Y3 R: Q; L
}
0 H9 U* }; P1 x/ ^/ y7 i% y
return (0);
0 u1 J( Z/ G! B2 i9 N; A/ X
}
9 M( w w _* u- a) w
2 r4 A. V' |3 U7 X0 |5 U7 K7 s; n
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
! m& ?3 R5 ^4 G3 F: k& Z
addr = base + cnt; /* pointer arith! */
5 B1 q, q4 J. n/ T& q8 |- N5 D
val = *addr;
9 g; {" r# S; g* p
*addr = save[--i];
% D3 R4 U8 O# S7 F, b/ n ]
if (val != ~cnt) {
8 m! W+ g, Z: J
size = cnt * sizeof (long);
( s2 u, c" T$ L% |: W: e; ~; G& K
/* Restore the original data before leaving the function.
' E$ R: y0 a8 {+ y, ^
*/
# A9 L, Q1 v) |+ H% v
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
$ x9 s, M, X, K5 Q
addr = base + cnt;
$ R3 \/ G8 N& I# }
*addr = save[--i];
- O6 t- ~8 I. ^6 p# F5 }' K
}
! w' k+ l* t& t7 ~2 a5 Q2 ~
return (size);
# `2 |% y/ R; n+ B ]
}
# u7 g5 f( w: x$ o8 _# v/ ]4 x
}
6 e a4 t4 t0 s# p/ ?3 |/ s
0 V7 }6 m1 l, l$ h
return (maxsize);
+ [2 u8 m* l0 z# y' y- x
}
# X5 F7 w: H7 Y6 e
int dram_init(void)
( s6 e4 P$ q1 z- q. D1 F2 h
{
& w9 ^* T- j# Y) Y: Z
/* dram_init must store complete ramsize in gd->ram_size */
, F8 b; O" D) M( \% W) _
gd->ram_size = get_ram_size(
9 k0 g0 y E( h
(void *)CONFIG_SYS_SDRAM_BASE,
X9 n. d, _ D% Q, A+ J
CONFIG_MAX_RAM_BANK_SIZE);
9 C' G- v$ c8 Z m" C
return 0;
/ q2 ^9 S3 g; @+ g, {% v6 N9 ^* K# ?
}
5 F3 b' N3 u5 i4 C; L3 U0 a+ k+ Y
" b9 A$ x9 x2 B$ X
1 I7 _4 [: p) u5 ]+ L
) t) C8 | \5 j$ l
7 z4 E. R* C; P9 E
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
0 m4 e$ C6 H% e, G0 j
3 T! @' T9 K3 R; e. k: }: a' H
" v& K6 @3 |2 W% c, ?1 V
& s+ k/ l( y% F
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4