嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
a9 ^$ Y; H2 G" M, i
核心板2:DDR2 256M Byte NAND FLASH 8G bit
* e X; b7 H8 _+ X% P+ \1 H' o1 f
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
) v0 D. H; f2 R! l- S1 Y! L
( e$ I& f, _6 n2 r E; r
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
1 z1 P k+ w m
1 F" n1 J: f" @/ P4 R- `
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
. D# r3 B0 u0 U
/*
" L) D3 a, f& w8 |. t
* Check memory range for valid RAM. A simple memory test determines
4 J% L- ]1 e- {" ~! ]
* the actually available RAM size between addresses `base' and
; r5 w& _" l) a9 v! ]+ s- U
* `base + maxsize'.
8 q* z; Q8 n$ p
*/
' _" Z7 d& Q! t1 d
long get_ram_size(long *base, long maxsize)
8 }$ J" `) A. z. [: d, b
{
* H. k8 z7 V; z$ v5 {4 Z( l
volatile long *addr;
\# f% Q# @, h+ {
long save[32];
' W( v+ D1 u* ? d$ A" j- U
long cnt;
) @$ r% O7 N9 [: }! ~; F' t0 g
long val;
7 L5 |" O) |1 @# r: }& F
long size;
( I, A8 V/ u9 l0 w- k$ u* v$ x
int i = 0;
; N/ Y2 A- l- u9 |
) t [" ?& T3 Q) I4 o* ?9 [( o' T
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
. X) P+ l( J) |" M3 T) ?
addr = base + cnt; /* pointer arith! */
! ^$ B4 ]. `9 v; ~3 i' v
sync ();
N; Q5 ~1 _7 S% z9 [) Z* w1 E
save[i++] = *addr;
- @/ Q, p+ Y1 ]* V; r
sync ();
& k; _& o; ? Z; ?1 _
*addr = ~cnt;
$ D+ J. b- M& t# w! a# `# ~
}
1 M# r2 C; ~# ]) b8 ~
: N7 y3 F8 E; p# e4 q* i
addr = base;
: W) V, x) m# X
sync ();
' { G5 p& d3 l' }% B
save
= *addr;
- k& t6 a/ b2 q6 o
sync ();
8 I+ [9 B2 h0 u1 D' z, K
*addr = 0;
0 u" d7 a7 I, T! u
0 k9 X0 E. @, w6 h
sync ();
. h D* @& |3 A e
if ((val = *addr) != 0) {
. p! P6 d. c# G! H
/* Restore the original data before leaving the function.
) B8 D. t. ^/ g1 U6 S
*/
L* K2 W& g6 Y6 E- K
sync ();
( p, `+ _# K- U+ W7 r+ q) K
*addr = save
;
* ~; h' G( p0 ]; s3 n7 g
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
0 ?% z+ n; Q) @5 L4 y# \7 M* k
addr = base + cnt;
" H* x% M! H( @/ _' S
sync ();
! M" _3 G3 @! K
*addr = save[--i];
4 H6 q" g/ {' v; ` A U7 v
}
; ~' n8 \: u. p) R3 C* ]% P( V
return (0);
5 M6 _5 H4 w" E$ d) d+ M" h
}
$ c! X" B& [" ?; h
& x6 y9 q# L* B$ E, H( `% A
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
8 m) `3 \! I; J. |' w) \
addr = base + cnt; /* pointer arith! */
0 {- i4 g* i7 S9 R
val = *addr;
# J. _3 M) g% l. G# h
*addr = save[--i];
/ U5 Q$ C# B8 F+ M1 s
if (val != ~cnt) {
1 ~; S2 V1 o: K1 P s8 `) S
size = cnt * sizeof (long);
( _+ D! I( b$ w; @0 N1 m: T! y) V
/* Restore the original data before leaving the function.
; u; M. \* B& G6 h
*/
& s3 `: O. t8 a- o6 g& h
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
$ l* d; N2 D5 k( N: x# e, n2 r+ a
addr = base + cnt;
3 X# R1 o5 S7 h: f% _& X' M, q
*addr = save[--i];
& L$ q" z9 d% ]8 z, b1 ^2 _( ]
}
+ g; a- ?/ v6 S* F* x8 `+ Z
return (size);
$ F5 _2 I2 U x
}
+ e1 |( U* U R" g+ U9 t( _
}
# \/ d$ W" }8 L; N& l
, X3 ?9 ^8 G0 v: [1 m+ Z4 \
return (maxsize);
+ U2 O3 Y4 R' p5 v9 q
}
. l/ J. O+ O* p
int dram_init(void)
5 `# h1 x6 D7 Z' u1 c
{
; e! p2 L# W, t1 l. F/ `' j3 J9 K
/* dram_init must store complete ramsize in gd->ram_size */
# ]3 P' W* ]2 P9 @- d0 U, A
gd->ram_size = get_ram_size(
# k$ W) L# ~- W- ~8 `. u
(void *)CONFIG_SYS_SDRAM_BASE,
# G9 B# r8 v# b9 f# J* @" i
CONFIG_MAX_RAM_BANK_SIZE);
) K0 y: q4 q) q* ]/ l( l
return 0;
; { X& v w6 y) T+ A" P3 }
}
/ m0 C/ c& b1 a% L6 B5 p
) z5 O+ a s4 K) ^
- b! C% E+ U3 s3 P5 h
* I$ e+ e) F' Y9 I1 T {& k# E2 W! l3 |
* I) c" j( W4 q- a3 n
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
6 Z1 l/ e6 u) f/ h4 r1 B
! ~9 E. z/ H8 j/ v2 t8 h/ ]
1 G2 C, p* x& B! g$ K2 Y$ c
: d+ _- ~# W, T! C0 h
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4