嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
1 ~+ A/ H9 M) @/ U! D7 K+ W
核心板2:DDR2 256M Byte NAND FLASH 8G bit
C# E z1 Y: M" c9 n7 h
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
. S, L( s' W6 ^+ D- d1 z r
/ y; C1 h, I K% B: a
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
( h- s6 |7 z: i- [' j1 n
. r* d$ o4 E) ~1 j9 w z
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
7 K2 b5 |" Z) U2 p
/*
% k2 r: c9 ~0 L+ L8 k
* Check memory range for valid RAM. A simple memory test determines
) E8 k+ l0 H# ]6 {5 g
* the actually available RAM size between addresses `base' and
8 n/ h, e/ [5 m4 n5 h$ t
* `base + maxsize'.
3 M; r$ B; e! U( F* E( h" y& F
*/
7 N& C+ G) P2 b' Z1 z
long get_ram_size(long *base, long maxsize)
, T3 I; m9 x: z( L/ L
{
8 }8 R: M, B- a
volatile long *addr;
* F0 h( k. Y4 }% b3 b0 c
long save[32];
$ q# E5 ^! U: w" F# L
long cnt;
& [' n! f+ R$ p4 i4 C( k
long val;
/ B) i! A" j7 b4 T4 X: a# y8 _( _
long size;
& G* n- |* H! F6 N
int i = 0;
! e; ~% @" i$ _3 \1 ~7 ^' y
" e. K+ m7 F5 V+ _
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
# r+ k! {7 [, _: g/ H, h) m$ k
addr = base + cnt; /* pointer arith! */
' q, A5 a6 H# T+ L
sync ();
* |) u5 u; X y6 x7 Z6 A' {% ~& o
save[i++] = *addr;
$ }' r0 `4 \- J! [4 o$ Q$ ~ D
sync ();
" K1 x2 ^: V* j# g
*addr = ~cnt;
: i# |* O; ^5 }8 p: x
}
4 ^; _) C% X/ C% U- M" G
P# b3 R4 [+ L2 U: O/ B( t
addr = base;
' l% x+ }5 X1 d
sync ();
& {1 l |3 Z [5 K$ `
save
= *addr;
5 _* F' W. a1 x! h9 \9 g
sync ();
; d3 f0 S4 M& R' V
*addr = 0;
0 H% C5 M( S2 |. W
+ s. J' p; D) z5 R% |* ?. i
sync ();
( d M l, R, V5 _6 \
if ((val = *addr) != 0) {
4 j2 h# H) M" f) y4 R+ {. c
/* Restore the original data before leaving the function.
1 [% L7 ~# V* m* H4 m
*/
* i& A# s. t" J) I# [3 ]
sync ();
" m; N9 v# i* X0 G2 n0 d
*addr = save
;
8 N5 d$ j- C* u0 a+ Q" c' Z' m3 o. e
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
/ e+ n/ U# |) @# A
addr = base + cnt;
% A; I( D8 b9 ]# [8 N- g
sync ();
# X' N$ [2 t8 r& j. B
*addr = save[--i];
* F3 @2 I" Q9 p. ]9 L% n
}
$ |! r/ B( k, h5 P0 z" a
return (0);
# \' m! I7 R) u9 ]3 z7 U
}
9 T- k7 b P* u" e! r5 J F |
- \' ^, {" Q K' r: U
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
" X6 O* m, B8 m. A- ~
addr = base + cnt; /* pointer arith! */
- |& W4 `; z% z( k; U2 ]5 N
val = *addr;
( o) p, B X3 K. F
*addr = save[--i];
8 f6 |: d+ J9 V0 i
if (val != ~cnt) {
$ c4 d7 _4 E5 l
size = cnt * sizeof (long);
& |8 G( D( q4 s0 W& |
/* Restore the original data before leaving the function.
9 [/ D# C( J* l2 I$ W
*/
- C% {5 o# O( k+ P7 H ?
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
! {& }( i3 d) L$ J& w/ t2 \; L
addr = base + cnt;
0 K! G. {4 Z) [1 |9 v s2 c
*addr = save[--i];
; } Q$ V0 P- ^6 k* }5 u" s7 K
}
+ H- i# l# d+ |0 V
return (size);
$ F* y1 J! ?" W1 ~% h
}
) k' t3 A% ^2 J5 Y$ A5 j/ J2 {
}
! v+ Y% S& J+ ]
: h9 d p* c# G3 s
return (maxsize);
1 k+ r. R8 X/ J
}
2 ~+ S1 w1 K7 @" p
int dram_init(void)
. p7 ]! Z5 D- C
{
# Q+ i6 n1 U9 e n5 f% g/ U
/* dram_init must store complete ramsize in gd->ram_size */
) s* {- N: x& q5 F1 Q
gd->ram_size = get_ram_size(
" C) v' L& I p' }0 B7 x
(void *)CONFIG_SYS_SDRAM_BASE,
3 z Y$ a3 b8 W9 v6 c
CONFIG_MAX_RAM_BANK_SIZE);
# @% w5 @: B9 @. D
return 0;
! z' z0 ]( C/ |; X
}
) `5 u! }* H. A/ m* t2 i
- t- r( T* A: e
_& \& `+ w* C" g5 B* H
1 J V, u8 a } p3 I0 {7 _
4 M5 b' ~7 L) ?( r% Y/ J
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
; d" c! P2 Q1 s" W( A" x9 ^
- b8 b+ K8 J+ m2 F; T3 Z: \
, k( ^- B2 t% R* z" w6 e
2 @1 h& t& S7 |( ]
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4