嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
: }, l" c3 Q0 f' u3 r
核心板2:DDR2 256M Byte NAND FLASH 8G bit
- S- v) r) }+ }5 c/ W9 m
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
# e1 @! N/ L% J1 @2 [" g9 H3 T! p
( S# W% L8 z1 Q/ @! l( _
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
1 ]6 Y+ w% M- D
R7 B( @4 D4 ?! \& g# J! K; g
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
0 L7 U) \2 f# ~9 X9 ^) G
/*
) |) V) R1 j' ], x G8 D, f1 ?
* Check memory range for valid RAM. A simple memory test determines
& i! c) I/ o8 p
* the actually available RAM size between addresses `base' and
# j1 E3 V* }% K: G5 _
* `base + maxsize'.
$ S4 D: g& Q$ _5 W% @8 ^5 J: {
*/
5 s8 ^* r8 k2 B# U
long get_ram_size(long *base, long maxsize)
, h9 f& f9 v8 c: V, l- _ ]0 H. ^
{
, j# {) Y: l1 W- A2 ?& g- p' [
volatile long *addr;
w4 j: l( D. o! o/ \
long save[32];
+ m. j a" q% {; L5 o
long cnt;
5 t& z% [' b, Y ]
long val;
- \4 x! w+ V) y7 p- [" e Z+ [
long size;
* l; D2 g6 z) H# X' J ^; V+ @) K
int i = 0;
6 k8 \6 ~# | S7 w6 H
& r) y& r# j2 a. k0 n6 U
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
a5 b3 ^' X9 j& l7 p' V H$ j& C2 F) S
addr = base + cnt; /* pointer arith! */
; Z: s" M5 d4 e* F( D# Q; l
sync ();
% H! j4 ]: @- E
save[i++] = *addr;
* Y1 j; v G! D$ k- @
sync ();
2 z( ^* g4 }+ i5 M" J
*addr = ~cnt;
* p j2 O. u, H& f
}
, {$ o. K* H, m$ h' K7 `
' R! `7 I. r- i
addr = base;
6 \3 _, f, V# T' w: o7 f
sync ();
& x( Q9 i6 I( X0 u
save
= *addr;
8 Z8 v9 c; c6 d S
sync ();
' Y8 d5 h+ T3 J7 B
*addr = 0;
6 w: H$ H. H% ?6 \4 Y! c, [+ d {
8 d; x' A. p+ n* t+ M
sync ();
2 N1 S+ w- @- ^ m$ n, J
if ((val = *addr) != 0) {
$ Z$ a; T& ?. @ c$ ]
/* Restore the original data before leaving the function.
3 a' j2 ^) y" E8 c
*/
# E c( O- T, L7 G: w
sync ();
6 z, ]2 E* j3 t, O* S
*addr = save
;
8 ~9 r) ]& h2 Z8 B; H
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
# J/ ~' C* @8 v: j0 I
addr = base + cnt;
8 |0 b. P9 B# v* Q6 t. f" x
sync ();
" W, k* x3 g1 |- m x
*addr = save[--i];
7 v1 I$ q6 y& M3 p0 M8 `4 S
}
: ?% H- {/ U: u4 x
return (0);
0 F- F- M) L) G U5 w
}
# J f1 a9 H4 q; A7 d" m
* B4 ^9 H& O" l, C( a) Z5 N$ A
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
: l P# B0 O f
addr = base + cnt; /* pointer arith! */
- w6 z) O2 |: K) l2 }: U7 M' ]; E
val = *addr;
$ f! j! ~) L' E% l5 n' b3 B0 t+ B& O5 a
*addr = save[--i];
+ {& Q! h2 G4 `' a: h
if (val != ~cnt) {
* Z5 i! X0 X9 P0 G8 a+ Y
size = cnt * sizeof (long);
1 e2 X! U6 n. ~' c3 C2 P1 U& i
/* Restore the original data before leaving the function.
# o) n6 w+ x6 C2 h
*/
1 v+ u* A0 T9 c0 y8 V1 _1 g
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
# i, H4 m- Y# c0 {
addr = base + cnt;
- b2 ~% z. p! Y- i
*addr = save[--i];
2 n: ~+ ?+ Y+ }0 Z
}
: g7 W2 {/ i& i: j5 s7 G( n% q
return (size);
4 W! @; U. Q! y: E* q5 q
}
) h5 M5 q2 C) j* i/ I
}
! |% k( @* { U: Y8 J; R8 m
1 S- E1 k( ], K5 N" P
return (maxsize);
4 I2 e2 w6 v( _ T1 p# X/ a4 x
}
) h/ [. B" _$ h/ u
int dram_init(void)
, T& ~# d) G+ ]0 w+ x. M* T
{
% x0 m3 {7 K' O' ?
/* dram_init must store complete ramsize in gd->ram_size */
- |! B5 f: H @
gd->ram_size = get_ram_size(
+ j8 x& n. O( }3 \7 T3 u. R9 f( k
(void *)CONFIG_SYS_SDRAM_BASE,
6 m0 |" E3 K' G7 K- a9 ~
CONFIG_MAX_RAM_BANK_SIZE);
R* \6 V: h9 s4 X
return 0;
9 K% @& B! k$ k" t' n
}
4 @2 C' ~7 f& D+ V0 k
+ T3 Q7 {! v0 h/ N, M: r% V
* d7 x5 u" t9 K' A; U
% v+ }9 m3 U5 g0 q2 E% h' N8 B
) t. f1 M. N3 s0 x
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
6 i% `& u, g7 n0 _
8 n/ M* H4 { u6 G. z. m8 F: f
# D5 Q6 P" g. c* ]8 n! o
6 ]$ D# k/ v! H2 D, \$ j2 \! H0 r
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4