嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
5 v/ J5 ~) x ]. S
核心板2:DDR2 256M Byte NAND FLASH 8G bit
; h# s! \6 m) O O! z* X" g+ H
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
7 h2 Y: H' F3 K5 s0 N
& w: y2 {' _9 [( h" |7 V6 p) _
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
" |. e3 }% s* |7 F
' A! |2 ]* Z( r; N
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
6 \7 Y$ ~1 o; ~* i
/*
1 ?' o4 b2 V. q2 c) I
* Check memory range for valid RAM. A simple memory test determines
5 M2 [& d0 n% J) o
* the actually available RAM size between addresses `base' and
( A3 T/ x+ v8 _
* `base + maxsize'.
5 @, B4 X4 R+ S( \8 k
*/
- b, ]) B2 y& W$ E
long get_ram_size(long *base, long maxsize)
# q p' u' p% D- {$ I4 j+ [3 i
{
0 R2 O e& P4 l3 h
volatile long *addr;
3 k) a* ?; f9 D* P- E) X% C( u1 u( z
long save[32];
2 E" B5 O9 [5 }/ y9 s
long cnt;
6 T) H) I3 i6 v! A
long val;
9 v9 _( r0 \% Q0 O8 K
long size;
9 X& {* S# U/ `/ R( p3 X
int i = 0;
& i+ Q2 p7 L) u% F2 c f5 y
3 T% n# c+ t: l( J8 ~
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
4 {: N- v( ^6 W/ X
addr = base + cnt; /* pointer arith! */
9 r4 ^4 y- Y# A" m" |& A3 F5 F
sync ();
* I. } w" r5 L6 ?$ k9 c
save[i++] = *addr;
! Y7 t; }1 S0 i3 k9 x2 d) z
sync ();
0 u( s4 N" O3 ^8 I5 W* n6 _
*addr = ~cnt;
; J9 Q6 @' w7 w. n" e, y
}
+ n, {- y3 R8 c! Z% E% m
% o% A5 X0 L6 Q2 g
addr = base;
# b# n' x+ ^7 i2 p/ O/ o% m
sync ();
7 R( l& B3 L% y7 r" }- g4 J
save
= *addr;
4 Y8 ]1 x( V# a y3 g; ]) e
sync ();
7 [/ j( C" c g/ o
*addr = 0;
0 b5 j! L9 u6 T% f" m' F8 T- w+ u
( b. B# C1 z+ m" o( A s) ~/ I
sync ();
6 H4 |: B9 m" D$ V! v9 L/ u# a
if ((val = *addr) != 0) {
, M6 `" x ]" h6 z" I5 B( V3 ]
/* Restore the original data before leaving the function.
3 d4 H- @+ }& R, C U6 y- l
*/
) U d% g! S9 _+ z- P2 v
sync ();
6 H2 G& F. W% S2 B
*addr = save
;
: j9 ?5 {# e& ]" k/ W9 H/ p0 ~( M
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
* ?( j( K7 |; o% A' b$ f
addr = base + cnt;
* d0 u# }2 r/ @0 B
sync ();
- a! w! X& [. d( L$ z& F3 D
*addr = save[--i];
) @& i" Q+ ` m9 i
}
! ]9 m" H$ v* g9 h2 ^9 `9 H1 Y( x" |
return (0);
; `) n# c0 s. b
}
9 c* e/ a: s0 B
5 ]3 e: ^& e8 K6 O
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
& d7 c& Z" U$ e a+ V/ p
addr = base + cnt; /* pointer arith! */
6 r1 x' T6 t1 K- y# R
val = *addr;
! R: h! S0 ~1 U6 @* P; D
*addr = save[--i];
9 x: _0 M4 j) J4 U3 S+ L' c3 \ f
if (val != ~cnt) {
6 {8 z: W8 D* ^' m8 o1 O2 c& n+ t
size = cnt * sizeof (long);
- S- w) U- x2 l0 |0 Z
/* Restore the original data before leaving the function.
+ } T( j: C- G( ]
*/
6 E% V5 d) A; x
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
! C5 T% C- t+ r
addr = base + cnt;
$ m% o' b! f4 w( y
*addr = save[--i];
( u3 m, F* S/ y) W
}
3 [% R8 v r: I7 y9 @: e. k
return (size);
+ R8 `8 X* W! B) z: F7 I2 ^# ~8 b
}
# _# [' A$ v: w5 |& `* A, t
}
6 n3 p1 a; V. x7 q
5 t) f' @; B6 W1 Z; d; Z# c
return (maxsize);
6 `4 D& z7 q R! M$ V- ]
}
: F) Q' a+ \( M5 e: W3 q
int dram_init(void)
4 A$ k9 p6 r. I
{
5 u; y6 ^ a4 X! h& C0 P5 ]( O* J9 Y B
/* dram_init must store complete ramsize in gd->ram_size */
- K* v+ @% n* T% j% k6 M( ^
gd->ram_size = get_ram_size(
+ i6 @* d( Y" a$ D6 O
(void *)CONFIG_SYS_SDRAM_BASE,
# i6 ^- v- e, U% d' v9 A5 V
CONFIG_MAX_RAM_BANK_SIZE);
7 a( z H" M9 R4 M
return 0;
/ j% v0 V& k) E
}
, I% p& v# E. ~4 Q; e- i
* s5 c7 l% F' k1 o( l" J" K' N
- R: ~# d6 a% U8 t3 h
" K' S1 w& s% k, }
* n+ e _$ X& x2 b9 B9 ]1 Q' D
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
: I P# D/ x7 C2 j7 |
" e! J i! [' {- C; c4 q
# j) _+ S; L- P5 [8 b
% S1 s9 n& ^7 _7 E3 J, x" q/ d
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4