嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
6 L6 R. t) O$ \" V+ V3 E3 w. ~
核心板2:DDR2 256M Byte NAND FLASH 8G bit
. B$ ?" U6 j2 @# Z/ r0 h( ~ Q
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
9 q% L5 j7 E* r0 p2 b- k7 a* P6 g
1 p1 C' X& {1 p2 `- q' t; d* O: z
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
' x& P+ `5 P2 p* C8 f7 w3 ?
5 B" F; W% N* V* I
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
, t5 S( Y' D8 w3 c- U1 L2 W& _0 o
/*
% w d$ J# W3 h/ _% f1 h: C
* Check memory range for valid RAM. A simple memory test determines
$ Y0 w8 g- n6 a* T( \' B
* the actually available RAM size between addresses `base' and
# S3 |: T0 [/ R- W& f9 x% U3 B/ q+ r
* `base + maxsize'.
5 s+ j% K @- ^9 @7 ^+ f3 |) q
*/
7 V# R3 y/ X8 H* m
long get_ram_size(long *base, long maxsize)
, V/ _0 f+ {8 S6 V' ~1 t5 }! y
{
1 T+ q/ a. [! l; T
volatile long *addr;
: l- }2 f! o2 e! ~( e( S
long save[32];
( T5 I* C, X, Z
long cnt;
7 N; |1 l @' B6 r# r; F: r/ M
long val;
0 A" v2 q O; ?+ S
long size;
) Y( D- K8 a" T4 m7 q/ U
int i = 0;
$ g3 P. |; I5 U" @
9 d2 a/ W% q) G( X5 \
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
& W* C* @; x0 }/ C$ z3 M
addr = base + cnt; /* pointer arith! */
5 @+ }# U4 a) T x+ |& }# O6 C" w% R
sync ();
4 |. w; R' e) b0 p b! X! k1 J
save[i++] = *addr;
4 K% K& a+ c: A
sync ();
' A- d) U( _7 b9 Y/ e) Z
*addr = ~cnt;
( G! g8 {% A8 e6 } D$ |1 F# C
}
; l% F& s( u! R2 S1 d3 J/ z4 _
' T& n9 A# X& _( p2 D0 t7 D
addr = base;
. _( d. G1 R8 C" y9 e( w
sync ();
% ~ l- X( q$ u* |
save
= *addr;
: N& d" H2 o v3 R" f" X6 R6 W
sync ();
+ `. t8 e7 ~' U0 p
*addr = 0;
) v& g& Y, W7 z; f( T) y/ S+ T9 S
% ~1 N" Q) n6 R6 I: V; {0 g
sync ();
* i5 K) z% q6 c$ [8 x! o) [( X" T
if ((val = *addr) != 0) {
0 q. N0 C, k/ l. u* X
/* Restore the original data before leaving the function.
/ l: |: Q( K' |) d: `
*/
1 `- W5 U- f+ c( U; s+ {
sync ();
7 \ T/ Y! _8 W) n
*addr = save
;
$ S( N9 C9 B9 V
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
# ~9 r; u7 v8 {8 ?
addr = base + cnt;
5 t" U$ j6 K# A1 d) i9 g2 E
sync ();
2 R2 G2 R3 @! Z; Z# f
*addr = save[--i];
6 Z5 S5 c& f* R0 m& J+ D
}
7 g0 [! c0 B# a1 b
return (0);
8 U. M& g$ f! e6 y+ k% S! V+ d8 t
}
) ]1 F3 E" N9 R" X. Q7 P1 R
3 V/ X% e: F" V# O
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
/ f$ W/ p. w- k3 x4 F
addr = base + cnt; /* pointer arith! */
. Y# I$ @$ i+ x8 K( U9 c1 o; I! D! E
val = *addr;
6 z! T5 A; E8 o. H' F& y
*addr = save[--i];
1 w3 s, _' t% v8 ~
if (val != ~cnt) {
9 J7 {! \/ _( A; x
size = cnt * sizeof (long);
6 B+ o) V$ E+ s% S. j9 _
/* Restore the original data before leaving the function.
9 H/ N* }# [( \4 w; ]* S
*/
+ {/ t8 f6 I: R3 W
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
+ |1 A% ~; h+ N5 z! |0 u- |
addr = base + cnt;
" r6 y& U" q- ]# z: I
*addr = save[--i];
7 H( f% ^; o7 [" C2 B9 O
}
- I& i: T. k$ f# [+ G
return (size);
& |( b( d2 q8 i% d, [, C3 w9 R
}
1 m; ]* W: B0 l* C' K/ `7 }# t9 N% p' r
}
) ]8 ^9 Y: {6 X1 q+ k
: W( F) R: ?! X G, k/ B9 s
return (maxsize);
. |. m) [7 E* l4 W5 B" I4 T7 r# _; F
}
4 E$ Y1 c. x6 r& p: g
int dram_init(void)
. i, D3 k- a' g0 W* [5 G+ R
{
' Q& M% P0 u) w9 ?' _6 C
/* dram_init must store complete ramsize in gd->ram_size */
/ |0 Y' m) T" y( G
gd->ram_size = get_ram_size(
& J0 A! p; p3 C* Y" `0 s
(void *)CONFIG_SYS_SDRAM_BASE,
* D G3 U, J3 d2 T6 b1 v4 l$ v8 z
CONFIG_MAX_RAM_BANK_SIZE);
+ l6 ]) J2 O$ x ^
return 0;
) p/ a* @, k* S9 C
}
* u H2 i/ n2 C! r* J, `' i: O
$ C3 t7 s6 k" W8 p" l
4 g- L B9 Y1 \& l
, c! [# y7 D& N# k; x* f* ?* w
$ N) O* t, R6 c4 _3 _
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
4 U6 q2 e ?$ w7 l7 }# E
( P( J8 ^& g' _/ L. B1 z
/ ?1 g7 _ w$ d2 j: H3 \- o2 i
- o+ Y& W) z9 B# A1 B8 h2 B! O
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4