嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
! ^, o( L# D* ]* W
核心板2:DDR2 256M Byte NAND FLASH 8G bit
9 o( R/ x: `* d( G* k
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
# a$ _, k6 u$ V. U8 L
$ w+ ?' ?4 A; ^
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
" f" i; L- ? u
8 Y% c& }9 k3 p1 W/ \2 W8 u' J9 m' O
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
7 F2 b1 x& Z) k
/*
) b1 t1 r' W" L. j9 r# m3 e
* Check memory range for valid RAM. A simple memory test determines
5 K1 s* c; n4 Y9 @2 L
* the actually available RAM size between addresses `base' and
/ }( `0 _# y, B5 v/ {( L- e
* `base + maxsize'.
. U* v: L) ?6 J7 a) I
*/
% j; m- @( l7 f9 N6 j
long get_ram_size(long *base, long maxsize)
* [& \+ ^; N3 H8 U
{
3 r5 q: |" K) J
volatile long *addr;
( C5 Z2 T, `. X
long save[32];
3 C, o5 `% J$ {+ t4 U8 A
long cnt;
" ^( G$ C5 {) E( T" G" `6 T/ S
long val;
* S) P3 d& O# }9 N
long size;
* W7 W9 V" t9 l6 ?6 a
int i = 0;
# U2 _% J6 A [/ {1 p: Z9 o
# e" B% t9 ?+ o, ^
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
4 W& w: g. Y( A
addr = base + cnt; /* pointer arith! */
: R) H: `) H. j. a; X6 k6 ^
sync ();
" p: _. a+ r+ y5 w& B9 c7 S
save[i++] = *addr;
6 F6 W, j/ a" n* T# a; g
sync ();
+ m, A4 h3 Y8 ^ b$ t: W& C
*addr = ~cnt;
# `6 V& A( T, F% \' I4 j
}
( }# B; a3 h' C5 u, M
* k$ D) y: V4 M! v9 S- g8 }' b( D
addr = base;
) N2 w: d- B+ O* u' \' k1 s% L3 m
sync ();
. T/ j z: c( c, f+ \
save
= *addr;
5 ^! ^0 G$ D, s* @8 @# y, W
sync ();
; d9 g" `5 ~1 H
*addr = 0;
/ p6 u, ~( E9 t: l5 `
" @; Y w. V- ? o' I6 I% Q$ g
sync ();
1 K7 |. \/ R- r6 Q' T) z
if ((val = *addr) != 0) {
1 p+ H5 o2 N9 H+ S
/* Restore the original data before leaving the function.
2 e; \' O1 g% Y1 e$ P( G) G h
*/
- r: \8 o: u! R5 e6 @
sync ();
: d; m2 T" ]5 v: d% D# v5 i' I
*addr = save
;
; h2 Q8 F' Z4 Y' w4 w' J: K
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
9 j( e5 r' |* q& _
addr = base + cnt;
! F& T% Y$ T( R" g- [
sync ();
* q% }; }% P" S2 q
*addr = save[--i];
7 b5 N& w, M8 M
}
! j* n! \+ N6 v# W4 A Y, A
return (0);
0 }% V) Z# j( {- f/ p2 B
}
1 f! u2 c C& S2 d
& i6 X2 V Z) X* ]
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
- M5 [% |- o5 q2 O0 v& G# L
addr = base + cnt; /* pointer arith! */
0 H d4 E& m7 Z4 A! R; Y; y
val = *addr;
+ o, M- b( p. b) J. g) R/ S; P+ e
*addr = save[--i];
: C: u6 M" Z3 B5 \$ O, j% |
if (val != ~cnt) {
5 T) G7 E, V$ g0 S" W& Y3 k" s
size = cnt * sizeof (long);
~! Z) C# d5 `6 M E0 P
/* Restore the original data before leaving the function.
7 x/ o* n2 |6 u# I+ {
*/
! j9 |# ~0 ]: l* `
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
0 b% n# L4 m; S
addr = base + cnt;
0 W' l. |" y4 T
*addr = save[--i];
! M' b' m. X5 ^: [- P: \ y' j
}
: v) ^0 |. j3 Q8 X$ n- S. @
return (size);
& O& C7 C8 f4 o$ ^6 l6 u5 l' b t
}
3 n- F/ l+ b- T; d
}
* o9 M( l5 M- V4 q5 z
% X( S1 S" L8 G# u; ?& ]
return (maxsize);
. U( S! a% t+ E; u5 A* |: o! m
}
2 V2 ]) F m7 r: M. A6 }: I; S
int dram_init(void)
7 [9 G3 K3 h" f# Q5 S8 r
{
* d% `. Z0 u; B" Y. Y5 C
/* dram_init must store complete ramsize in gd->ram_size */
. ]" q% p% U' ^* H- F
gd->ram_size = get_ram_size(
5 `4 p5 L+ p3 b/ g$ i4 u
(void *)CONFIG_SYS_SDRAM_BASE,
9 G& P$ V: I* _5 `/ y- [- S2 B2 e
CONFIG_MAX_RAM_BANK_SIZE);
) e7 p9 B/ q. c9 |" g
return 0;
4 f& s( F, c6 h+ D# j' ~$ Z% M: a
}
) e( n+ @5 X8 Y" g6 N
( b9 O% U! z8 x" _4 S3 O; E3 n0 L
5 @8 J0 \- K6 |- k* v. y* }# T
4 j$ x/ l1 n& q5 C& }
) z, [/ _# l% K; z0 y, g$ _! R; r! F9 }
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
! R8 |8 \2 e& R/ K+ W' q
/ I4 |8 K$ j* c# y3 A V
2 ]) q/ L2 O4 d5 j" y5 U7 Q. C
9 b% c$ \* U: m$ \6 U( u3 J
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4