嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
3 J& Z8 T) r' F2 o% }/ w
核心板2:DDR2 256M Byte NAND FLASH 8G bit
7 C* Q$ n2 J I2 w
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
- E' o8 I4 ~) `7 Z9 ]1 y
1 g& Q5 S6 H# W
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
% o8 s; Y$ u: S! I: w. T
) l7 X0 H6 j( I8 \7 x3 E" Q
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
* Y" I8 a1 ?: h
/*
. C+ d/ B; F: F' u
* Check memory range for valid RAM. A simple memory test determines
; q: y# R4 X c5 x, |2 @+ b
* the actually available RAM size between addresses `base' and
" |; W1 ?! S6 Y' M. [. F
* `base + maxsize'.
! W$ c3 E6 J1 g0 y4 K) M3 Z; j
*/
- J8 d9 t0 W, i/ a2 G- ~
long get_ram_size(long *base, long maxsize)
: e8 _0 Y, y# u1 x' B- [
{
- G3 E$ z. E4 ?' }, g
volatile long *addr;
* A9 [2 c/ f5 v' }) s; v0 P9 y) B% x
long save[32];
+ u$ B# C% W8 z. Y( @$ U; r* ]$ i8 c
long cnt;
- c& M4 H/ v& ]1 y' L+ P B
long val;
4 t! u+ I0 | J8 X- _4 Y& x
long size;
$ Q9 H+ m3 |2 h9 ^0 ?9 G4 [. K
int i = 0;
$ }' g" a1 R$ ]3 d
3 E1 }) w9 V8 Y( S& k+ q- E
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
* A$ d% t' ^: J0 z$ D
addr = base + cnt; /* pointer arith! */
( ]# c4 ^4 W6 m: j6 j9 D
sync ();
3 A5 v/ |' t: q) ~7 ]$ V; h
save[i++] = *addr;
# [' ?( s* J# l, S
sync ();
- {& x* v2 t) _, o
*addr = ~cnt;
4 k) l5 N, [$ Q E
}
" Q/ M' _) G0 F- `, X- i" k
* `, O% Y, S( t) j$ i
addr = base;
2 T" D$ t5 w9 b: F: C5 _5 Q" y
sync ();
I: u" ?! N; u. Q( E- \
save
= *addr;
( y' @1 m; B/ v# v( o& q+ ?* c
sync ();
" t6 l7 L, ~6 L
*addr = 0;
& V" l) {% z. O7 Y( h
: l# u* O& q7 d3 \6 f1 M
sync ();
, b0 G% t* i% w! X4 | p( t
if ((val = *addr) != 0) {
, \/ u2 ^: u% S( p: m$ ^0 L8 n
/* Restore the original data before leaving the function.
/ s e6 _& L0 z @1 T) c
*/
2 |1 a$ D" g/ r. g- D$ F8 ]# |& o
sync ();
3 d6 Y t( v; k
*addr = save
;
: k4 r4 x5 ]1 t+ _
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
' a$ ]( t8 M( q* z
addr = base + cnt;
0 [3 A- A2 ^7 N# x. W7 L
sync ();
% N8 R3 a* i* p" L1 w& f# e
*addr = save[--i];
3 C2 v2 X7 e* r# a u5 x
}
* s' z: T' E* I* o& F3 z! c D
return (0);
* G/ C8 Q1 |# u4 G, N1 z
}
8 I& w m+ r" L6 }3 F: i" B
; n L* x+ y }* b+ N5 V
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
; T: O: Y5 K# g/ ~# e
addr = base + cnt; /* pointer arith! */
: B8 a- F7 a) K
val = *addr;
4 k2 p1 H6 i- P& [
*addr = save[--i];
1 Q* a, _! y6 z
if (val != ~cnt) {
8 N4 d" ?& ]8 x' ~5 o$ D
size = cnt * sizeof (long);
$ s4 Q8 ^# }0 s& A
/* Restore the original data before leaving the function.
& A; y% M' H# z. k j
*/
6 `' J4 O- b- e- Q+ o
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
/ w- n! L' _+ o# E6 ^+ @
addr = base + cnt;
- _6 ^# P( A8 l5 _6 J. ]" n6 D2 Q8 b
*addr = save[--i];
! y8 R; ?# \$ N
}
* u1 N! z" b/ g* e
return (size);
3 j5 d* Z ^ R9 s
}
. {4 _) j a; z( _' i
}
: Z" u2 e8 U! u: S3 u6 [
0 i" y" e4 J2 G6 c3 y$ z
return (maxsize);
4 v# Y8 b( Q; y' l
}
* `8 J- ]2 G7 N' f
int dram_init(void)
4 ?: | G* o9 P9 G3 s# l
{
: G3 V; \0 r- G" k2 f
/* dram_init must store complete ramsize in gd->ram_size */
* ?% a7 y: L% I1 X4 i
gd->ram_size = get_ram_size(
" y& R' I% h1 N
(void *)CONFIG_SYS_SDRAM_BASE,
0 F+ l! e1 c" j1 A7 \( G- x
CONFIG_MAX_RAM_BANK_SIZE);
' |, x+ z6 x e G+ ~. [/ c
return 0;
6 D& ?* j8 Q7 g( H/ r
}
3 R1 N' Q8 F) q. G# S0 ~8 y; N
; {( b2 m3 }4 Z7 z3 [
5 A" ?! d" R8 [6 f# F: }
) O3 ?3 d a6 n0 \
! @2 \* A5 y) q: [; z8 s
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
( J9 t4 X P3 v8 A& F; ]( Y
! h% u3 U$ V2 q+ g$ I1 z
* s \1 c; j5 A& O
9 b$ d& f# B! X, |; a
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4