嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
6 [; Z4 q) x4 n3 P( r" P' w# f
核心板2:DDR2 256M Byte NAND FLASH 8G bit
3 i7 o- z# J" Z7 m$ u# Q3 P5 O
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
S; G1 c o" j# t* }5 ~$ ~* _
: u1 e; u& v: ]- l+ I
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
) @8 G: ~& C6 G, k+ ?
t' D; K! t& T* _7 F" ]
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
3 P' x9 _4 E+ H6 D# s/ H1 X
/*
5 ~# {2 j. d; ?: @5 c: S/ e/ }; k3 t
* Check memory range for valid RAM. A simple memory test determines
+ Y; ]7 f' k# G
* the actually available RAM size between addresses `base' and
. j3 z; {' I9 _' |/ r
* `base + maxsize'.
3 l7 d( e( Y. Z4 a
*/
* ~/ M# W; d$ x: v' M/ p: Q! B5 L
long get_ram_size(long *base, long maxsize)
, V, r8 n; t( V7 a
{
+ u) T6 N K3 y( ]: E
volatile long *addr;
+ D U- t4 e/ S/ L
long save[32];
; p! }# f$ c6 b6 j0 L1 |- q/ b
long cnt;
- w/ R6 a- j0 ?- C3 Q8 W
long val;
: _3 s( s, R0 _" r, `) K
long size;
. U( M9 b3 t' F& h8 s1 p- s1 T
int i = 0;
3 r4 B: F6 i( X: Z% T
3 ~* G( Z" I9 R
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
" {$ \4 _- z6 M7 n- V. N# r% O; n
addr = base + cnt; /* pointer arith! */
+ g6 I* w( C, b1 p
sync ();
, P% e D: t% h) E* Z) ]6 j& k
save[i++] = *addr;
9 U7 `" u4 S! r& D1 Y& r- B2 B
sync ();
3 ]' b; }- U0 @7 L5 S( f& u
*addr = ~cnt;
% C* L- M V( a9 n* V
}
1 ?. r" f) Z/ o0 m' |
3 `0 U- Y8 Y2 u3 k
addr = base;
% ^$ K, V0 m8 b$ C8 c( M) y6 u- D
sync ();
: Q/ t) N8 H6 i$ m. h/ }! S
save
= *addr;
' L( ], ^- t6 z: _5 p" L, m9 }' q
sync ();
8 T" F5 p( u3 @5 K9 l( }
*addr = 0;
1 d6 S# @' o4 F3 z% e
2 d3 x9 x- e/ q0 V* t4 C
sync ();
( C' |% ^: x9 k- }" ]9 x+ d
if ((val = *addr) != 0) {
# i: p- V) D( S b+ V. y
/* Restore the original data before leaving the function.
( K5 C2 {/ }) `* Z4 |
*/
- x$ B( y( l. v9 K, M2 l! o
sync ();
* ]8 b/ ~/ l& H) r) F8 l5 y" E
*addr = save
;
- h! f$ Z4 c& I
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
' v3 I |- l+ b5 B7 q
addr = base + cnt;
- l. w, m" Y0 [$ U+ E6 v3 x
sync ();
# f* d; A4 F; w4 ]8 B) m: \
*addr = save[--i];
/ `: j$ x B4 B2 ]$ B" `" u
}
" v0 s! o3 ^3 m& {( }
return (0);
$ c* m, A2 o# s
}
$ B( `! e4 k& @- y0 h
4 Z/ f! ]4 `" w9 X; o/ I. a. u
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
3 A) W& m% M/ X1 f% N* B" B
addr = base + cnt; /* pointer arith! */
0 }: A- U. C8 f" \) h4 W# ^* l
val = *addr;
! H( n& s1 b% P) Z6 f1 @3 h
*addr = save[--i];
, d7 \ S% k' `
if (val != ~cnt) {
( ^ y* j. u. p& ] v/ S+ b5 A* c
size = cnt * sizeof (long);
. w; w$ [7 X5 I/ M# U! V
/* Restore the original data before leaving the function.
" V6 R& R: z) x8 s \
*/
L: V9 |- b4 ^3 E8 K* d- s7 v
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
6 G% `; r* J3 a
addr = base + cnt;
6 V# l$ a; a; b) J! ]
*addr = save[--i];
0 d" w9 L. ~7 M' [. u
}
. m3 U$ ?9 i* A
return (size);
0 E4 B( c2 c/ Y9 C: P2 n. F9 l
}
. h1 M/ N0 [2 M! p* a
}
9 j8 H3 r. u1 ]1 I- D
$ ^; P) C% Z- H8 o) R
return (maxsize);
2 w1 m$ v3 n" f4 g8 I2 j
}
v! W' z( {) l% G. N! T+ f$ j+ d5 x5 [! _
int dram_init(void)
& R* {# o5 H9 P+ i2 Y
{
4 J5 O- `- a7 J0 l
/* dram_init must store complete ramsize in gd->ram_size */
2 e, z' u7 K* X# s1 P
gd->ram_size = get_ram_size(
) J& C$ N9 H; O4 X+ s+ U0 S2 Y
(void *)CONFIG_SYS_SDRAM_BASE,
# U( g1 t8 m9 ~$ W' `; Z" p& T6 @
CONFIG_MAX_RAM_BANK_SIZE);
4 W* b- Q+ K' u3 m
return 0;
! T. V8 y6 J; b2 R
}
* \, p3 T, E) ~+ G9 b6 W; x) z
, X# k6 i0 |% s8 x( m( e
5 S- r% s7 R. i9 F
2 Y: d" G/ r' C8 ?
/ Y, ~2 _9 Z( z: L* y
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
% z+ U6 W; ~8 B4 t: h/ _- m' ~
: N: i' H6 n0 v* }
( B. L6 ~- ? h6 s' [8 _
T, _ B3 M+ ^" |
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4