嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
+ i4 N$ T! d& W8 W6 M
核心板2:DDR2 256M Byte NAND FLASH 8G bit
6 }" X3 m3 N9 a
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
6 P' b* O4 [' F" q9 a h- S
1 ^& |5 H& D* k0 B8 V
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
; ^/ H3 h8 d) z, k, I2 R
/ f2 x/ F" T! h3 n
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
( P2 `+ N; m9 Z5 O$ Z$ g7 u' `" Z
/*
4 H/ r4 N. D4 E) z& a
* Check memory range for valid RAM. A simple memory test determines
2 e/ W' |! j' R0 W7 P/ s$ d
* the actually available RAM size between addresses `base' and
5 N r" ?2 r5 l0 p, p$ [1 U4 y' x; V
* `base + maxsize'.
2 O- H% {6 Q9 o1 [2 u" T( o
*/
- \% u1 y1 V4 e5 T" V( i/ T
long get_ram_size(long *base, long maxsize)
2 R# o1 u2 {. L/ D8 ]
{
* M1 M, }; h& _
volatile long *addr;
* J2 s/ P* Q3 j" i2 u. R4 |
long save[32];
# t' Z3 g" i$ V$ z6 `7 A
long cnt;
, f3 g( n, J, B- J6 Y* ~0 j4 ]! r
long val;
7 |, s0 K$ B4 Y
long size;
/ r. O, d( z8 I4 ^4 I
int i = 0;
9 _. `9 ^& J: L
8 y7 w) c% m) F" y% ^) }( v8 N4 L
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
7 H1 _1 [) _* N3 t# y3 N
addr = base + cnt; /* pointer arith! */
8 b; f) T. E; ~) B% v
sync ();
6 u* C6 x5 k& b( z0 S. V
save[i++] = *addr;
: r7 [* |7 z4 a$ C
sync ();
! Y* |' d( A7 A: B! U8 g
*addr = ~cnt;
: K* Z$ F% C( T
}
) e, F8 T% B F% R; \
1 k# ?! X# @9 E
addr = base;
& h: q8 H4 R. q: t3 U
sync ();
: N/ g5 H; h0 n5 n6 [9 `/ m3 ]
save
= *addr;
; ]0 Q* q6 n; [3 U3 |
sync ();
- B; w0 x f- V( n* W
*addr = 0;
8 A( z6 o; {; B8 x3 T
4 d. u& Y9 _1 G8 O6 d! x: r ~8 S
sync ();
! n' O; X! S' |
if ((val = *addr) != 0) {
+ U3 Y. Q( Y {( f+ W
/* Restore the original data before leaving the function.
3 A$ X/ g7 E" {) [7 E) ^" O% m
*/
$ F/ f, H8 W0 a; K
sync ();
5 d' Z' `- W: m9 F+ U
*addr = save
;
! n7 x. l2 U- e
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
( b Y# v+ z6 x0 _* ]- w+ u
addr = base + cnt;
, S( Z+ D/ o+ s; D1 C
sync ();
: p5 M+ X( z6 h
*addr = save[--i];
; b- h- @% F8 D
}
% {" ~' K9 p: r7 o$ `
return (0);
. T1 T: b; z5 ]
}
3 O% U6 Q9 ?+ L* s7 q# Z9 j4 `
2 d+ K$ s2 I9 M/ v# n+ J i) n
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
; J% u7 V A3 ^$ f/ B) [! |' U
addr = base + cnt; /* pointer arith! */
+ T- U5 `) F4 T @
val = *addr;
- r$ z% ^ W4 M. C! j9 `. [/ L
*addr = save[--i];
1 y6 f1 p/ l2 A6 l3 w
if (val != ~cnt) {
) S1 z4 d* T/ X
size = cnt * sizeof (long);
- F, E6 J# O4 s6 ` S
/* Restore the original data before leaving the function.
4 ?) \; c+ \" s9 o5 q
*/
, P1 g ]0 c8 ]
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
+ [+ t9 I( q% [
addr = base + cnt;
. S" G* K* Q$ _$ |8 M! U
*addr = save[--i];
+ D1 }, D- T) j
}
1 `* B7 ^, e0 Z" z- [2 b% q5 {
return (size);
" H2 I u- P2 m3 Z+ Z; _
}
$ E4 c0 U" K U2 @4 M1 q
}
: E9 t; D8 u& c% F
, T0 w$ m, G( y* Q1 @: N; N
return (maxsize);
8 Y$ l: {& Z) F% k- j* m
}
' Z& F0 t) r% }; ` n
int dram_init(void)
1 Y5 S/ e* z: n7 Q6 U" K+ T
{
% Q: R' ]0 g) {
/* dram_init must store complete ramsize in gd->ram_size */
( _( z+ C( S3 m: c0 ?
gd->ram_size = get_ram_size(
* x ?0 g! |* M) o( h8 k, F9 G9 f
(void *)CONFIG_SYS_SDRAM_BASE,
! l( \1 v: @2 }) H0 x: X, [
CONFIG_MAX_RAM_BANK_SIZE);
4 j0 ]' f7 h: X3 q6 t' S
return 0;
: f# ^' f5 q$ J8 \
}
1 j# t# u. w8 ?6 P6 h
, k7 `* k% f4 V$ S9 v" U; A! o& R
/ l# f+ _' \2 U- D; c" g
5 f& X ~/ I9 J) K: L' m2 Q
4 }. S5 @$ f$ C& n: \/ O
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
7 ?7 M7 u4 P; p9 k! V, O
% y0 p0 E8 W0 H0 f4 R6 G4 A
. b4 t1 ]5 P. `' ]
) \% c* m0 {9 I) i, a& U9 S
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4