嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
- A. s8 i c! D0 ?) k5 R( U. e, N
核心板2:DDR2 256M Byte NAND FLASH 8G bit
3 Z& z+ J/ @9 r7 m
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
% Q8 l5 T$ u& c, ^
( |; e" Y0 y/ D+ F! I
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
/ J7 }* x1 e5 h2 j% w
: E% P7 |& S2 w" Z5 h0 W" r
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
- [; v0 L& X' K7 Q* q& t4 H
/*
5 x7 H1 u: g9 t# _& ~: \$ C
* Check memory range for valid RAM. A simple memory test determines
7 {5 I) a9 ?. B' _: y
* the actually available RAM size between addresses `base' and
; m: D( U- k% {/ L3 m+ @1 ?
* `base + maxsize'.
* H( i/ Q5 Y& z6 r4 D0 r
*/
. m6 Z; v9 C6 T8 {5 V) ^- B t
long get_ram_size(long *base, long maxsize)
: Z7 }( Q7 S) S6 [' Q6 F( o. V. U
{
; U+ ]. e$ s1 r0 i2 E! U1 f
volatile long *addr;
; Q* p1 g% T7 z( S( o$ M
long save[32];
! ~0 a0 K# {4 k N6 `* o
long cnt;
' c9 ?$ m, }6 u @! p$ V
long val;
3 M- Q* t; E' S" ]
long size;
6 g8 b% i: q1 Z- F
int i = 0;
$ @, L" B9 L4 A5 \7 q9 U
3 I6 U- S. U( w% u% l. r! K
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
, l8 H! l% G! d6 Q# o1 i
addr = base + cnt; /* pointer arith! */
; g `" x: b# U
sync ();
% s: L3 W. A8 ~
save[i++] = *addr;
/ C* v7 P9 d* b2 I$ E" `1 l/ Q
sync ();
4 {; l8 S) l0 v! S/ u
*addr = ~cnt;
! f& O5 | x/ W& X) w% M7 i; F
}
) a, M& J) s0 ]
. A7 g# u4 B: e0 M- D" I* c! ?6 B; w1 m
addr = base;
2 P# P2 c' G1 @' R) h) ]* X6 P
sync ();
/ I3 y2 W1 I2 ~# g" k" o4 g
save
= *addr;
1 Z% d/ F" C5 k1 B3 Z% `
sync ();
+ u. I0 K5 K+ M: g
*addr = 0;
) C9 Y. Z- y" C$ E/ e6 ]' }
% @. |0 g* A4 q
sync ();
! Z( p/ F5 q! Z; ~. g8 z1 g, `
if ((val = *addr) != 0) {
+ J$ }+ U% K: r0 p4 E! n2 }" n
/* Restore the original data before leaving the function.
3 W) K0 V' Z+ y A8 M7 q4 c+ _
*/
" \' _% V. E: ~/ ~7 u: m( S) X
sync ();
I3 s3 u |: K) ^6 P
*addr = save
;
: T& L( l, G' l' Z7 D- h/ q
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
) T @4 L: n4 ]" C- i% n# Z& y
addr = base + cnt;
, g- v' f# g) F/ q9 ~8 i
sync ();
0 y0 d% [6 c9 ?' Q5 ~# ~: C/ v
*addr = save[--i];
- r9 H2 i$ ^. a0 g5 D
}
6 C7 Z/ p) B/ B3 v1 g; b7 K* G
return (0);
9 B$ h" B4 {( \. c+ F
}
1 ^1 x/ U+ k* f( J
4 R, R% q( v4 R3 U; l
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
- b: i4 D% F$ c* K
addr = base + cnt; /* pointer arith! */
5 H5 k& f7 q) [- g2 E2 T/ L
val = *addr;
& W& n$ T; X5 n! Z
*addr = save[--i];
: o/ w) ^1 n( D+ X! p
if (val != ~cnt) {
4 r5 _" X' }# a# X
size = cnt * sizeof (long);
% ~' T( V% n( m$ u$ t8 t
/* Restore the original data before leaving the function.
/ P8 N3 Z. s9 d0 R$ I3 s4 W( @8 Q
*/
* f) e( X4 F8 u4 B; J7 ]) U
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
7 ~" n+ P q" v
addr = base + cnt;
8 j- s; o6 W! W0 Q8 P' b
*addr = save[--i];
9 x+ F# u% m% P9 H& t4 U
}
4 a3 K& _- s0 c+ Q
return (size);
" p& ~# G- F0 G" e0 w0 k
}
" m9 q, Z* T, x* y- h- x
}
: r: N# f4 p$ L8 y( n7 ` k
! c& m$ _, d: i: X( H% a z
return (maxsize);
5 n; W* d* j/ D* t! S# |
}
3 v# l5 Q; N8 r- W- x6 Y
int dram_init(void)
& D' ?( L3 Y# `! M
{
4 e, c& ~( g5 m# ^) h$ f$ \
/* dram_init must store complete ramsize in gd->ram_size */
" q6 B: ]. G H2 [$ h
gd->ram_size = get_ram_size(
) Z: P" t0 c3 r+ w5 p; E
(void *)CONFIG_SYS_SDRAM_BASE,
5 Y# F+ F( n' b* T1 |1 h3 {% j
CONFIG_MAX_RAM_BANK_SIZE);
2 |5 _ O, K0 M/ U ~" {
return 0;
" j6 {- o, L9 t: P+ P8 V+ ~
}
& Y' |% V1 D4 S% o. [
/ z. f0 X3 F' _
- k3 N* U, c1 }% X9 W8 x8 N
6 ~* z1 M- A( g/ o8 j. {0 j7 u
( J4 L6 c T% e7 q
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
# ?3 ^( i4 k, l) h5 {8 f
+ \- [# M5 H" I
5 M {3 v& e2 p
6 Y" D) ]# H. d/ H/ _3 J
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4