嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
& K7 e5 ^1 H# ^
核心板2:DDR2 256M Byte NAND FLASH 8G bit
2 C* s* ^* b* u; q
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
7 \6 n" o4 W3 U2 t$ g9 q
6 o3 z% d' n: A$ W( t
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
, [5 R* }6 e# I2 |4 V( s
: X3 X f e, H6 w
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
' i6 ~# q$ Z, b) q( D( h
/*
& W, K# V7 N( M2 u4 N. j6 X/ d( a
* Check memory range for valid RAM. A simple memory test determines
) G$ ?" O" _+ \1 j( X
* the actually available RAM size between addresses `base' and
3 N. o9 @( _2 @# q: }
* `base + maxsize'.
( c; }# v+ J% G
*/
D' q+ Z+ v& t# g5 k0 D
long get_ram_size(long *base, long maxsize)
T$ N% P# V/ d$ S
{
1 B( ?5 C/ O @
volatile long *addr;
' }& s% \4 T9 b/ v- e( ^. N
long save[32];
3 w. z$ m7 B; X2 w4 K
long cnt;
, ^3 z) a: }: S G' E% Y# ]9 ~ d
long val;
* H" f/ W) Y+ R5 q0 o! l; t
long size;
7 S3 ~% N: s; m* C. }% O
int i = 0;
. A( c2 t0 ~: x% m3 ~0 v2 h
4 O# e \2 ?% N' S# I/ H5 q
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
4 S7 U! l7 v) c6 ~0 a- k7 a
addr = base + cnt; /* pointer arith! */
6 Y5 I& u# `: k2 u1 l* C2 |) B- P% e
sync ();
# D& P& ]3 S: \/ s" P) U
save[i++] = *addr;
0 W3 o* C! J2 w+ `
sync ();
: ~) G, g, i9 C& Y
*addr = ~cnt;
, D+ K' i g/ B y, H0 w
}
6 ?, }, G( ]% {% J& d- s; r
4 X5 E/ s* o) C V
addr = base;
4 J' K( m2 k# |: ?" \; J% J
sync ();
! ]8 M/ T# i& W" ^; S- g
save
= *addr;
% |/ l, w2 e0 m" d4 H K; ]
sync ();
2 ^# \' g9 p9 K. Z5 u- r2 i3 _
*addr = 0;
* t/ r6 F. b- V9 u% q
1 \* ` h/ I. H7 p
sync ();
/ |! N" U. `5 S
if ((val = *addr) != 0) {
8 ` j, U! A, a3 H& f* f2 T
/* Restore the original data before leaving the function.
" S5 T5 G! D# i' Y8 b# j8 F
*/
- B! g/ r" G; r' d8 t
sync ();
7 [8 q- d9 w; w4 L
*addr = save
;
8 w2 p1 {- I @6 v; M
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
: S( D; v9 a5 u$ N* `( A; B! `" I
addr = base + cnt;
% {2 F0 v6 O" ]$ o0 S3 g) i
sync ();
) l. g! |9 T* ?: M5 M/ G+ S; N
*addr = save[--i];
' }% ^3 O* i7 I, t0 e! p, x6 g
}
$ L& f. n$ ^1 [5 `* h
return (0);
/ \- Y' a3 p5 O
}
# J) ] H% @" {: E2 u! z0 U
1 f' }6 C4 ^5 u+ A/ P
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
& C0 k& ?& J8 U/ H$ r' v$ H1 M
addr = base + cnt; /* pointer arith! */
' n0 V' v2 y. q) H- `5 w3 l
val = *addr;
. g6 \& r& M/ G; H& d3 C3 X9 ~
*addr = save[--i];
7 z$ J) ~* O) J" Y$ K
if (val != ~cnt) {
% r3 D4 O' a# O# D
size = cnt * sizeof (long);
$ q, ^. D9 @1 t' W3 O( S
/* Restore the original data before leaving the function.
( | T7 c. U: p! d M
*/
& X* E7 E; {, Y2 |: O
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
6 L& D5 u' U! ^* J2 I
addr = base + cnt;
. U- R! b3 G3 T4 ~6 T9 G% V) N
*addr = save[--i];
* ?% O* ]3 s' C/ Q- t
}
% G. M2 m& W- x; j5 f
return (size);
7 N3 v) y9 A- k* L. M! H
}
. y( k$ Z- Z" x$ l
}
( U: L/ y0 S& t j
, x$ f) ?0 o+ z k% t) i, r
return (maxsize);
: p1 K7 f# ]: Z6 q$ n
}
1 J+ E8 p7 U4 t5 k0 {5 F
int dram_init(void)
. L0 B6 M4 r* ^2 a q; n
{
1 }9 T/ R! w5 P: H! S D1 `
/* dram_init must store complete ramsize in gd->ram_size */
1 ]5 s" O. F; ?" ^. u
gd->ram_size = get_ram_size(
% v/ R) ^# @, V8 S2 `* Q
(void *)CONFIG_SYS_SDRAM_BASE,
0 \" b8 L+ _( ?; {7 e2 s
CONFIG_MAX_RAM_BANK_SIZE);
$ w" N& v* f+ E' _* a
return 0;
$ W9 F8 ]5 L9 K q. \
}
: W& U- h2 B! V+ j
. t Q3 @( d# [0 S/ m# u& V. `
3 Q7 W2 {3 l5 C( Y$ a. W
' S& Y) ~ y' F) H2 O6 t
2 m7 @7 S4 p8 d6 E/ F, @: ?9 j
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
7 V. [6 ?( i. [! S A
6 ~; V! G9 q7 A4 Z2 M* c$ Y% l
- N( V3 e/ b& C; o
( y& d7 @ Z; r/ g7 o4 {
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4