嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
5 N4 Z3 |$ L) _
核心板2:DDR2 256M Byte NAND FLASH 8G bit
+ [5 d5 ]0 R7 S" B* \4 ]
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
* A# C, `+ K% S+ |! d
9 j5 W) d& f' v3 p" ?$ V. Y
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
1 v2 z% D2 G# e/ p; S
" l6 O: S. P Y$ B/ Q; I6 I- d! i0 a9 X
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
# ^$ r1 ~7 z+ ^; i4 C0 ~* A
/*
. I9 p0 z/ F, l1 B* d
* Check memory range for valid RAM. A simple memory test determines
0 F. X6 Y! c2 d2 M$ n: d
* the actually available RAM size between addresses `base' and
* k4 E7 s2 F/ ]
* `base + maxsize'.
# j. B* f- H- G# C8 N2 S4 l
*/
) r; h. [( _% w4 G* J
long get_ram_size(long *base, long maxsize)
" X- }) F) V" l, {
{
" [" f: y" B0 {+ \% ]
volatile long *addr;
9 z% S& k1 a4 |$ I+ e# Y
long save[32];
. t) Z+ {) d% j4 S3 B& e; S
long cnt;
, A, {7 p8 \; Q
long val;
% {! u5 [6 y! w
long size;
9 `' I. \7 v: y& `
int i = 0;
- {. ~/ V/ o$ ^" g5 M
! S6 u4 `) F) v4 \- P! q) O/ `
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
3 O" x0 X" m9 J( f& }) e+ Q
addr = base + cnt; /* pointer arith! */
, M8 q' Z8 e+ s3 ?8 u
sync ();
5 g; ^5 j+ }7 R2 x1 T& L
save[i++] = *addr;
- m& W- l* @6 j" M+ K/ s% ?$ W
sync ();
$ t7 u v' t# R+ A0 G( \7 @# L4 _) t
*addr = ~cnt;
# D: a4 _9 {- b# A; a( m: Q
}
- b4 V( C' K! Y2 r* I9 v# ?
& d) F9 J4 Z4 \1 |. M& P6 x# P1 ?
addr = base;
( S2 d9 w; A; H X) Y
sync ();
1 @3 t' `6 b% [$ u( V* ^
save
= *addr;
# k) ]( x% u! D2 t$ q+ D# p: G
sync ();
6 a# S2 ]& @" T( E! W7 S% W
*addr = 0;
9 d# n2 a* E8 Q$ Y
# }+ D$ |& b. x" b( z
sync ();
1 D1 x N* v& D7 Q5 ]. `2 c
if ((val = *addr) != 0) {
4 T# \3 C: `3 W, n
/* Restore the original data before leaving the function.
F' z1 S, ?6 K$ b' e% B
*/
) U4 c* K- s9 p( C+ W- q
sync ();
$ |; I5 h1 Y# O0 V% y/ B( E
*addr = save
;
1 r$ d6 T* s2 b$ O& z* f$ l! b
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
+ @. p" t+ e, O7 V$ }& l
addr = base + cnt;
8 s) @8 M& H( u9 n' O g* f" r/ R
sync ();
) i) v7 I4 U4 I' c' O* n& ?; O: m
*addr = save[--i];
1 D3 U) _( M# S
}
: B2 E; B5 |+ b n" u$ b
return (0);
" \( V5 e. ~" G; y2 v
}
, {4 b8 I; p# X
+ z o9 \: d! d8 M! i# G
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
3 l1 L( p1 H3 q" l
addr = base + cnt; /* pointer arith! */
3 r0 d p( e; @
val = *addr;
! S, f$ g% ^& P1 o. [2 Q- h
*addr = save[--i];
- p: \. I, @: G y" l
if (val != ~cnt) {
' G! j% d; F. W/ u
size = cnt * sizeof (long);
' J4 R" J" z* n$ b
/* Restore the original data before leaving the function.
7 x! V; o# o, l4 e3 j+ _8 c
*/
! C% O* t2 R; r9 H4 d
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
' H. N0 T; S2 ]7 a( A% J1 C
addr = base + cnt;
3 E2 I6 z4 X8 h/ l/ w: M" v
*addr = save[--i];
) A% D: [& y/ D3 U) ]
}
! |& ?* I a; P
return (size);
) c2 F+ [7 O O& k
}
* B7 l4 ^. d( _* T1 |
}
0 X8 w- X! j2 x- M) t
# s' E: _. r5 R6 a; P2 E4 O
return (maxsize);
7 G: i+ l, D# g0 K3 N
}
: R3 f T/ ?0 g- b
int dram_init(void)
0 x& c4 d/ u' G& V) j
{
3 z+ N1 z$ p% O: _5 G
/* dram_init must store complete ramsize in gd->ram_size */
5 q9 B1 j3 N% ^2 P1 }$ q* A
gd->ram_size = get_ram_size(
2 z2 E- p8 {/ D; K" _( }; }2 l( D
(void *)CONFIG_SYS_SDRAM_BASE,
t' R& I' @* z3 S* r, k
CONFIG_MAX_RAM_BANK_SIZE);
2 F/ k& j u6 \4 C7 D# z
return 0;
, L0 G6 i! O( O' j: z
}
& n: G% N/ p6 B3 S {$ @
1 c4 n9 L- b+ G, D: y4 ^3 H
]$ ~( O3 F( @7 U
% K6 t3 V: `: x& }% c
" L8 g5 i# n' ^% @8 P
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
. l4 Y& o5 \9 h H
' h5 d5 V7 \- i$ U
/ Z" I2 ~, q4 ?' E) ?
4 `+ W* ]; V8 A5 ^: j* _* |
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4