嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
: w- r8 N" ?! l5 b+ i
核心板2:DDR2 256M Byte NAND FLASH 8G bit
# H, e$ b' }6 a1 z+ {
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
! O4 X2 L; ^, o5 \ `, p% [ G
( a: M% M& S* ]2 ?' M
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
$ R% x* g4 [8 a/ m8 e& K0 E
# w% [6 J* o4 T
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
2 }+ p7 U U; I
/*
; u3 U' B+ o( F: {
* Check memory range for valid RAM. A simple memory test determines
+ ?- v" c' y* q; _% u( _- O( q! S
* the actually available RAM size between addresses `base' and
) C8 q6 K9 h8 t% g; o# X
* `base + maxsize'.
$ H0 r' n4 W5 z: a* G9 w
*/
; `5 M; P+ Q5 \- F
long get_ram_size(long *base, long maxsize)
. r$ q7 g/ Y! \) z7 i
{
- s; o5 p6 ? Z) O9 `8 E( F
volatile long *addr;
7 H# ]+ F( s- _( V" y. f
long save[32];
% v* J0 K& A5 j' I B
long cnt;
' v* Z, ?2 l4 v7 C9 n u: ~
long val;
. m9 q; o; M" A# B o9 ^/ f
long size;
0 t( x- U% {! a- b
int i = 0;
1 r f* g( c% G0 J& F4 l6 I1 f' [
) D2 Q% B& w. @; }$ T
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
: S9 V( K3 i3 r
addr = base + cnt; /* pointer arith! */
: O; t) j$ j% n3 B% u
sync ();
. o1 q% p* x \- m
save[i++] = *addr;
) S( ?1 i" o, j
sync ();
) I' v3 @" @& J! y3 B
*addr = ~cnt;
/ Z$ E& K+ F# ]: q
}
) I9 ]3 e3 c2 g# N; [
( W* V ?& H' ~
addr = base;
& u6 E4 A9 g1 @3 }0 a, A: P+ a5 B
sync ();
! |. w3 T* h1 ]
save
= *addr;
u. `/ [( u1 I- l2 i
sync ();
; c. w# O# s1 t' ^8 b' n8 L8 v# e
*addr = 0;
# h9 W. _9 @; o; `* `& b
+ Z2 R7 |3 @8 N a: h
sync ();
( X& Y% ?' L& l D# @9 b
if ((val = *addr) != 0) {
" @9 F3 ?* B" w, E3 k
/* Restore the original data before leaving the function.
% n" m/ Z5 c; f3 E
*/
7 T. w: l# H: ~3 k. m
sync ();
: G9 \( O5 m* M
*addr = save
;
: H! Z! k& R/ H0 I# K7 x. j* ]
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
* ]! S/ z) e/ I! w2 o9 ?4 ]3 q* e
addr = base + cnt;
0 P. s, r- R/ i. n% J
sync ();
, Q* I- h3 e# c0 Q9 j3 S0 y4 X
*addr = save[--i];
3 h, q1 z- O1 y' F5 L @& p1 O8 S
}
$ ^, n3 ]. @0 {: D- Z/ x
return (0);
/ Q p I6 m+ A7 S+ J
}
3 v% ]# W! H- U3 k0 R
) Y2 ~0 h! D) C4 `# \9 m" I
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
0 O6 L) s7 m, B5 _0 A% ] @
addr = base + cnt; /* pointer arith! */
# _, h% ~* C" R( U
val = *addr;
Z4 w. E5 w3 [7 }" @# Q
*addr = save[--i];
8 ?3 q9 @) n, U# v+ M4 p6 @4 [
if (val != ~cnt) {
) Y4 F9 D9 E' [: b- Z
size = cnt * sizeof (long);
0 E0 J! f+ Q: N! h2 N. S' D# G8 c
/* Restore the original data before leaving the function.
' ^% J. N7 K5 }
*/
: J F' ]2 [2 }1 ~8 U
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
1 W! \5 H; \1 E" r* V
addr = base + cnt;
+ M4 j( z+ s# o7 C) b
*addr = save[--i];
$ b2 ?% J7 J% v
}
* D6 Y, G! B- W- F" X
return (size);
3 i: L& x) F' h" {; [0 f
}
5 \+ i% ?/ l% C$ s0 W/ k
}
, \9 V$ _: S. g9 Z, g1 q
' f- X& Z; h- K- Y0 I l: ]
return (maxsize);
+ G! T# A, h8 O: h( B: ]
}
. w; V8 G+ s: ]. M
int dram_init(void)
. m+ K, R# }! c3 ?: [0 ~! r% i/ |6 u0 v
{
7 b: Z* R; [: q7 A6 B) g& a
/* dram_init must store complete ramsize in gd->ram_size */
0 X- x* g7 x1 }$ M- w
gd->ram_size = get_ram_size(
3 `" T3 K* m4 y4 l3 u* [# a
(void *)CONFIG_SYS_SDRAM_BASE,
1 I! Z6 [6 H7 q
CONFIG_MAX_RAM_BANK_SIZE);
) n8 H. P; O! M
return 0;
4 M* {3 X: u; j K$ T2 o$ z1 }
}
9 m1 A( }2 d4 x) e! ]. n
) a, u* }7 c6 S6 i. o
0 ?; y* ^' k6 ~% v/ O% ^, V
; T i, p6 s7 o; R' H6 I% e9 }$ ~
/ l4 F! g! `* ~, N
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
' C* b S3 M6 G8 t. z5 B, d
! u" U0 |) O0 o" t7 S, j6 K
7 Y4 Y/ C9 b& \8 k
! \: X& f8 o7 h3 X: S( p$ d3 K1 C
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4