嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
- L( N3 F4 N6 z
核心板2:DDR2 256M Byte NAND FLASH 8G bit
/ Z6 r6 V7 I& z/ z0 i# M" n
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
+ z6 L# y8 l( a3 d
% Y# N5 ~8 T# V, P6 ^! v
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
! W/ ?( ^; N% P/ e8 Z
/ F# x' ?3 G# Y; ?9 s8 r0 g. |
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
4 P7 O4 V" H, d5 S9 E" n
/*
4 d% M( D; J% _4 E; O5 U
* Check memory range for valid RAM. A simple memory test determines
2 j' c/ m; Q! ?$ D0 O
* the actually available RAM size between addresses `base' and
5 ^* w4 h) K4 @! ~7 |
* `base + maxsize'.
* B5 J& _2 _7 p" q7 d) ?
*/
; K0 R" {- u- v+ U1 I) }$ D
long get_ram_size(long *base, long maxsize)
S q! a! |- ?% G3 Q! R
{
4 X2 f' T+ M& L" A
volatile long *addr;
' V( }' k9 f% e9 @, w7 V
long save[32];
/ u6 F8 N& F6 ~, r
long cnt;
7 c; K0 _# }- U
long val;
. S7 o# n8 m4 z3 a# S' u
long size;
3 j8 L) S C# P" _$ k5 }
int i = 0;
. X& Y1 d" N+ B; z: ?
" _4 Q" I8 y D9 k* N: h
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
; U4 S v s& n* o
addr = base + cnt; /* pointer arith! */
5 m X% t! x7 U
sync ();
6 A+ `9 Z7 w, g8 f
save[i++] = *addr;
/ v* m/ ~1 i. o) X2 b( f
sync ();
! a; e9 u3 |- v* a: X9 j
*addr = ~cnt;
0 b6 a4 j% F( b6 O
}
) H& A1 y( @1 q& U- y9 N6 K0 c
0 l7 _: X, ^# d$ z
addr = base;
3 r8 K q$ ^& q4 O! e" s) B- i G
sync ();
' N' _- u7 ?, @2 V2 C/ x
save
= *addr;
/ L, k' {- u- e+ }% {
sync ();
! g- V- ?0 N* Z2 E% x& J. U( g3 ~2 x
*addr = 0;
& a& {) Z! \- K* \9 H
; C( P8 S) g7 k5 v! [+ R0 |
sync ();
1 x5 r9 W, H$ ~1 V
if ((val = *addr) != 0) {
. z# ~) @# T7 b
/* Restore the original data before leaving the function.
1 {1 c+ R5 H1 [- i% M$ a
*/
b: I" Y, s0 T! j9 q/ Q
sync ();
- {5 q- v G" v) I# o7 u
*addr = save
;
% R* h7 K9 `. U( r1 \% a2 N
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
* D5 Y/ |+ s0 Z A7 b, ~6 A
addr = base + cnt;
+ X0 f1 {( W/ G5 }' n @: f
sync ();
$ j# S% L( X( v4 O" g0 h
*addr = save[--i];
9 ^6 R/ x6 M4 \5 Q9 w3 ]
}
4 P/ D5 {3 K7 j" I
return (0);
; ^+ L. d$ t0 e% U4 q- V2 [/ {
}
" Q! Q) N6 m |+ k$ j
, z4 e) T5 V8 w" p# n+ y9 Y
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
) C( X0 b# k2 `% r7 U
addr = base + cnt; /* pointer arith! */
/ L- {, S4 e' t, m: Y
val = *addr;
0 {# y" Z$ w# _' P3 y- ^
*addr = save[--i];
% j8 `# d0 E( ?4 ^
if (val != ~cnt) {
) d" m1 [# U |7 l0 M" Z, F+ l
size = cnt * sizeof (long);
! n/ J. `; A7 ~. b% h7 @
/* Restore the original data before leaving the function.
4 N, }0 ]( m6 {, T1 p! U
*/
2 `" s; T& J2 [% `
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
6 {; k0 F: u- T8 S. b7 n
addr = base + cnt;
! t0 i( `$ f1 a: Z: }% _8 y& Z$ v
*addr = save[--i];
2 L1 k3 B" V& H+ ]$ `
}
6 W: z4 {5 Y- r2 D: `
return (size);
) y* z5 p% h2 `, {6 |# q
}
* _5 |* H! t4 p
}
( O) J% K6 C, D; K( k
( \' ?$ G) U3 S" b; f$ T
return (maxsize);
{" r7 g$ E0 t' N
}
" u% L( z3 N ~: P4 [
int dram_init(void)
9 F9 _* O4 f- Y7 c7 r
{
! S- \; Q3 n5 r+ y. I
/* dram_init must store complete ramsize in gd->ram_size */
" y8 L* U9 g9 V) u7 z
gd->ram_size = get_ram_size(
% C' j- ]" j. q/ Q1 Z, N& D
(void *)CONFIG_SYS_SDRAM_BASE,
7 _ Z6 D* u9 u) E: z) v+ |0 d6 h
CONFIG_MAX_RAM_BANK_SIZE);
% d/ S+ R9 T( U% S
return 0;
4 F& m, H, e& Q0 ]2 W3 ^
}
) X7 C1 l8 @( ]4 A8 ?( L
8 n) y! n8 ~: y5 R1 v6 b
! L; E8 E& N3 T! \( M4 @. ~* \
& n% }; e& n: C# A: y1 A+ P, u8 g
) O) O" s$ b$ Z# C _+ w
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
' P) R1 v$ p7 t, c3 Z9 L
3 z8 c6 ^$ x% S+ |6 \& Z I' r+ s
" |& {( J" L+ y9 k& r; ~, u% X, U
* C6 H* O& `* m. D6 h
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4