嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
2 ~( s% j8 ~2 [0 N" y: s
核心板2:DDR2 256M Byte NAND FLASH 8G bit
]+ v7 k$ _6 \; k" R9 s
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
* b1 J- _6 Q: z( m0 n6 {# |$ ^+ ^
# a& F' r/ g1 E) n Z
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
" F8 K% e) q) t& G. E/ U4 T5 e' k" ]
- E% w8 R: ? K3 B: @1 d* W1 Z
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
8 c/ V+ V+ y6 M& r. L( B" e1 r
/*
4 ]8 d$ V) S# k3 A# i; D# x R( G
* Check memory range for valid RAM. A simple memory test determines
6 R6 H$ A# D0 }6 n4 r
* the actually available RAM size between addresses `base' and
. A7 @) a. i: y7 G1 ^
* `base + maxsize'.
& `# z k/ p" r y4 U
*/
1 C$ X4 \" S4 E% D7 D
long get_ram_size(long *base, long maxsize)
+ H% R: K7 P8 ]8 K, t( C9 ?
{
2 R) Z2 F& }& K/ M6 q" ]4 |
volatile long *addr;
7 T& s& U1 G M
long save[32];
1 ?" b; G. R; i+ g6 {9 \
long cnt;
3 h! o; U$ {; M, c
long val;
5 C+ ?2 _ {4 \% E& {
long size;
/ N% f; d0 p( T: ?2 B
int i = 0;
- Z9 o& g* c% v1 E8 ~
2 Y& s. W/ ]0 D* Q4 N
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
4 E# _. i9 j* Q% e& p
addr = base + cnt; /* pointer arith! */
+ a( d6 W J' E ~# w
sync ();
; k& Z! `. E. A" O7 ` [& m
save[i++] = *addr;
- u2 m, E- u" b1 s
sync ();
0 X1 u8 T$ n2 \. R5 u0 r
*addr = ~cnt;
3 U+ u9 | r+ \- M' K
}
$ S$ x- `( v0 m
[' n+ [- Y. z3 A1 \
addr = base;
* t k" z+ V2 o: _
sync ();
* B% u, h: Q9 T4 }
save
= *addr;
- P7 O9 U0 h+ R6 V7 C5 D6 C
sync ();
; z: _5 K$ ^" w# w" j; p4 F, j
*addr = 0;
+ j# z$ F) E# \: S
- ?# y1 @3 y+ c: V ?- J
sync ();
5 V+ z9 t v0 C
if ((val = *addr) != 0) {
9 f i; F, F U! P2 x, |
/* Restore the original data before leaving the function.
- Q9 M, p7 k& j6 [3 r) m( W5 G
*/
7 y9 l" A: a( O! V
sync ();
+ s! E7 _7 P7 z& x/ z$ W
*addr = save
;
4 e) p% E+ Y$ O& L6 W$ Q
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
- w9 m4 K" F" o% @4 x2 ?
addr = base + cnt;
- b% r" @' V* F1 v, m- E5 T
sync ();
8 m0 a+ R% h9 k
*addr = save[--i];
" l/ x5 \" n4 \! d: Z5 d3 a- G) l
}
* |4 M, y+ l' V; v4 r
return (0);
" _6 j( D8 b4 V8 \4 |
}
: v% b" W8 r9 X! f+ |
+ K: I1 M/ @ w+ B6 L0 g
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
9 F8 b4 j* X$ D+ y3 z# h6 ~
addr = base + cnt; /* pointer arith! */
9 i# I0 {- T% R+ n1 i
val = *addr;
9 F% s) o' s" z5 A% p9 i3 R/ x
*addr = save[--i];
4 O" L/ Z0 \6 `
if (val != ~cnt) {
1 m. [6 s7 A C( O) v/ q8 d
size = cnt * sizeof (long);
+ ~2 j+ F9 T7 L5 B( i
/* Restore the original data before leaving the function.
* L# n; Y# ?* W
*/
8 S6 O2 E8 X* q* c8 T8 \
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
# w! {% J4 z% y% _% V
addr = base + cnt;
6 Q! h% }2 Z. l( c# {/ k; a
*addr = save[--i];
+ j8 B2 X; R7 J; T$ `) Y3 g [
}
, D) u0 T |9 F' j! _. @
return (size);
# _# R9 Z( y& V# `# X/ j
}
& A; _: K' f9 c. r1 x( L
}
' I7 m- o5 C+ D/ O V3 _6 J
4 E5 B/ n) f2 o
return (maxsize);
: U! E K- K( F3 ?4 {$ | w2 W6 C
}
4 }, V) H0 S: }3 `9 V% P
int dram_init(void)
0 _6 q! O% Z/ \5 X6 y' b! |' p
{
, s. \. V$ M8 R C# |# S& z. i% P
/* dram_init must store complete ramsize in gd->ram_size */
% ^/ F7 }% F% [. i6 v
gd->ram_size = get_ram_size(
3 V+ W R- {7 E/ g# S0 P4 ]+ D
(void *)CONFIG_SYS_SDRAM_BASE,
6 ~! e3 Q- \7 b# h* z( `
CONFIG_MAX_RAM_BANK_SIZE);
" x7 l5 f3 w4 P4 Q8 @% U& Q: m, q, T
return 0;
8 g/ A p+ u5 X: U: Z1 R' V
}
% U4 G$ n; K8 e, ^" ?5 L2 A% [
9 l+ E) u: D- Q. p/ K* |
1 t/ v5 `2 W% K4 v0 d5 t
- b$ d2 l3 R6 b3 L/ Z
( v( h* o. X5 X' o) d9 P' x
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
% u6 F8 _; u" g3 a4 \* w
$ B9 H, l- _* t+ X
t+ f2 g2 m2 d1 d+ ]
) }8 v% v: B8 q, D$ ^
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4