嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
: s3 T4 d( l: e( t- y
核心板2:DDR2 256M Byte NAND FLASH 8G bit
! d9 C3 s3 V6 p$ k4 ~
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
9 m u9 D. U! \& N* g2 {) d/ M8 T
1 o5 {1 {$ M) s4 G/ y& l" N F
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
. m S7 A( x7 V8 H- z
# @7 [4 X6 s" R9 [. ^
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
& J% h0 U5 `* z' e1 d) Z( J
/*
' o9 i' t7 y; b/ O# P0 }
* Check memory range for valid RAM. A simple memory test determines
0 z7 x/ T, W# @& | Q1 [
* the actually available RAM size between addresses `base' and
7 g, f0 {. f8 t) ?; L
* `base + maxsize'.
/ t* t7 g( B: i! W! ~
*/
) `/ w# _/ F% q. Q1 G3 I6 A, B# H
long get_ram_size(long *base, long maxsize)
4 K% o) ~+ G3 @
{
: X4 s( K; P6 n* d- `$ Q0 R7 {
volatile long *addr;
- u/ G3 P) x# _$ u2 {2 b1 w( I, ]
long save[32];
! F" b: ] _4 Q ?: M% H
long cnt;
% d0 E2 D8 Z8 |
long val;
" S! n0 T# B3 i& c2 F% d* M4 W
long size;
6 \ g( `4 M* C% o* p
int i = 0;
" | s3 a j \- t
( w& t# V) F# u" F: Y! g& V1 S
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
1 ]& h% P8 }+ u( D- l& n/ }
addr = base + cnt; /* pointer arith! */
" i1 p/ |4 I" s" [! Y- ~0 Z/ B
sync ();
. N. V# ~" e9 G! U$ d0 b
save[i++] = *addr;
$ A4 h( a, |' l# R
sync ();
1 I0 n- }# Y8 h j/ J2 N
*addr = ~cnt;
6 S' }$ v! c: R4 q3 J! J
}
0 k( O1 f4 b$ H) i3 S3 [
! n/ m' \3 A4 {& G( Z
addr = base;
. q( ^9 q: X$ t& t% g5 ^ r
sync ();
+ M) _( i7 C, w" X
save
= *addr;
. M. P7 m# v" u% {2 s
sync ();
) P! W B- G; E: m1 s9 W
*addr = 0;
. z( ?( P% W/ b* ~, n& ~
$ }7 l4 F* ?2 t7 ]
sync ();
; C. Q0 |: h( J; O3 H
if ((val = *addr) != 0) {
' c( W4 g3 p: K' f9 `& T8 N1 E
/* Restore the original data before leaving the function.
3 k0 c* Q( h$ O1 e9 o
*/
1 R Z; s6 C9 v4 W+ w/ \0 `$ e' h m H
sync ();
* X0 r; W3 k. e% V1 b9 e! k
*addr = save
;
* X9 X# _: L* M; `
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
$ P+ \( ` j+ U1 P# Y
addr = base + cnt;
9 }: i! j. m' `1 J7 F* z* e
sync ();
/ A/ J) G% c+ q9 e! f6 s, u. q
*addr = save[--i];
9 |& E2 c# r, H5 ?9 g+ K! d& [
}
# g) C0 N2 Q0 C" c) C# n9 Q$ i9 z
return (0);
5 j( x+ U$ T- v' Q; e& w2 N$ |
}
% i8 m E) d) Z5 D
9 L1 B" }7 E6 v L
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
]) ~* p+ b9 A& L2 Y
addr = base + cnt; /* pointer arith! */
# @1 [+ O N: k" S3 U
val = *addr;
u; W; \" k( N& u9 J! X% x7 g
*addr = save[--i];
% X. j b# k" c1 o/ v
if (val != ~cnt) {
! x& `% _4 }, c8 k2 R
size = cnt * sizeof (long);
: C1 W3 ]8 x% l+ o& }# E
/* Restore the original data before leaving the function.
% ?/ i/ Q$ n; e+ d
*/
& @6 h! i: t5 I, K+ ?( h6 r. F
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
( ^% v5 ?9 w5 A. t1 b/ Y
addr = base + cnt;
( f: V$ `. S) R$ G0 R
*addr = save[--i];
" v3 O ?' E5 o9 N1 m1 }
}
/ F! I. x: ]6 ?6 _# G+ A
return (size);
, z9 y3 ^" z0 j. r$ n6 v
}
6 B/ [; `9 W% }7 {
}
5 g# Y- L7 `8 A5 z$ G0 S& m, b
) s; y* _+ w: k! }+ e2 k F3 @
return (maxsize);
! |* \! a* U) P1 ?3 }( ~2 h. O* q
}
, ?% f8 y+ |) m9 I" G2 L
int dram_init(void)
" g% _' ]6 k, J% J' H- J5 p
{
: B! j) ]) K( M# T) Y, P7 ]; E+ v, l
/* dram_init must store complete ramsize in gd->ram_size */
* U3 u* U% q9 t; ?8 o
gd->ram_size = get_ram_size(
- ?9 O5 t1 U H! H3 v/ s
(void *)CONFIG_SYS_SDRAM_BASE,
2 }4 _$ r, N- \* g
CONFIG_MAX_RAM_BANK_SIZE);
3 }; g6 Z, ^ V- q8 s9 g
return 0;
( h$ L% L& c$ k2 Y: i, p
}
6 F3 o+ k! o7 P. k: Z2 F" q
" }" ~# `* M6 w( o$ b) H
7 ?. l, N2 C8 E/ X
: b/ ^* a) d" c
; m# m' a; }2 |- @
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
2 C6 Z2 z1 P) v& a5 p# g: G' _
U0 m& G' }! p: _0 x) D
8 Y9 _7 O; z2 e; E3 @* \
, J# k3 m# F* W# d: ?1 E" O4 ?
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4