嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
4 }0 ~+ P0 t0 I
核心板2:DDR2 256M Byte NAND FLASH 8G bit
L5 ]" M% R% `. G% t
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
8 T+ P$ q! \& o# r, _# v' f6 S
* G6 `9 @" v" e& T) a! j
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
8 N" D/ t. ^2 H" q/ \- H
% X' H. S: W: ?! w: W$ I4 z
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
* R$ h: R( {( C. r0 W# u. ?
/*
, ^' \1 L5 z; N" X- b" B' D
* Check memory range for valid RAM. A simple memory test determines
* r. U( |( v) a+ q7 I# N
* the actually available RAM size between addresses `base' and
; u/ h9 a: U, o
* `base + maxsize'.
$ w' K1 J' I. C+ [
*/
4 x0 ~) B( P% j0 s; m7 @4 @
long get_ram_size(long *base, long maxsize)
7 A0 M0 H( ^8 _) P ]
{
8 z4 I4 |9 Z6 W3 B) B' Z5 o
volatile long *addr;
4 \2 @; y& M$ Q r6 g0 T# @
long save[32];
* E8 r: f5 |( o& n7 D+ T
long cnt;
A4 `% V$ ?( q$ ^% Q7 ]: }- W
long val;
g* ?# x1 Z7 H- a
long size;
8 K( |/ o! h( o
int i = 0;
( O/ u' V6 Y1 k T
6 ]* d# W; F% j }
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
. M1 z$ K8 v) H; m
addr = base + cnt; /* pointer arith! */
. E( S$ z4 r9 B1 u) J; c
sync ();
3 b g7 h" ?- {' {4 W
save[i++] = *addr;
, a, s; o9 x7 T6 n
sync ();
- m R9 n: Z( }+ R. W, J+ t
*addr = ~cnt;
! V3 }- }' v9 t7 q8 p
}
7 f" Q( j- y3 y% E5 ?& U
5 J# @, W' t8 t. P% Y8 m- W: C
addr = base;
. G$ d' Q! w1 l1 G
sync ();
7 N: ]6 S; a4 q" [8 j p
save
= *addr;
3 T2 ^: E6 X* U/ o, M2 p
sync ();
7 T& k% _0 J" a+ m4 w
*addr = 0;
/ e, v" [1 w5 b- l* ~4 v3 J" R6 a
7 N5 F( w4 v5 w5 C- X& Y. R! g
sync ();
8 x' g" p R/ A
if ((val = *addr) != 0) {
3 f; R5 I) P( U- J
/* Restore the original data before leaving the function.
. h. ^+ w b0 I: }* l4 Z1 ^ b
*/
W- Z) O2 Y0 }+ K- i! x1 e
sync ();
' ?1 n; j/ K! o" W/ C1 O
*addr = save
;
6 s# x2 t3 Y+ q% {8 ?2 m2 F5 I
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
$ [' T8 r1 s2 N$ T* I8 D
addr = base + cnt;
) q& R% q! x6 Z R, S& I' P
sync ();
0 c! ]6 ^2 C0 Z' O( X ~# O0 u _
*addr = save[--i];
1 Q$ S$ l6 z7 S- f* `6 |$ `4 _, \
}
0 [* ?; Q0 C! h, X
return (0);
6 @3 B/ V9 y1 @" ?3 e
}
7 R) C; v) e8 P+ Q
9 o3 x+ \8 Z+ J# V4 G
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
: Z& H% n, g- O4 j8 ?+ p
addr = base + cnt; /* pointer arith! */
1 [0 k+ [$ q0 J/ R5 U r
val = *addr;
" f: C a5 w% E/ M8 o
*addr = save[--i];
4 v- F% A3 m g+ G# O) Q% o
if (val != ~cnt) {
9 W3 J5 ~* _9 @ \% F
size = cnt * sizeof (long);
/ X m9 V4 T! [3 E" g- j+ i
/* Restore the original data before leaving the function.
/ R+ T$ J9 b4 M, _& W/ `
*/
# y7 A8 s3 z5 F o7 l7 K. x
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
0 e' Q6 l+ P5 X' E4 A
addr = base + cnt;
. y6 M( Q5 u! m* W
*addr = save[--i];
; C8 d, l, e$ I& e+ w
}
?) z3 }7 | U& m" V `/ T/ J5 g2 ^
return (size);
/ ~/ r# ^/ p9 I7 b2 d# x
}
( Z& W3 w4 q$ X8 l) m
}
) t$ U# a5 l# X+ S& F5 M% s4 ~
5 L$ a( a0 V" I5 O. s
return (maxsize);
1 _7 j+ O* V: q9 H& G' Z
}
. d$ [+ p2 `+ x0 B
int dram_init(void)
% b$ P% ^. m4 t) W7 s, k7 s
{
6 g+ A' P2 N7 v/ C
/* dram_init must store complete ramsize in gd->ram_size */
1 V9 s; Y7 L% i x8 k: Z
gd->ram_size = get_ram_size(
& n: n: \. Z+ a D& w; O0 f- p
(void *)CONFIG_SYS_SDRAM_BASE,
. f0 f- x# ?. B
CONFIG_MAX_RAM_BANK_SIZE);
0 V6 Z$ y4 ~9 U! |9 y5 d9 n1 u& v
return 0;
% q) ]6 k3 l3 x8 O% ~5 I q" _+ @& o3 K
}
# R7 |$ n/ J# W' {
7 [' Z. v4 n( N2 R- z
8 H4 V4 G* \4 C
' {/ g3 h+ @5 [( c1 B+ H
1 e% ~1 K3 g" c- V+ i, p
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
* P/ s0 T$ R0 ^1 Y
' E; R! \+ A2 |$ A
8 B" K/ U4 C' k+ ~' ?6 S: b; v0 k8 u
8 ^. q0 a" b4 _$ {# G6 p
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4