嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
0 b6 _2 M. F% n" N
核心板2:DDR2 256M Byte NAND FLASH 8G bit
{( G- K9 @+ |5 f9 }5 G _& j/ d R
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
6 u5 [. |2 s5 R
) J u# C; _( B
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
' Y( e- s1 T( Z& P$ T* T
[" G) \. c6 a% R7 B" K; ]
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
/ R# h. } [( s; j( t9 G
/*
' P- W8 n% j* H# o) ^
* Check memory range for valid RAM. A simple memory test determines
' c* r6 q# \# G' v7 E+ e1 M
* the actually available RAM size between addresses `base' and
: m B1 h; M: W' v4 n& w* o
* `base + maxsize'.
. |' r8 E/ ~0 ]
*/
, t, M8 k4 {$ |+ V
long get_ram_size(long *base, long maxsize)
* L& X* Z( _5 l3 q/ X
{
9 A: T0 \6 ?8 y( \
volatile long *addr;
3 \/ K9 Q! N' E9 J
long save[32];
- |- a' k& B/ F8 A9 X" h. U
long cnt;
( P) C0 \: V& m/ @5 T+ [# D
long val;
" z" s! @+ H( Z( M8 r6 e
long size;
0 T& F3 R# L, j Y7 m
int i = 0;
* F3 \% a) A9 F+ b) [5 Q/ Z
( S6 L3 d3 L( C
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
/ n0 z, |/ s* `! @) r I
addr = base + cnt; /* pointer arith! */
( J! _) ]( a' \7 @# }7 o: a
sync ();
. h/ b- Q3 O! J4 T2 X' y6 [3 g7 h$ j
save[i++] = *addr;
' D: ~% ~) @" K
sync ();
! f: [" m; S4 Y7 h. k. c( `
*addr = ~cnt;
6 [' l& r' y. o$ y: {% C9 y
}
- H8 D+ z' Q( Z; T! b* s5 h8 H
# R1 n% \ Y% f( ]6 s3 p% P) G
addr = base;
/ j, `2 {6 a7 v; ~1 X9 j8 t
sync ();
% Q! x3 L& H: C. k
save
= *addr;
8 i. x' O9 u$ w: q; P' F
sync ();
/ q# v; a8 j" S* M' Q) c) t
*addr = 0;
6 n6 ?5 H3 J. U- V# r
) q7 O% w% o1 v3 m& z' J
sync ();
$ c" \4 c/ b) A- G" J6 S$ B: M
if ((val = *addr) != 0) {
" ^& @ g3 D% J
/* Restore the original data before leaving the function.
+ J2 v, Y/ ~, Z$ B/ d! s
*/
; B/ Z! V1 B4 ^ F$ J
sync ();
) i! P& I/ B. e F
*addr = save
;
; m0 ~3 A& }! x' a8 N, y
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
$ R: I! o! l/ h4 z8 x8 @
addr = base + cnt;
( q# k2 E" r0 s3 b+ B
sync ();
& s+ E$ g, `+ N% z) Q4 e6 U
*addr = save[--i];
# S- _/ w3 p; a% _
}
" @ n& ?$ Y& ?( h8 D' A
return (0);
" X" v C, J3 i, Y6 X/ x9 {
}
9 c, c. |' {' O& J
) j. |: W2 k1 t/ t. H# H& Z
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
% a0 X3 b: V% e5 V
addr = base + cnt; /* pointer arith! */
9 |8 K2 d& ^3 u- I+ j9 W% p; }
val = *addr;
3 M; |5 L0 T m# T; F. J4 a
*addr = save[--i];
0 c) O8 \" h% C
if (val != ~cnt) {
( @7 p8 k! o# f6 l" }$ c
size = cnt * sizeof (long);
) e: I v8 n6 S% ^( ]9 X
/* Restore the original data before leaving the function.
3 i' l( U8 [, m( _+ }: H* G; I
*/
& @7 J9 |: F1 [0 M
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
5 c) P m0 x1 f9 V% g; a
addr = base + cnt;
) h) D7 y0 t( \+ C
*addr = save[--i];
, x$ \; ^4 u3 Z/ t) a
}
1 Y( z+ e8 j; ?% x" V! P
return (size);
' a: E8 Y+ _- J" C- p; R# M
}
% \1 J3 }! ~' c1 A7 [( e- N
}
) d1 h) E u7 Z8 z2 @% M
: S: a. g' H: H! p
return (maxsize);
6 w" ~- u$ n, j% K3 W/ m0 o
}
& x+ B9 b h, v. @8 z
int dram_init(void)
/ M- Q) A5 q( \! \6 z; q0 g
{
+ O" w: \" k+ _# R
/* dram_init must store complete ramsize in gd->ram_size */
, E0 Y& u+ c, Z! `8 ~+ I
gd->ram_size = get_ram_size(
5 B6 W( F* r: c! m* d1 f8 T
(void *)CONFIG_SYS_SDRAM_BASE,
b) m& ~6 q2 d& L: M8 `
CONFIG_MAX_RAM_BANK_SIZE);
( S3 X" b" S+ z, l8 Q4 D
return 0;
3 X+ p# _! |" p& |; l) y1 W* W( D
}
) w( e Z. G o% d) D
$ w. v6 I' P, I6 X) l
, H) B) [' x( y& ]* r; k
/ n2 A+ d8 K" W! i5 B& N: q% o" n M9 H
9 ~3 g. \6 ?. Z$ o) f
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
: }8 K ?6 }5 a, o: k( X% J
+ ?7 c+ }( F2 W, N. t
4 W9 _3 ?# r( H8 m$ S1 y
$ i1 n! q; b5 L( R9 I! H& s6 C
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4