嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
; n5 j+ @( D% Z( }& v9 c
核心板2:DDR2 256M Byte NAND FLASH 8G bit
0 |2 R. V2 S/ }. h; U
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
) Z, h! t: u+ M: R4 A( A6 Z
1 a0 e7 _8 o+ }& U3 W+ J
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
1 v; H2 A6 _0 [0 b2 }
+ Q. Q# M+ [8 k7 `
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
1 {# l& L* q: M i5 j0 Y0 u) Y
/*
+ {$ b* o, |0 }: K& p% Z9 L7 J
* Check memory range for valid RAM. A simple memory test determines
% F9 x) q6 W2 W4 x
* the actually available RAM size between addresses `base' and
- K" G) ]: P, S ~5 q
* `base + maxsize'.
4 J9 z8 v$ W4 R. M7 G t( o8 H+ @
*/
) b$ o/ _( m( V7 g. ~
long get_ram_size(long *base, long maxsize)
* c; E, x, w) b+ g7 i. N
{
7 l7 g+ M% }$ \% U) [6 K( F
volatile long *addr;
. J$ H) ]; E- _1 _) D# k& D) p
long save[32];
8 E3 D' t* T5 w, a9 c( W; R
long cnt;
% a6 Y: D% p0 N/ e& Q
long val;
/ q! S8 x& r& f$ ~3 e1 `2 I
long size;
: v$ F1 n# u+ [# B# ~! R3 g
int i = 0;
+ [2 \- v8 o4 v4 z' q# D
% B# p2 l6 K* a! r- N/ P
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
% ^2 D! x! E5 ]- X
addr = base + cnt; /* pointer arith! */
0 Z Z# X* } b, q
sync ();
4 N: f" o# m9 G5 j. Z3 `
save[i++] = *addr;
' R: ^/ L, `3 Y) j0 C, C. C
sync ();
( G; H5 y8 A7 x+ J% g o
*addr = ~cnt;
9 r* @6 J: t2 t% e7 X
}
+ f. h+ T0 Q) |- s c
' r$ I' [1 c9 t& M8 z
addr = base;
* q4 L2 l1 j! o+ k2 g! B1 l
sync ();
* M1 K' d1 T" C a2 ]9 ^, w% e6 X
save
= *addr;
: P+ u0 o5 W0 O0 J
sync ();
) j2 t! H z& W2 c) R" @. B$ b! W
*addr = 0;
2 ~6 z M+ n+ \. G# i$ B3 \
! g" @* ` y8 Z/ W6 A3 |
sync ();
2 y* ]0 Q- m7 E3 _5 m/ L
if ((val = *addr) != 0) {
/ b# k* G" n1 ?
/* Restore the original data before leaving the function.
7 e. P4 N. J5 X( s- k+ C$ [
*/
8 k3 Z2 O0 I9 a( H( S
sync ();
0 c+ n; o: f9 X3 ]8 Q( R& l/ O% J
*addr = save
;
6 K0 O* V% g* D, e# r3 ~% ]
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
5 O( y, F5 }1 ` |& Q. ^" V; x
addr = base + cnt;
! P2 H: p6 `* L4 w8 ?* f' x
sync ();
9 w7 F# L3 r$ n. p& @$ \3 `' G
*addr = save[--i];
D9 q* q+ L+ v& B& B
}
6 Y0 x r; ^& P# f8 V( w/ C
return (0);
9 p( m4 v6 l) `, U) p9 V
}
: e- h) W. ] r+ H7 t
g9 }) Q7 ~- B% b) f2 E7 z
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
" j0 x8 [7 w, }( Y7 B7 J
addr = base + cnt; /* pointer arith! */
3 L6 W9 j/ v% i6 @' m3 _; m; u
val = *addr;
& ^5 p% p" M( n( f4 T! H
*addr = save[--i];
. p" T& W1 Q+ y" w5 N' u7 Q0 p& k
if (val != ~cnt) {
2 [( b% S$ y- T. z% E
size = cnt * sizeof (long);
0 i* Z @& U3 I0 Z/ [8 t( Q
/* Restore the original data before leaving the function.
5 E6 J6 i. [! M- ~ f& `# e! T- @
*/
0 |/ _/ Y0 Z! g
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
+ L8 ^8 [: O& R! C( m$ [, d
addr = base + cnt;
6 ^' D0 A6 D% |2 [, p8 r
*addr = save[--i];
8 I( A/ i) I) f* h2 }( T
}
) {' K6 s6 ^) ?8 D8 L: u
return (size);
& n. v# v* u3 G3 P
}
4 h1 l1 ]4 ?2 W" t! z( g! J
}
! ]. W% b9 `, K o4 U4 G: e
, E* `8 e$ e1 X2 t# U5 q$ |" S
return (maxsize);
6 N7 o& Q+ T7 \& d: Q9 ~$ f
}
4 h( {# q$ G1 j8 N. C% ?
int dram_init(void)
/ F' o5 @/ n4 R6 }4 `6 C
{
" u8 Z( p) D7 N% j ?& L
/* dram_init must store complete ramsize in gd->ram_size */
. K3 e$ n( u! d8 H5 T
gd->ram_size = get_ram_size(
% F, @; h) [; H: l
(void *)CONFIG_SYS_SDRAM_BASE,
! ]% A+ e& w" g/ @# a( V8 U
CONFIG_MAX_RAM_BANK_SIZE);
/ h$ c( n3 p# K: z% I3 w# s
return 0;
- V- I }2 ^5 G6 L; P N
}
/ {! L6 C# K" C2 {8 }0 g
6 j/ h+ v1 w+ O- V
! e- m0 [; V6 E3 ]
* D* E( n$ l G% X; m2 w* ~
3 N. z8 }% X$ S6 V
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
" O/ v" I( O$ x) \ }6 l* L; ]
" p0 E- B7 K m/ B: @/ X5 |
1 x$ Q0 {9 o9 i" Q
5 m6 x5 s9 o# i, v
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4