嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
: Q) E4 O) ]( k2 P& Q7 D( m. Q
核心板2:DDR2 256M Byte NAND FLASH 8G bit
1 z, n( E' l, Q
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
" ]8 N6 V) V, ]* y+ j
3 I0 \$ e* x0 |, \% [' [5 g4 R
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
b) C4 E% T8 Q7 \& f$ Q. ?4 s, J
5 T* {- G7 T. B! v% Q% r- Z
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
: U* i1 _! |0 p
/*
& S, X* f2 H/ k" H& U8 ` ~ C
* Check memory range for valid RAM. A simple memory test determines
# b( u: ?' T0 T- t+ T E
* the actually available RAM size between addresses `base' and
3 W0 x8 q3 V7 v. H7 q" E7 z- t
* `base + maxsize'.
J% u/ w u/ Q9 O, ?! g6 v
*/
, w2 |( ]6 U! H
long get_ram_size(long *base, long maxsize)
( G' q( g, J( `% I, o- t( Q
{
# f: G! V3 Z3 W8 \7 A. f/ L D
volatile long *addr;
" q1 S2 r7 T, v- I3 g# D' t6 E1 L8 g! G
long save[32];
+ {6 }( [2 J1 ^+ E& B! ^6 P0 E
long cnt;
! ~7 m- o' x$ M( I5 O
long val;
1 ?$ E$ D* M7 G/ }4 ?, m& |, C
long size;
3 P7 z/ x, X- l- v9 C7 Z6 o( o% g
int i = 0;
' u8 b+ Z/ ?1 F8 J S
C$ g+ l$ J- z+ v X/ U
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
- f+ P" G3 C2 a9 @0 s
addr = base + cnt; /* pointer arith! */
$ t9 Z" ]1 v. Q1 S
sync ();
5 B9 C8 L4 b F( j0 a7 N* a, H
save[i++] = *addr;
% {5 y! R, D4 [, i) {0 S& ]$ U! T
sync ();
/ u, e* C7 J, X3 c6 N+ t/ h
*addr = ~cnt;
1 m- C: P8 h: S; M
}
1 r/ ]8 `# Z% y) c. I
7 C: N) j/ Q% y: X3 @
addr = base;
, P7 N7 W" L7 N9 m i; B
sync ();
+ ~0 h' {% A/ h- | n$ z! X4 G6 ?) j
save
= *addr;
% z; f p( n# Z6 |$ b# V+ }
sync ();
/ k& h. \* F5 @) L; F9 a8 C* h! x4 J
*addr = 0;
1 ^, B2 D0 O3 N* m' l t
; ~# I1 P5 B( m$ Y L( B+ {, c
sync ();
# X4 f0 M. x4 b$ B5 \
if ((val = *addr) != 0) {
# [ ]1 b L( d/ ?4 q0 I( E; T, L
/* Restore the original data before leaving the function.
" `% p- f- e7 d0 M( R' l# o- u/ L
*/
. J, }/ c. C( B+ G; j
sync ();
* N% p( ]0 Z0 Q4 I7 h* d
*addr = save
;
3 ]4 i4 j. n. }1 U
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
) N3 H- \0 Z/ t# z! w5 B- C q: ?6 @
addr = base + cnt;
' }5 x& i/ t# [( F: P t) [2 V2 G
sync ();
0 s& M+ L8 g# t, R7 o" C
*addr = save[--i];
2 u. q- n& ]6 y6 r
}
: I: [6 t: `- p5 I' C
return (0);
8 N/ ^0 J E G% H* F* B
}
9 x8 E3 O5 D5 L4 J
8 t9 z/ g0 n' \: l
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
, R$ h" N5 c; W% f9 P
addr = base + cnt; /* pointer arith! */
3 T3 |$ J5 U k/ ~* L. O3 _3 Q
val = *addr;
! H5 j8 C* W$ |7 J8 } z
*addr = save[--i];
* A" y( @- ?! p: {
if (val != ~cnt) {
& L0 R' E% |! g" P. H5 l
size = cnt * sizeof (long);
8 X0 G' }/ O) J0 ?* \7 p
/* Restore the original data before leaving the function.
3 P/ h; j/ \- p4 z' P6 f3 f$ d
*/
( M) O7 V [3 y4 F+ `2 \! [+ i
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
7 D( U$ Y* `0 E% F
addr = base + cnt;
0 v* y+ W [2 r- a7 j
*addr = save[--i];
4 N c$ ~( [1 `7 u7 q( Y
}
S, |! X; \" u2 p5 D! P
return (size);
9 p0 U+ l( k9 |# Z# [
}
7 r! x9 @1 g$ K* g; ?
}
1 z( d% k8 i! s0 z T! c: {
3 V6 J( f' \# Z$ [ D, r
return (maxsize);
& T I4 a0 Q' I6 x9 }7 L- ]5 p( I
}
" j* F% {) |5 r9 }4 y
int dram_init(void)
! o" O; f6 Q$ N2 }" B
{
5 a. d0 o0 q. T9 i2 ? [, q" P X( ]
/* dram_init must store complete ramsize in gd->ram_size */
, n+ F+ @- j& v. A v1 O+ D( A
gd->ram_size = get_ram_size(
( g! m: G, x# b) ?
(void *)CONFIG_SYS_SDRAM_BASE,
) q4 U; A0 `/ w0 j, y- s8 x
CONFIG_MAX_RAM_BANK_SIZE);
`0 w7 W+ h5 S' f' T. Q: `
return 0;
' @7 b" T5 g' t$ j
}
5 ?' r/ M `* F2 n" c
7 y8 g7 _( F, ~( G: b
9 r `, G3 t3 s* }. Z- o) j* F
5 A3 z$ F3 H6 @+ A6 |1 Q
4 E+ [9 a1 \9 ?/ j
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
) I6 k$ z2 T" V! c: Q3 i
, w" @6 D: v1 F: p/ d0 C' H# {
+ O- Q) n* T+ o5 s! Z
`8 @" B9 J1 Z* E9 x) h
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4