嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
" v2 g: Y7 ?' y
核心板2:DDR2 256M Byte NAND FLASH 8G bit
1 p1 O# ?1 K) m. y
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
; J/ y; ]+ s& V0 ?7 J% |) U8 b
2 D3 Y a5 `! b H" \: N7 Q$ t# w
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
; E9 ~# @0 g) Y: ^4 P2 j+ w% L
, `: {# b( O/ E
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
) u$ q, s; ~9 ~- ~: k
/*
% \6 g9 C3 Q- Y, g' Q
* Check memory range for valid RAM. A simple memory test determines
~, y. D* L/ r- ~; s5 A& U9 X1 p
* the actually available RAM size between addresses `base' and
: `0 H" G. V. T6 t% h
* `base + maxsize'.
, _1 d5 A# J4 S
*/
4 S8 _2 J, M6 s7 a1 _% a* O0 h
long get_ram_size(long *base, long maxsize)
3 y' _+ J: _0 |! H+ V* S7 }7 B
{
' S* Q0 C9 t1 H( A! [
volatile long *addr;
2 R8 F* d8 A9 \4 y5 q1 d. i
long save[32];
1 A9 q+ f7 K+ W4 U9 [) d) y
long cnt;
8 F5 z& ^, B# t# d
long val;
# K" y1 s" j* y5 W2 ]# G
long size;
) @. ^4 b! M# n2 \4 l2 U/ H; D( x0 Q
int i = 0;
2 @5 P3 E# o+ n; n0 E' e3 q
5 l# S2 }. P! B! o+ J: s6 O8 g
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
- W4 ]* _& l' T* M# v( N; F
addr = base + cnt; /* pointer arith! */
7 y& K! Q g: t+ p) E. _' L z$ D
sync ();
9 f- I8 F+ f9 E+ [- t+ @5 C2 |
save[i++] = *addr;
0 b& [% c, s* n n! ~: Z t
sync ();
# N# N* M0 F' \+ z+ S
*addr = ~cnt;
$ l5 ? d8 {' ^7 D! H, \8 q
}
4 j& q+ b, R' t
( H5 j4 a. d! D' Y7 x3 a- J
addr = base;
# d. ?( w. u/ s. T5 b
sync ();
, R8 T2 @1 L7 O2 M5 G+ c& ?
save
= *addr;
0 {" n% x/ T& [- e% x
sync ();
( t5 K# W; w2 n. _1 G# f& w% A* m
*addr = 0;
3 Z" Q( R$ [! b4 s
% H- ^5 @4 f& A- P+ `; a! O
sync ();
7 C2 N1 I4 t* q
if ((val = *addr) != 0) {
4 N- `, h2 ]) w; u1 E5 B
/* Restore the original data before leaving the function.
6 s$ A7 r2 D c$ O3 S* V
*/
4 n: e) T3 X" l* @; n$ c9 i/ C
sync ();
3 N1 ~9 Q" A3 l% V: p
*addr = save
;
& M, c( o1 P5 W% x
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
) F6 x0 T( }% g. a1 n9 l% {
addr = base + cnt;
$ R' T3 p' _/ \! M. u: `/ q
sync ();
1 K# ]8 B r" y, D) L0 m# c, J2 \
*addr = save[--i];
7 d! K/ f8 O4 Y5 M V8 c8 p" }: O
}
+ T1 B/ a4 T5 Y. P4 [+ O- d
return (0);
: k2 d+ G- `; d6 a: S: ^0 U
}
$ W$ }* ^( b2 d( h6 U) p
7 g, L8 R* o8 w7 h0 I5 t: \
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
8 [7 r; y+ L* |$ Y/ A
addr = base + cnt; /* pointer arith! */
9 Q4 A1 l0 w1 D+ U2 l
val = *addr;
# v `2 V5 o$ G( M
*addr = save[--i];
* j! E& Y/ u0 Q1 v7 A
if (val != ~cnt) {
0 U% v- v2 |6 f4 R) K
size = cnt * sizeof (long);
% ?/ I5 Q. H& g4 X* B
/* Restore the original data before leaving the function.
* Q7 n; N1 ]+ F ^+ p
*/
3 r7 v6 d5 H* P6 p* l( D9 T- m" R K
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
9 _7 [% c6 Q5 L
addr = base + cnt;
' K0 }. ?: u+ Q6 B- }
*addr = save[--i];
' F; ]8 r) ]( T
}
: L' J/ j/ O& a# G* s
return (size);
, n8 ~# }; y/ a/ l, f
}
( @* J; j, U& F% R+ x- z% O) C$ i
}
! b @" X" i4 J2 Q6 ^7 h+ T; {( t
$ d6 T3 R0 r# [! D, `( }. b9 X
return (maxsize);
, @1 Z5 H6 X9 ?1 ^+ M
}
' [; y% p0 N% A) f* ?- `- H
int dram_init(void)
" N- W& [' \! ^, ~0 K0 q7 z
{
5 M9 Y. C( W0 L. V
/* dram_init must store complete ramsize in gd->ram_size */
4 n/ i3 I4 p0 |! C B- O
gd->ram_size = get_ram_size(
8 W6 k3 G" p9 N% ?2 E! Z
(void *)CONFIG_SYS_SDRAM_BASE,
) j) R% w: O6 g4 W# G6 s
CONFIG_MAX_RAM_BANK_SIZE);
/ q9 Z$ `- q# G+ B
return 0;
! u& [* Q2 {2 W. L! {: }
}
8 }7 k3 Q9 B3 y; p) N1 T
7 ?; V* E' @& R4 J! {% j+ I
/ _0 ~2 }( P2 }; g @
& M v9 f% l% j% i4 F; s2 a. g
& v9 \- F) ]9 d F( r
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
6 \: m1 i* \! A' d
* r0 Z* H4 m s; t4 c$ C. U. g
- N& g; O" [1 `4 h. X. a) s# g, w
& Q9 y( N2 K1 a4 p2 O3 P/ L4 o8 [
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4