嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
3 I. z7 Y5 I/ K0 i0 W9 j
核心板2:DDR2 256M Byte NAND FLASH 8G bit
" ^- F$ Z- t; I m* l2 g
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
" z" l* E. {; }; f
+ E: f2 ]7 i1 e# V! `
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
5 d, w' m, \+ x: q N. T6 O4 y
8 l! z! s4 T+ @1 {0 }
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
. l2 l, W# N6 M$ W5 Z
/*
- Q/ `1 e4 ^7 N) V
* Check memory range for valid RAM. A simple memory test determines
* E4 q% W; b$ j( Z# X
* the actually available RAM size between addresses `base' and
! I3 i, E& h3 {& z" v6 ^* ? P: Q! Z
* `base + maxsize'.
7 O. C, t+ y6 }! z0 M
*/
0 n9 Z. K$ Q+ G H
long get_ram_size(long *base, long maxsize)
9 L# P+ Z4 ?# x
{
) b! P$ S2 G7 M/ c6 e3 a
volatile long *addr;
) k3 u. A1 j3 J5 F% b( L
long save[32];
s( w9 d# K- ?* z" u
long cnt;
! z; O, D- C6 Q9 F( ]
long val;
# W" v3 @/ o2 [* Q3 q. ^; p' k5 @
long size;
! S, _" E% q6 g* ^) b& x
int i = 0;
2 k' J5 c5 {- i) l/ `- u8 V. O) B
/ @( {5 F" G8 k% @
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
+ g% V) r3 y5 v6 \ r+ S4 L5 Q
addr = base + cnt; /* pointer arith! */
1 x: u& C" O6 A7 W8 l; e
sync ();
+ S% M9 s$ S- ]" N/ ]
save[i++] = *addr;
5 ^5 U5 e) P6 j- E0 M4 T e
sync ();
4 n6 a4 b2 J+ G+ r
*addr = ~cnt;
: M! \8 x+ m* F* k: O& _
}
1 @0 m; S6 ]/ F6 g8 x
0 x. W( P" Z. f+ J" @, j: t
addr = base;
! L9 X; O1 ^* g% p* i
sync ();
. a% S( P5 N: p! X; \
save
= *addr;
: `, B' `4 T6 h g# i2 j
sync ();
* d6 P: }; z v# p S+ H
*addr = 0;
; a- E1 Z j2 Q P/ m
4 z6 a% a/ W: f- d
sync ();
& [) M9 z& O3 p
if ((val = *addr) != 0) {
( y) r8 t: J, i1 c8 E7 n
/* Restore the original data before leaving the function.
: J: ~0 p6 B- W
*/
- b4 Q8 Y1 r* g" i3 ~. U
sync ();
2 i J J( v j& E/ ?. c
*addr = save
;
+ W! C- Z1 P3 ]" U
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
' s: X' w- D8 o2 h: c- q# q) L$ r
addr = base + cnt;
% E& W Q, C- K( B8 Z! D
sync ();
3 J$ X$ i+ w' k% R3 \
*addr = save[--i];
) L( M: _9 x- z+ J- B/ t
}
. S7 U; U: V: e
return (0);
7 {; l5 b& G. X! j8 ?; O
}
5 U. z8 O$ ^! x. w9 z
/ Q9 O" _( |& r
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
/ m- m# T q3 a% M* h/ W8 i, V
addr = base + cnt; /* pointer arith! */
# m1 L9 v& D( V( f1 {2 a
val = *addr;
2 K, E( R9 d; P5 N! s/ x5 P4 M
*addr = save[--i];
) z$ G# x9 c% S" ]" h# y0 V5 `
if (val != ~cnt) {
8 z7 X( t/ S& w, K0 O0 }/ L. Y* |3 l
size = cnt * sizeof (long);
" L% ~. R9 Z5 p1 A d, q
/* Restore the original data before leaving the function.
( s2 p8 l2 t% {& F
*/
0 V* t3 P4 A$ {
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
0 J6 e& z) R; |
addr = base + cnt;
. b! }! D0 d4 [. V0 v+ n- Y
*addr = save[--i];
+ X& v+ @9 ~. l% t; x+ u9 o
}
. A: b8 s1 X5 T: c. p' [/ f
return (size);
/ A1 i$ ?5 i1 i6 b' }
}
J, }2 g* d# _# r9 n4 {* ^/ j
}
3 q& t* R% H" y( K, v+ u1 Y
$ b0 E( w: p( {* @; h
return (maxsize);
: Y! x" g4 y& n7 B1 Y5 z/ \2 J
}
Q. s, E/ x; {, O' l
int dram_init(void)
8 f+ A) x! m4 x7 h9 X
{
6 N* b7 E5 V1 o. n
/* dram_init must store complete ramsize in gd->ram_size */
% f/ \* d2 \3 J1 \6 }% Y- k$ U
gd->ram_size = get_ram_size(
& S# a5 i* F" m' T7 O
(void *)CONFIG_SYS_SDRAM_BASE,
5 y* ?) [. O5 R9 k* c2 s4 X& i
CONFIG_MAX_RAM_BANK_SIZE);
9 N i% I4 G6 ~( U
return 0;
& K$ V) `/ D3 k# o3 v, o2 ~, k9 q; W
}
, p9 m! ^! F2 Z$ @# g- ^
2 y5 m, t3 }3 k# l4 m1 B6 N
- q0 r& P# w' s
( P0 h& }: k! o% {# |
7 D2 z z1 S. M
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
( b B7 o: x, A% Z' O- ~( k5 s
* n; r/ ^4 w1 x1 z
/ h3 z& P7 {& a2 H: q
: a# ~! }" A- x+ e/ N
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4