嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
1 ?1 D z' m1 I9 `8 \ o
核心板2:DDR2 256M Byte NAND FLASH 8G bit
4 O5 p/ w9 ]* a6 o+ {: n5 x6 ^
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
$ m L7 y9 g4 G/ f8 Y
+ n) C2 n& a" D3 h) V3 V Q
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
9 Y9 l: t* w+ Z+ K* R9 E- C" ~
X# j5 z- r6 Q1 J8 d
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
1 o6 B2 X5 a$ ] `, w/ R0 f
/*
8 F" [5 j5 Q) s
* Check memory range for valid RAM. A simple memory test determines
! U2 X6 S/ x8 l" B9 I
* the actually available RAM size between addresses `base' and
& X& ~9 w: i7 t. r6 W7 ^5 h
* `base + maxsize'.
- n& L+ T6 l; j: r0 w
*/
1 g& V8 k1 A8 p7 w+ ?/ h5 g
long get_ram_size(long *base, long maxsize)
% `! P7 d) Q- y; l
{
4 m: G, ~$ X& C. l1 [+ J9 ]
volatile long *addr;
5 K& G& |, v$ i
long save[32];
& E) @3 R% [/ R. V% {1 p+ k
long cnt;
9 _: g. ~: Q' K
long val;
) z, M9 y" W4 Q( U* S# K3 W! Q# ]
long size;
6 N# g; u# M6 V! u; k
int i = 0;
2 D7 I" R9 [& m- x, `
8 B2 s& f2 X. a
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
- G) K% G0 k$ z9 |1 M& S
addr = base + cnt; /* pointer arith! */
; X Q1 d& C( }
sync ();
- {3 K/ P0 f' h* I7 r
save[i++] = *addr;
0 c6 p$ s! P4 B2 B8 S8 E
sync ();
1 }) a1 i! R5 M) \: k
*addr = ~cnt;
& u$ b9 C- z1 C2 n; C
}
0 l& u8 U: a4 @# {5 @9 |
; J* r0 H" C3 V9 @! v7 A
addr = base;
; w# b9 y( E3 V9 T u
sync ();
9 s, }0 K1 H. I, r6 W
save
= *addr;
1 n3 J l* H, b$ N' q, m% N
sync ();
" u# L m: b$ ~ [7 k) F0 m2 H+ z
*addr = 0;
4 i6 Z4 [% Q R' P' I, G# Y/ Q5 L5 F" P
0 Z- V1 d D Q3 B& _/ {
sync ();
0 X% D. m/ @/ n% n: K$ {7 W# R+ Z
if ((val = *addr) != 0) {
# v6 K" ^- T* ?+ R# L& L
/* Restore the original data before leaving the function.
7 L# w+ U3 G9 K( s6 l' G
*/
" E2 B$ p) c, G' A
sync ();
1 i3 Q- ?5 T; K) _. T8 c7 L
*addr = save
;
. d0 d+ B3 m* t! O( l, q
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
/ V5 u+ }/ F3 p; J! S9 \
addr = base + cnt;
& p/ X5 `, B6 K! j
sync ();
' M/ C. {" t, v6 N ?& n7 o
*addr = save[--i];
% g# Q( U8 D/ e G. z8 L3 b& g" l3 z
}
0 h3 P( E5 a2 I" ]* c
return (0);
( l {5 `) }! p
}
& [# E. v1 @% ]' c( _
, x6 m! q! f' R- T. k$ d
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
0 L4 O' ~+ m& L% a$ Y: C2 q) U
addr = base + cnt; /* pointer arith! */
+ M3 M2 P9 j& A* g. ?
val = *addr;
, p) w x2 l7 }8 Z, ^
*addr = save[--i];
0 Y% c0 u3 }- W5 w4 N
if (val != ~cnt) {
: k- O! n2 s: g
size = cnt * sizeof (long);
' i P& Z0 y8 n" V$ d- h2 x( K
/* Restore the original data before leaving the function.
' G( ^ Z3 _' H! i6 m
*/
+ ~6 c4 L( s3 c5 N
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
8 I; `/ ?( [7 }2 H- x: Z
addr = base + cnt;
( O6 N2 `/ f- @! i
*addr = save[--i];
9 Y$ W6 C6 v8 v, E+ f# ~8 ~1 N! Z
}
$ @* l' F3 |1 M7 F# [; x
return (size);
4 I% z8 l3 Z* i) }& Z1 b
}
0 j( U o- L3 I8 d4 o3 h
}
& F6 A5 B! w, T5 z) p
6 |2 z4 l4 e/ b& u# `
return (maxsize);
# H6 S/ t' j a# I2 M
}
2 s! ^5 U, Q# X! _) S
int dram_init(void)
# m, p' m L& { K; |
{
3 \6 o6 L y2 Z) N1 h" z
/* dram_init must store complete ramsize in gd->ram_size */
8 D- J% O+ L* u$ }' A! _4 ?
gd->ram_size = get_ram_size(
( ]( O. W, B% _+ p5 ]5 p7 p
(void *)CONFIG_SYS_SDRAM_BASE,
" j" F) X2 D3 o; Q- {) b
CONFIG_MAX_RAM_BANK_SIZE);
9 M- J/ G2 ]9 _
return 0;
& Y' N) U. e. W: j
}
) L$ `* n2 C4 {! y
/ B' B( ?: M8 S. w$ N
: r$ `4 U: j4 `9 _5 @0 X. d; ^
4 o; `1 }7 q6 Q+ ?: j4 Y
8 c, Q' u( A2 W8 s
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
: h' u" P* j8 m: H' N0 K5 K
# D! U, r, z5 B! Z# f# M
0 ^8 @7 q' R/ \$ s6 v
: E; w3 O6 F$ G4 v G( E% w; C6 h
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4