嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
& p: p* n9 ]1 q, m" @ O4 t: a9 w! f
核心板2:DDR2 256M Byte NAND FLASH 8G bit
0 x! g( Y: j0 p1 Y
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
, I4 p" ?; \7 c* i! }
. s; T' N4 X6 Y- R
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
1 F( l8 _. O3 N1 n' f9 T
! C- N1 l1 j# Y0 t' }
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
- [0 ?: m! t+ Q, u3 A1 A: K
/*
. e$ G! _5 r) | o1 r0 m! X
* Check memory range for valid RAM. A simple memory test determines
: v$ H0 b1 Y( G; S
* the actually available RAM size between addresses `base' and
0 b$ O) Q. G/ A. E. B
* `base + maxsize'.
/ U/ e! |% a2 X% b# \, S
*/
/ M$ W* i; Q: _# z/ v9 X
long get_ram_size(long *base, long maxsize)
& p. L5 B" }; |" V% @( a
{
0 _. G j9 h( F! L/ A. g7 Y
volatile long *addr;
3 _4 C6 u% X' x5 T6 x6 G6 x
long save[32];
) c! p: `; T: p* G% x, ?
long cnt;
. G: h* S8 m5 A. R: x
long val;
0 _; O+ S# e$ }# E- O8 F) P! e
long size;
( Y ~0 c7 W8 V7 V. `# D
int i = 0;
~5 U3 _1 w/ a9 ?. b& `( R
# m8 V- H _5 j) }6 C. e
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
2 Y$ V$ s6 p* X6 p" L) P' m+ N
addr = base + cnt; /* pointer arith! */
\2 I9 l/ X; r' }( I; v+ _
sync ();
6 _0 Z( y+ c6 h i8 s" G: @- b
save[i++] = *addr;
( e# Q( ]$ H( E) w
sync ();
6 @$ `5 J9 W! }2 h7 M% I4 m
*addr = ~cnt;
( X1 W) G" r% e. }. u
}
8 H; v9 ?' f( t
l; I: h4 Z6 o0 ~; n
addr = base;
5 ^: n" @" E0 ]3 d) ]
sync ();
) W ?4 S: y6 Z
save
= *addr;
- x0 p5 o5 P2 ?6 S; D% W" F7 P
sync ();
5 [. }1 u9 r- E; \; |
*addr = 0;
) @5 M) T( G6 b3 N5 R
3 z( c ]- k$ E
sync ();
- |; w: j! m7 k! Z( I/ t
if ((val = *addr) != 0) {
+ W! [3 k3 l0 k: B @
/* Restore the original data before leaving the function.
3 j, N' y. Q: B
*/
! M0 y) y/ a5 R
sync ();
& E7 h" R" u. k! A
*addr = save
;
* n2 }: _/ X# o
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
# `1 Z) n3 J9 p7 j. n
addr = base + cnt;
5 Z5 }% n$ D& L
sync ();
' D% u: c* _6 N$ ]' t
*addr = save[--i];
( z- S( L; h# ]- s( |: }5 h* x
}
; o8 v# b; q. U+ q$ x7 }
return (0);
' b* q1 r5 t+ F9 l
}
+ Q1 I$ y$ }4 J0 W8 l
& s- {+ Z4 j/ K ?
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
4 h2 ?! o7 W6 ], T. {
addr = base + cnt; /* pointer arith! */
- L* F" X: B* Z: I$ |; l0 b' E
val = *addr;
$ H' Z, \; }) c' b3 ], |9 k. f
*addr = save[--i];
; d! t+ }0 ~( b+ u+ F
if (val != ~cnt) {
* z: S, } w9 J7 _$ Z
size = cnt * sizeof (long);
8 ~' |0 Q; W5 d$ {
/* Restore the original data before leaving the function.
, l* c) P) s+ c% Q
*/
7 r3 N5 s, `! t+ J2 N* v( _
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
. D9 z( l& q. ], Q
addr = base + cnt;
" U0 c' |7 |, J" H5 g6 \2 b' v7 ^& y
*addr = save[--i];
( q# r. S6 d( u1 C
}
; b$ f3 X) V& N7 c C. J/ W
return (size);
: d' Z; j$ @- A/ M0 N' Q& u0 q
}
' n# l2 g; h; w# x
}
c- L1 ~' a& [+ `$ Z& o
! E" l8 Q: D# {
return (maxsize);
" N1 q ]3 I9 {2 e9 h& H, a+ T
}
) u& d, E/ J5 Y8 ^) [
int dram_init(void)
& F8 I. X1 s" w' h: p" o" G3 ^
{
% a; x- ^! o: s) T
/* dram_init must store complete ramsize in gd->ram_size */
- |' h9 ?+ m3 z
gd->ram_size = get_ram_size(
3 X- j8 |5 c# F* H- \
(void *)CONFIG_SYS_SDRAM_BASE,
. v; Y: f. s+ q! B
CONFIG_MAX_RAM_BANK_SIZE);
8 ?& }! _# h+ c, I
return 0;
# F; [. u# z! v- ?+ S
}
( i" z$ j- h8 s% a
1 W1 p% \" U- ]
9 M5 @* R5 T; K
9 Z6 c9 B u- G ^% Y% J
2 T* X3 H: O+ a- [2 V% l+ Y+ y
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
3 a) H. d% ~& F% I* \7 K, v' n
1 q {% t0 [; N; p
6 o$ E e# D0 ?/ W
! g4 }' ~& v [" e! _. m
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4