嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
5 I$ ]2 y1 U- N% A4 @
核心板2:DDR2 256M Byte NAND FLASH 8G bit
+ j+ ]" }0 S: U* c% {5 q3 E9 }
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
# C- U3 z* s( j0 q, L/ b
" N: j0 k" j a+ Z
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
( }( g/ t( v+ D } J# Q7 t
+ o7 _+ ]( R* _5 E; b F
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
1 z( a+ P" j/ [4 M& ~
/*
" k& W8 e$ v- i M; G9 }1 U
* Check memory range for valid RAM. A simple memory test determines
* p# L' ]5 e. ]( e! \8 k0 F
* the actually available RAM size between addresses `base' and
7 ^9 g2 f4 o9 @/ K1 S
* `base + maxsize'.
- R1 h4 m$ Q! I# e8 n8 r( J5 Q
*/
$ [- ?) p8 w& C$ Q9 R# d% b! |0 L
long get_ram_size(long *base, long maxsize)
- r$ p0 H& f% f) U, {
{
3 a' L& }' P" B9 [ y+ p
volatile long *addr;
+ `9 T: ^( m) n- Z+ L3 S
long save[32];
9 x3 @; _ c1 a$ K
long cnt;
$ B- f5 M/ ?' E" y0 b' I5 R* l+ a
long val;
( w. E& {/ ?, \) g# e* W
long size;
* x( e7 v! R' n* Q) N2 X4 o. d' s' o
int i = 0;
1 h0 H. s8 |; ]. {) j
^' \6 Q' f0 X( o
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
: R$ a a; k: b* `, W
addr = base + cnt; /* pointer arith! */
# B" L( L" ~9 W2 H8 k+ S
sync ();
) p: C p* o% ^; e; L8 z) K" f
save[i++] = *addr;
: R4 w- `2 R' @9 w/ l
sync ();
+ w; V" R- n i4 J% s
*addr = ~cnt;
" U x% A0 n, x0 O
}
9 p( K9 m0 K( s" I
& A1 j6 I7 u; @6 r
addr = base;
/ V$ {; z1 @7 S$ ^
sync ();
* ]3 A. N; G3 r- @
save
= *addr;
$ _$ W% j# v3 }' p
sync ();
% u& D5 o8 w j4 l& G
*addr = 0;
( i6 Q$ {! O) p$ \
5 r3 t D; ^8 _6 o3 x, G
sync ();
6 m: I7 D! u# R. }5 V3 [4 |. o
if ((val = *addr) != 0) {
9 m1 p0 ]9 b$ T5 {1 p' |
/* Restore the original data before leaving the function.
( e: f% Y+ p! ~/ O0 X) [
*/
. e& N+ y# `, H7 v
sync ();
$ v. D7 v: J* u6 C5 L( j" S/ h
*addr = save
;
4 x7 t; o4 m: q# u( x" @: F* l. O
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
5 ]8 R- e u' v9 i6 N8 Y: n3 U' {
addr = base + cnt;
" m/ M: w: ~+ {, J' b0 i2 Y: Z7 W8 U
sync ();
9 t3 e" ~6 N7 _
*addr = save[--i];
5 {- ?+ J9 I0 D( d0 q* n
}
. p) g& q5 @9 H4 {# B8 ]2 s! R
return (0);
/ ^) k# o' |. g
}
( s1 m/ Q6 v- @3 v: {2 J
, S. M% \$ Q9 t$ d
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
% D3 W1 M( a2 j. Y" S! U
addr = base + cnt; /* pointer arith! */
/ ]% f4 i/ _. o7 O+ V
val = *addr;
3 T' k7 A" u' M* `7 @
*addr = save[--i];
4 W* B: r5 I) o' p. n' _
if (val != ~cnt) {
5 E( B/ X L* p1 M$ ] m5 D
size = cnt * sizeof (long);
5 |& a3 w/ j- V% ~% R/ B
/* Restore the original data before leaving the function.
: ?# p) L. V: {( H9 R7 D9 y+ q! @
*/
# E( h. w: k& w( U4 C
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
% u- n+ \. R+ S$ i" |6 c. x
addr = base + cnt;
8 c2 O# D5 t. l r. D9 ]5 R! t
*addr = save[--i];
) S3 l$ u ~ k) I5 p0 V
}
0 z: [ k/ Q! y' T$ F& l
return (size);
|. A2 Z/ }9 g) h, J! ]' O& h1 ^
}
h3 J! R" s( W' a4 A; W# K
}
4 M8 Y, I3 Y5 h
& _& H5 A; c0 l9 D! K7 W
return (maxsize);
' M1 I( z( [2 h+ q ^
}
- [! [& S2 `. I0 e+ t
int dram_init(void)
" m. w7 h7 |5 C( j. D
{
; v1 W6 X6 {3 g) y6 W
/* dram_init must store complete ramsize in gd->ram_size */
: E) X6 u9 d8 E6 r
gd->ram_size = get_ram_size(
" k5 Z3 Y# f! A
(void *)CONFIG_SYS_SDRAM_BASE,
8 j7 v; v+ K* e* `' Y" ^; U
CONFIG_MAX_RAM_BANK_SIZE);
8 @: O+ B z% i, m$ ?1 r/ i
return 0;
* R. Z3 W; c8 Y4 s; O# X
}
. E, G2 L4 _; p8 G8 G; O
- } A1 j4 p$ a, H x; Z
( r, S5 K: [# ?$ D/ T3 @9 I- \0 ?
3 ^) U a$ {9 b4 S6 v2 m* d
) b( K& R4 H( o0 H
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
% Y- }& ~# c8 I/ R7 V' s
& u" H7 z3 z- Q
1 y5 q$ Q T( }- S5 ^, s' d
* l: h) H" E6 A3 R3 q0 V
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4