嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
/ L3 \! E8 p0 o8 }, k! p3 c; h
核心板2:DDR2 256M Byte NAND FLASH 8G bit
5 W }7 D/ o u5 G+ p
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
+ w) n6 Z/ T) J/ m8 Q+ Z
! i" o0 w$ `* G/ z" W4 b/ o
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
) F# x4 v3 M3 G# C$ `* I
# N; `2 _" ~" H! i2 z8 f( U
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
# t, P7 e. L' B
/*
. b+ \2 b- I6 ]$ F" S! m
* Check memory range for valid RAM. A simple memory test determines
6 A9 ?9 z) L5 A
* the actually available RAM size between addresses `base' and
! Z* q: y) h) l0 `( T; }
* `base + maxsize'.
, A: k: k% B; f1 K: g
*/
4 l( Z8 o5 [! {& a- l- Q
long get_ram_size(long *base, long maxsize)
* Z" i7 X- |, q0 q
{
; }7 W* M0 Y1 }6 y5 [' x
volatile long *addr;
9 U% M v% B# O! _
long save[32];
/ g' m4 c: O8 V1 `5 b8 d
long cnt;
, j) _6 V: C8 V. k
long val;
& `* H7 B2 U: G# {/ r8 K( _
long size;
7 w! j, z- |- _' [2 Q* S. {% C
int i = 0;
5 g z5 b3 G. D; e" f$ Z
) } ~" u D( J& _' k' q
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
& D: C1 s0 @* \
addr = base + cnt; /* pointer arith! */
# n, Z$ W0 e2 w! G- a
sync ();
" u$ J6 \7 O0 T4 i6 h
save[i++] = *addr;
4 c+ Y. Q" P. j9 {
sync ();
% q8 ~% F/ ?; v$ D
*addr = ~cnt;
& ?2 n2 P6 b1 p
}
2 p" m# c! B8 j
1 b- n! G5 u( a# W7 [
addr = base;
8 k" ? n& I5 e% A
sync ();
/ F2 B, g. T: w/ X3 d5 g4 Q+ ~
save
= *addr;
! c9 O9 {% m3 u7 Z0 J/ ^
sync ();
9 `9 Y* [3 k. s- |! D
*addr = 0;
3 Z8 s* _7 u0 \ a! j
0 d2 ]% g R$ C% u4 t& D! h
sync ();
1 [( K& p b% [( l$ t! c
if ((val = *addr) != 0) {
& W( k$ x6 X; }3 } t! @7 J
/* Restore the original data before leaving the function.
* Y! S& L/ D0 ?* ?$ e
*/
5 |" ?, w- h3 @
sync ();
7 X5 X5 B" \3 n* t
*addr = save
;
+ \0 \) d9 ^8 e1 _9 I; x
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
) n! U5 ]- ?3 o0 @3 q2 q" F
addr = base + cnt;
% q7 h0 [9 \* h1 G! I
sync ();
! s6 j! R, Z7 Z3 u% A. Q
*addr = save[--i];
+ _# a3 ~/ H$ l
}
0 b4 o4 s& c1 G; P
return (0);
+ t# ~. \+ r* J8 e2 Z! p( o
}
! a3 ^/ a% w E/ y' ^, Y
, r4 @% ]& N- y5 R6 M x. r
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
3 B8 V A1 Y' P. n; E5 R1 Q. k" a
addr = base + cnt; /* pointer arith! */
( ` y% d; d" ?' t
val = *addr;
! A. q3 z. Z/ E: i( Q
*addr = save[--i];
0 r* ^# g* k2 i o% O7 B# p2 A" X
if (val != ~cnt) {
9 ?. a' F+ @/ T
size = cnt * sizeof (long);
+ N1 o+ a6 n5 f6 [1 o6 L( _( `
/* Restore the original data before leaving the function.
: u1 u3 D* K* n# C9 e) S
*/
- Z6 W7 z; j; q2 P; k
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
) j3 v' K' F9 n- U; d ?
addr = base + cnt;
$ V6 j& F/ z. j( }6 b8 z7 b
*addr = save[--i];
% m2 G/ X3 F% {/ h
}
5 e$ o. D- Y3 F2 g
return (size);
& \& }/ d7 B3 |0 R8 o4 B& e2 i& J V/ F
}
: c1 V- u7 s8 E" f
}
4 m6 ?3 d+ y/ Y @
+ n7 x+ \5 `6 u' B; [3 Y
return (maxsize);
6 q/ \, n" s+ U1 E+ e4 ?+ d4 H; K; Z
}
4 l- S0 ?: r% k% @7 `! Q W
int dram_init(void)
* n2 j+ |% }1 H+ J2 |
{
9 ?8 W( M& O3 ^5 k
/* dram_init must store complete ramsize in gd->ram_size */
- R I8 X+ Y6 r" p
gd->ram_size = get_ram_size(
j% d; X/ w& G
(void *)CONFIG_SYS_SDRAM_BASE,
, Q0 h7 ?( s$ f7 B
CONFIG_MAX_RAM_BANK_SIZE);
1 o ?% [- C q H( _2 ?' K
return 0;
! `" Q0 e9 j. o$ G* [( s! ^
}
+ U' v# U+ w% E, `. h" d
9 m. v$ B6 U. ^% p: }7 u
( V$ b1 O" f# D) y8 I
/ g$ s" ^" u- d
8 C+ i& V8 r: R2 e9 u
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
; {1 r( ^0 _. k
: `7 v) m- m1 Y: Y! _# g
3 t0 q5 ?9 \$ b) X8 c$ q3 l
) Q. Y; W9 ?) y/ M; }
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4