嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
8 U; F# f. y: Y# Y: [
核心板2:DDR2 256M Byte NAND FLASH 8G bit
9 K) B% n' o; \' j6 S% j; c9 M
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
4 B$ l3 C3 Q: o1 h
% O6 @/ ]) e0 ^1 R2 S1 ^1 _, t4 S
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
( C* z6 G" d+ y A) l
. x. D/ Q# ?$ E% _- V
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
[% |: h8 r2 E- a" a
/*
6 R6 `. c3 \: a. ~' X
* Check memory range for valid RAM. A simple memory test determines
; o1 z/ m5 D) m
* the actually available RAM size between addresses `base' and
2 ?% w) }) |) R- s* i( o
* `base + maxsize'.
7 ] y8 m6 [' ~3 Y1 X2 u6 a9 k; A7 Z, d8 K
*/
' c( I" A, G& H( S+ v H
long get_ram_size(long *base, long maxsize)
/ `' s, l" _$ N: D1 h& {
{
( m4 G) c2 ]) N0 r* S( ~" i
volatile long *addr;
[/ Z- i) r ?9 g/ \
long save[32];
7 g) Z- Q$ P0 s; y
long cnt;
2 I( x+ |* B4 R; y
long val;
0 t+ x5 s0 X) ~$ G' [
long size;
* @2 E# G: W+ D7 x. d
int i = 0;
% ]+ b$ U: ?6 M3 k8 Y8 [4 e- p
6 ]5 v3 I6 @5 y0 q! O
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
: \ `% _ @2 ]. P& O* Y/ G/ u! u
addr = base + cnt; /* pointer arith! */
, L) U1 s, ^- a% g# E, \. M- B& n
sync ();
* }, y/ M3 Z. A8 |* Y$ @0 r! D
save[i++] = *addr;
0 j5 t$ y- w! S6 F
sync ();
$ Y! i/ Z7 w: B0 t( K0 N
*addr = ~cnt;
: I7 [( b. {6 k, \( K2 Y1 Y
}
/ ^5 A. H7 z+ C" m
6 ]& _' D0 p7 P5 ^
addr = base;
4 G3 V2 i& v0 F. z9 d
sync ();
. { w3 v7 A1 h3 C5 D1 J7 q \7 \, H4 R
save
= *addr;
- x0 i) J& m7 [/ O6 C1 j9 F
sync ();
! L# e" ]- M! o' ]9 R/ e; {% j
*addr = 0;
0 t* g$ {3 o- f5 U) a5 P
7 w! h, q: g" g9 X6 @. h2 V
sync ();
; O2 A" B; {- t* S' v( j
if ((val = *addr) != 0) {
, \% t3 V, z& j" _/ E9 R
/* Restore the original data before leaving the function.
% P& U' |; a. v! q @# R
*/
4 X4 [$ y# M! D% U$ x( i0 D
sync ();
+ l* v! Z6 Q% s& A9 j, U. _- Y
*addr = save
;
( P' z" B1 D; Y$ m1 w
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
F# P- r, q* M, d" u
addr = base + cnt;
$ e: s7 c) J7 U6 H7 W
sync ();
; }' p" S# u; Z* ~+ \! y- B
*addr = save[--i];
: P5 V8 \( X0 Q6 N* r& Q3 A
}
+ M5 _; t6 k# ^. P: o3 Q6 K
return (0);
% {8 k6 `1 {2 J# t5 { l+ C- a
}
( S6 T+ Y h, d$ X- t) z
" a E" i! }, k- b( @
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
% Z+ r4 w' L0 p5 S; z, Z
addr = base + cnt; /* pointer arith! */
3 g' s3 K! L5 T$ N; B. R
val = *addr;
* q3 n7 m+ }8 r: T. b
*addr = save[--i];
6 B3 X$ L0 G% g$ m9 L
if (val != ~cnt) {
+ k9 Y3 O; B- B n
size = cnt * sizeof (long);
`( a& z6 O5 w4 I' M# v
/* Restore the original data before leaving the function.
0 {/ h6 g% }3 ~, \ m
*/
1 E3 ^" B2 R6 v& \% R2 r( C8 M
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
6 w. k/ _* z) Z# `
addr = base + cnt;
8 `" B: Q7 a1 f% T
*addr = save[--i];
* n7 S, O, v3 ~0 n
}
! c: x/ H/ n7 p7 m8 A% g0 W. y
return (size);
4 }+ M( A. H& ]+ L
}
. g3 T/ A$ j( R2 |2 D. V
}
% I. s( G( w4 v5 J0 g
, n# {4 L2 N" r, d* a& w- a& O$ b
return (maxsize);
! E0 ?' a, S- f9 S. O9 B
}
+ b1 Y9 O6 l: J, C0 p0 `
int dram_init(void)
: I; D) x' t0 V
{
+ j! m6 K2 ]$ p& d1 O. a
/* dram_init must store complete ramsize in gd->ram_size */
3 D0 V/ L2 C4 e* `; C
gd->ram_size = get_ram_size(
6 R+ {6 R9 ~4 g0 W, D
(void *)CONFIG_SYS_SDRAM_BASE,
0 J% W0 \8 q9 m- f& I8 o, Y
CONFIG_MAX_RAM_BANK_SIZE);
+ _1 M2 }6 q2 {3 `, r7 P, T: [4 B
return 0;
6 q) R* r6 H- a6 S! d
}
, m0 B7 g. r0 T* r4 [- i2 x+ m
$ [9 T- q4 v7 a0 k5 X6 v/ r. d% a( o
& q, b2 | g: [( Y5 D( ]% ^
9 Z5 D0 B3 S+ Q
8 `2 ?$ M9 T0 n" R- `2 p4 M
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
6 u; n9 f. d% l7 U( a5 n+ K
3 R& s' X5 B* s+ G9 v
) C4 @8 A# \; n# F& V3 [/ p
) d2 s- e( O! `! H; O
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4