嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
, [! F ]3 A) _
核心板2:DDR2 256M Byte NAND FLASH 8G bit
- s! q" D& V2 u3 l
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
: b3 I" R1 S# u, }
3 H! V ]" y0 _; u
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
5 @( [8 j9 x! g0 Q# D( c6 r8 Q
2 s" E. ^9 _$ @# O# k. ?
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
, t( P% E8 y. _) V6 k( c+ b- A
/*
* y, e. b' A. ^1 G! _4 u: H/ |
* Check memory range for valid RAM. A simple memory test determines
7 A1 p7 X% i, ^8 D: Q1 }5 `
* the actually available RAM size between addresses `base' and
4 f) z1 S" \8 \" _: S
* `base + maxsize'.
5 r- ?6 u8 v4 w8 b5 S
*/
* j& z( S- e6 H# r
long get_ram_size(long *base, long maxsize)
8 j7 S% y# P7 \
{
2 `2 ]$ h6 t. m
volatile long *addr;
" g$ s/ U" G' K
long save[32];
7 W$ w3 X% `( a! o$ H
long cnt;
/ n* r) t* N; o+ K) i7 L9 ?* S
long val;
4 g, p$ |2 ?% F- v) y( ~
long size;
8 m4 M8 {# r! {. X
int i = 0;
) u. E5 D' ^9 x$ P y, ^
7 w* T$ l7 I% z/ q9 K+ d
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
! O" w/ {- Q. s2 M* E! ]. E3 _& [
addr = base + cnt; /* pointer arith! */
& \. A- a0 W' R. O
sync ();
/ ~% t0 e, k" P. ^
save[i++] = *addr;
5 ?7 P0 h, S" `4 }
sync ();
2 r0 P6 @& m' X1 P* R
*addr = ~cnt;
- i# \* m) ]8 G. F3 L: N
}
4 P, v$ s( W2 k! Q5 N2 [& G9 T( H, j; n
4 E. Y d( s* [% g, `
addr = base;
7 c K# _" ?8 ?; z" {9 c( L
sync ();
* O, e5 P4 c) X: F$ p$ `
save
= *addr;
( i, X# m/ q3 | H7 x* i# H
sync ();
4 d5 t5 g/ L( E f9 y1 i: F
*addr = 0;
+ l( u1 N7 G+ _2 F
. t" F. z: B+ w4 E$ m
sync ();
) _: h9 m' q( @: K( `8 Z
if ((val = *addr) != 0) {
. ~8 Y/ j i5 v' m) C" V
/* Restore the original data before leaving the function.
D7 l+ s( B1 t: {; ]7 ^1 \8 c
*/
) ]. d. a2 h7 r; A
sync ();
0 s! r' p2 M6 ~- U. @) T3 u
*addr = save
;
- z3 g" \- L U+ K# B- a" [0 ~3 b
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
* k8 n+ _4 @8 ?4 [( k! J% A' G
addr = base + cnt;
6 O' s0 \* r6 S' M- g
sync ();
; [. u# n; [" k2 J" q
*addr = save[--i];
1 [$ s- A' g+ i8 P" G E
}
! `) ^9 d, |. x& b- K. T
return (0);
3 t8 @5 i. Y& ^. g3 Q: T# i
}
. _9 [- n3 g* w6 B
$ c3 O. S \$ x& x
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
7 |7 k# u( G" h
addr = base + cnt; /* pointer arith! */
4 C0 i- O4 P( Q% S' Y @
val = *addr;
3 z0 X7 l: ^6 O# {" D, v
*addr = save[--i];
9 P: ~* N8 n: s7 t& x
if (val != ~cnt) {
6 Q) |' V; n1 Q
size = cnt * sizeof (long);
7 o" o0 s0 n" X) O0 F3 b3 r
/* Restore the original data before leaving the function.
4 ^( B1 c% ?+ u2 E- i N) ]
*/
- t* x0 d( b- z; P C# O
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
! B9 C7 T: p. y+ M' Q% A6 H5 z! ?* i A
addr = base + cnt;
" {0 }) K0 M$ C1 | `9 N
*addr = save[--i];
- N$ W9 V) }0 S- f6 s# Z
}
* I: G! C! L0 w p( |$ G/ t4 K
return (size);
% [7 P. A" }% [9 l7 Z( a* z
}
4 }- V3 F7 `5 y3 R
}
: j& k2 D _1 f. j6 y$ d
& \& k, G0 e+ W1 R1 H
return (maxsize);
7 m7 S. K% \( I5 N' i
}
, V# i$ z$ k8 l( v& y9 p; L7 J
int dram_init(void)
+ F8 |9 }' Y3 q: u" H
{
& g' x, `) s+ d% }: ^
/* dram_init must store complete ramsize in gd->ram_size */
0 c0 W. S6 H4 H% n$ N
gd->ram_size = get_ram_size(
! e* a/ O; G; J- Z( j
(void *)CONFIG_SYS_SDRAM_BASE,
0 O, ?2 Z% F3 a7 C$ R
CONFIG_MAX_RAM_BANK_SIZE);
, ]( O3 w6 C' ?: q, F7 w" k" v6 y
return 0;
% p4 I4 [- r. E
}
/ ~. l+ B8 R% q6 A& ?
: }' b% H7 D7 [- H
: g" Z6 ]+ C+ D/ X6 ]
# |" V; Z* f8 L3 H, ^
; v+ a9 k9 e( n' I$ T) i
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
* y( y& C. b- z4 W, e3 I7 S
" M3 J. p" [' F
2 L6 M, w& }: Y4 m( b. k
6 c L4 n! ]5 T4 @9 ^4 r0 F4 U
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4