嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
. ] `& q9 Z* Q& A# |
核心板2:DDR2 256M Byte NAND FLASH 8G bit
; Z: {9 J! V. w& Q! C
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
" [9 | B8 \1 U3 O
: D( Y* Z. ?, @" ^, p2 v
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
. u: {) a' U2 e2 o) t
8 j. i$ D0 }* Q% \
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
$ F: Q3 {5 [6 s; U. T3 s
/*
. b% H2 [) s) ]+ |8 q
* Check memory range for valid RAM. A simple memory test determines
& D1 G. T+ N5 [. f
* the actually available RAM size between addresses `base' and
) a) R$ u4 x& R- h
* `base + maxsize'.
2 x, f+ g6 v% }6 o% c( B
*/
- y2 ?7 |( o* t9 d }+ A: z
long get_ram_size(long *base, long maxsize)
+ S4 }5 p* i3 C# f) B6 k, {! |
{
% `/ H5 x3 x% u" y( C
volatile long *addr;
0 f6 o; C3 m# C" C
long save[32];
3 W8 C, S0 ^' T* W( k. m4 y
long cnt;
" q- N8 p" Z, |* f
long val;
4 ~0 H0 U9 k4 P' r7 T" `8 Q2 A
long size;
8 F; R2 d- y- E9 x/ q0 R
int i = 0;
$ o, _. W1 S5 ]# B
( W( S' C* T: a4 r& w' L
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
0 q7 t; l4 M/ \
addr = base + cnt; /* pointer arith! */
. ^; `1 A3 T# C7 Q2 B2 W
sync ();
& Q+ m# }* C m9 }0 v! b7 @
save[i++] = *addr;
' u. u& e- d8 b
sync ();
6 M: ?) u/ C Z1 W. [; |
*addr = ~cnt;
' u0 o" l" x9 ?- x- u/ Z- N
}
Q) g' j h$ `, O
# O/ r. \ }& L0 \" t
addr = base;
# A& I6 }) [ v9 C& A6 _
sync ();
" n8 C# t3 m3 Q; K8 w& C
save
= *addr;
5 Y2 U& v( p2 L9 D+ U B0 R
sync ();
) B2 _! E5 j! g% b F3 l2 B1 R
*addr = 0;
% m/ z7 I( R# z- S; O: [
; _2 t/ x% s3 V1 s1 F
sync ();
6 }6 r) e( D" |) c
if ((val = *addr) != 0) {
# H) i O c# B0 N4 ?" ~
/* Restore the original data before leaving the function.
* Z) ~" q* @: a$ P& g9 r3 y
*/
1 m) n% ~3 J0 O3 ^' }8 Z# ]- M
sync ();
. C; Q- H1 \0 h) p- c
*addr = save
;
- w) o5 C' {6 b/ P# _; E; n: g
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
5 a9 t8 q G1 p8 E0 H; n# g
addr = base + cnt;
; J& `" }2 `9 g5 J4 J
sync ();
* s% ~1 x+ u2 A; x4 F9 G; W# W
*addr = save[--i];
# ]) v( D& C$ O% g( A# e
}
4 k3 K2 r: `* }1 ]( v- h& v
return (0);
# H' C$ n2 e; @( h, t
}
5 G, F8 g6 s+ X/ v
5 x( j( N3 M, b8 p+ t
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
: b4 P* V) }- o; x% Z1 a
addr = base + cnt; /* pointer arith! */
1 x3 n0 A9 w2 ]0 t. _
val = *addr;
% r9 c( t M/ ? b
*addr = save[--i];
0 ~9 \4 N& ~$ ?; i, k
if (val != ~cnt) {
4 R: C9 K8 s/ M, a8 r
size = cnt * sizeof (long);
. Y1 [8 T+ \3 X5 b3 E' E4 H
/* Restore the original data before leaving the function.
1 K( y3 T4 V. }
*/
3 H5 `" R) j O k
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
) f% B% M8 o: Q
addr = base + cnt;
9 \9 V7 _/ m# V. e
*addr = save[--i];
8 b( R4 x: B% c0 _' E6 h
}
1 c& |, K$ a1 m! g7 D; K8 l
return (size);
! A+ s2 o$ w# E
}
9 N* }$ y8 i/ p
}
! W2 z s0 e3 B, }( i
0 F" `) U6 u! u4 O# U5 G
return (maxsize);
' d8 D$ H7 W; c' b0 [) e: G+ w
}
/ J/ c3 s$ I7 U0 n
int dram_init(void)
" j& f, d; N( i: \- U& M8 F4 j
{
' O6 Z# ~0 m0 }! `+ z% z
/* dram_init must store complete ramsize in gd->ram_size */
+ s. m( H- J, b2 B* n
gd->ram_size = get_ram_size(
# E" C0 W) i1 Q. V% H- ~
(void *)CONFIG_SYS_SDRAM_BASE,
% H) s; N( b6 X; f1 m3 S
CONFIG_MAX_RAM_BANK_SIZE);
7 v0 I; m R! E1 }; y1 ^/ p
return 0;
, ]9 a3 [& E& O T* _3 k* L3 o4 k
}
: P) F% ?) ]' N- I; ~8 }. F
|* G6 K, r! [6 X# x$ C( @
/ N3 \2 l/ h6 x7 M+ \* O# y; M8 i
5 z8 t6 b0 O- w$ J L/ b8 k
% a: x' J% ^/ t' `# w" d/ _) l2 Y
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
/ G& l y S/ y- X
5 y( _+ D8 [! z& L2 Q6 Y( g
. W$ N6 k2 R' ?
' \/ d! D2 P2 }$ C
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4