嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
; `! X0 w. e; ?2 H6 c
核心板2:DDR2 256M Byte NAND FLASH 8G bit
}% x! ^1 b% ]6 g, U! K/ h
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
U. j [# u9 C9 E A4 ]# h
( f0 x D2 d/ S" P( e% `+ h( p( \8 A
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
2 G5 l0 {$ H, R6 O3 z' O& I& m$ v: t
8 z1 e0 ?6 @, C- x0 X3 p
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
) }+ d% s" }. y9 W0 y1 ~6 `( m
/*
' k% `5 o5 Q& \. K2 M
* Check memory range for valid RAM. A simple memory test determines
3 L4 R; t+ m+ i Z) |2 l7 i
* the actually available RAM size between addresses `base' and
, [5 W7 n9 k& p+ D# [& l% S) G4 E
* `base + maxsize'.
, a7 v( f! t. p V: O; F) F
*/
6 S4 u. c5 V6 O i
long get_ram_size(long *base, long maxsize)
, B' h' E& b; r1 I
{
5 b( ^6 Z6 u3 ~
volatile long *addr;
4 j% H6 B5 L* K4 n5 K
long save[32];
$ H! m2 @+ x9 P# Z) `
long cnt;
3 _! @+ i! _. P
long val;
+ |* g! ?9 H9 G/ k1 d# c6 L
long size;
) ~4 v1 o5 A0 {; g! a! U+ ?1 M
int i = 0;
- B/ ^+ J$ c. H
1 M" X0 R' u, {$ C( T" b
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
! }; `5 f7 l* x
addr = base + cnt; /* pointer arith! */
" X% c [5 c( i i8 g
sync ();
; f! \+ V! X4 o1 Z2 u
save[i++] = *addr;
( \/ i( u! W/ \4 _" Y4 N8 Y
sync ();
" Z6 w$ X$ D8 E ~5 L& u
*addr = ~cnt;
! }& r. m; j9 |
}
9 L N$ J+ R1 m6 U
6 V/ q" a' }7 m& R
addr = base;
& z1 ~! \- x+ y
sync ();
: Z* W1 k% w& `1 i/ n! c0 T5 f
save
= *addr;
& N0 I- A0 s. h7 F
sync ();
" e) S$ H$ H$ P* s
*addr = 0;
7 H3 e& h1 S( g
) } r4 k) Y0 H% H
sync ();
/ b/ F. i% l" ~+ j- R2 F
if ((val = *addr) != 0) {
' j) ~( T! c3 W1 a; g1 f
/* Restore the original data before leaving the function.
) a6 N$ S3 V: `& ^
*/
- |. ~4 S; r) h8 R% T4 Q
sync ();
' e2 K; o' h0 e
*addr = save
;
! [) X! z* s, e0 a4 f8 W
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
: L) t2 [ b& \4 e( O1 y
addr = base + cnt;
' l/ v. I, V" y( I* g' s
sync ();
' R5 r( J2 f! O
*addr = save[--i];
8 @6 d. M4 K: {7 C1 V
}
. o3 U; }/ c. d; z: l3 P
return (0);
4 o; l3 n% Z. m0 I6 i
}
' f* u2 I/ t0 }/ Q
5 \# ?6 d, V; y! }& a# U
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
4 W" I6 P+ R* d
addr = base + cnt; /* pointer arith! */
+ K; t" S7 l8 E. M3 H9 o/ W5 D' T7 v
val = *addr;
1 W1 _ E) |4 k/ h
*addr = save[--i];
# j1 g( q: W3 v/ X
if (val != ~cnt) {
% D7 J% d* N& V: j$ F
size = cnt * sizeof (long);
2 A- G$ m! L& F- F/ d$ {7 b, I
/* Restore the original data before leaving the function.
) w( G( a# J6 G
*/
! u4 ~# G' @! O5 z- {1 O( T5 m
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
8 T, a ]) Z; p0 b$ N8 q; H- `5 k& u {
addr = base + cnt;
m" y2 {# o _6 j3 o! o
*addr = save[--i];
* ?( F) }8 j4 `
}
, o% n6 `7 O4 }% g. _' c6 i* x0 a& z
return (size);
2 q: s2 O& @2 n; m/ w
}
( L R }3 z% j+ C5 j. i+ u
}
2 i( B J3 y ` t- F8 I! e+ j
9 U. m( e- I3 c) k3 }% I- |
return (maxsize);
* W* r% d# U' v. H' F5 F
}
4 I3 L% s/ p% I0 ]" g! q# D
int dram_init(void)
8 h+ k# C6 B9 h4 P, X
{
: ?+ _3 I% U& l+ F1 i4 Q
/* dram_init must store complete ramsize in gd->ram_size */
% ~ f6 F6 U0 ]
gd->ram_size = get_ram_size(
) \! U1 j6 i; F( L( H' l
(void *)CONFIG_SYS_SDRAM_BASE,
3 b% b7 C: @6 j, s$ N/ u1 Q
CONFIG_MAX_RAM_BANK_SIZE);
" n* d [6 V/ V- m9 u! M' R
return 0;
K( D( ^$ r! R! C" E9 C& I
}
, i; `2 z; D# P: P
: u, }+ N" j& k* M+ T' I! c4 ?( s
+ J4 s& t1 e, s" ^7 j
# l, z$ h7 h* O/ d2 {( c2 q
. j2 s* h6 T2 N/ j" j. f
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
; P8 o( P- r% s. E4 ^
) v7 j" C. }. `& v( y( z) ]4 L
! W# N+ t1 o6 L5 p+ @
. d/ ] V: D: [0 q/ \
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4