嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
" z* t r, a; K7 I) }$ i2 H( ^
核心板2:DDR2 256M Byte NAND FLASH 8G bit
7 o. P& x! a5 \
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
: F' c$ t- s# T0 ~) l7 L
- Y( z1 Z! q% B3 U
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
2 y$ t( j( F. U0 q- A4 w
$ V3 s6 T; j4 q) W" K1 e% L& }
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
1 G& d1 y9 ^% u# j0 n* v5 t8 N
/*
& p, K* ?* |- f9 A# F7 y3 v
* Check memory range for valid RAM. A simple memory test determines
8 Q- J' e0 j: c* p9 [
* the actually available RAM size between addresses `base' and
! A$ ~ B/ u3 e8 W: y, H5 e/ ~& O
* `base + maxsize'.
5 `/ C2 ]4 m2 \( g
*/
- a- }2 _" i+ g& K! F; c$ R7 K
long get_ram_size(long *base, long maxsize)
7 \+ @) c% o( h; N$ @6 g
{
' f& V" k6 |7 Q$ G7 ?
volatile long *addr;
' v7 d1 \" i. U
long save[32];
) |4 A. Q: T" D" l
long cnt;
, T- i, g& P& ~* |& P4 ~+ E
long val;
) H. r* Y! V) Y3 a* o. w, j. Z
long size;
; O! \' K+ P1 I+ A
int i = 0;
! i8 _ {$ p; H& Z. P6 W, _1 t
$ I7 f' G$ P& ] @4 p; r* J
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
: Q& P0 I, x0 U7 ]7 E7 V9 f& y; ?6 ?
addr = base + cnt; /* pointer arith! */
# L6 ?1 ? d# R3 \7 V4 A M7 m
sync ();
, t! I( W$ `' Q/ d1 S
save[i++] = *addr;
0 R- i( ]' Y; }
sync ();
0 c6 A8 R% Y1 r6 n
*addr = ~cnt;
: y" B( Q- a2 w/ x
}
. c1 s4 H! \$ R U" |* ^3 l- Q; ?
A4 C: W1 c9 \* e( L6 i( o* E
addr = base;
' F1 c8 @0 W G" g& n
sync ();
4 l- H$ ~ d7 M+ @
save
= *addr;
3 W7 C2 M# I7 v" ~5 Z
sync ();
7 _4 }3 @ t8 S2 s: E, f; }1 d
*addr = 0;
8 e; X5 o" g/ w
8 U; @' K- p) [' s, k! v& U
sync ();
1 v8 Z$ e$ T+ `) ]% z
if ((val = *addr) != 0) {
& D) f* _$ V( E# j5 U5 Q
/* Restore the original data before leaving the function.
# [' N6 o# v4 H/ d2 v' o
*/
3 T6 d/ k( i$ N( Y
sync ();
: _7 O+ {+ u7 B- g( {0 p( |, j0 a- ]
*addr = save
;
) b! V6 z( d9 j
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
1 j' H1 @9 f; b/ s; a* V$ F
addr = base + cnt;
( Q; L# \9 p1 e' |9 O/ u5 C
sync ();
5 N( N- s; h: K3 g1 h
*addr = save[--i];
8 N) d2 p+ a) ^0 t
}
8 s6 `* {6 h1 W( m2 ` H+ w
return (0);
: ?$ w$ {+ b8 ?3 J; T: O
}
6 ~' E, m- O$ i7 F$ ?
% Z) I$ H+ @" ^$ J
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
0 x9 ]( }1 s; L! p
addr = base + cnt; /* pointer arith! */
* [+ ~) s9 y: }% }" _
val = *addr;
* K0 T, l6 I, F6 g6 V% N o
*addr = save[--i];
: ]0 K+ ]3 \/ {3 \) i
if (val != ~cnt) {
) I- E$ `7 p$ O/ ^, @6 j
size = cnt * sizeof (long);
( Y' m. S' E' @ g1 L7 |( U; S* v6 t% R6 m
/* Restore the original data before leaving the function.
( C; C7 h; r3 U! z/ P: d, Z2 r+ [
*/
3 m8 ?0 R% Y8 p, B
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
7 [) P; g9 I; @, r
addr = base + cnt;
/ w* W: A0 H% {- z& D G% z }0 A
*addr = save[--i];
) @+ }9 s6 Z d+ C0 `1 w. B/ V" a
}
+ Q" \" T& N* Y3 x) \& d5 D
return (size);
* S5 Y8 ]+ H+ P2 g; }; Q
}
1 r7 ^9 O3 ?5 K. Q5 S
}
. ]- m" T/ {' E$ l5 s
, r8 R6 A! X2 w* q: B
return (maxsize);
# |. L6 f3 b/ H D' {! E) G
}
" H" j: \ n. w9 g" r6 B" E
int dram_init(void)
M h6 v4 P3 g
{
2 Y) y) }' @4 Y! c2 b
/* dram_init must store complete ramsize in gd->ram_size */
3 v; @& b9 o- z8 G! f* H
gd->ram_size = get_ram_size(
Q5 A! E h! o, c
(void *)CONFIG_SYS_SDRAM_BASE,
. w9 M- S7 I; _+ _* [
CONFIG_MAX_RAM_BANK_SIZE);
( N" X7 x! Y5 a6 [: C6 E0 i! ]8 S
return 0;
3 ]. c) R+ b1 U5 x' _! P2 {
}
% F1 Q4 c: t' H# K q
2 x3 o, d1 P1 g6 \1 p5 A' |
& ?# y' m# S1 i: C) I+ d4 ?
* z8 Y0 J. H1 B0 u
8 i2 w% v5 ^# D+ }
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
! w% r) G8 X% w9 i) x4 Q
6 A- O3 T1 a% U
" N H7 f# ^' f# }( D6 a* D( X
4 g. q- Y( e; E
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4