嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
. y0 O+ C9 g4 P! @% ?
核心板2:DDR2 256M Byte NAND FLASH 8G bit
+ w) P: V" D6 a' L, _+ Y" g
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
" g$ j6 L, M! k9 u" {9 d2 t% E
( E/ l# I' Q- N, R
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
5 X' Q T7 S4 E' F# B4 l
8 w! y& N l6 ^: i. N
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
/ l) u# T. Y6 P/ `5 f
/*
+ x" F0 v! F# Z9 A, {) c5 B
* Check memory range for valid RAM. A simple memory test determines
0 d5 Z6 {1 m; D: c' s. n h
* the actually available RAM size between addresses `base' and
/ K" n& Y' U: a4 s- Y) ^
* `base + maxsize'.
, W. y+ Y; W. ^; j, r; G
*/
4 G4 [( G6 n$ f! S4 Y1 ^$ B1 D- c: Q
long get_ram_size(long *base, long maxsize)
5 w4 h' Z+ D/ S# f2 S
{
7 b9 I2 T2 ^' }& V+ Z1 V
volatile long *addr;
, M$ W5 ]& j$ A( m: p2 }
long save[32];
( l8 C; ~8 W! p2 N: |4 t8 I
long cnt;
/ \3 F2 U. g7 I- y3 Y& X# n
long val;
$ d+ S, n0 ^5 [+ f8 z h G
long size;
* x; m) f: s1 z% u6 P
int i = 0;
( E. z5 {/ ]" T7 E3 F Y
8 V, k- }7 t# C& f% x2 ?+ E
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
$ ?- P: ^- Q/ K6 R, c& |
addr = base + cnt; /* pointer arith! */
( t& d6 N4 a% O* x% e
sync ();
; y5 F" ~6 O: q; |# b
save[i++] = *addr;
I+ z3 i U8 A& j% A6 b
sync ();
! p! e; O, z2 D1 t& N
*addr = ~cnt;
: Y+ K- s4 s9 ^6 X( R9 I. a
}
3 i) j, l* h& E/ G& [$ b: X
$ z: k) o& C# k7 Q6 e
addr = base;
4 q6 e/ Z9 H1 {; i5 {) P
sync ();
6 t! h& i4 d+ o
save
= *addr;
5 ?8 _# y& O: j! W+ k
sync ();
4 j# @4 `* u3 T5 Z% Y' Q
*addr = 0;
/ f: q' }3 f; v( |
2 h$ _& Z7 R, q: T3 l
sync ();
( f& C: h- ~6 m1 y4 [4 i# A" E8 r
if ((val = *addr) != 0) {
% |0 a* O! \ {* t4 {( r( C% o `
/* Restore the original data before leaving the function.
! o5 ]0 V% m) y, Z- O$ {
*/
2 d% w0 N& A! j6 j. a; P
sync ();
, L- a" M7 \) P0 o5 |( V: G0 ~' r
*addr = save
;
! _! f' Y4 G$ f
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
4 r2 N* Y6 s/ T
addr = base + cnt;
" |7 i9 b: P; q
sync ();
1 a+ }; X6 @/ g
*addr = save[--i];
( A& G0 l* X9 j0 U( x7 Y
}
# f* L$ L/ r6 a# Z7 l& o
return (0);
" E/ ]( d8 t: D' O) M
}
q! z, F) G9 g' r8 R# N
9 \. n. q8 n& W }" u! x/ ^2 X
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
- `# c6 C* W5 @: M( m. C
addr = base + cnt; /* pointer arith! */
8 b7 c# ~ F, K, N! g
val = *addr;
) b' S4 e: W* y0 `1 _4 n( s
*addr = save[--i];
# x+ w* A: r, i, W7 u* h6 ~% y
if (val != ~cnt) {
V' v. L- Q3 D( N0 W4 r; g
size = cnt * sizeof (long);
! ?1 b( P) Q1 { E& b/ {
/* Restore the original data before leaving the function.
{ R1 ]7 s9 T5 t& H8 R) X9 i- @4 i
*/
7 W( p/ T; O0 k% S4 V
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
* |) v4 x& v' J" }7 c
addr = base + cnt;
- O2 ~; x& r# ?4 K+ F3 R& t/ N
*addr = save[--i];
3 L6 U* `$ o. l1 N2 J% `& l
}
$ x+ v! `7 {# L& o/ `" U& p
return (size);
4 H+ i% F0 A' U" g- _9 m
}
1 P/ q2 o) ?% A
}
: m- r6 ]7 V: w) I: P
) V# p/ R1 v. ]
return (maxsize);
4 C# n4 }, m9 d
}
+ z2 ~+ `- }% p* b& ~
int dram_init(void)
0 y0 Y; c4 G+ z6 k! E
{
* V; f+ E- F5 I
/* dram_init must store complete ramsize in gd->ram_size */
5 }- r( W9 X8 P6 w6 a3 S
gd->ram_size = get_ram_size(
. Q2 V) k6 W, j
(void *)CONFIG_SYS_SDRAM_BASE,
1 ]; U O, g0 S
CONFIG_MAX_RAM_BANK_SIZE);
0 {( Q/ m* S* @6 C& q- B9 Q
return 0;
. J d% d. L/ v9 U& Z
}
6 h# @5 }) E+ B8 o0 t
# H& o$ w+ j1 Y) E; T$ Y9 z
7 v" ~0 k1 I8 A2 B) d8 P& y$ t
4 t2 L* Q' ]+ T$ x" r
# g. ]* \4 a a) y2 R5 X' U
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
, R# c: W% N1 T" }) ^
( M8 U' d ?0 _2 }5 J) e& r
5 Q5 ^8 U& ], }, }
# m! E8 u: E/ i; z( e2 M+ k* b* i) J
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4