嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
) k# [; ^7 N# g2 b# ]
核心板2:DDR2 256M Byte NAND FLASH 8G bit
' E+ x! ^. h8 Y9 X4 @5 D
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
* n3 N. V7 T$ y% z7 L* Q
2 ~% z7 r8 y6 Q% |. H
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
- _2 g& g3 H6 q8 V, `
\7 g. W# f4 s. F7 ]4 Q0 @3 [
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
& k: d; g" j1 V' i
/*
+ x" C9 B* Z0 r. A% l/ _: W% v& r
* Check memory range for valid RAM. A simple memory test determines
; I. E4 H1 y. R" x5 e
* the actually available RAM size between addresses `base' and
4 s9 i6 s6 i8 e, o- ~: g5 [4 V4 m
* `base + maxsize'.
9 a$ P: a7 ~% Q, [8 o( F9 t
*/
9 s/ u3 z+ E( P
long get_ram_size(long *base, long maxsize)
# [: ]$ [) o. M
{
' @% q) w3 p; `2 f
volatile long *addr;
3 L6 M0 D/ ^" E% c
long save[32];
) _# N) V3 k8 `# g3 ]
long cnt;
& w1 }2 c+ t! \% M9 L2 T7 j" `
long val;
) _3 ]% D: ?: f0 b5 r
long size;
1 W) ?: O" l( l
int i = 0;
# I" t/ [2 F0 j+ S* a# t
1 \4 M5 z; F' {' r+ ]2 d
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
2 z: w) [, I4 x$ b; J
addr = base + cnt; /* pointer arith! */
7 `8 y* r* {+ _) o
sync ();
3 B2 C c- r/ C( [" Z( l4 g& v: k
save[i++] = *addr;
; `8 o5 L a5 f$ n6 M. s# ~" Z
sync ();
+ i1 b/ I. a; S, {9 z
*addr = ~cnt;
/ M! t8 L9 o. J9 z4 B; \: G
}
4 B. t$ G: P; ?
, T; R9 p& s. y. \( m
addr = base;
" |$ i3 U9 h0 |
sync ();
1 q2 N# a( E) g/ s) D% O8 g
save
= *addr;
. r6 f3 {; j9 l& m
sync ();
& q6 ^2 Y1 b$ w3 i* J; M/ F
*addr = 0;
1 Y, B/ D1 I! M. S7 u* e7 R
" F" L2 q P5 s3 D
sync ();
# o* M9 g) ?6 \( A% Q2 T
if ((val = *addr) != 0) {
, h6 I/ f9 ^5 P1 a5 y" Y
/* Restore the original data before leaving the function.
3 C' p, E" F( e- q( N
*/
! o7 ]8 T) X4 A5 c1 m2 V, V! ?
sync ();
4 t5 K/ x' J2 V/ x5 P
*addr = save
;
9 I- ? ~9 @ I0 U' r+ @4 c# ?
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
* G5 [+ q. v) y9 p6 V- W
addr = base + cnt;
' v4 C, Z8 N i1 G$ Q$ J E& b5 @
sync ();
! m# E3 ~; ^: t( Y1 A
*addr = save[--i];
. E3 i. |$ L/ m- x$ A1 m
}
% y* C8 E% B& L k
return (0);
; q+ P. J0 H0 L" n$ V* I( |5 ~
}
/ h- ^) Y, c4 s1 m* a
1 l9 l- O' i P3 f9 z" R+ L$ \
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
) n; Z7 o* J* W; H" L5 ]
addr = base + cnt; /* pointer arith! */
9 C' L4 p+ j; H( C3 Y
val = *addr;
( L" n2 W$ D# }/ P% [
*addr = save[--i];
6 Q* S; \+ w" V- F6 ~
if (val != ~cnt) {
Y! K) P! a+ f' k
size = cnt * sizeof (long);
) N2 ?0 v; O1 m+ T7 Y
/* Restore the original data before leaving the function.
9 W: c V Q/ `8 f% G/ ~! @/ o. ^
*/
# q5 b5 N( b# h! [
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
u; r0 M- H/ c3 ~( ]4 `
addr = base + cnt;
+ D }) ~% y h6 t
*addr = save[--i];
" v- s6 r( h: P( g
}
: Q+ a; W6 L F: R) H; { Q
return (size);
5 p4 T5 i: Y' t* o
}
: l1 i8 X3 ~6 L
}
* F1 F: I) r6 S- }/ m
/ {" x7 [4 p7 ]4 N4 |4 J
return (maxsize);
1 `8 M* b K' v) ~! {
}
& Z" S. L: m+ o- s$ X3 t8 I
int dram_init(void)
* j0 i( N, k- ^- d
{
! V+ a3 p! s0 _% B
/* dram_init must store complete ramsize in gd->ram_size */
) k: n& g1 n+ R1 R! u9 M
gd->ram_size = get_ram_size(
6 V' `! p) X3 y( l0 r1 K' L
(void *)CONFIG_SYS_SDRAM_BASE,
) P' m* g) t% p1 O9 f3 d& j
CONFIG_MAX_RAM_BANK_SIZE);
+ E' {3 ~' y( a
return 0;
5 N! I$ P6 R& C# f x8 L
}
- c* p9 t; d- a
$ f6 Q: p" E9 ?0 X
$ `* O2 A$ R: e9 e* h) P
: z1 T9 |, @" u7 e
* r# H, E: z1 h5 ]" d# o; Z, T! Q
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
/ P4 q& ] L8 S, _3 [( o
" b0 f. q: e6 P; b0 U# m' [
3 p7 \; g) k# v! t8 ~
7 {/ d! X/ q+ @4 `) N2 t5 {
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4