嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
I# _* @% F$ G- R' b7 {0 u, H
核心板2:DDR2 256M Byte NAND FLASH 8G bit
E7 I0 [* f3 V' ?9 B! x1 x
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
" L8 Z; l" W, i1 q( r; l% P
5 N4 }% Q) m: F8 m/ }
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
* I; [; m# C! }7 X+ k. i
) t$ S* ?# [& I; m% T
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
& [. k g B4 Q: D6 H* a- @
/*
& S" z0 c0 f c. O$ j) q# O
* Check memory range for valid RAM. A simple memory test determines
. M5 M, Z/ u: C
* the actually available RAM size between addresses `base' and
( i2 [/ p; D$ h: q
* `base + maxsize'.
' O: n& {" O5 g7 b# Y
*/
6 z: n- x4 T" U9 C9 F
long get_ram_size(long *base, long maxsize)
( l; N$ ^1 y4 F9 t$ {2 e; K. I' R' p0 U
{
. u; b Y7 F3 v8 X9 B
volatile long *addr;
" {& F1 ?; R g8 B% ?* Q
long save[32];
9 U5 y$ O1 e' ]: E, U/ }
long cnt;
. j: d' A6 M& @' P* }6 G
long val;
, @6 y3 u& A- V% w
long size;
- d5 ?: v) M; x* A& J3 }3 E5 }# }
int i = 0;
- @8 k2 s- O. W. _& b
7 x7 }& ~/ y! T1 w
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
7 U& D! r/ S3 T* |- V/ U
addr = base + cnt; /* pointer arith! */
1 z d- e$ }3 J+ C+ p% Y# Y
sync ();
, J4 S7 Y/ t: ~; }& ]
save[i++] = *addr;
+ c/ B$ t& l/ [5 A+ x Z
sync ();
3 m2 l9 g L4 I+ ]3 S8 {$ @3 m" m$ a
*addr = ~cnt;
2 X1 F; C' V' M% G3 C, U
}
, N/ }( I/ N+ v: H
! p! I7 Q2 D9 k
addr = base;
/ ?# W# A7 Q' p" {/ G) ?* J
sync ();
; i- } L- T) {" ]- [6 e, G
save
= *addr;
" J3 I* P7 V9 @% D. T8 \/ E
sync ();
! k& M- T3 X& N$ G7 s* k. R
*addr = 0;
1 w h! C' P# G' K$ \# ^: e- O8 e
" B; z. t$ ?6 ?5 J$ l# X% H& b
sync ();
/ j- s1 ]. H8 A7 V5 q; X% D
if ((val = *addr) != 0) {
( U2 Q- J6 l4 r& q
/* Restore the original data before leaving the function.
4 o8 y6 ?6 b/ K! C* f
*/
5 B4 x; z6 t9 [/ O! q
sync ();
# M& ]3 V+ y+ F# p/ y9 l. Q
*addr = save
;
2 A" W1 k* U5 \- i U: {5 I
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
$ B/ H& t/ u$ m/ f4 Q. g6 B
addr = base + cnt;
% M) K7 ^" n b0 Q+ Y
sync ();
& i& W9 l3 y) @; p$ Y. ?$ J9 }* T* u
*addr = save[--i];
) w! n, g5 ]1 Y6 [+ h: h Z
}
, e# C) \/ X5 L5 ~
return (0);
* r; j! d0 {8 `4 d, \& W
}
( ~! `5 U) B; A! Q
4 Y t9 I+ i. E) R
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
7 X5 C1 Y q) @- G+ _
addr = base + cnt; /* pointer arith! */
6 x" D' A2 k$ k" Q; P* f8 M' X9 I
val = *addr;
+ ~& A6 }# e# u% M! h& k! u9 M& t
*addr = save[--i];
' o {, T J; W- f7 n$ z
if (val != ~cnt) {
) [* Z- k+ N3 s* s# X& h$ f) W. v
size = cnt * sizeof (long);
# F: V' W+ `" |5 q- d- Y' v
/* Restore the original data before leaving the function.
; d" e' m! W5 Y+ \+ U& ~/ p
*/
) F1 t6 b8 }7 e* t
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
2 t8 Y2 w3 z! I, c. r( ^9 \
addr = base + cnt;
9 x1 @' i% l& Z) e
*addr = save[--i];
. _. E) y* q; t. I2 H& v
}
. }6 @2 a. L9 m2 `- U7 p9 K5 m2 J/ u( g
return (size);
a& N) R; M/ q$ x8 f$ r5 N# P2 c
}
& p9 b3 P7 a4 E$ A. ?# F; o
}
! A; G9 O) t& K- M. i
- Q2 s& @* m0 w j' R" U
return (maxsize);
8 ?8 f' B5 N5 u4 T( Y( Y
}
: E# o0 F, u& a8 i
int dram_init(void)
$ m( i2 A% f2 K6 u/ Z/ I
{
' `9 ]) O2 h7 M& d: ]" O- B
/* dram_init must store complete ramsize in gd->ram_size */
- m; c+ h" s w! e! w
gd->ram_size = get_ram_size(
: y/ Y9 z( M+ {, q" ]
(void *)CONFIG_SYS_SDRAM_BASE,
+ B- t/ a0 f3 v& v6 @( m
CONFIG_MAX_RAM_BANK_SIZE);
" H/ _# ~0 U; E" R
return 0;
( m, x' Z: W+ Q9 q
}
" ]; d. d- Z( Z1 h7 l
% e3 {7 {0 t+ h
3 O* S$ o8 @2 e4 ~( D* E: S
3 l& |9 F( R2 E; \8 m
! b# E! ^' `! H( U5 d
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
5 c# f) I% k& L. D
) U9 u7 \1 D6 C3 H
, y& f' E2 a. X# J' [
! P! _ ~$ z. [
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4