嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
" E% c( {- q6 Y3 z# j
核心板2:DDR2 256M Byte NAND FLASH 8G bit
9 K, m) o2 _% o( P
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
: r+ k7 ?! R* Z5 A
) ~0 N, h+ J, S+ b4 ]& ?8 S
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
6 }- i! Q2 F$ c1 X' J: {
6 z. E/ x) _: ]3 d/ H& y
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
! I' R9 L0 `+ U5 ?* P
/*
' i5 X5 s5 h0 @4 @
* Check memory range for valid RAM. A simple memory test determines
% i; R, K% H9 W, ^0 f
* the actually available RAM size between addresses `base' and
/ C1 U4 ~' y! u( S( I, e
* `base + maxsize'.
, n8 y/ @; d6 y+ c9 v$ T9 v
*/
; d8 r8 l6 I! o! x5 E+ q' s; z
long get_ram_size(long *base, long maxsize)
) W# d# d: w; [' e
{
4 B/ q: \3 N% T
volatile long *addr;
. i: A" ?' d% j, t
long save[32];
( w- e5 w9 [: ^( r9 S7 m, e9 H
long cnt;
* L) o4 c- F& E4 }+ r$ X; T: \
long val;
" B" o% Z. d* b- D( H% k! _5 f0 b
long size;
* B- C+ W. y2 L0 v, q
int i = 0;
0 U$ ]$ y. S& ^7 Y9 j b1 I
1 B' j, {& Q+ N
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
& ?. `1 p, `3 }
addr = base + cnt; /* pointer arith! */
5 K2 q# F' u6 h; q$ G1 {
sync ();
5 u' Q5 _ d x+ L( z t
save[i++] = *addr;
8 h* _7 s$ A. }& w7 p0 N9 X
sync ();
2 Y+ |4 u, ^, E; j2 k* y# P* z3 }! o4 z
*addr = ~cnt;
1 b0 U+ F Y; U# r+ d' T0 C: F! K
}
# ?- q2 j+ I" f# H- W$ A
# u) k- ?& n2 v& P& s) g0 m0 u
addr = base;
/ x% r/ v5 o/ F7 B& s ~
sync ();
- O7 x; G9 U) `" B1 A# ^+ G
save
= *addr;
. u* D1 \, I2 H. V! f, {1 y+ ~
sync ();
) u2 L) @# q- F) W0 b V# f2 x
*addr = 0;
" i- B& g _' v& A
! v1 C6 O- r: y: n9 m4 _
sync ();
2 J* s& x/ N- V$ r X2 [
if ((val = *addr) != 0) {
$ Z- i: h: P# x! j/ ~
/* Restore the original data before leaving the function.
6 v5 G5 q3 F( G+ T, e
*/
9 k) E& ~ C+ D% o
sync ();
1 H& R) G$ `9 y4 e C8 v0 L4 |4 U7 O
*addr = save
;
1 m7 Q7 t% s' Q& D
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
! I6 Q# f' K5 E1 @8 {$ K
addr = base + cnt;
3 k: ~1 g5 e* `) H
sync ();
/ y& q7 d2 z! A) W9 W
*addr = save[--i];
' o! ]8 t2 g, ?) T K( D
}
6 d8 X, |" l" r! j% ]$ w% u! \6 Q
return (0);
, [! h. A; E$ S5 T2 q
}
5 o2 D7 r8 f# ?0 E3 g0 w3 b
6 V5 V# [ i" k2 L0 d# @
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
4 X' N5 O2 b2 j+ l
addr = base + cnt; /* pointer arith! */
2 [$ A! f: v) w7 t( Z
val = *addr;
5 J2 Y4 e5 l& d2 i/ x
*addr = save[--i];
4 |) S4 v1 m: k; |9 E3 H% k3 l
if (val != ~cnt) {
' o" W1 b$ Q3 G3 d, y3 y* p
size = cnt * sizeof (long);
3 g' G4 ^5 M( |% @; a" Q; d9 Y* b
/* Restore the original data before leaving the function.
6 `( y" h6 t. G1 c! q; t; s
*/
9 E. {) ] K( u# `3 Q8 O) I. V
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
3 t7 E, |( {0 d* B8 s5 t2 ~
addr = base + cnt;
c2 C }7 H- z% Q, P H+ O9 i
*addr = save[--i];
8 n& L/ W- M2 N: n- z7 C
}
% D9 c0 h9 a4 Z1 L- G( A
return (size);
0 @7 c# `! g$ G- j. k
}
9 q; S I: D j, p% {7 ^
}
7 p q( Q. R! I: N( Z
) h0 m, E* i: K' ?. [
return (maxsize);
! F! X- Y4 l5 @! P' F, a
}
! @: A, ^# y# F+ O' e
int dram_init(void)
' k: G& O& H l5 @8 g+ L0 A
{
' b0 ]7 w5 G2 o$ g2 m: ~' x4 X" H2 g
/* dram_init must store complete ramsize in gd->ram_size */
4 S' u8 l7 _- f* j& A$ H8 B" `0 _5 N
gd->ram_size = get_ram_size(
5 G* R: u9 p9 H2 d( R& Q& f
(void *)CONFIG_SYS_SDRAM_BASE,
. O1 A* ]9 v9 C# ^
CONFIG_MAX_RAM_BANK_SIZE);
5 H" f' d+ A% }. X( L
return 0;
) X: X/ A: X4 d* U) X5 _
}
; K6 {) e" z: X! _3 U/ E
- @' q' x. o2 Z) Z' {) d% U
$ U6 P" u0 N# P" n" W
* T. y: b' T- Z
, x- R# f4 v5 |/ S9 k: w& ?
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
8 { u0 O- N0 f" _
2 H$ [" J! c# ]* r9 h
3 c+ `, E8 ^: Q. p4 K9 _; y: f/ m
2 V. X$ O0 K" f
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4