嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
* m1 d6 x& t) u$ i: D" ^
核心板2:DDR2 256M Byte NAND FLASH 8G bit
9 U7 S6 ^: x5 ~: Z3 W
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
% Q: ^: T1 f* ^: o3 s; F% i" s
w& J0 `" H" i# u
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
& c5 c/ x \: n( _
% h0 c3 y3 \0 E, L7 W5 x8 F' N
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
$ c; q6 ?- v& T* H0 I
/*
* I; p3 F- F! ^" ?
* Check memory range for valid RAM. A simple memory test determines
& S: B6 D. j( a) _) N/ L
* the actually available RAM size between addresses `base' and
; Y! X6 Y* u/ G, M
* `base + maxsize'.
4 ~- l. X! \# A" }
*/
3 y. G3 `; q9 p; P
long get_ram_size(long *base, long maxsize)
& }* Y) A2 B, U3 c# Y, ~
{
5 A5 s( z: M0 u, J1 s* H, ~
volatile long *addr;
4 X; K0 @1 O* z& w" \) P7 V" _
long save[32];
/ V6 `- g0 I8 j+ F H/ x2 Q
long cnt;
" A" u Z" S0 t3 i8 l# R/ c
long val;
( u) ^5 |% |9 b# z+ j; f4 j' L: K
long size;
9 x: M' o6 `3 h' H5 M. I+ Q i
int i = 0;
( k# u+ P1 O! h7 j9 Z; \
( _4 n5 n. d* h
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
" ]2 ?: @- c+ \( L: u, c" W6 `
addr = base + cnt; /* pointer arith! */
: `# S6 `9 T% E) O# B
sync ();
X* y% L+ h; R% M
save[i++] = *addr;
" O5 O' b8 e7 V- A
sync ();
1 n: z. i7 |& Q5 n0 `+ O
*addr = ~cnt;
" ^) L( Z5 \5 b3 f2 X
}
& R3 s; s: q( J/ p: M2 U" d% `3 z
$ ?/ o4 N$ ?3 c7 j, Y
addr = base;
- z2 [* w2 M( R% F$ v
sync ();
! T' a) d3 G! K g' C: k
save
= *addr;
( q% R5 O6 ]2 ]* D' u0 \
sync ();
# r$ ?1 i$ C' [# Q7 ]9 m- B2 @! y9 l
*addr = 0;
T# D Z! t4 ~8 C4 G9 f% o, I7 I( K
0 W7 i C, n6 o' M9 b
sync ();
0 a* ^% Q- k# a) b5 B1 J
if ((val = *addr) != 0) {
7 Q( g% @0 N- x) G+ d
/* Restore the original data before leaving the function.
9 S. i6 b8 p7 J6 ]
*/
, h$ v; n3 ?. Q2 ]
sync ();
% n# g2 K5 b" \9 b" H, s+ f/ | Y
*addr = save
;
, T8 k0 U+ C( } U
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
# x5 e" i! N b. \& h; S+ [9 r8 y
addr = base + cnt;
1 |' I7 [0 I2 a/ {" }: [
sync ();
) U8 i; F& K7 _9 l- U
*addr = save[--i];
3 J, s9 k0 u; @, P2 I ]) M' l
}
% m* e+ t# g5 |$ T
return (0);
) A/ i2 u2 C @" k9 Y* B
}
, e: x, @- x& X6 W2 Y
) p) A0 k% j0 g6 T, P& W% T
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
# |! k3 g! U" m: A
addr = base + cnt; /* pointer arith! */
1 |7 a- H. c V$ {+ L- O8 I
val = *addr;
) ^& n! b3 E- W" ~2 q# R4 {9 Q, b
*addr = save[--i];
# J% C2 u* P9 P. t* p5 J
if (val != ~cnt) {
. ^/ R5 u0 P& G
size = cnt * sizeof (long);
# J: t4 f* S( Q- h# Q' {& s6 u
/* Restore the original data before leaving the function.
0 A5 a. Q8 R) Q& Z: E
*/
+ h: C" U& q J9 j0 i9 n
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
4 S- [1 z g( c
addr = base + cnt;
7 e; N/ Z- j0 L0 h: _. @ J) I, w* J
*addr = save[--i];
. b- A% R( x A* X% Z
}
6 Y v1 O" o( D7 o- M; R5 n3 X3 i
return (size);
% n, u1 {8 r& |" W2 e8 X1 A
}
, c; g. c& w2 ]+ i. Z- d, B
}
+ p5 `, X$ O+ u. w
3 J" O, k- T8 b% B
return (maxsize);
. R1 ~2 Z+ X/ p% V4 n. j
}
0 O- {& [7 b: ?
int dram_init(void)
0 k8 C m/ F+ l8 \7 k
{
- [0 r4 W+ s- ]+ Z3 Q
/* dram_init must store complete ramsize in gd->ram_size */
+ Z# K: s) B! m6 e+ s5 Y0 O. _
gd->ram_size = get_ram_size(
2 D8 c! x/ [7 j$ Y
(void *)CONFIG_SYS_SDRAM_BASE,
1 ~$ ^9 [' |9 J6 |4 R+ g4 ^" n* P
CONFIG_MAX_RAM_BANK_SIZE);
8 K2 U7 G" W4 D& r5 d1 A, R& H
return 0;
" _6 p9 L& _4 N7 h! E6 {
}
" q7 z5 N. ?7 ]: N8 r
8 Y5 x! h+ d5 _2 I
$ |# x0 p( r' [0 H; I
7 @' [& ] x0 p
! t& S9 w: o3 p2 `5 T
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
- [! s& g% W; ?& n$ x- { g: l
0 C9 R- u0 Z( w. A% t. c
* M& ]' R5 ]8 }) [4 L: `, @- [
& P: _9 a( \; Y8 O' C/ @7 b" T
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4