嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
l& h+ s; e" u8 a1 W
核心板2:DDR2 256M Byte NAND FLASH 8G bit
- w4 x- D% t7 u# C
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
: [ B1 R5 |! j1 o
v0 C! v' j t+ A& }0 {
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
* q$ A1 P, O( @. P
$ I. K8 N, L$ o5 { k& _
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
8 A3 K: l$ [: N3 ]" }
/*
5 M" g9 [, T6 q5 ^3 E+ R$ t/ t
* Check memory range for valid RAM. A simple memory test determines
! s+ B, n! [5 d
* the actually available RAM size between addresses `base' and
- M) d" m1 d& W$ E
* `base + maxsize'.
" w4 Q* ]4 {4 S; i R
*/
. b7 D" F! G6 `. Z, b% A
long get_ram_size(long *base, long maxsize)
7 B( R7 P' l. J* M
{
6 h/ y( e( L5 a- X+ x
volatile long *addr;
* ]0 B3 y- b; S1 e+ ]. N
long save[32];
X( N* W% g) Q. L, ]
long cnt;
3 _3 B$ J; k0 j A" j# _
long val;
; Z4 E; |) s* v
long size;
( w) d& }# J/ l6 m4 i8 m6 V" ~
int i = 0;
' S, D7 C" t) [9 ^- F
2 }0 M8 l! J- e# d# ` s" ~
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
% [( \: b5 L. V( f4 J; v# e3 C0 g# O$ n
addr = base + cnt; /* pointer arith! */
8 i y a4 A' X7 j
sync ();
- S1 r7 n% D, L6 W7 _
save[i++] = *addr;
: z4 }5 }' N$ y0 \- u5 m+ Z/ D
sync ();
0 S+ t( }; r1 J) J
*addr = ~cnt;
. g5 [4 \- A: _" w4 X# d
}
) l, v H2 l) h% M4 T( x' h% C
5 k, [ \2 m' }+ N% P6 P1 a
addr = base;
# g8 P6 T. h9 K& C1 i
sync ();
, m; T$ M$ w1 s) p+ H$ k6 o
save
= *addr;
! L2 G* @3 }$ d4 S# o0 R$ T
sync ();
1 ?4 ]2 j, b4 a/ g) ~
*addr = 0;
0 t- h7 R' j- u7 g
/ O! x( l* v& i! t" e# o
sync ();
! {1 r3 ]: ~7 E e5 }
if ((val = *addr) != 0) {
5 l6 r7 [/ C5 V) T2 I# ^" F
/* Restore the original data before leaving the function.
7 W) C2 f# _! `
*/
. [3 N' G! u/ R% J
sync ();
$ E" w: w N. X! @$ C( Q4 g
*addr = save
;
5 F# u5 ]( u7 I( j2 r" D9 |+ P
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
6 c) W7 F+ s" F6 S6 j" |
addr = base + cnt;
3 z8 g! D- R$ [7 i
sync ();
: B& Q( V2 ]+ \* f2 }) R: B u
*addr = save[--i];
}; X% P$ v! _0 N% l( n t, Y
}
' @& Q; ` D2 k3 \
return (0);
/ O2 N' c$ c$ H
}
: I T6 r6 P! a: _" E( [
; u/ n- O' ^5 _6 z+ B
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
( g3 z4 ]; w8 Y+ M2 z* {0 F, X
addr = base + cnt; /* pointer arith! */
' C: C# K7 f2 c- v% G
val = *addr;
* u6 c5 c( D0 b$ `1 _
*addr = save[--i];
5 { F1 f: B' M* ~) Y3 V0 m
if (val != ~cnt) {
7 K+ l2 `: q! \* \4 T/ z% @. `
size = cnt * sizeof (long);
- P/ W: W5 I; k4 F
/* Restore the original data before leaving the function.
7 l n) e% s) ?" N5 W5 A
*/
* V2 S+ c! C0 G: L U! ~
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
0 {7 e4 H* X" D; R& D
addr = base + cnt;
7 a5 Y9 B- |9 o" s3 N( U+ s
*addr = save[--i];
0 I) a. J4 P! [' K* z( d
}
* M4 E' {- W' o8 O$ s$ Q2 }8 r
return (size);
4 d. S* L8 t+ W5 v' w6 X" O3 A1 x
}
$ O7 P4 t( ]1 O, I5 F2 R
}
! `4 m% f( ?% [. k0 { \ |5 h
6 U( s' T3 c8 H; h' N5 q
return (maxsize);
4 ]% j0 @4 E: U5 k) {5 m6 x
}
9 L) k. f, S& `! J
int dram_init(void)
( c! U8 I3 v1 I# \& [+ v1 w- I
{
1 y# y) h- ~( {+ f$ n, S) c
/* dram_init must store complete ramsize in gd->ram_size */
4 ^) q$ _& u. U( c' F" z) e
gd->ram_size = get_ram_size(
( R3 T: K9 D( f
(void *)CONFIG_SYS_SDRAM_BASE,
! x0 \* u& X+ }0 r: B
CONFIG_MAX_RAM_BANK_SIZE);
( L1 W; ?% B) C
return 0;
0 W+ p8 O0 t% o- D& G
}
2 J! J+ D4 v0 u4 h8 k: t3 @1 L
h. ~0 ^% J! A. ]& e& ?
?2 j& Q! b- @7 U" f
) R" K! J% w' O6 c2 Y* `! g
( x3 Y0 z# @, y a
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
" a+ I0 b% W( k& q- `7 Z
6 C. W" p& P$ l. X7 `7 H
* l/ U0 D! R& |& ~4 f, u4 a2 \
( X5 e( ~! w' x* ?
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4