嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
9 z. {' E# s4 j3 W& G
核心板2:DDR2 256M Byte NAND FLASH 8G bit
0 X0 o; k! M/ U% `7 b, `) P
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
0 u) J5 C# m& w" T
9 s( ^* t& m3 I: X
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
0 ~& v/ U# R: p5 Q( O+ u
; h8 G) u: W6 g9 V7 {
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
/ n% P# h+ W( ]
/*
) Y4 c/ l1 ?% c% N) o7 `* e
* Check memory range for valid RAM. A simple memory test determines
# ]. q, T' l& d! |
* the actually available RAM size between addresses `base' and
) y2 h. @! p, {8 Q$ q' ^
* `base + maxsize'.
6 x9 P& ~7 }( ^/ l
*/
# `! I- c H& c4 D3 b0 H; C! k3 X' u
long get_ram_size(long *base, long maxsize)
. c1 Q" T* y" n/ x
{
. N" y7 P6 i7 r% w" L( h: |' X
volatile long *addr;
. y% e" @9 B4 w# h- d
long save[32];
8 Z2 ~# {4 O- A# C( O, C
long cnt;
+ w% n4 E$ ?# ]! v5 M _
long val;
+ L O) s. f5 P, b1 [, Y
long size;
+ j' c& h* j( f3 o
int i = 0;
! b0 U7 w/ x4 l) }
+ Q) H1 F+ `3 g$ d6 a$ L
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
3 y% }4 `. @, |+ K# a j5 f
addr = base + cnt; /* pointer arith! */
1 [) ?8 a3 r) f7 c5 p
sync ();
' t; C/ l/ c& {! T& S
save[i++] = *addr;
& r8 ^$ b1 W- t t
sync ();
' F+ h+ L1 w. ]/ @8 _, H# }
*addr = ~cnt;
* p+ H6 W: Q4 I: v% Z) \7 ]
}
1 x3 P3 e! ^) ?$ p+ G4 K( |3 w
! K% C0 ~: k4 i4 I- n4 U
addr = base;
1 y6 }$ B6 O6 D6 Y) J7 ?
sync ();
/ o; T. A: U0 o$ t/ w% f6 \
save
= *addr;
& F+ k! K a, Q+ F; e* e
sync ();
( N- l! B, i4 c* ?7 m
*addr = 0;
" A m+ G- u1 `( I
/ Z" f! o+ o/ k# u3 U2 r6 M1 H
sync ();
9 c% V* o4 u0 ~( _
if ((val = *addr) != 0) {
' l5 ~, E# k4 M7 C% j
/* Restore the original data before leaving the function.
; ]0 o, m/ n* u% S5 \4 a8 h
*/
* {1 [* A/ K! N( b7 h* l* `
sync ();
9 ^$ M, Q$ L- O& ^/ M& J
*addr = save
;
/ w+ ^0 i* z. W: n0 v9 A2 r0 H
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
! w1 b- S+ s" a0 j; A+ _0 |. E( _- F
addr = base + cnt;
$ @: E5 y( v/ G8 Q- u
sync ();
' ^* {, q& u, j/ Q) t; l: d7 q' s
*addr = save[--i];
3 a& B6 Z+ D O6 t) [- Q
}
. ^ C7 b+ `. A( W5 r
return (0);
. A) X1 m4 [7 _4 ]" B8 H6 B
}
- K4 h$ A* [0 n
- r2 m( p# H( m: g0 Z
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
# o6 S/ o- ?: ?9 Y* X# g
addr = base + cnt; /* pointer arith! */
) p4 ?$ ^- `) @1 V t6 _
val = *addr;
" M* X% n& S$ S" X4 e Y/ v
*addr = save[--i];
* L {( o/ b. N& X" k2 I
if (val != ~cnt) {
0 M6 B2 p: O$ b ^6 v# S1 t. e
size = cnt * sizeof (long);
/ t o. t; \8 c* {8 I0 K j& u
/* Restore the original data before leaving the function.
' N3 _- g/ n( m7 r
*/
2 ]1 O8 j# w9 ^
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
5 s+ o8 V, ?% r1 d7 d
addr = base + cnt;
; `( ^+ L2 Y8 Q' Q. i3 I
*addr = save[--i];
0 L. U* l) X1 V: C' L: a8 b: n
}
2 R* |! h' F5 f% D8 O# b; u
return (size);
8 F- S s. f0 p4 w5 p/ A
}
4 g, e" Y4 |- W6 R3 W: Y% |, ?: A" K
}
9 i$ H7 t/ `- | s
- X2 Y. w1 Y7 `6 |9 F1 Q
return (maxsize);
5 S* O( z- `) \$ R+ u4 ^/ }3 F1 g
}
1 i- m5 x8 C' V8 N4 W3 V1 v
int dram_init(void)
9 k3 ~7 f( k' B. E0 @, i! t* w
{
; D0 I4 ^+ `$ P+ L7 L' [* L
/* dram_init must store complete ramsize in gd->ram_size */
5 f% s: |( z6 H( U6 T; a$ N
gd->ram_size = get_ram_size(
7 Y' n$ O9 l: {. T
(void *)CONFIG_SYS_SDRAM_BASE,
. J- q& t+ V, H- i* c2 Z* ~
CONFIG_MAX_RAM_BANK_SIZE);
1 ~$ L# X) z y6 E, _
return 0;
! }& q' L f; W
}
8 Q6 u- X0 z$ w f8 _7 z. |( l
; `) J% o/ s* W5 e, K) ]1 O9 T' f
$ P& d$ q4 W ^- W: h. d$ E% V
" I5 }, R# s9 M
, S- k; n! U$ G9 H. z; a" C
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
: P$ M4 [$ J. \1 x# C
, K% \0 h! b0 Y. w; `% S4 [
3 J# N( g+ j. \4 f9 ^$ a
9 i/ \1 p' c. ]2 n! e, J# M; G
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4