嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
, g8 [# O/ ~; U- b) H
核心板2:DDR2 256M Byte NAND FLASH 8G bit
/ E. r& S" Y* I c& G& ~
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
1 P4 C, _2 A) k+ n
) o7 t( O8 z7 i
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
. Z0 s- x! z8 C" @/ @ p
) w' U0 Q. ]& Q! N( t( X
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
5 E' o9 K3 ~0 W0 I3 a4 g
/*
* J6 s$ Q0 t" F/ x% s. z3 G
* Check memory range for valid RAM. A simple memory test determines
) c0 C- a( J# U5 i0 }$ j0 h5 n+ N
* the actually available RAM size between addresses `base' and
3 H9 o9 e8 U- z
* `base + maxsize'.
$ k x8 c2 G$ z* U/ u7 L
*/
9 U# I4 |$ q. S1 B8 W9 J: O6 g
long get_ram_size(long *base, long maxsize)
0 A8 `1 U( x/ q' O, ~
{
0 ~+ K/ P' L: R: a9 a/ C; E
volatile long *addr;
. ?& O- f4 G2 h6 t, G
long save[32];
6 h5 L- R+ r- F% u2 t I' D
long cnt;
T5 n- F8 }% t, H
long val;
9 }! M( i u# b D) W# g
long size;
! i5 T) J7 A3 E8 d
int i = 0;
5 D7 J0 L. O e- C
6 g* x/ X3 d3 F$ M; k0 H
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
3 r+ S* u( o c# z( j
addr = base + cnt; /* pointer arith! */
: Z' j0 E5 p# H
sync ();
/ ]! u6 {% V0 N$ J% O8 T( D
save[i++] = *addr;
) V/ [5 y5 `. Y/ Z5 W4 q
sync ();
# X- i! B1 F" q/ N2 G
*addr = ~cnt;
& j& b' h! S: H# B
}
' d* e/ A6 h4 \8 y+ E3 K
$ l+ f8 h1 n' I" ]* g- p/ U" s3 p
addr = base;
9 u% O: E" A1 u1 Q3 a7 U- u& W- t; Z' f
sync ();
1 q7 q$ f4 h+ D2 A7 |5 t/ X: ~
save
= *addr;
/ l/ K/ v2 C1 A' D( `
sync ();
( [( T" f# `+ y8 W( x$ A
*addr = 0;
' c* V8 q* l8 K1 y0 j1 m' q
2 ~* w7 P3 J% l( f! Q2 w+ p4 z
sync ();
0 [7 f, ]/ @! D- j2 @
if ((val = *addr) != 0) {
) D. O/ k- G/ @ x0 \8 i
/* Restore the original data before leaving the function.
8 S8 b* p+ ^8 w) X' j
*/
' d4 j V& a' r
sync ();
( T: v ?5 K3 S# a3 r
*addr = save
;
2 @) i! R! |. g
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
. t8 O% J5 W" g8 ~4 o3 B6 C
addr = base + cnt;
" N" H- I$ N% b
sync ();
" e8 Q3 k* s ~# Y' n* p
*addr = save[--i];
8 E, N% M/ ^3 A2 r% ]
}
7 V2 G: H" n8 r: L2 j0 s' K |
return (0);
- N: `6 r. o) X) Z/ [
}
$ Q: u, b8 ?; z& V: X" @4 T* l6 Q1 E
; ~; P9 B9 W) u! h; `
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
) T' y! \! ~, C! P
addr = base + cnt; /* pointer arith! */
q6 a" s. v. c6 H7 l/ g
val = *addr;
" F9 q8 R6 S) a7 I P! A/ {) R
*addr = save[--i];
7 C2 e) j4 H+ B/ s
if (val != ~cnt) {
/ E5 c7 n. `2 x L9 t4 s# b
size = cnt * sizeof (long);
- |% r6 F# ^5 Q9 q: n- I
/* Restore the original data before leaving the function.
2 h1 o0 D, ? S- ~
*/
6 l' V- Z' P+ b w! y+ R
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
8 \% @6 t2 [* T+ Z0 Y- V2 f
addr = base + cnt;
* C7 q% c1 ^( ^$ o% E; C2 y4 w1 k
*addr = save[--i];
. j& c3 f3 u% q- w# @3 F
}
5 `* h( [( ?8 Y& D9 J. X3 Q8 `# [
return (size);
" I# b# W( z! Z8 g$ }; Q; E7 O( o6 ~
}
3 \: n5 N* e( }3 I1 Y
}
4 ]! j' c! m( r. R. ~
s$ z0 U- D& ~+ a1 V
return (maxsize);
( [/ S* r) Y1 c7 M( [$ q
}
7 N( z1 _: C* x8 G. J, q
int dram_init(void)
4 J! Y9 Q& L/ H2 m
{
: M3 ~ o' o' A1 l( M* J- S: v
/* dram_init must store complete ramsize in gd->ram_size */
$ l; a8 ?1 @7 i2 j( Q# N5 Z
gd->ram_size = get_ram_size(
- K c1 A! ?6 Y+ b0 v1 C. e: t
(void *)CONFIG_SYS_SDRAM_BASE,
0 n: X, a, K( A: e
CONFIG_MAX_RAM_BANK_SIZE);
: }& n: d6 s+ s/ R( u
return 0;
* _# w4 p0 q* u# o2 ^
}
" w- e @4 ^/ O
) {# v2 s' j7 v1 \' d. L
7 W9 [' N) Q/ M0 o, j- z
+ T6 f5 z, N! y9 `( |" ^
$ r x4 }3 n4 g- U8 ^
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
6 L) ]! z/ F1 m+ C
7 M- y9 Y% _" R6 _( V
, a, W- k. k! d; D, ~! R0 u
) S. G; f& M8 e4 U8 l( c/ l
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4