嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
0 ~. s$ ~* j/ W9 F* N
核心板2:DDR2 256M Byte NAND FLASH 8G bit
, _3 Y# Q1 g. e+ ?- U* R* @, N
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
8 L ^5 \# t( l
$ B% {% y& S: T+ [7 a8 M
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
( B) {& w7 o+ d3 t
. k) e0 {7 t) a3 P9 e
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
) i* k( W! i& O6 S3 {: ~' Q1 V4 w
/*
7 D3 ?8 J+ [5 Q& b0 f4 c
* Check memory range for valid RAM. A simple memory test determines
6 n3 K6 h( E( o* J# X
* the actually available RAM size between addresses `base' and
! o/ u) ]) |' G( x* D" Y. D# j
* `base + maxsize'.
( _/ i3 K/ E4 P; d4 r
*/
1 I2 s6 O' D/ x3 G
long get_ram_size(long *base, long maxsize)
& J% x' s" n8 e9 U" S6 f" \
{
7 i! a' u$ k# Y" E, f! w! u
volatile long *addr;
7 X4 ?1 Z) o7 r
long save[32];
& ?- e4 I8 j1 J* T5 L3 ?
long cnt;
1 h6 j/ d* r0 m0 A, M
long val;
/ \3 o- U- ?1 C, Q
long size;
5 V/ x' ]3 u, t# Y D! u
int i = 0;
% w ^* |% x' R1 g ]
# w3 _& q2 S+ K _) c* W$ l. }
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
n# k6 Q4 L" h" s/ z9 G
addr = base + cnt; /* pointer arith! */
Z, f0 Z9 T. ?4 x P9 ?1 i
sync ();
: P: r# f3 Q, P9 o% F
save[i++] = *addr;
1 Z! B! c) D' K1 T: v5 ~
sync ();
$ c3 ^5 }! ]5 f
*addr = ~cnt;
6 g/ H4 p) y# d3 z* f6 O5 L2 g! c
}
0 a# {" F) r; h) e* f/ I5 p
/ M! U S e3 } I7 N4 S# K
addr = base;
0 S5 t9 _# {" H* t3 K; ~! ~
sync ();
0 v" F0 |7 T, y% S! ~3 p2 y
save
= *addr;
% u; i' e( A/ X8 i" Q1 n
sync ();
# B4 y) H. j1 D! ]. L: ]
*addr = 0;
$ w! d. I& _* `0 V
( f/ G- ?$ w+ ^" i! A, f
sync ();
3 f- k4 i* X& z
if ((val = *addr) != 0) {
# Y3 k% o) ^; ? s
/* Restore the original data before leaving the function.
$ F) T: p; q- e# i4 U) }
*/
! E0 l6 X. [9 [$ e
sync ();
9 J. N% L! Z( |& `( F, K1 X0 _5 u
*addr = save
;
; Q0 e2 W* ]% r. H% b& o
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
% |( j: h5 }6 X$ l
addr = base + cnt;
/ W9 w$ s- R8 Y5 F: G$ v
sync ();
) k$ l/ b/ n, L# q" ~: \
*addr = save[--i];
; n% g) f n# h3 R" D' W
}
: h" A, T# O) M6 x0 x" y
return (0);
8 M i' z. O, D u
}
2 `0 e$ N4 h2 c. x# F) O
) {8 L: ?! b% j) ^& V: e* K
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
# B8 w4 ~8 o7 Y' P$ ?2 Y
addr = base + cnt; /* pointer arith! */
0 v0 A" w" @5 W* \# K k8 I
val = *addr;
5 Z7 ` G) u0 \7 l! S1 j
*addr = save[--i];
9 ?% I5 Y+ Q6 n2 i6 h: X; F8 g
if (val != ~cnt) {
p5 ^! E; z3 k4 \- _8 w
size = cnt * sizeof (long);
0 W2 w0 x$ ~! h$ @2 w0 \, z
/* Restore the original data before leaving the function.
' t% n/ A1 D$ ^* c( ^" S. j
*/
' m3 X9 C Z8 {
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
+ A4 n6 y: D U1 G7 [ m: E
addr = base + cnt;
& N v- d9 B# l' `' d% `8 [0 B
*addr = save[--i];
& t1 h3 P+ `2 c, h2 G9 A& e9 m
}
# a/ r; E; D# H$ G$ H6 Z
return (size);
0 T( E* k& b) z- W. H# E) b
}
* V0 u3 U7 B5 W- _6 ?1 F* B7 k" z
}
2 K3 \* Z) P+ w0 |/ Q) e
; S8 s' f- g- n; Z9 B4 c
return (maxsize);
' }! _: N" h) Q5 `% S# j
}
/ ?) o& h8 k( ~. s! o+ X
int dram_init(void)
8 ]8 m( Q5 |" w7 r: A: G1 c+ z, V
{
* G, [) A. L( q( ~9 d( o0 E. a
/* dram_init must store complete ramsize in gd->ram_size */
* _& a& b5 b( z
gd->ram_size = get_ram_size(
' Z: r- Q) D% |: a4 a" t
(void *)CONFIG_SYS_SDRAM_BASE,
/ Y/ e5 w0 Q* a! P1 y' W; ?
CONFIG_MAX_RAM_BANK_SIZE);
* a( Z) C9 A4 m9 a- P6 s
return 0;
* e7 {: d3 O5 F, L! [+ |% U ?* X5 ?1 P) d
}
- w; ^ Q( m% ?0 |6 J
( w) |3 Y: o+ `2 b' }. }5 z9 C
3 A4 r0 V9 F' k+ i0 F$ r' Y8 K
$ i+ V( K, g% g. v
! w( ?0 b; e3 Y5 L1 l' d, m
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
8 e0 ]2 f) B; I& n+ b/ [0 E) C
7 ~$ a* X. ~6 Z9 E( A
3 V+ z+ R1 m' b# F0 i1 B
! d3 g# b8 Y6 o9 ~
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4