嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
2 ?7 v# q" W3 \0 [3 ]! \
核心板2:DDR2 256M Byte NAND FLASH 8G bit
i J, B8 t/ y0 k
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
: N& {% U! c) p0 x) Z% k
! W4 V6 _6 O; X$ M; d
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
3 m) ~" n% X% r
1 t, z4 \7 d5 P" \ m
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
& j* I3 W4 b- @7 m
/*
7 B/ }5 y2 W. y5 W. e/ x* \
* Check memory range for valid RAM. A simple memory test determines
% ]; m3 `, Y. @& D! G4 u4 T+ t
* the actually available RAM size between addresses `base' and
! i0 R4 ?. l+ [ ]6 \
* `base + maxsize'.
* V+ w( A/ t: A! R' P
*/
) N( }7 B9 y$ C2 Y
long get_ram_size(long *base, long maxsize)
9 G) n3 ]+ `/ a8 m9 g2 J$ z+ b
{
) ? ?2 C s6 g7 d w
volatile long *addr;
* V% C* x* P1 X
long save[32];
; T% B% v" v5 a
long cnt;
) V9 a/ s+ ]- n% G x9 A: g
long val;
" ^( U; `6 r. u2 c4 Q- n, Z: |
long size;
7 S& ~5 Z% y0 v
int i = 0;
2 K1 z, z4 `& R% v7 W1 u0 f" [; T+ l' h
1 U7 L9 }8 m8 u c0 g: c- S9 r
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
h' ]. K0 X7 d; C: o7 L
addr = base + cnt; /* pointer arith! */
7 {. z; i1 H* ?$ A8 N1 \& d
sync ();
( w- \8 K/ \& ]
save[i++] = *addr;
# f5 V; l7 O8 s% g* f( H
sync ();
/ `. u% e3 b3 ~. G" f" V3 K
*addr = ~cnt;
6 l% t# S/ Q8 P$ p- Y* J9 E6 v8 \/ R
}
1 k+ `+ E# P- u& y6 t4 ~5 p- X
, g, H! {8 H$ D& K& Z
addr = base;
( U4 L3 I9 r0 t
sync ();
8 Y- d% J/ F9 e' E! D
save
= *addr;
$ j; D3 K. o7 }: Z; r* N% d% y
sync ();
$ S; } ]4 m# |7 A" w
*addr = 0;
, A0 G' }% O, U5 S' ]7 k4 Y o! ]8 z
$ b b) [8 s( b1 U9 {; f9 [% `7 _0 Q
sync ();
8 w4 }) T9 P5 d- E& z9 H
if ((val = *addr) != 0) {
( j7 L' ?5 e2 x3 P* }! Z7 u
/* Restore the original data before leaving the function.
3 u7 o. Y1 S- ?0 `
*/
" a. @' h! {& y' B, Q& ~
sync ();
3 Y7 A9 q8 t, {/ ]8 G
*addr = save
;
5 j$ ]' ~4 A |1 C
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
2 N6 @( i% t5 F6 w9 ~8 C, L
addr = base + cnt;
$ T1 g0 O$ B9 A F8 _
sync ();
1 E( Y0 b! P0 t9 U* l
*addr = save[--i];
/ I. w* T" n8 ~) L1 B0 c: _
}
; R' [4 Q: }& ~! V( f8 @) G( w4 l5 L
return (0);
5 x7 [$ j7 v( Q3 B, [ }' ~6 K, p
}
$ {: `; V9 V d. o" }
: \$ X& k0 g& Y u6 H# |/ a
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
% o; X w" @+ s. T
addr = base + cnt; /* pointer arith! */
# B. v; P# h+ H( J& H
val = *addr;
$ F( S- P- N5 p0 t- p2 J
*addr = save[--i];
9 ?& ^2 V" c3 F0 |
if (val != ~cnt) {
7 i: ~5 l& _: a( g/ v
size = cnt * sizeof (long);
4 T$ `8 C. m# E
/* Restore the original data before leaving the function.
) P6 D: @# U# R
*/
- E; M& }: R. ^* g
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
& a2 v/ [; k7 `
addr = base + cnt;
6 J% |- ]; A% e0 U7 L
*addr = save[--i];
/ S' x9 a- v8 m" f3 C
}
; T& x F1 k$ k/ i/ {& ]; M0 O5 h8 L
return (size);
; ~ M/ y3 A; O1 |) l* J
}
+ b+ \ v* m2 z! r5 Q- I$ a" _+ O
}
* ` \$ H; v: E o1 G$ D
+ ^& K' ?3 y" k# ?+ v" X S
return (maxsize);
- J& U, L0 R( @- h e
}
; r; X/ C# y+ ~- r0 i% l! Z) s
int dram_init(void)
6 X% M" n9 [) @" }* s
{
# T1 R( x5 J* J3 m/ f* k% i. ~+ m
/* dram_init must store complete ramsize in gd->ram_size */
4 X; l" ?0 _. B- p
gd->ram_size = get_ram_size(
8 g- d" N8 v, }: C; I) ]' i. T
(void *)CONFIG_SYS_SDRAM_BASE,
. j6 u& P, u. L, D
CONFIG_MAX_RAM_BANK_SIZE);
3 [: `$ @. S5 l7 T% K
return 0;
( o# B# |9 p$ F# \
}
9 u) H- v) ^& y# q% ^: |( k5 D n
, c& { y* C6 T+ S
4 }, W2 T7 z" V/ G
/ [- E3 T7 i) p% y
8 N5 p0 `0 U) O/ C
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
8 b9 ^# s. g @6 [' g- a
: M& ?+ L& G! S: l
6 I2 V; x9 u, m4 y5 ?
5 r1 [5 y0 p8 r8 r6 R
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4