嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
5 f: | p$ C, L5 l9 }! `3 E
核心板2:DDR2 256M Byte NAND FLASH 8G bit
/ y6 Q8 X$ ~! P% z. u
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
; y! v$ ^3 T& R v; W& A
- M3 e7 @6 [+ t7 H% H
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
7 n5 W6 }* u1 p0 ^3 D# h
C X# `: f$ E2 V4 H$ E) N+ m" \9 ^; c
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
% F) _2 M% L: w E1 L
/*
, U) p# D' O# s! d' c7 S
* Check memory range for valid RAM. A simple memory test determines
; R, F4 Y- F" }3 k. c
* the actually available RAM size between addresses `base' and
+ C8 E8 G+ |/ E- j$ O; _" E
* `base + maxsize'.
, I5 Z V. `6 d0 l
*/
( C% @; K8 ~, ? M) L8 f
long get_ram_size(long *base, long maxsize)
; S* A- V* G2 w) J. y1 ~3 P1 ]
{
4 O+ g+ |3 @; F
volatile long *addr;
5 h8 L6 c4 o; K" r: f. |$ u. F% `! b
long save[32];
$ [* F- y, q j5 a9 U
long cnt;
! q1 `% t& S: v- K8 X9 v$ ~7 \
long val;
2 Z' S0 T2 P6 U& p4 W! K
long size;
; ~4 o# u* S3 ?- P
int i = 0;
/ J) D% Z g6 h2 _; J3 u* c
8 I5 }& E* ~6 `5 a7 O
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
. G. C( z1 }" O' n& `( H7 r
addr = base + cnt; /* pointer arith! */
. i2 y" a/ A# p5 V
sync ();
$ O- q' x/ ^2 L/ K
save[i++] = *addr;
+ Y% d/ [7 ^ i
sync ();
+ v+ U( v" ^+ A# b( D7 W5 i
*addr = ~cnt;
1 x Q% f0 E, }' `
}
, s. G9 }8 ]! [# F5 ~
6 V& A9 m1 |# n! Q& b* Q7 L# \
addr = base;
# a* F0 {* d/ l) ?0 e7 z0 z& a
sync ();
: C8 n) |: u- @7 p. ^ `) R
save
= *addr;
M% A3 _# Y5 u2 k# [
sync ();
( _- | Q" Y9 p
*addr = 0;
/ w2 q" R2 D! n1 F" Z; r2 s4 Q. [
, {# |! y) m* u; K1 R. c3 I! r# y
sync ();
/ ?& m5 o2 \ h, P0 i0 X
if ((val = *addr) != 0) {
% b* B" L8 U: x
/* Restore the original data before leaving the function.
5 L) c4 ~5 P+ Y+ j- l
*/
0 e# p. j2 \* \2 ^
sync ();
Y6 Y/ k- w$ @# ?% X
*addr = save
;
6 n/ ]% }- Y2 _: ~5 \
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
2 {: A1 e" L" R2 P7 ~" K
addr = base + cnt;
- ~8 {# W5 ]' ~5 y' g
sync ();
- b/ C9 M O, C5 ~5 m9 u2 u
*addr = save[--i];
5 r6 Q7 j1 Q: F9 J; Z
}
' F) E: v: x$ A
return (0);
$ u3 s: d* ~' u- |4 V: @
}
3 \! g" o# e' h
$ y) T3 k* z+ u/ |) U. _& t
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
' C# ^0 Y/ x3 h+ W
addr = base + cnt; /* pointer arith! */
* W( J2 A$ u5 \2 {! J1 e" ]
val = *addr;
( t* P( z" b! o* S9 @9 c( [% N+ x" j
*addr = save[--i];
% n% ?: l$ G2 g, W: z8 W
if (val != ~cnt) {
( n8 f' i6 T7 I0 Y
size = cnt * sizeof (long);
9 Q7 U" u0 l' k5 a9 Z6 U
/* Restore the original data before leaving the function.
3 i/ \) w- K- V5 |* f" x1 x( e+ D
*/
7 d. R5 t8 Q5 _( w8 |
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
( s5 z/ y! _) G3 h& @" Q
addr = base + cnt;
# z) w: h/ O( |' o
*addr = save[--i];
; m! ~" B8 Y6 b6 U7 l" Q# F- u
}
# C; j0 R0 t; q2 Q
return (size);
! ~% o( Z) F! ]7 O4 P$ {
}
5 a/ b1 A# p* U
}
+ ^, ?# f1 X6 m4 o
) M; H6 J( f! H+ B* [1 ]
return (maxsize);
6 C% g) X( _) O/ k: W
}
) v8 ^* b+ y! }3 q, t8 ?5 E" }
int dram_init(void)
% ^* D2 m$ Z( ~- g
{
0 F3 \# I$ b) i- s% j" Q7 P
/* dram_init must store complete ramsize in gd->ram_size */
6 s* W( |: r; o" ]; T2 {
gd->ram_size = get_ram_size(
% K0 T' T1 h& M0 I1 g0 h
(void *)CONFIG_SYS_SDRAM_BASE,
0 i" | G3 H8 ~9 _
CONFIG_MAX_RAM_BANK_SIZE);
9 s! L8 f/ H* z% z0 Q
return 0;
) K" ^& ?, C9 }% [
}
. Q8 X ~$ ~! m# p6 M
- U: ~: ^; d1 c) e) d* i; m, j3 }& p
" P4 V( [6 u4 H/ J4 w
& o. ? b0 {! j8 s1 a' O4 W- o
/ o$ }( A7 I! @
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
$ l& ?% Y0 Z8 L# P
9 h& @% x. {8 V* c( t: n2 x0 l
' N' j/ |& Y/ \+ J" o5 `
w* }2 X t3 d! r
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4