嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
! M) }" h9 U1 |0 G. H
核心板2:DDR2 256M Byte NAND FLASH 8G bit
* W+ Q9 c4 y2 o0 @
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
3 {( F- s* O& h! t
3 R( @3 z f# Z ]; H/ ^' \/ r& a+ O( w
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
) j. W/ v3 w4 k
, }4 y, A- q R k
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
. h$ k& d$ Z; v: R
/*
1 W/ \2 V# r0 x& \, W( t& I
* Check memory range for valid RAM. A simple memory test determines
' O# n4 Q- R, \, ?; e3 j2 w
* the actually available RAM size between addresses `base' and
1 ^. X( N! G1 C
* `base + maxsize'.
2 Q1 R! _! W- }# |3 ~/ O
*/
7 Y5 Z! M( ~: L5 h" b
long get_ram_size(long *base, long maxsize)
s3 @1 S$ ] y5 \! R
{
3 c! O3 Z! [- k4 U7 p! X4 ^
volatile long *addr;
7 G" y# W1 p2 P3 {7 N
long save[32];
- O& X& L, u* X, E( @6 g! d! @+ H
long cnt;
2 ?9 ~. B9 v# L- E% h
long val;
: @2 B7 {# x, ~( a) N6 e
long size;
. h6 W8 J: b! s* A3 D# H
int i = 0;
: h; M1 T/ v: E1 A' ]3 N
# V/ E; v$ i; M% M
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
5 h+ ~0 E4 p! }. I3 A2 P" `
addr = base + cnt; /* pointer arith! */
& d$ V- x/ X8 \+ l# }' v# y F
sync ();
0 R. Q' F* W* J# d
save[i++] = *addr;
9 Z3 H# L' A2 H% Z! |4 X& a6 L
sync ();
! m! l; ]1 a, h1 w; i. j
*addr = ~cnt;
7 x7 s6 i7 S" f/ s. s; ~, z5 B8 }$ f
}
3 |+ p8 M- u6 V' h
4 ]+ B6 }1 ] W
addr = base;
$ O# a5 e5 Q/ l! I2 N+ [9 t
sync ();
4 g, @* s, i& o y5 V0 X
save
= *addr;
* ~( O. |- _+ l7 Q& ^0 O$ {4 a9 ?
sync ();
) C! B6 J' ?: t. O5 Y' P5 X
*addr = 0;
1 p, m5 @& Y1 c2 b5 G8 l: K
( S q4 M$ E) I# i/ d% d; n
sync ();
F7 r5 v d1 d( Z2 [
if ((val = *addr) != 0) {
2 E- g( N# g/ d2 Y
/* Restore the original data before leaving the function.
x+ C6 k+ r' M$ n' U3 o
*/
- C% [6 N7 v t, c1 E9 a- J
sync ();
0 X& ~' v+ ~9 c$ R5 j
*addr = save
;
* X0 E& w$ v9 _2 ?, ~
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
8 l# k5 ~( ?' H9 z1 X6 X
addr = base + cnt;
5 ~! q4 D; [4 z! T' m
sync ();
3 O6 e' [& {7 c! R
*addr = save[--i];
8 H2 W6 S; r* X D' X: l% y h9 x
}
9 h* h6 G- M" [
return (0);
* f4 a* b: u, E0 n9 S- e) ]
}
( T( @+ `* [( {' U1 o9 u2 I
1 n( c2 P* [( U. P+ ~
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
" p$ j$ O7 H7 t3 g% L) e- R: E
addr = base + cnt; /* pointer arith! */
- n4 i1 Y% H+ N1 u0 Z0 x
val = *addr;
! k" Y( i& u m+ b
*addr = save[--i];
& J+ b7 m8 P6 z0 f
if (val != ~cnt) {
% L, \3 C1 V; v
size = cnt * sizeof (long);
b+ m# E, d$ [
/* Restore the original data before leaving the function.
5 N. Z& Q- u+ {1 t% s3 t
*/
; P- j0 q% N; v4 j" f3 Q, ]
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
: [8 [, B7 J' d9 A/ D1 `
addr = base + cnt;
' e; s3 O/ r: x2 t2 F& D' T* V
*addr = save[--i];
) d+ e( [( n, @6 f+ ~0 f" Q- v
}
* ^. \% B8 \6 C! j2 n
return (size);
; O2 S" _; b2 b
}
" `# _; i/ x! \
}
* h) P2 ^, q- h6 ^! d: F+ h
2 d. V9 z, B. d# r0 |
return (maxsize);
. `8 A: }0 e0 \
}
0 C3 U, ^$ d! z% K9 J3 L$ ]
int dram_init(void)
: a9 K% _& K3 w
{
$ K- ~. m2 x) `) Y
/* dram_init must store complete ramsize in gd->ram_size */
) X( T% O4 l0 G; [' g/ |9 l
gd->ram_size = get_ram_size(
& ~6 o; U: t2 t% V0 w, L
(void *)CONFIG_SYS_SDRAM_BASE,
- N, f* n s H
CONFIG_MAX_RAM_BANK_SIZE);
6 }. w" Z5 p% Y7 W2 T5 w: u' y
return 0;
2 ?" j+ Y+ u4 f* O
}
( ?" Y: k) X1 v K" L& i; g
6 v) j( Q: t" g6 _
- m3 G! ~3 v: R( \) X7 J
) Y3 p. m$ g( ?' }3 k! k" c Q
+ y% S L( a5 s+ L" P$ c% W. X J
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
; q! _/ p6 R9 b! D8 A3 b; H
R; b% }4 ^/ C. w: G
& d( L1 Y( l! k! o
: I6 [+ z; ^5 o+ Y' D6 n
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4