嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
+ o! V* l3 s( u
核心板2:DDR2 256M Byte NAND FLASH 8G bit
* h+ ^% D) l+ w+ \5 n, Y
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
; f0 M: B# ]9 ~$ c% N4 u
5 y6 e$ }7 E5 w o/ h: w7 z
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
4 V& j5 L( T% C/ r3 y' v
2 A: i& _1 U x. t9 c
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
: ~. S. |/ I8 T# N4 K! `/ N
/*
8 A/ w; W5 ?8 ]1 N0 R! I$ j
* Check memory range for valid RAM. A simple memory test determines
/ M( W: c# N& ~' O$ E2 y
* the actually available RAM size between addresses `base' and
3 M* U/ {, D. ?4 u- z! o1 Z, q/ {
* `base + maxsize'.
; L, H: `* d: w( |: A
*/
; n9 a/ d, o, I
long get_ram_size(long *base, long maxsize)
* I' M$ u e. @8 V$ H6 ]4 F2 K* o( d
{
w0 s2 ` r2 j1 A5 `* x- L+ e
volatile long *addr;
8 J) G. z2 a5 b- Z# G, n
long save[32];
' F" o" P2 Q1 o( t! P
long cnt;
: T. o2 |1 A' E& u/ C9 w
long val;
$ T6 S( D' [8 k9 i; U
long size;
+ N* A' b: }7 n7 S
int i = 0;
. v5 \8 T1 j$ r0 y: r- r N
6 Q- H- n1 X( m& y
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
3 M g- a& ?# U3 D5 Y
addr = base + cnt; /* pointer arith! */
! }0 g# f" U( m
sync ();
" l& x0 J( n: E3 a- g8 w
save[i++] = *addr;
/ B# h3 j' v4 B) j. v
sync ();
, Y1 r7 M+ B5 R1 B
*addr = ~cnt;
2 K7 Z4 u5 Y* U8 L2 s6 e$ p
}
) W) {. y& v, u; U( w! K/ X$ ?$ h
+ n) w: I4 U0 L
addr = base;
! [/ y( v7 ~+ B0 b- Z
sync ();
4 h8 R! z4 a: e3 R
save
= *addr;
0 y3 A( A0 j4 w, V, H+ }
sync ();
1 d( a1 A% I& o: }3 \7 l8 i
*addr = 0;
2 m: E3 I7 L* }
) g( [/ ^6 ^8 x% L! ~! N
sync ();
# k0 U7 I: o) c2 l
if ((val = *addr) != 0) {
+ L. Q/ H) Z% @5 s- S
/* Restore the original data before leaving the function.
9 Q+ G; q4 ^4 d) x1 v9 N* T) h
*/
' p) f# y4 K! {
sync ();
! f& z4 c4 h8 Q/ E `. H) ^& _
*addr = save
;
0 U+ E* N; y1 a2 u" W
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
1 A) a- G+ q2 t! F5 I: c
addr = base + cnt;
% s- ^5 m$ _4 z; e( @
sync ();
, X# q9 d- c" M* p
*addr = save[--i];
6 P" z, W/ h2 c) a
}
2 b) w4 F1 s# r8 Q) R) b
return (0);
6 Y. `# f! q# B+ M8 I! Y
}
) \5 r6 e# E6 z7 n; n
7 C! x3 F: W v* d6 d
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
' C' q1 }, U3 y& v5 V( w
addr = base + cnt; /* pointer arith! */
, V$ N0 j/ d3 c! Y7 O( _/ @5 D
val = *addr;
; U3 s7 J% S% ~* [+ Y2 D+ A
*addr = save[--i];
/ d* R( U/ k9 x3 N1 s' A- D5 K
if (val != ~cnt) {
. j6 v3 D' N, ^3 P
size = cnt * sizeof (long);
$ P( M* d5 h; W4 F5 O. d$ M
/* Restore the original data before leaving the function.
$ C5 G# R, T! R% Q+ v; i
*/
2 B/ s8 j7 P- B! M
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
7 S* \. n( m7 |5 L5 x
addr = base + cnt;
8 L7 p; l# [" d2 t
*addr = save[--i];
* M3 a5 u6 U; Z# v/ d
}
9 u6 L1 @+ {- y. D
return (size);
- X7 @2 r! r' A+ w( q5 Z
}
7 J* B5 ]; {! ]+ l0 m" ^
}
4 r% |2 y! R4 t6 g/ Y. u) W: Z
$ q; E, {3 X. a" ^, o* _
return (maxsize);
0 X! ?3 }7 s! x
}
( s7 k: D2 Z: R
int dram_init(void)
1 R1 a7 }! ?9 C1 N# l8 n
{
) [1 s) H7 L" i3 T; V
/* dram_init must store complete ramsize in gd->ram_size */
) i8 X6 j, c& F V
gd->ram_size = get_ram_size(
5 _" P- l9 l: z" u
(void *)CONFIG_SYS_SDRAM_BASE,
5 \/ R+ W" @- A' m6 i
CONFIG_MAX_RAM_BANK_SIZE);
2 C! \& \- J7 v3 W* O5 [
return 0;
; `$ x8 v" S6 G/ M( d
}
$ V7 l1 @6 _0 j7 k1 A4 E( a
( I. e; [' Y5 g! B! `3 h
; \4 `+ C( @. Y2 ]( S. u
1 f% m+ ^( h4 I$ c& M. P7 @& Y
0 o* _2 L+ g) p3 X$ I
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
3 p; k F- g* t' p" T
" T6 Z7 P5 N( P, _
) x% Z% t: p( x3 y' m/ x
" X7 P0 o% j2 A0 y5 b
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4