嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
9 w( K* h$ Z6 M8 E+ _& c
核心板2:DDR2 256M Byte NAND FLASH 8G bit
/ T. w5 `- e% ^6 g) ?& Z
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
. t9 Y+ ~- v% Y" t) u
; S4 Q% R- h2 j
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
: z- [/ j5 B7 H% u5 t8 P
" @! }9 l" m) P; `2 ^0 q: ?
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
* S$ t; @1 P, a8 I
/*
! m T" a1 S. l. D& _6 B" k
* Check memory range for valid RAM. A simple memory test determines
! o( Q. n) b+ k! y- F/ |) g5 J/ Z1 F" P8 c
* the actually available RAM size between addresses `base' and
+ a2 L6 D9 F( u+ J9 j. A9 V7 `
* `base + maxsize'.
. X- B- E: F2 t( D4 T5 L
*/
' e$ f1 t, S- ~. z. d8 v# y1 J
long get_ram_size(long *base, long maxsize)
6 F5 G6 \' P! _( z$ ^( w: e
{
4 ^1 K7 }! z0 F2 ]' r6 g) p
volatile long *addr;
. Z5 n! [$ L- s( x
long save[32];
, h5 T, H3 I) X" \
long cnt;
h$ J. E: a( p/ W
long val;
& c$ J3 _' x- r6 ^8 I
long size;
) N6 W2 f/ d, e( k* X2 C+ ^
int i = 0;
9 e% ~& ~8 ] j) g9 u3 R7 v
S! V( N1 @* Y# f/ m! ~, u
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
. J6 g- m5 b3 n4 m
addr = base + cnt; /* pointer arith! */
4 p# [( z4 K& o% Z# R. i7 @' M
sync ();
+ q3 K: [: f/ W% ]% a
save[i++] = *addr;
/ y, V K2 Y- \8 H* W/ |" Z. c
sync ();
. l2 U7 l; b: k0 j: y1 q/ a, u
*addr = ~cnt;
6 \7 v8 u4 U' t" u' a4 m9 V
}
' i0 y4 T8 a, N9 ?; K
+ S4 F% H1 Y& k) h4 f; H# o
addr = base;
% X7 ^: _7 p7 f5 c$ {! t( M
sync ();
/ @1 ?1 k- }- G1 X& E
save
= *addr;
4 b) [6 ?+ t) l" X) |
sync ();
3 ~! ^3 S5 c5 _: N0 ~; C6 ~
*addr = 0;
$ j; M& C& P7 s3 L6 `" a( ^
) f' ^$ C5 S- n: C& Q v: M
sync ();
( n( T; x$ O' _- P7 K h! B/ n% F
if ((val = *addr) != 0) {
% e E/ H4 r) `/ i+ v" \5 }+ t* y4 O
/* Restore the original data before leaving the function.
4 u& }6 J: T0 x8 ~
*/
* q+ t$ E0 f7 j( U; N9 U& q
sync ();
5 J/ }4 m/ F1 t; c
*addr = save
;
# K b9 L1 L, x% ~6 K
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
. R0 E+ q: G. X
addr = base + cnt;
. R1 }, F, {: K' w/ k# }' s
sync ();
8 x' ^, u9 X- x. ^- O0 K" N
*addr = save[--i];
- c6 \5 O- T/ c- Y/ q x7 a( C
}
# T8 V2 g9 V4 u! d2 ?2 H. i
return (0);
- ^; _9 N% M' w' l6 Z6 h
}
) R$ Z% r" d- a5 @& L
) C2 w0 e8 l! ]' s+ T( F
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
: }+ `8 ?% Q# }# A
addr = base + cnt; /* pointer arith! */
+ [. O* P1 d9 [& Y* v# e2 ^" b2 T
val = *addr;
7 N# O' l& I0 V* R
*addr = save[--i];
' {4 v9 S% x+ g6 \7 }9 ~$ S
if (val != ~cnt) {
4 u, V: s( Y; h0 y# _: U# e
size = cnt * sizeof (long);
4 s7 s# \$ b2 d9 [
/* Restore the original data before leaving the function.
$ p* H& b/ l; z
*/
- M& K$ e7 |, `, y$ Q3 f4 ]( w) B
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
4 @ y+ L; X6 M% ]5 Y) u
addr = base + cnt;
7 D: ~' S$ c( J* X5 V5 g
*addr = save[--i];
6 E5 U5 e* ] c. B9 Q$ c6 ?
}
; ]" ]/ O# W; Z6 b
return (size);
, A+ t; V5 {9 ^8 q
}
) E4 v, v, B W2 @: W: S$ w. h$ P5 y
}
- p& e1 V: l0 O7 F* r9 C
8 ^* j) k0 a( f3 H. ?
return (maxsize);
# h7 S+ d& F8 q7 z5 D" c5 ]
}
. W. Y2 j; t% K4 G# K8 M# l
int dram_init(void)
! }% U0 v" k4 G! I$ o& u& F0 p
{
* L) F1 r# e) Q4 j9 k% a
/* dram_init must store complete ramsize in gd->ram_size */
( U' }6 J, T' Z# k# q( T! \
gd->ram_size = get_ram_size(
' s6 N' t4 a& G$ i- j$ v7 C% P
(void *)CONFIG_SYS_SDRAM_BASE,
& p m3 Y- \9 j+ | B
CONFIG_MAX_RAM_BANK_SIZE);
) U1 B0 o @1 G% h$ \7 l
return 0;
! w7 O. d! V I/ A: P% v
}
$ O* f2 \ W, ` Z
& n3 W0 H2 T: G& P
0 [1 C( r3 X' Q3 v- g4 V
I5 U- Z; k D% I0 X0 q1 E/ B5 s* o$ G
9 B6 H3 `+ y7 g
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
9 g! I- q* n7 y3 Q' S
5 A4 y, [ f. G% q$ }
: o! p B; N0 V0 Y5 Q8 Z
5 J* F9 C' M7 d s: ~2 V1 L
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4