嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
6 q' N1 A1 y9 {: M+ `7 w
核心板2:DDR2 256M Byte NAND FLASH 8G bit
9 Z! M% e, F5 ]1 e7 w! [
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
' X9 h$ [) J6 {. |! l5 `7 }) Y* b4 ?
) e" Y. M7 y) T' ^0 d3 c% C
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
% C, C. z1 W# O; ?' d% s
( N& S* y# t% w. y2 z, h
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
4 A3 Q6 s* Q5 g6 w0 I9 i, E/ {4 W
/*
2 \$ Q6 U' O: U6 X; `& o; x
* Check memory range for valid RAM. A simple memory test determines
- n' D2 H+ L# K3 V
* the actually available RAM size between addresses `base' and
! e# b" h B; M4 }7 T
* `base + maxsize'.
# r4 `/ B d0 I
*/
' j" C" g3 H4 f: N' b& D- P3 ^$ s
long get_ram_size(long *base, long maxsize)
. k3 q0 I' @' |0 V( G' @
{
! B1 @( a" ^+ d/ [/ Y4 A; ]$ X
volatile long *addr;
$ K( l/ e% Z- S2 K, Y4 o9 U
long save[32];
! ]- ?2 {4 _- G j7 X# O. F
long cnt;
6 B7 F0 i* S; a( M* f
long val;
. B+ R- B' c$ G% q
long size;
& E8 S4 U; S& N) `
int i = 0;
# S+ K9 Z( W8 l; q
0 u* J2 b9 Y9 b( z6 c4 U$ L
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
* P; e P+ n8 s5 p" H
addr = base + cnt; /* pointer arith! */
- g! A$ u& ]! _& P$ M
sync ();
2 S. d8 P% s8 W9 b' d* _
save[i++] = *addr;
! A- P5 r T. t9 k8 L; b. R
sync ();
8 V' D$ J3 e" R. I6 @ k1 S9 M
*addr = ~cnt;
4 S' N0 J8 ^" ^& b2 [0 U
}
: e- Y4 W+ @/ b+ f: o7 N
- G$ n* l" x7 W
addr = base;
/ o [7 W+ \7 T5 i1 H' T! i& p
sync ();
5 F2 R; O- U& t' M, {4 S
save
= *addr;
4 S6 F% d( U# l- y
sync ();
: h) N5 f- s# J9 {" ]. H
*addr = 0;
8 Y3 b& \3 m5 b. r8 F
) e& G4 y$ U1 L8 x/ t9 L: E( v
sync ();
1 a9 J$ U( Z+ P
if ((val = *addr) != 0) {
B3 i2 P4 Q. _. x8 t" S
/* Restore the original data before leaving the function.
- P+ ?9 U: H0 a2 I4 c" |# C4 N* W
*/
) S- j9 O0 _5 T0 J0 b' R: S
sync ();
3 d% R+ D' U9 x& ~. S/ E/ W6 T
*addr = save
;
) e$ \( m9 Z4 X
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
% @+ L$ S2 P$ U
addr = base + cnt;
. j2 \: ]+ E' A: T; R" y
sync ();
" n0 |% k% J% b5 G1 ~$ u
*addr = save[--i];
8 W8 L, ~6 c3 @; U2 n
}
0 [' [* Y( e% _3 e7 A
return (0);
4 P @* t9 b" p8 Z3 \4 r* \4 P
}
# `- M0 n2 N {+ [* v9 h
) `6 l$ W1 F2 V m" z
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
/ }* c5 s" V/ U/ ~* i( W
addr = base + cnt; /* pointer arith! */
. B& V0 @! O. }/ \3 t' i0 n+ M; M
val = *addr;
" ], i( B4 a. D1 g
*addr = save[--i];
% E" u$ q0 i5 y
if (val != ~cnt) {
; Y' Z( q& M2 n& r
size = cnt * sizeof (long);
2 T, s& H8 C( S/ e- }
/* Restore the original data before leaving the function.
; @0 E! `* J' v/ T. u$ n8 z/ N
*/
$ j7 S3 o4 A' N" Z
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
4 l/ T2 e+ F' s1 P
addr = base + cnt;
; |+ R6 J. F# e: V/ \* \
*addr = save[--i];
l5 |8 i0 V! B
}
2 d o3 C. g; X" i. f% d7 q2 m
return (size);
+ _) U3 r* M2 E
}
, {8 P5 e0 c2 Y: f% G
}
# } M. M. Y* u1 x# Z; ~7 O2 Q
8 Y& Q) ]( z8 b+ G/ C
return (maxsize);
' s9 ?. m$ U" p% T, d
}
0 h- q* c+ m3 q
int dram_init(void)
1 _; f) t3 X. a; y; C
{
+ D& s4 T& P: {4 F
/* dram_init must store complete ramsize in gd->ram_size */
! w3 ?! h+ m# J& I* C, o) B+ U+ o
gd->ram_size = get_ram_size(
1 c) u- h2 Z4 g( Q) W0 V' ]' e
(void *)CONFIG_SYS_SDRAM_BASE,
7 D( f, q; a' Z& d3 _% b1 R; u( O
CONFIG_MAX_RAM_BANK_SIZE);
0 D# }+ [" {. w* l; F; f
return 0;
! Q9 X* c, ]8 I7 b7 D' Y
}
, M/ _" V' w; T% [9 ~
1 w0 z) C" E( a/ ^
& r6 I+ \$ b( k. I: q: ]0 U* F7 E4 y
+ k& E& [3 {8 ?. k
3 \0 i3 q( f' _# o3 P& y
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
3 F0 d1 S: ^& v. P3 S- M0 z
# q% x2 |! q' Y1 u2 B
( o# G: x9 v. W2 L) L; Z) R/ R
. D+ C7 J1 A- p
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4