嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
: j3 `6 W) B9 S
核心板2:DDR2 256M Byte NAND FLASH 8G bit
$ w0 N/ R& K/ k1 g4 O+ |* X
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
% E2 I# Z/ o) j
0 j8 e! z, _3 H l, e4 f" V9 J
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
7 x3 L7 ]# J, y8 G! r! b. {
8 l2 _# d* e* O+ T
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
' s( r7 Z, Q# x$ \7 ?8 S
/*
$ J1 F) r4 O; \
* Check memory range for valid RAM. A simple memory test determines
& K5 X! ~: n; w
* the actually available RAM size between addresses `base' and
0 R# u5 d/ t X% ~0 x% E5 w
* `base + maxsize'.
+ H. p, n$ R1 S& n/ m `6 O# y
*/
: J6 F5 p! d' p
long get_ram_size(long *base, long maxsize)
) v ?; n) @) @$ ?6 r$ v% Q" J% v
{
: Y4 c% t. C }3 S
volatile long *addr;
j: @: x! W+ D" C4 j
long save[32];
8 w" B6 B1 U% Y* a% H% D& Z4 U O
long cnt;
: U }' E. P- q. X6 D7 m/ n
long val;
2 U3 `0 X g% c! j
long size;
, t( r8 V9 `1 y; X$ \) T
int i = 0;
8 ]2 }4 _0 d6 C7 z, m
+ F" y8 I# g7 F4 c% F0 r
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
# f# m% v# Y, C8 G4 A
addr = base + cnt; /* pointer arith! */
/ h1 E) s3 s! z, G" O$ v) s; N
sync ();
% d* S' R) q0 w. v7 Z( s4 k$ y8 u
save[i++] = *addr;
5 x# P9 ?( x6 B* j; X m/ J% t) M
sync ();
! d- o; t. e Y
*addr = ~cnt;
1 ^( |5 e, A( y" U; t
}
( H6 o% ^- c( W5 i8 K
0 C/ K+ X4 ~8 h s( e0 C/ v" H
addr = base;
* A& l8 |) `8 d2 q3 z
sync ();
5 B; Y) O5 H. `$ ?: A4 Z4 P
save
= *addr;
& L: R% C' M- o
sync ();
7 z, o5 S$ j2 N' x: K4 x `
*addr = 0;
! Z. e3 r( Y5 K4 d6 l" j4 ]
n4 ]) ^8 d: P: q" G
sync ();
4 f) ~7 D4 O+ x8 N1 ^
if ((val = *addr) != 0) {
. j: c% @) D1 ~ V
/* Restore the original data before leaving the function.
* U0 S/ i( K5 h* o
*/
# d8 ?1 o4 C0 l$ r$ c; c3 L
sync ();
7 l) v) a& }3 j/ x
*addr = save
;
8 u+ \7 Z/ T4 X+ i) ^
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
1 ^3 f! a3 F" i' Y4 P1 J
addr = base + cnt;
) W: r" g* |/ D" f% ]
sync ();
3 m2 y7 S" {) x1 }. k
*addr = save[--i];
$ R6 [ ~$ g" {, H9 h# `/ A
}
8 m' C. j, Q# {0 z' a9 L
return (0);
& d% M: ]. n" ]; a7 [
}
- t1 I8 F5 Y/ ?2 ]
" V3 E% r; c7 C9 p
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
, F6 E0 O8 P6 ^5 z9 x' ]
addr = base + cnt; /* pointer arith! */
! D# \& w6 a- q; L
val = *addr;
/ q# c% \& R) N1 Q
*addr = save[--i];
, \4 D5 [: ]( l) V, }6 y: o
if (val != ~cnt) {
7 u6 R7 {0 r- E; Y
size = cnt * sizeof (long);
: N6 J0 [# U0 n
/* Restore the original data before leaving the function.
- u" [7 r4 e- A4 i+ n: [
*/
( q, H/ h$ ]0 y4 |+ `) p' D
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
0 T& W" h- B. D6 k F
addr = base + cnt;
6 f7 \: o1 \2 K. f
*addr = save[--i];
2 E) q& W# W) ?& M8 @5 R
}
: S! A: H; n9 q# y7 I" c9 Q( _1 V. M. |
return (size);
9 c7 X H/ x7 i9 Q
}
1 X/ t" G" Z/ W4 k$ @
}
; }% ? L; h4 y
( ]* e4 h+ x" E9 o# O) ^$ x
return (maxsize);
% L5 q" t0 Y* U9 O# s
}
0 [4 g6 k2 _& }! x; ~
int dram_init(void)
T( \" L" Z% o
{
( p; I3 o" `0 _* r+ t$ \
/* dram_init must store complete ramsize in gd->ram_size */
0 l; S. S& ^: z+ V6 S
gd->ram_size = get_ram_size(
3 M6 _1 I( W' Q# I+ _" n1 w! V
(void *)CONFIG_SYS_SDRAM_BASE,
) |0 {9 Y) @- P* ]
CONFIG_MAX_RAM_BANK_SIZE);
7 }* r% [: L4 C4 l$ W0 C; L' ]5 a
return 0;
4 E4 _: C$ u1 c
}
( F# q4 j3 Q' M
! z; m9 p7 x d1 O8 f
) L( s1 y% n$ P6 g" P8 ~
, C$ w) ]$ q- M4 Z0 R @% F
$ S/ B" x/ p" g$ S1 W
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
3 v2 o! q* @: F$ F% y/ B( ?
8 [8 Y" I1 y7 h& C
8 d) z# @- K5 i, |3 ]. t9 r0 ?
( J+ t: c9 X v: _' N
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4