嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
1 r2 H% S' X/ A3 g" @
核心板2:DDR2 256M Byte NAND FLASH 8G bit
% k5 N& o7 e2 n+ K6 J
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
& A$ [4 h3 r3 G; K3 x! o
: \) ?( W8 M) G+ K$ x7 B
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
" }! B$ ~9 W F( ?
, x% L/ \0 R9 j2 K+ J" f
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
6 r5 K8 R9 N B1 z$ a
/*
% o0 F9 ^. c- W/ W
* Check memory range for valid RAM. A simple memory test determines
; ]2 a" h e0 `6 n# F3 v
* the actually available RAM size between addresses `base' and
! b& x- [2 _, D- w! T( p8 |# }
* `base + maxsize'.
- d$ P% ^2 Q+ Y
*/
! W7 ?! q& c+ _' ]( P+ M& O8 Y, [
long get_ram_size(long *base, long maxsize)
8 o7 ]' S/ Y5 J' \
{
. I* N0 }$ N" i5 ]
volatile long *addr;
- ?0 ?: W% J: g8 z
long save[32];
/ m3 ?$ ?# P/ W* e; ~
long cnt;
- w% U- X* H* k! [4 v+ d
long val;
% a! n/ d d4 c
long size;
% {$ I, u1 K; K \8 L9 E; h7 n
int i = 0;
2 c$ e$ E/ z' a8 I7 C* G" E% ?
6 M1 ]0 d J& V4 M1 ]
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
* Y6 I$ ]: X+ j, x) G7 R
addr = base + cnt; /* pointer arith! */
, D3 t- ]' W8 g, P3 ^
sync ();
( @% H' y. \# ?
save[i++] = *addr;
) I) }3 y3 ~1 B7 |2 q" k
sync ();
6 d G; M/ B2 ]+ z
*addr = ~cnt;
- R. Q A& E) S
}
9 F+ G& b7 J5 }0 C
, B% w' { P$ j
addr = base;
6 a/ H8 [3 u1 B
sync ();
. f* L' } @ C9 }
save
= *addr;
4 L5 d: L3 f! b. J- E- D9 Z, l
sync ();
) D% F4 a) w: u! N1 c: m5 J
*addr = 0;
) D" N2 y/ D/ f- a L- w
O8 ]/ s9 Q j
sync ();
9 l) U; `& v! Y" Y% |2 f
if ((val = *addr) != 0) {
' V: k$ Q& Q* u9 Y: C! S
/* Restore the original data before leaving the function.
+ d# l4 ~7 Q1 r1 t2 w9 R
*/
0 _& f/ i$ z8 }* a2 ?
sync ();
9 E. w; q W) w' X, ?, m
*addr = save
;
" {% b: | ]7 B0 K* o# {
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
' t* m9 R2 [; W( E$ S- G) C
addr = base + cnt;
! K; E6 T5 j" m* @7 D
sync ();
Q* ~8 S( }% t3 b$ B
*addr = save[--i];
3 ^ M: r, @8 K, t
}
3 n$ U @$ {) `0 Z
return (0);
4 t. e2 j9 ~& ^( [$ S1 B( B
}
5 z( g3 i7 W# P
4 S5 [% }; q3 o' V
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
4 V2 v) u7 R7 p' T6 j, M! w) Q
addr = base + cnt; /* pointer arith! */
8 G( r3 `8 y2 c( Q) j4 v' g0 Y
val = *addr;
- q* Y/ ~5 G; q( c) e& K; ]
*addr = save[--i];
# Y7 o+ L+ K P& E# s' Q
if (val != ~cnt) {
2 ]; O: d$ f2 r1 b
size = cnt * sizeof (long);
$ T, Z# k# X8 ]# R- H1 ^
/* Restore the original data before leaving the function.
0 V* C d: h( |9 y1 s
*/
( z9 E: _3 C, N, g- v$ ?
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
% c% A, s/ b6 X! j% n
addr = base + cnt;
2 J; j( R2 U; f+ t
*addr = save[--i];
4 D/ V/ ]$ i3 }/ U3 q4 R- m
}
9 f- v) @1 ]( k: z
return (size);
. D/ h2 g- B A# ?5 o. |: S
}
! y1 x5 C/ V0 e* `
}
1 G8 z4 s3 `5 e* ~7 X# t
* C. K2 V- |) M$ s) x3 X
return (maxsize);
1 U/ v8 m. v5 M& k8 I- N; t
}
$ N$ x- e6 n/ S
int dram_init(void)
. F: y( R o( Q9 v& _( F
{
' p8 j" R [8 R; m6 U
/* dram_init must store complete ramsize in gd->ram_size */
[1 R: l! O4 m2 a# \; @
gd->ram_size = get_ram_size(
3 i0 R4 p' p5 J( n
(void *)CONFIG_SYS_SDRAM_BASE,
0 Q0 l) P/ i+ h+ j# e, W
CONFIG_MAX_RAM_BANK_SIZE);
, P! Q, y+ I- D% t+ T
return 0;
# W, ]: O+ o( ]
}
9 q8 S. M$ L0 B
" w7 _2 K0 t# P- y! P* y
1 k- H, W! V$ I
; L/ F2 N* Y% p* m, X1 X
' P0 G3 N8 S* [+ }3 _
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
+ b( [) d# I1 O) p
0 Z; |+ F, X3 Y0 u
( i% ~9 e% ^% d. p: ^
4 Z/ Z) E" O8 K& x0 o4 a
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4