嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
- o) ?# Q# S% T
核心板2:DDR2 256M Byte NAND FLASH 8G bit
$ W D% b N2 Q5 v7 y) i
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
2 ~: M0 ^9 \* _4 n6 c0 O) L
+ o9 i: g7 }9 L
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
( U: [. u1 @9 o0 `' J
' @+ q9 D- p7 k: }7 w8 W3 A) K
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
* c: Z1 H6 b) n0 p1 M' V
/*
* J$ t7 k( |8 J
* Check memory range for valid RAM. A simple memory test determines
7 H0 S# `, G5 L4 m- b2 D
* the actually available RAM size between addresses `base' and
% s$ I0 Q/ K) P$ Y
* `base + maxsize'.
1 [0 v. p' n* Q) i6 c( x$ g' h' \% G
*/
, ?- n4 F" n8 V
long get_ram_size(long *base, long maxsize)
# l& I" O* @' j( l
{
0 e% B1 `9 Q: c) F# h
volatile long *addr;
4 b9 t2 B! C5 a) ?* E, Y- P+ T6 f
long save[32];
* ^: J( w: x7 r+ x9 k: ]8 h
long cnt;
# l! G( ]' Q. m0 }
long val;
; X; I7 }) S; e( g% _5 R
long size;
4 U! T/ i! _4 H: F+ I
int i = 0;
$ y9 ^# }6 h8 j( m
5 E3 B- M$ a" }( | h: Q
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
6 `8 C1 F0 P: E8 d, X0 w) T
addr = base + cnt; /* pointer arith! */
% g) ^4 ]1 q: k: f, v2 m1 [
sync ();
4 a/ v+ @6 O( S3 G
save[i++] = *addr;
+ N, |# W; C) D8 S5 |9 w/ V$ ~: [# i, v
sync ();
, ?3 E4 u# m1 _! }
*addr = ~cnt;
$ `8 |0 g: }" N) J1 I" R2 A
}
5 ?; l# H# F1 S
- y1 k7 E3 g6 F. H
addr = base;
. T5 N# @& @! }0 ~
sync ();
6 s+ s6 K/ K- C9 m& `5 U6 ^, g
save
= *addr;
0 k# i! z4 e7 J
sync ();
) H9 ]/ T& a1 T7 D, R O0 l( q
*addr = 0;
6 M$ W* \: d; j6 y4 S. [3 C
5 h O% x1 \: `+ J9 t4 C5 D
sync ();
) a$ I5 h5 m2 |& C6 e. Q9 c
if ((val = *addr) != 0) {
% d% {. H8 P' ?" m$ _
/* Restore the original data before leaving the function.
' s' C% k; g% }! g: Y
*/
( v2 u+ Z) T0 \/ o' J
sync ();
' e; \6 |. N S2 Z9 Z9 f- Q( c
*addr = save
;
) s7 f* r2 N' V, K) `. r2 @: |% @
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
+ J) C. V3 D- ?
addr = base + cnt;
6 L) g% k3 F1 X% l6 y+ B/ x
sync ();
J$ ]5 N- L( r, y1 ~
*addr = save[--i];
) X4 f6 S6 ~/ [! R
}
5 y1 N/ f* _; H$ P- N& A6 ]
return (0);
6 B2 @, Z/ n8 \: J. U& e" }* J
}
, B+ p1 A7 J8 j+ a) \! N, X# @- y4 W
0 [( s Y% n0 a7 l# H
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
# }* w, g: y* U
addr = base + cnt; /* pointer arith! */
9 B9 }% s2 C5 ^' @6 F6 l7 P
val = *addr;
% ?8 z; ~6 X/ i
*addr = save[--i];
2 C2 O. c" q, c4 B0 a _
if (val != ~cnt) {
. [& k$ r3 N; o# p' l0 `9 w- [
size = cnt * sizeof (long);
1 l: E" X# v( y- B4 _; G% d
/* Restore the original data before leaving the function.
6 f! W5 Y+ n$ P# Z' G3 l8 W( q
*/
4 G8 K$ {9 K) v4 ]
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
7 s r2 ~ {3 ?, S! s. O
addr = base + cnt;
9 H3 j, ^# p# ~$ V, ]) I
*addr = save[--i];
3 s3 T6 Z, M/ F. A8 L; x
}
: W$ E" c) a E( F" z' a
return (size);
s, @9 L0 p& U, E. R' B1 A; I( S# ^
}
# w" \1 i w' c& q: n
}
# h1 |* @" q a3 }
5 |& a, C2 U X" r8 l( j
return (maxsize);
* k' z9 l! B# F. U
}
6 ^4 Y0 b* d2 Z1 H* C4 X2 Q
int dram_init(void)
( Y+ J! T3 U7 C" H* f
{
# g' u' o4 ^ v( S4 J
/* dram_init must store complete ramsize in gd->ram_size */
1 _) E( g& P, I2 e) Z, I
gd->ram_size = get_ram_size(
. k4 W0 C* S0 L
(void *)CONFIG_SYS_SDRAM_BASE,
7 n% g6 J0 r' S
CONFIG_MAX_RAM_BANK_SIZE);
! j9 n: o: u* }; R
return 0;
3 f4 n7 M0 t% q& l. L" m
}
2 Q! l, @5 w. D/ ^# J
. u; V# K+ [/ p* r! ]5 z( R; C4 U
' i4 S- J, e8 `8 P+ B5 h, G
% i8 t) N" E( F0 p! l% p! M
% n# c8 s9 L" d3 |5 X1 g
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
, q. W2 R% B$ Z7 t f
+ s$ P0 L+ \ [- q' ^3 A
) G0 s# s6 b) a9 o# q
/ `0 Z/ d, E5 A7 S7 Z
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4