嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
, S0 ?" E- | l6 z& R
核心板2:DDR2 256M Byte NAND FLASH 8G bit
4 L( {: q2 [5 b. @
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
& N+ v2 \7 h2 Q3 w
+ ~5 N5 L7 I1 X: N' b7 N* ]
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
& E3 r% L4 }# G3 H! f
0 X: v" F& Z( B) A. C5 N
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
9 ^" j0 J, K7 y( h6 Z
/*
$ {# }5 T" T5 Y* _" C! @4 T
* Check memory range for valid RAM. A simple memory test determines
, |, M4 m( @2 M, P1 D% s# n
* the actually available RAM size between addresses `base' and
6 C p& Q2 ^* _& a# m- T
* `base + maxsize'.
6 O6 T1 `; q, [* p# ~
*/
4 e, `, k& a2 P+ ?( X: U
long get_ram_size(long *base, long maxsize)
$ N5 B q1 u4 t5 P: t
{
4 |1 R% P9 g4 h1 d
volatile long *addr;
1 c& T' _9 F" y; f( M6 o
long save[32];
3 |! c6 P7 B. t
long cnt;
+ [! H) i' T# X9 ^# w. K+ K
long val;
- n# u1 L; v; q7 t
long size;
6 F' B* k D! N+ f. _
int i = 0;
- j2 Q7 ]6 b- M; `6 v
4 }2 Y# o8 R3 L, H' h
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
/ W T; `1 r: v& b H* Z+ O
addr = base + cnt; /* pointer arith! */
, n# B4 Q& l% h' b& P8 Y P
sync ();
) }, |7 Q2 q5 u6 }4 R
save[i++] = *addr;
* i( y, v& y: N
sync ();
$ l/ L5 v: H4 }
*addr = ~cnt;
& P/ Z$ d% D6 N/ A0 K$ E n
}
! F V- d& G8 D& Z
" ]# {( p& ], |; e2 m1 x" ~
addr = base;
" W5 K9 J+ o( }
sync ();
% i! a: s' g) w' N. o; f5 J( Z K/ J
save
= *addr;
& Z2 x8 S, S( V0 c* U# n+ c
sync ();
5 P' F* R' S* y, G! S
*addr = 0;
0 f# P# o A) H, g6 y
# d" p: }7 B! S9 b {7 B5 ?$ D
sync ();
. F; h. F" `0 }! J
if ((val = *addr) != 0) {
1 [! D3 X% k, V3 F" b2 m+ `+ C
/* Restore the original data before leaving the function.
3 L8 {6 }% ?9 b1 E( }6 [* s3 w, T
*/
4 ], O+ k- A9 Z8 H: k% y! _
sync ();
% |' _ r2 c/ \$ u+ y! F2 I8 a
*addr = save
;
! p( ]) g% D# ~
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
. f. j( Q5 K( m: \' [9 f+ g! i+ p% L
addr = base + cnt;
+ n$ \+ K! x; F* B! r: s, n
sync ();
( |. ^) U2 [7 \9 k0 Q
*addr = save[--i];
: T$ p( a3 p7 }& X0 f# P& R3 \1 A
}
4 S! l1 i$ {2 ^5 J9 D: Q
return (0);
& ^9 {; J/ _: T7 Q* a& x3 r% t# m
}
- G* B; w4 e0 T+ Z# ?
& d: }. `+ q5 ~$ a. j. c4 q) A
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
: j& ]& C7 x1 e* ?: o& a
addr = base + cnt; /* pointer arith! */
; g% \: {2 e; o" |' @7 O" h! T
val = *addr;
& T% s5 _& ~" o8 P4 Z
*addr = save[--i];
2 `- q7 }: V' H& D
if (val != ~cnt) {
7 z( O( p! L2 W
size = cnt * sizeof (long);
8 Y$ M6 A2 N1 C
/* Restore the original data before leaving the function.
% Q& Y. I! I2 a
*/
?4 Q) E A6 k {, y0 q% Y
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
+ H) I. B% S1 Z& W) H6 a
addr = base + cnt;
( I" F1 p9 a' J2 n+ K8 i1 |
*addr = save[--i];
5 G$ W* F: q( s s6 [; j- V
}
1 a, Z% G# q3 f2 G5 C/ U. x" N u
return (size);
4 e6 h8 I& E4 z% a. h/ U( p
}
T# p- B, \8 w8 h
}
0 t6 [6 \/ _5 [4 U9 q& u+ z
( u" l) f9 d( U9 y
return (maxsize);
/ R' ~$ _) R+ M3 r, I
}
?( l4 \. U1 N, O G8 N7 o
int dram_init(void)
9 W( |0 O5 ], [. |
{
3 j( w' d) v. J) ~; C% B7 }# U
/* dram_init must store complete ramsize in gd->ram_size */
: h6 n% R- J% p! b' A' u! l
gd->ram_size = get_ram_size(
/ A6 \9 L3 ^# |1 d$ P- a
(void *)CONFIG_SYS_SDRAM_BASE,
, _, B K; Z I! y' Y; X9 x" k
CONFIG_MAX_RAM_BANK_SIZE);
7 B9 _1 i, X, c( n5 U8 Q
return 0;
: `/ S, J* _: \ E4 v( P
}
5 n2 X q$ Q/ C6 e8 ^$ v7 f- h
* ?2 @. t( r C/ q1 B
* C! v: W/ N2 T. y( V7 E
z2 t$ c0 E3 e; |' [0 ~$ _
2 i9 Y0 X: o& ^' r2 N. P3 ]
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
0 I: _ q# S0 {8 ^
|5 Z$ i5 O4 Y- p/ T- X
" g, s' d" y( ?7 f& w% W& C
( g4 p( m' m3 p$ z8 w
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4