嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
8 k. S6 Z7 }8 \8 ~4 x1 F
核心板2:DDR2 256M Byte NAND FLASH 8G bit
C: e& ^. a. _4 x# S l. O3 o
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
2 O( M' Y: G- g/ b! X& {- d
& v9 K8 V. p) \+ l
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
* ?9 p0 k3 U1 n9 l
, t* ^% p; W0 S3 K! h# H$ u
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
3 i$ \0 B* {+ r2 B3 j# u3 a) T1 R
/*
4 d( P2 @6 u7 Y: n$ @1 Q& d/ r
* Check memory range for valid RAM. A simple memory test determines
5 E% ?: b' @3 {+ U; O/ R
* the actually available RAM size between addresses `base' and
$ k1 s. ~/ K0 w0 H6 I
* `base + maxsize'.
0 n+ A0 O# s3 x/ b
*/
1 T/ r7 Y5 H) }6 n% }/ z
long get_ram_size(long *base, long maxsize)
3 a1 Z/ h1 R( B& J( i! E/ A3 W- N
{
! j- v, Z* c' ~- J T
volatile long *addr;
2 g2 l- P) `0 L6 y- l/ r9 J( N& O
long save[32];
) Q/ n' a4 u- r+ V6 B7 o3 R! B
long cnt;
( t# P7 A. Q$ O) R
long val;
! G' i+ C" Z! R3 R- ^7 L
long size;
3 b1 j1 U1 f1 n- t7 f' U& _6 y
int i = 0;
) q7 u% b6 R, E7 |
, T( r8 u8 V" N# y0 T
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
- n9 w( P$ J+ w4 Q, Q
addr = base + cnt; /* pointer arith! */
/ O7 W+ `: Q- B$ q5 }, K; j
sync ();
/ y1 K3 u. S% {+ I
save[i++] = *addr;
* i4 _5 N; u! ~% K) i
sync ();
) s6 W- h, P2 B2 Y
*addr = ~cnt;
4 [- y F, d) D3 J( p: K" k" b
}
+ Z B: k# z/ v$ q B
+ C: n( q1 U7 S
addr = base;
8 U: E, X( f1 L8 T; F2 z+ @
sync ();
. b# Y. ~8 G+ ?# t, z" U) j
save
= *addr;
, q* P& E# w" f: s \2 x
sync ();
5 Y" O4 W# w- p% l6 v
*addr = 0;
" W# n- Z, t: S5 ^+ K2 @
# N4 B) w# O& L0 ?% j# S
sync ();
+ p+ a% S* Z* s9 F( ]
if ((val = *addr) != 0) {
, k _. N( Z, T
/* Restore the original data before leaving the function.
0 u, ~) n8 `" H, L
*/
( L& ~. s, I: M" d' v
sync ();
' E+ v: ^' t Q- b1 v! \4 f
*addr = save
;
2 y* p! d8 x, x8 K" N( h ]; T, h
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
4 }- A, D+ `' m/ p& i% i. m
addr = base + cnt;
; o/ Q7 |: D8 C, {# P
sync ();
. m X- ^$ m5 e5 x
*addr = save[--i];
- F* g5 @8 Q/ c, e
}
' {, Q1 H E! P, J8 W
return (0);
! z7 n& Z# k8 ]8 `( V& E; b# x# l% i
}
7 a! G8 _# I; w
$ e8 Z: j5 w* |2 |9 Z
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
7 V6 j0 p( J2 z/ ?' a2 \5 F
addr = base + cnt; /* pointer arith! */
/ G$ \$ l7 U2 E% b8 }# U" D
val = *addr;
- }3 ]0 d+ p6 R7 `5 S; Z
*addr = save[--i];
7 J' u! P/ t T2 C. ~1 _" X# T
if (val != ~cnt) {
$ `" Z; e. z8 C# D9 |. W3 P: k7 o3 X! ~
size = cnt * sizeof (long);
3 y- O0 ^: e7 O5 \1 @& G7 Y# |( D2 t4 E% e
/* Restore the original data before leaving the function.
3 F9 b: Y: ]* c
*/
0 T- ]/ z2 s1 Q, R+ t. n
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
) f4 E0 b8 f! K N; ^0 ?% O, N. l
addr = base + cnt;
2 V5 V% L. }! O" t9 e& ? `: B* r, J
*addr = save[--i];
. J# _0 ? e! @- l2 K
}
# j9 o' R5 m- L
return (size);
4 E( U3 u @3 W5 e8 M9 |
}
, z" R4 Z, p f% g
}
) l3 [2 E8 U" T! @
' a% t2 r* e6 Z
return (maxsize);
; Q0 c5 ]8 O9 z0 n+ }
}
% t: i# R. R( v7 r) q+ ~
int dram_init(void)
5 d3 t& b% W3 I1 \
{
5 A* }! J0 ~; k
/* dram_init must store complete ramsize in gd->ram_size */
5 g! Z( e q) U, o; \% [7 h, P2 P, b. y
gd->ram_size = get_ram_size(
6 k( O- L' G E# C5 W. x
(void *)CONFIG_SYS_SDRAM_BASE,
! g4 `) C% [0 H& h, ]* B
CONFIG_MAX_RAM_BANK_SIZE);
( e* ?" q/ a7 }" L5 L9 K
return 0;
. V1 p) C' U4 {; ~6 Q
}
1 _3 _/ U/ x5 U& u8 g6 U0 U+ l
/ l/ H! ?# e" D% r! M* U
$ I" y5 W0 Z( m# v
% ?+ a& W; [0 l& s/ k, g0 m; N' N, G
7 _- i% X/ m4 [
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
/ B% o+ }6 m+ T$ u/ X
5 n. @6 q- k5 t( a! V: K+ G
6 L0 G2 d- q/ y6 X3 l& t
: |7 \- g9 G+ h4 u
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4