嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
/ j5 X; h, w1 M0 w$ y2 `
核心板2:DDR2 256M Byte NAND FLASH 8G bit
! ?; d0 x I; s% ]
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
" b$ ?% u9 U& [8 ?0 z5 Y( F: d$ J
! b2 R o7 V) Q! |: Y- [* L
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
4 G7 V2 ~9 q( e
" D5 u+ \3 b+ E3 q8 T [
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
1 c& B) d3 _2 |* \
/*
# l1 F* {6 n5 O+ }! K$ g
* Check memory range for valid RAM. A simple memory test determines
% d9 |9 t1 D3 w" V
* the actually available RAM size between addresses `base' and
8 P8 R9 j$ z9 o
* `base + maxsize'.
s$ k4 S" ]$ v
*/
+ |5 L) Q8 i R2 u6 v3 \' F, X
long get_ram_size(long *base, long maxsize)
4 }, ]& T A$ K
{
+ c% \: A/ l+ Y6 X$ x
volatile long *addr;
) w9 L1 p, V) r+ h4 {$ @& x
long save[32];
8 Y' @3 _4 Y' f1 R4 _5 G6 P
long cnt;
, q9 {2 p4 r* Q1 |
long val;
: w. N$ Y- m- `, a4 s
long size;
- v" b' g j; _1 j9 Y- s
int i = 0;
" ?* _4 I/ u* U, h* |
a% C/ F6 a/ x g
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
5 O( I6 S0 i2 T! y" a. i
addr = base + cnt; /* pointer arith! */
$ ~. T, O" a9 ^
sync ();
4 w# ?+ b9 v* R, S
save[i++] = *addr;
! o9 B9 Y; S. e) x" H. v2 _6 ?+ D
sync ();
- f$ B5 S/ p- X% d
*addr = ~cnt;
( Z- |3 e6 E/ t" T, h t
}
" P- {. j6 b% {) Y3 N8 e$ U
8 q1 ^3 V% }4 J% s/ u
addr = base;
5 @! g8 o$ M% V; ~
sync ();
. B( _( a( n/ l( O
save
= *addr;
' p5 J' i. d( |" v- [
sync ();
/ e3 b1 B/ W" G" P e7 O
*addr = 0;
& b: K% v% ]- T% m* Q
0 c( e8 N1 m# O) P
sync ();
1 L& Z) W5 j6 |: H* p$ X N
if ((val = *addr) != 0) {
$ B4 c; b& d4 |. G2 l
/* Restore the original data before leaving the function.
: b" ?9 F1 o" h/ }' w7 h D
*/
8 i/ J& O/ T- j7 H4 N
sync ();
' G: @6 T' m: v( l/ Z9 i
*addr = save
;
9 ~5 ^. i: J2 [
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
# Y: ], z) r" r7 M
addr = base + cnt;
# @9 ] `% |% T- R
sync ();
5 O, g5 ~/ |+ ?1 y& N( Q
*addr = save[--i];
3 ^: r- [" N% ?) T
}
( W& n% W8 q/ k9 G" I4 A
return (0);
3 b- Z4 l Z1 _7 i- I
}
; W5 D/ U$ ^( A% R9 B+ t
# {3 r1 N8 W: f/ \6 d& ?
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
& N, m( \5 U2 \2 P$ N
addr = base + cnt; /* pointer arith! */
+ {! H! q! J/ Y7 V/ U$ s/ W& I
val = *addr;
P8 N0 I- Z+ Z
*addr = save[--i];
0 }: o& C5 s6 O( T' g* }
if (val != ~cnt) {
% y6 l4 _2 h+ |3 w8 \# J1 T
size = cnt * sizeof (long);
6 F/ g% M" k3 g: `+ V
/* Restore the original data before leaving the function.
5 w5 g v# X8 e( c& ?
*/
& i! q' A2 {& A6 h2 o. m
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
4 ?& N0 `! x7 s4 L
addr = base + cnt;
8 p6 ?9 Y! v. h! h4 s, W
*addr = save[--i];
$ E* i. t# w& h \
}
& w+ M" H$ E8 {, k1 [- R
return (size);
9 r& o) h% J5 r9 b
}
) S9 m: J) G l% ~: V0 W: V
}
' T. v/ I, H4 m0 G% \$ ^
?$ i: Y5 o* U5 N2 u$ y
return (maxsize);
# q; G; {- p3 N* g% f
}
, l3 o0 e" _2 Z) l. S
int dram_init(void)
/ z# s% x) ~4 d4 ?& W# b
{
# G3 s: ?8 P9 E: w- Y2 j
/* dram_init must store complete ramsize in gd->ram_size */
" Y2 N1 B7 f6 x& D8 g" w( U
gd->ram_size = get_ram_size(
. I1 K- M: {+ c m" z/ r6 @3 ~
(void *)CONFIG_SYS_SDRAM_BASE,
) d* b, z4 B4 M* s2 d
CONFIG_MAX_RAM_BANK_SIZE);
5 d' |/ E3 Q# v* a* u0 ]
return 0;
, u& I0 V q6 @2 Z
}
$ A5 ~ y7 \1 a
2 y9 D. q) \0 I8 J8 }3 ]1 p8 N( a7 s5 f
9 _; [% f. u; p! V
$ T+ [) Z4 s- s3 n/ ^% i
6 g2 F" L1 r( a% V S2 W. Y
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
' c/ Y- n6 m$ M0 A
' F6 s/ P" {: d2 V W: M: ^: P
; |5 v, j+ C% U& _
1 Q& {' h) O6 r# z$ b
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4