嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
5 d. k5 [+ c! Z1 {3 K: o: {
核心板2:DDR2 256M Byte NAND FLASH 8G bit
; S2 s6 B2 \! J9 L+ S
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
4 E/ q/ ^, [7 z, A: z
% T. }( D( P$ l. |7 \" \9 m
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
y9 r; q7 s1 t3 U
0 P6 y4 a2 T4 `
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
9 b3 `. c6 n8 @3 W" ^: y
/*
* Q7 S* d' G6 H, }: {# P
* Check memory range for valid RAM. A simple memory test determines
! L& @% @0 a& c+ C
* the actually available RAM size between addresses `base' and
/ H- ~& q! J8 p; q ~! \4 s/ D4 h
* `base + maxsize'.
' m$ Q6 [7 Z2 ^2 W- h U( h& Q4 x
*/
( t# D# g# t, P2 N9 ^
long get_ram_size(long *base, long maxsize)
! Y$ h9 x; r8 N6 v8 F( O
{
0 u k2 Z8 x/ s- K* t2 z
volatile long *addr;
. X9 j, M, o6 B, u1 {- _6 u ^
long save[32];
3 P0 R$ C( ?4 _9 L; |( h; K
long cnt;
! I/ b" Z! q! X0 I
long val;
4 v' m4 R" W; a- F& X5 n# ^' F
long size;
% o$ _: n/ y0 @( Y9 s: ~
int i = 0;
% s. Q# e0 k1 p( h3 w4 m
8 N) k0 h; p( w% c' F/ R4 A0 J. w
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
5 T* W4 O% L" ?" Q" i! c* @
addr = base + cnt; /* pointer arith! */
, J; _& _+ b9 t G3 I% `0 R
sync ();
3 S! r! l6 y# T0 A# ]
save[i++] = *addr;
0 F: C$ s+ a, s9 Z
sync ();
7 q" R/ C! ]! A' y `
*addr = ~cnt;
( U* w0 t* n: I, x; x! K
}
- w* w3 V( k9 p8 ~7 D7 x
4 J% \) D; ]+ y f6 Q$ r" q
addr = base;
# F+ F( R# j0 o' V5 _+ O- M
sync ();
' {: i( z2 Q& B. ?* G
save
= *addr;
4 `% o+ K$ u: Y/ d, H# M
sync ();
0 X \: B& {. `& F: h" a
*addr = 0;
! H+ W% e2 X U0 n4 S( f1 ?
. ^( Z6 t$ P7 \9 Y# S
sync ();
. I( L0 o+ k; Z* O! E3 I+ c' n
if ((val = *addr) != 0) {
( n, }. a) v+ P0 W; G
/* Restore the original data before leaving the function.
1 U: s5 H, L0 ]9 N: C
*/
8 p# g I5 P3 i+ X5 y, s- }0 [
sync ();
7 h/ j: e5 Q& I M
*addr = save
;
/ X0 N1 F- Z: o* M# H9 [
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
# P+ ?* r2 N# e+ e% P; i7 Z
addr = base + cnt;
, R9 ~" @/ {5 b5 O6 u" C, u' P. a
sync ();
, l$ z" C7 v' R
*addr = save[--i];
/ I0 W/ t. W2 W) z( \5 z$ X) Z
}
: g0 u) v d' q- |, u
return (0);
E( ]$ E# {7 n4 S
}
2 L( r* L2 j/ z' z6 ^
, b& d. Q8 O& J- M; b, u! y
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
2 B0 N: e5 g! o/ K' r# [0 I& l
addr = base + cnt; /* pointer arith! */
/ E" W `" J9 R4 F! w4 i0 l8 \6 Z
val = *addr;
& n* [4 s% P4 k! S: ^4 U k
*addr = save[--i];
% ]6 v/ w2 w o( H4 o8 J( _
if (val != ~cnt) {
2 e1 `9 |% w% A. L2 m
size = cnt * sizeof (long);
' }# h D" b- P
/* Restore the original data before leaving the function.
. Z X* p" k6 J; N
*/
1 j! |( X- j [5 b# U# U
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
! |5 B' _1 g) g2 J
addr = base + cnt;
, Z' f/ @( H- l5 s$ P
*addr = save[--i];
) r7 e1 c4 \$ u. S1 f
}
$ G4 G4 @$ g8 o; ^3 `1 r
return (size);
4 R$ C6 U3 p8 _5 @0 Q
}
8 R0 W4 P9 }, a# b/ T1 [* e, H4 L
}
' P. K( q6 J7 W6 ^: k: d! l
" X2 u/ N; h- k# Z
return (maxsize);
# X2 L1 ~- t( G5 G2 f( P
}
: i; ^2 {+ h8 X k& a, ]1 q: u
int dram_init(void)
1 V$ W0 }; c5 z
{
- Z8 r6 ?) `4 a9 W' M
/* dram_init must store complete ramsize in gd->ram_size */
$ g8 g" x( v; g
gd->ram_size = get_ram_size(
9 `) W0 o& V# v+ K
(void *)CONFIG_SYS_SDRAM_BASE,
) r/ ^: N8 `/ Q3 I* @, _
CONFIG_MAX_RAM_BANK_SIZE);
. X. O/ f$ [$ w* U( X% ^
return 0;
) X7 X! J" }4 V/ \1 E% J% {8 Q
}
?/ h5 C' o! G2 E. P
6 [3 H. l0 ]! |* q9 c; U
0 i* c( b% c0 P- N: d8 M1 d: s' v
6 a U1 g6 _7 A3 B3 ^
; t" w6 Q! h" k4 E) C+ f$ q
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
* o+ E: G+ `+ L( s+ j8 p
2 D. L- ~9 R9 r9 z/ q' E: a' b
" v; F8 C W- N/ J: O/ E
6 a T- ^% g- g. ~( { Z; n/ X; r% K
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4