嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
# J0 m. v1 N: t! b
核心板2:DDR2 256M Byte NAND FLASH 8G bit
: m0 M- H* p* [, A4 v, A
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
2 k) E/ o) ?+ t# ^# S# a3 \; O! `
1 H' b) \1 a0 W* L& P5 N
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
" q; |% e0 |% _. l
. |( r( p! e$ s( f1 C2 `0 o4 ? s
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
& M4 E4 E- @ y* K$ B" ]1 H
/*
, R. [& `" R$ g5 T @5 N9 }7 j
* Check memory range for valid RAM. A simple memory test determines
7 p' `: i/ x; j7 e* G6 r6 b
* the actually available RAM size between addresses `base' and
3 q u" T1 Q' H9 f3 ?+ I
* `base + maxsize'.
4 J( o1 R' Q+ C. i' @. I( o
*/
: l- w4 y/ N+ R
long get_ram_size(long *base, long maxsize)
5 Y: T* n+ e4 C
{
3 Y4 d/ [5 C+ O7 ~) N7 c1 ?2 B2 s+ ~
volatile long *addr;
5 O* h$ a9 T' G5 Y5 g
long save[32];
8 E d6 p) m$ F6 n! t9 D
long cnt;
& R$ d: v9 F, h5 u
long val;
9 K* q: r/ P2 J% T" v( b0 y
long size;
- i# s, {$ J1 v1 @$ I% ~% Z
int i = 0;
* `/ }- D/ P& A/ o- l
" `- c) V4 F2 O7 s
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
3 }) F9 W+ y8 w
addr = base + cnt; /* pointer arith! */
6 J5 Y6 j3 b1 p8 }+ C5 t. t
sync ();
( ?7 A8 I0 B7 @
save[i++] = *addr;
. g- `! Q1 p( m. B3 m% ? ]
sync ();
0 _8 f5 S; x! P. c7 W
*addr = ~cnt;
u+ L: i5 I, ~: U, m9 J
}
: c2 r! o1 h4 S4 H1 O: ]
; _! J3 e9 W4 O9 p. W- w
addr = base;
* v: S. K& k; B5 x2 K
sync ();
0 ] l: a- A% Y% b
save
= *addr;
\! L7 \# Y0 z
sync ();
( f, W7 r* ?3 ]0 S- V+ }
*addr = 0;
3 E& i, Q: G# m7 V2 B: E& D
- Z# S8 @8 S2 ?9 h" \# o" A
sync ();
1 Z k! H6 Q' z
if ((val = *addr) != 0) {
3 G e! @2 C5 T1 n5 o, [2 G
/* Restore the original data before leaving the function.
- Y w& h" R' p! p/ M9 x) Z
*/
8 S9 k7 p- P& u
sync ();
3 y! U: ^( ?/ G* y5 T T. a7 s
*addr = save
;
1 Z' H0 J9 ^% P6 e& m
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
$ x+ p" ^5 M- ] D& d' D
addr = base + cnt;
o5 {+ R; I6 Y5 v' k
sync ();
3 t8 i* M$ X# y. l: c4 m$ K
*addr = save[--i];
/ S# i8 k8 K* d5 b* P
}
4 z, @+ A* P# C8 o% L7 B$ Q
return (0);
$ T- u8 E1 z& P
}
. y2 `, e: }5 A( X
2 k0 F' k7 E a9 T$ |) M7 E) z7 J
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
& K4 v6 Z9 m' q- d* @, A
addr = base + cnt; /* pointer arith! */
. A; E7 }" c2 X" H+ Q
val = *addr;
" T& q2 E# c, Z( {- [( v
*addr = save[--i];
# s1 l; x- a. a+ a# V# Q
if (val != ~cnt) {
7 V" R" U7 Y% B+ W
size = cnt * sizeof (long);
/ A1 y/ i9 p/ p* c6 e) d
/* Restore the original data before leaving the function.
) t( c% a7 o& ^$ p E! A, I
*/
/ ?1 G/ `7 O# j! C' s
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
$ p+ g- A/ x3 y9 @. }* w% ]
addr = base + cnt;
: a! \7 @5 |- \( E- U
*addr = save[--i];
1 A. V' i" m8 k+ n3 a; `+ U
}
4 }# C# k" d- T7 h7 H
return (size);
V$ B% g8 ]* D
}
; ~& s" E/ m5 u1 N* W5 T! ?
}
2 O: |3 d: B' V$ W0 H7 f1 X
n" e5 {' Y p, Y/ U
return (maxsize);
! E7 l6 _3 g4 f
}
9 E0 T& s' C1 n
int dram_init(void)
2 ~' E- Q4 O2 T6 k6 H
{
. j. h* D4 i7 H% e( z
/* dram_init must store complete ramsize in gd->ram_size */
$ r' J, r( Y* E2 {0 V+ l8 d
gd->ram_size = get_ram_size(
9 @8 _4 m" a2 I' _3 g
(void *)CONFIG_SYS_SDRAM_BASE,
5 `7 G# w( ^1 q$ F: p$ Z7 D
CONFIG_MAX_RAM_BANK_SIZE);
, N' }" @+ ?; ~6 V% L. M6 _; \7 g
return 0;
6 M( O8 V" \, [8 H9 c
}
. J2 X0 ?% X- z" v8 u
: R8 m3 d5 k1 Z* w5 y
, E" r/ I/ @, {8 [$ [* Z
% \! Y m) z8 R4 R$ t
8 _, ^7 V% r7 ?$ k8 Z" {. }
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
1 y- ^/ C6 ~/ b$ Y; c6 e4 ?
+ e! x/ ?5 |7 J1 o/ e- h
- W3 P. c/ \5 d' u
7 r+ B' e7 @0 K* i5 L$ U
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4