嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
, ?; k! X/ u+ u) l; |
核心板2:DDR2 256M Byte NAND FLASH 8G bit
& a+ {3 c! p/ r/ o" _
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
' W# t J+ B# W* H1 J7 ^0 `, E
' b% L5 x' v0 J) H/ Y+ y- X
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
! h% A9 N* g, J6 m9 x; P1 D' z
, f( z2 k( m9 D7 F
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
) n1 O3 A1 m3 n; V7 w
/*
* {$ r4 t( H7 R
* Check memory range for valid RAM. A simple memory test determines
5 n+ E, X% c( m1 U. L' N$ G
* the actually available RAM size between addresses `base' and
* Z3 K: ]% O8 g0 e, f9 j
* `base + maxsize'.
! r. i6 _0 a" j2 x
*/
! T7 N. y* W+ Z# U9 A+ _8 t
long get_ram_size(long *base, long maxsize)
O0 J$ R( d& D0 ~
{
* Z2 Q& C; w% X' f! _
volatile long *addr;
# o8 x0 \3 i) {6 r( r$ W
long save[32];
/ r1 x3 l+ Q. Y* Q
long cnt;
. I1 C" _5 b4 A* j6 X D
long val;
4 `$ |8 M1 A, A, B' U/ W
long size;
. ~1 \1 L7 w6 y* @ }
int i = 0;
& n' V/ A! C9 ?4 @1 D
! l& l4 s& a/ \( z3 c; r9 `
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
5 x h6 e! C6 l0 W. W% h
addr = base + cnt; /* pointer arith! */
) g* ^9 F+ }2 K- j
sync ();
' n8 P8 A+ i& U1 S# N3 D' s
save[i++] = *addr;
9 \3 b" s B) \$ y
sync ();
! x5 ^* c- a$ R5 |- p
*addr = ~cnt;
' R. n' b/ r! Y; w; B
}
7 a; J/ p- a$ k. ]- @9 c& M" P& U
; V# S0 B2 k! b6 B% y! N& A
addr = base;
( m" ]* n" \9 {) U2 F
sync ();
& ]5 D# p: j/ O- t% D4 F
save
= *addr;
! t# O. d/ o! p9 c
sync ();
- ]0 d2 B# P* o, T1 y) y( x* K9 S
*addr = 0;
) W: x% i: r& d# r6 {
9 K6 u7 D: j$ U
sync ();
5 O o* B5 L; Q2 i) z% C' k- _
if ((val = *addr) != 0) {
- y2 r. l- c- ]3 L" m
/* Restore the original data before leaving the function.
8 Z" c- c- M4 D. }; O; c# d& t M
*/
3 |% B6 h1 j9 q
sync ();
! v& }0 l+ T' u4 R7 Y) f' J+ @7 q
*addr = save
;
% w8 b/ {# @1 b8 X' B, m
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
) {! @3 ^" i" R' z% J; }1 v
addr = base + cnt;
' j* `- O& N. r. W2 K; a6 B8 W2 O7 f+ x3 C
sync ();
4 ?9 v, P2 ]; n3 U7 n e
*addr = save[--i];
8 o& l6 K7 V- \" Y
}
* r; Q4 L6 C& C8 D" w
return (0);
1 j! N7 K6 _" q; r/ o) g
}
0 W5 C6 X' U7 @
. S" \3 h, E. M! \, O
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
' Y' F, D$ i# _& G2 M4 |$ k
addr = base + cnt; /* pointer arith! */
( Y% A& i" r" X# Y* z5 P
val = *addr;
/ |) ?6 o( H& ]0 \5 t
*addr = save[--i];
, Z$ d( v- n! [
if (val != ~cnt) {
) R+ v8 d, x' R# R
size = cnt * sizeof (long);
$ E* w: ?% u/ M% Z9 P5 s5 f/ \
/* Restore the original data before leaving the function.
& M! H4 y( m! U/ ^/ J8 M
*/
7 y' k- Z% h) l% W; H6 E
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
, z& j2 J; ~" v! v
addr = base + cnt;
' i9 b7 o+ Z* B! }
*addr = save[--i];
0 Q r! c* A3 B0 h, s
}
. x0 _" t8 W3 R4 c, ?, D* U. X
return (size);
( }0 ~4 [2 z0 v+ `
}
5 m! S! L" d0 g' ^3 A$ ]) s
}
4 A& `1 z0 Q- ]2 X1 b
! C( e0 v" |& z* a
return (maxsize);
7 q" l \$ }3 h" o5 S# b/ t
}
" t5 A2 s b* |
int dram_init(void)
9 y3 M' D' P: i
{
8 s* _8 L" m+ k8 p; }+ D# i7 P
/* dram_init must store complete ramsize in gd->ram_size */
0 ~& q5 r& X" O$ h) C+ c
gd->ram_size = get_ram_size(
- H% i. }6 f& e. T8 {4 n. H8 }
(void *)CONFIG_SYS_SDRAM_BASE,
: N6 W; o6 e6 N- n! Q: D
CONFIG_MAX_RAM_BANK_SIZE);
2 ]2 R- B1 U' b+ v
return 0;
: l8 `$ w- Q& p8 R. t$ ?9 B
}
: M! t0 R/ S# T3 b5 U9 H# F
4 J. e* Z S5 b0 G2 J7 W; Y
G$ W5 D' O6 M, A0 l, R9 A
3 T3 o: i8 M/ V1 y$ h
) v/ j! m: Q/ A) a" W' x) v+ E
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
" c2 d* a. l/ g7 O$ P
% w8 P+ {& c8 C. z
. ~: C6 }1 d% @9 \4 w* ?' s8 l
$ G$ l8 w7 H. I2 A5 U, \
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4