嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
* A$ v& z# Z4 M% n2 {
核心板2:DDR2 256M Byte NAND FLASH 8G bit
' z8 s9 a9 `4 j# w
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
: d7 _8 Q( p7 F6 V6 F: p& Y
# k* P1 `8 g v6 B. Q# b1 @
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
( |( v* e3 r1 ]- U2 X: ?
9 l8 j( r% W8 M# k5 P, u
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
! ~1 ~8 F" e! c; p( K) N
/*
# B$ l, u7 U% ^/ b; k$ f
* Check memory range for valid RAM. A simple memory test determines
5 Q0 O5 F7 e6 ?5 M6 I$ l
* the actually available RAM size between addresses `base' and
2 \' o8 j/ U- ?# g- K
* `base + maxsize'.
e& @6 x3 T5 n+ B
*/
# U1 s( F7 H7 r4 s5 p' R
long get_ram_size(long *base, long maxsize)
4 P. e2 b, K' {* {
{
$ \5 J. r* U* o$ x# j) S8 o
volatile long *addr;
4 S, u6 _6 L& n" ?8 \
long save[32];
% P5 Q# A6 j( C/ ]
long cnt;
# G1 w$ D( ?6 L) [
long val;
: k6 w1 u# {0 e2 G# _
long size;
/ @3 w* p' [; n" ^. W
int i = 0;
$ T8 U/ j* C6 F7 x$ s% P
$ v" H- l, ?$ h" p, c/ }& @; N
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
6 d8 L/ V/ ?4 m
addr = base + cnt; /* pointer arith! */
, U$ f+ Z& F6 B: ? ~
sync ();
9 E( v% P5 \3 L; S: H
save[i++] = *addr;
$ X# `. o3 o \3 T( i; v+ N
sync ();
6 G5 e: Q5 ^$ n, v3 }
*addr = ~cnt;
d: M, ?0 g) S& M! N
}
# _7 H. _5 L' E- A2 {
9 o1 c9 N9 e" z, C
addr = base;
% H" w, R3 ~2 T3 |1 F0 U
sync ();
3 k0 P# H$ \+ e3 S. ~+ A1 B) @
save
= *addr;
# [ `1 z9 _+ ?1 v! S1 t6 c8 a, Y
sync ();
9 y }# o) K n/ M
*addr = 0;
: S; @0 S. n" t# g( C: Q
& Q- x# R3 _$ g
sync ();
$ V: h2 F, m% M+ a7 S2 Y
if ((val = *addr) != 0) {
% u0 z* K) ~* x1 D& H% F6 q' U* q- n7 n
/* Restore the original data before leaving the function.
1 {0 u2 x" z( d" n9 q" `6 N
*/
+ D" t/ q6 w) {4 }* p
sync ();
0 t# g, d* k6 F3 O. t
*addr = save
;
& x) }8 x: G: D. v
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
8 q& o4 ^+ [7 t1 E# ?- ~
addr = base + cnt;
5 J- P- M Y: }$ A3 |& J) d
sync ();
% L: C0 m# Q$ h% o. ]
*addr = save[--i];
0 ?( O0 B( f) A2 p
}
9 C. M R: i1 n n* K9 B0 X/ Z @
return (0);
9 e. s3 r7 c( U R2 R8 m
}
: I* l* n. A7 A: r) R& c
9 M7 K8 c' X$ q/ X/ ]
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
% S* \- ?0 c( v; P. K2 ]; W( n
addr = base + cnt; /* pointer arith! */
4 p8 I! O& `1 T3 g0 [$ m4 [* O
val = *addr;
6 Y# \; a4 c8 Y" K3 |6 s7 U
*addr = save[--i];
' h' U8 y2 b% G6 `
if (val != ~cnt) {
/ V; F7 u( T( U ?% |3 Z+ E2 q C
size = cnt * sizeof (long);
0 G9 t9 y3 H! M. @/ T
/* Restore the original data before leaving the function.
1 n$ A! |$ f$ M# s
*/
4 E2 [) z S1 i1 ^# A8 f/ z% g/ `
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
+ ~' ~3 B: X+ l8 u
addr = base + cnt;
" ^0 D1 F! Z8 b4 l- R: T7 G; U
*addr = save[--i];
# O7 u9 D* O% ?5 E' p, Y
}
9 e% ?# d% F) ]/ U/ x& r1 d
return (size);
# ]. {/ f4 |* r/ m w
}
) G" F D5 S4 E
}
/ [% M% i+ }0 k1 M
. p$ F) u' D5 t `4 Q# I1 \2 O
return (maxsize);
M/ S. K# ] y: I
}
+ U' `$ o( r5 C
int dram_init(void)
$ a. n8 v8 x; j3 h
{
0 t! ?, h* X ~- s% s7 ?5 S( o
/* dram_init must store complete ramsize in gd->ram_size */
0 q5 k5 t( _) R6 M) H9 d- F. f* O/ D
gd->ram_size = get_ram_size(
Q- q7 L& Q3 T/ d; B4 T
(void *)CONFIG_SYS_SDRAM_BASE,
/ y2 t1 ^" i9 N
CONFIG_MAX_RAM_BANK_SIZE);
6 N1 q/ ~9 S1 Q9 m }2 h
return 0;
, `3 J) ]! f$ k7 r4 P) B% M
}
: s# z# m$ Z# b* C
4 x- j s9 B) v7 H
" {% b3 q$ w# y3 p7 p6 ^
0 U- G% ~3 H/ Z8 m G+ E3 S
' X3 e [0 W* m, x1 e% ?! C
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
" J' i% w l" v5 g- V1 C
2 V% j) f' L- b) t. p7 M
3 \% M3 G5 M9 C6 ~# v
7 m2 {" d5 H: J. S- `& A
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4