嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
. f& I' z- C1 w" M1 S. v
核心板2:DDR2 256M Byte NAND FLASH 8G bit
; D; h7 Z5 i- k$ C; q: C
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
5 k: h7 T5 c/ A5 \& n4 W* _& G
; @" }8 v4 F# v# e# d6 |- d, ]/ y
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
( l8 j$ j% V; U7 d
S6 j$ m. K1 x _$ H/ P
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
5 H2 ` y; v: Z. q9 H. T8 M
/*
# v0 i' F" B2 |: D0 F" [( m
* Check memory range for valid RAM. A simple memory test determines
; h( ]) f) L0 ?* L% t
* the actually available RAM size between addresses `base' and
9 Y. I! e* M/ V* m" |* u
* `base + maxsize'.
* i! w6 _; g7 Q- m9 ~1 @9 t
*/
* k! V, X% S0 t n9 [& B& b* x
long get_ram_size(long *base, long maxsize)
, _. _3 x( H9 [; Q2 l; ~
{
$ o. R: [+ a0 ~3 d* m) y! ?" `
volatile long *addr;
+ L" }7 h5 K3 @" }
long save[32];
* U6 C+ R2 Z1 @: `! A4 {
long cnt;
& K4 [! ?4 c$ p
long val;
; n: c0 G) w: ^1 d
long size;
7 M& k P, q9 L2 k f% e
int i = 0;
1 R1 C6 k) p. V& O8 j# ?" N
& y/ @5 [; ]+ K# G3 u! w; _
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
# _, n6 a8 W: J: z# o
addr = base + cnt; /* pointer arith! */
: I/ a. l6 K/ y1 W
sync ();
1 C( T: \+ t- z/ G
save[i++] = *addr;
. j0 @& D7 j1 Z
sync ();
( t" o$ u/ R' h {
*addr = ~cnt;
! o9 h$ o- U. K3 t# A0 u
}
$ U' q5 C$ M: d7 Z8 v i
8 H, q6 h5 p( [% ]1 Z1 y' u5 l/ z
addr = base;
+ b5 E. K$ \6 B* E# d
sync ();
# T( T F% {; n" d* Z
save
= *addr;
* p1 C0 U( L/ v# r/ U- i p
sync ();
; n& f. U0 F, a0 H G5 ^
*addr = 0;
8 ~6 o! u& }8 J
4 o/ E0 X+ o, [0 I+ Z$ }
sync ();
5 x2 f& ?9 f7 X
if ((val = *addr) != 0) {
7 z6 r, ?3 }% [, {8 L5 }
/* Restore the original data before leaving the function.
! E5 r0 r; i* ^3 | \3 N( p/ l7 U8 A% k# r
*/
4 n# L9 p1 ]' Y% j
sync ();
& `4 F/ `' e/ E: v( o
*addr = save
;
* l8 m* R4 X8 @/ a. o
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
. x7 d. n( K1 Z/ \, U
addr = base + cnt;
4 d) T0 \& S" G
sync ();
" k$ U5 r* H/ `$ F$ E
*addr = save[--i];
+ t. S* e' u0 L% Z5 Y! e
}
' O8 F! E& l7 K
return (0);
! y6 g0 E% V2 n6 M' S
}
, N# i# t& O& Q1 [: U
' A) L" ~$ v* [; V
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
2 [$ m; @) J2 K2 [
addr = base + cnt; /* pointer arith! */
1 m2 C( N( V, t; M: l; X; n) T% k
val = *addr;
2 b* n# r- Q7 D( `
*addr = save[--i];
# C- S) s; k* C$ A! K
if (val != ~cnt) {
2 P3 ^* ~6 ^ ], K" k
size = cnt * sizeof (long);
- a% B' k+ w( `) \
/* Restore the original data before leaving the function.
* T6 _$ ?( b- a% {
*/
) Y) y/ l) C! c% \
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
& Q/ s' f T3 k$ M/ Z
addr = base + cnt;
' B; b }7 R4 k# J
*addr = save[--i];
+ Z, \2 c8 I# v: ]: \
}
; C( g% w0 l: i+ p
return (size);
) ^8 u: C$ r) f# Y0 P& B# d
}
T5 ?1 V" f- [) ^
}
1 ~$ U0 X3 x* }, K' L9 ~( C
; O2 y, R2 r0 G3 Q, z
return (maxsize);
$ k8 t' _" [7 ?6 I& N0 p$ W7 C
}
) X$ [( }/ U6 ]6 M( C0 |7 V, y8 [
int dram_init(void)
5 U1 U8 n3 B. P$ l
{
* a: [( m1 t: ~! y4 P
/* dram_init must store complete ramsize in gd->ram_size */
3 o+ D' S; E6 u" e) s
gd->ram_size = get_ram_size(
, ?6 Y. ~/ n' r5 V( X# B
(void *)CONFIG_SYS_SDRAM_BASE,
9 w6 F' ?# {4 Z. B, A; U) k
CONFIG_MAX_RAM_BANK_SIZE);
2 ^- o; I2 G1 K! r6 j
return 0;
- G$ G. H& V" M0 z$ P
}
' q1 q' @$ |# y9 Y6 n* y, h
. m& `& T9 }+ K5 i
$ ^1 x! J! G7 H: V, n1 i
) n: e$ r J: i+ g! G) L, x
8 Y8 B- ?7 X1 O0 ]0 c
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
8 t0 r: T3 l! h+ f/ l0 p
% j* W- i# F) e; X* @3 Q4 u
) e/ _4 g6 k# V% h
5 h0 w5 I# @5 g8 U* M+ e
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4