嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
9 H1 ]2 N/ `% I9 Z& ?
核心板2:DDR2 256M Byte NAND FLASH 8G bit
; ?# Q- h0 |, P2 k- C: c E7 w
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
3 y; l$ \3 U8 r* l& q ~1 O
7 `9 |7 u9 o9 V* W5 U9 a4 [& [
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
3 }' O1 X' q: M
% T( k6 d2 V- @1 [: a- K$ V; w
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
3 g" H0 v7 `# t1 E, m9 T4 X- h
/*
* R7 Q0 z" S/ B" @8 M; c
* Check memory range for valid RAM. A simple memory test determines
! s6 H# Y, |% u& \8 y( q
* the actually available RAM size between addresses `base' and
" v) \9 u" j; [3 T
* `base + maxsize'.
. v1 w+ Y. F$ N+ L Q
*/
. U! |& {3 k. c4 \2 Q
long get_ram_size(long *base, long maxsize)
/ q" h9 l* a( X$ v: l; @1 j
{
4 J/ U6 D) ^0 W
volatile long *addr;
5 K. n( }, E: A. |3 q& k( Q
long save[32];
( m1 P2 @9 j$ w" a+ F: {2 W2 i
long cnt;
- o8 u) v9 I7 H5 {$ ~' I
long val;
1 S: }8 P; \2 |3 `( v* g: Y; G
long size;
& y4 @2 n2 R& w: l4 T
int i = 0;
: C5 C! ?0 t& G8 G1 u N4 ?
* A6 ]0 x, S' Y+ B" ^, s
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
) z! m: G9 ?- H& o
addr = base + cnt; /* pointer arith! */
0 P# r7 K( ?4 ~* g' T( O4 J; k) Y4 Q3 n
sync ();
* U+ @: r, C5 o' q
save[i++] = *addr;
( b. q) G! b4 _2 w" `8 S
sync ();
- M: e7 U; M& E+ K. q2 U& b
*addr = ~cnt;
' g3 W3 d+ A$ \' v
}
' p4 M; d' ~* L9 d
( o" u( z+ J, |, q; K& i3 E
addr = base;
0 u! F$ M( v4 O
sync ();
; d9 ~4 M( Z4 C* B; U
save
= *addr;
0 D4 N! k5 e' e: G
sync ();
( B* A& X. _% T* k/ f
*addr = 0;
( n! {- J8 P% J0 Y, ^
0 W' B5 u9 H( j. p8 T4 b1 w. z* g
sync ();
1 l& E$ z# |9 V% X! r/ X
if ((val = *addr) != 0) {
6 [, i, y; R3 h0 `9 S ?
/* Restore the original data before leaving the function.
6 w9 t! U% b# Y l+ Y( W0 `, e
*/
4 F8 v8 [; H' ]. P# s& k/ r
sync ();
" V4 w& ]6 b3 d! K
*addr = save
;
: ^0 O$ A$ ` ?% g5 C. ?
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
: Y( S9 m4 Q1 B& c# ^1 j
addr = base + cnt;
; M/ ~6 U. }+ n m! |; `7 U
sync ();
7 v* l& Z6 e( m3 _) {/ A& }/ |
*addr = save[--i];
' l' ?( Y" c. l7 m5 h
}
5 ?( t" @6 s9 c
return (0);
# n4 F! i4 u# |. m% }7 P
}
0 \; V$ q/ O0 ]3 o% r2 j \: Z1 e
/ l+ C: m. }; {
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
! s' D- }1 D$ y5 |, F
addr = base + cnt; /* pointer arith! */
3 F8 q/ X, h' ~, l7 C- k
val = *addr;
0 v, s" \- G( _1 T" ]
*addr = save[--i];
+ L8 Q+ J/ Q' @& p( w" l+ l
if (val != ~cnt) {
/ v* Y' h& t3 a; y1 d1 h
size = cnt * sizeof (long);
% Z# r! F3 f0 M& g8 m
/* Restore the original data before leaving the function.
0 L! x$ _ H' `: y- L2 n
*/
* V- Y# q" G; U3 n1 P8 K
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
) `3 O, @) O( |, O! d9 F
addr = base + cnt;
" d! B7 j4 o& r1 x7 N1 j5 u2 F
*addr = save[--i];
' [; u( ^7 e. l# e! K( w+ ^6 F
}
, h: c* e8 g' R# ^3 C# {
return (size);
# P) S: f! p* a( o8 g1 }/ B1 b
}
- z+ }( C9 a- U* F& ~
}
; @& F4 ^7 S6 f( V" U: u- L
( q* F1 S1 b* W( X$ d8 }2 u& F
return (maxsize);
/ i+ p7 _8 h) O1 o! p9 {$ f
}
; U! ^ j" \2 a0 `! q5 v1 G% v3 S
int dram_init(void)
: s! R: m9 U% B3 V4 W) q
{
' X6 m9 n. D& h5 F) r8 z
/* dram_init must store complete ramsize in gd->ram_size */
! P! v/ }* X$ b; s# k$ _
gd->ram_size = get_ram_size(
9 W7 r6 |$ }! p8 ~3 i
(void *)CONFIG_SYS_SDRAM_BASE,
( Q( C+ @( K7 p. `% T4 r+ E+ A8 ^
CONFIG_MAX_RAM_BANK_SIZE);
" ]& a# n) D6 s' [, D& P
return 0;
0 L& G4 P2 \" g1 I/ w8 N! I
}
% u7 g4 c* m) w
( c# `' f! s+ R b, ?- _
9 y0 \1 @5 u6 c+ J C
+ ?) a" ^2 j5 u' K9 e% C1 ^
' [2 Z' z6 o* m# ^% D& }: ?7 n
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
8 M# P( e; p! `4 x0 g \" c
4 Y+ U! M+ e/ n. ~
/ t- b3 G/ ]/ L
" h4 U4 K& S8 f" P. e) C
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4