嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
6 d/ q% F9 a; w
核心板2:DDR2 256M Byte NAND FLASH 8G bit
0 _4 Z$ d# D% L* ]0 ~5 X5 P- T8 t
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
3 _2 e; B1 P7 v, a ]# T5 E9 K1 ?
3 g S5 D% }5 P3 a( ~
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
5 e8 z, o$ K/ @$ x0 V$ G
7 z$ h v5 G5 B/ _
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
8 D& D9 [) X5 C! u- D
/*
( v2 S/ f6 ~" z' v
* Check memory range for valid RAM. A simple memory test determines
2 q9 x) `7 Z+ _: P; \
* the actually available RAM size between addresses `base' and
2 m( d6 H$ ?, O& n# q! g# h4 ^
* `base + maxsize'.
# `/ R8 P2 u0 I" Z" E; n
*/
! L- N/ B6 f) ~0 `
long get_ram_size(long *base, long maxsize)
, Q: K. u& h# K* y; \4 I% ~
{
3 {" H0 S" v6 v* B- C
volatile long *addr;
8 P; ?, c3 j+ O6 d+ K, G
long save[32];
, g6 f4 @- n" v
long cnt;
Q8 T l6 m6 \ u, Q f
long val;
' J% Z) G, e2 v- ~, i% t
long size;
" M, l) P- a; B) Y/ L0 f! c: P
int i = 0;
: @* z, z7 Q0 f/ z
1 J. Z1 J) u% Y4 l+ q$ H
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
, x* b2 p+ e! I6 k( x% Q2 [& o
addr = base + cnt; /* pointer arith! */
" ~' x# ^! t3 m! h
sync ();
2 S) L6 j! S0 P, r
save[i++] = *addr;
2 K: g2 c* p. d5 a& n; g
sync ();
( p+ m0 w; x! D" X/ T! H. R
*addr = ~cnt;
! S9 r+ ~% ^! G u
}
/ z' S% h7 U& X
; B- O/ M9 R) |. ]% T1 N
addr = base;
6 ^* d0 X' |( `( T; s3 v4 T, ~$ k7 Z
sync ();
1 E! u; T, K4 B; J9 J
save
= *addr;
/ h* U1 r. Q- h' s- T
sync ();
6 C% H: }; n3 y% }5 i" N4 X
*addr = 0;
, _0 T4 _( A1 p5 I/ g, s& J2 r
* t5 B v1 P5 w% R% C& H
sync ();
( f# W# j0 X/ p$ ^) ]4 T" s. m
if ((val = *addr) != 0) {
/ h- ]2 B6 f9 ]
/* Restore the original data before leaving the function.
3 ^1 k) j; x+ ]/ f4 U4 O, m
*/
+ N) ?$ T) T; O/ S
sync ();
: T( ?5 T r* [7 ~
*addr = save
;
) @+ e. l9 O5 Q6 s
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
5 |9 t' _& {( l, c( k- Q
addr = base + cnt;
$ h) F9 |$ X7 G6 @' x# ~8 c# Y
sync ();
0 \/ z3 j- `' T
*addr = save[--i];
h9 o8 t: f' U9 r7 [
}
8 V/ w$ E$ s$ l3 g8 o" ^. \& V
return (0);
+ W) w1 g$ ]: `3 I. M
}
. K) L' k7 B- R7 X1 Y$ e
+ g6 m4 l; z, `. D
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
# A- N5 V |6 @! ~2 U- y
addr = base + cnt; /* pointer arith! */
2 V, s6 {+ p4 J; x. ^4 T
val = *addr;
1 e) f' }7 u4 q
*addr = save[--i];
2 F" o6 G5 S5 H; v$ Q
if (val != ~cnt) {
3 i+ Q- N2 u2 U( d3 R$ U
size = cnt * sizeof (long);
, K" D+ W. w, Z2 f7 M! Y5 M2 F
/* Restore the original data before leaving the function.
C8 t- B6 I6 q# i. X- N
*/
: }: T6 E3 Y: x) S* X
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
' j- j k4 k8 l3 ~5 v7 s
addr = base + cnt;
, a+ T1 y+ Z- U* Z. Q* L) ] v
*addr = save[--i];
0 M' h% P1 A% G( g% V
}
0 u( a. T: A" m" g1 k
return (size);
. g9 i* D* Y0 W6 j% ?
}
; r* Q' |& z: p R
}
6 r5 K+ y3 p2 L0 E
`1 V; E* s/ G; ^4 C0 V: V3 s" h$ L
return (maxsize);
! s n" @& f9 r
}
% M: M: f5 s* Q% M% k3 i: _
int dram_init(void)
2 m+ m" v) O1 h3 K$ M" X' e7 r
{
4 r6 o% T, N7 ?0 G1 _ E- I
/* dram_init must store complete ramsize in gd->ram_size */
- D2 C# ^# ]; ~& [
gd->ram_size = get_ram_size(
& x! k( L! h& y" Z( z5 ^* A( ?1 T
(void *)CONFIG_SYS_SDRAM_BASE,
8 Q& s" w: a- u& y" I
CONFIG_MAX_RAM_BANK_SIZE);
: [7 N% ^! v9 |4 \, N
return 0;
8 d$ r$ }4 v2 g8 Z& ]. M
}
|3 y+ L; Y0 @7 g- ]
/ {6 g* w; Z# C; v1 r
( Q1 K' l$ \3 b2 W# A: H3 T
]" d: J/ Z) Q- j
4 G/ i }: n& g$ q' g2 d
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
3 Z( G! B4 e" N
- h! o) d X( }# B$ a7 Q$ z# m9 _* t
; @9 s+ f8 e7 U9 i
, A6 j( E0 H6 x4 q' K
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4