嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
) H" r+ o; _( ~
核心板2:DDR2 256M Byte NAND FLASH 8G bit
4 z% \! S1 ?7 d
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
! z& N* l" M- V$ v) o
- }9 O6 Q. L1 d
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
, {8 ^1 [$ Z& E) Q3 K+ ?
( D' |, G6 |2 s, R
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
. |. y( B$ j, F$ _
/*
/ J1 ~5 P6 ]7 V* k9 h# K
* Check memory range for valid RAM. A simple memory test determines
2 J- H% P# [8 f
* the actually available RAM size between addresses `base' and
* `) h0 |3 P- x' K% |7 f3 i. n
* `base + maxsize'.
8 F i: A0 g/ ]/ }( Q
*/
( W6 y; l$ M: i
long get_ram_size(long *base, long maxsize)
4 [: O" k0 K3 _4 y j2 J
{
1 X* m1 x$ i% K) S
volatile long *addr;
' m5 G1 U, V8 y- s3 A8 F% f
long save[32];
6 E/ F5 p/ q8 k) s1 v/ q) L" e: b
long cnt;
) [6 Z& i6 Y) |" L+ n9 p: {
long val;
6 h b$ h4 [! Y, a
long size;
( K. l1 k2 o, D# F5 I& r8 f- Y
int i = 0;
+ Y( y' Y% F2 U* |* c, B
2 B, H1 e& I3 T
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
' p+ z0 p6 X. w% V5 g
addr = base + cnt; /* pointer arith! */
1 r* b% Z" u6 k* E: F. L
sync ();
9 ]! d/ H, t" C7 ^) B' [
save[i++] = *addr;
# k: j% G' i4 t( O% R3 q& D+ q
sync ();
5 r5 o; w/ E" H6 z0 s3 a; l e
*addr = ~cnt;
5 h0 `- m! B8 B2 y) U v( K
}
7 E+ J7 C. ^( V% y
' ^5 d) {: G8 S2 s
addr = base;
) R* i* d( j0 n. V
sync ();
" ^, R r1 p7 z( |7 W5 ^+ A
save
= *addr;
2 Q6 F, |7 ?7 }! |3 g* q, W, P+ Q
sync ();
7 f2 t: B7 P. w6 U
*addr = 0;
* ~; K0 j- u) |* i7 @7 k$ u) ?
4 f5 V1 k; a# M! K# p0 ]" e
sync ();
- ~0 H1 [9 N Q) ]% n: L
if ((val = *addr) != 0) {
~7 g, ?0 I1 V0 Q' q! N! _
/* Restore the original data before leaving the function.
1 @6 ^ I m$ u, }7 E9 [
*/
S+ i7 g% P5 C0 @6 N3 R) E4 R- P
sync ();
" [9 K) f" b8 U; u) u( w |
*addr = save
;
3 j2 [3 g4 G: H& l+ u6 W& K* }! r& |2 D
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
7 `2 T5 G* v% v2 { d' w/ t: b
addr = base + cnt;
! H# o3 m3 g& q$ h2 z
sync ();
. o- U+ M9 Q- X6 T/ O( ]
*addr = save[--i];
) |' w$ S* I* M
}
9 P: O/ }. x' @3 f9 }
return (0);
6 O- |8 l1 e0 m: h: v/ D2 w& c
}
) N/ Q8 F( A, e6 g
: }5 t9 J, M& |% H/ {
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
' m5 ]0 B9 o6 A' F% S7 D
addr = base + cnt; /* pointer arith! */
# ~" U `+ K0 B. B( c
val = *addr;
, w: X2 C4 w) B9 J' ^1 f
*addr = save[--i];
9 m$ m8 n4 b8 e/ l7 G& b- g: e4 S7 g+ \
if (val != ~cnt) {
& o( D# w/ p# [3 V) h1 D$ k7 Y
size = cnt * sizeof (long);
9 W- V! o3 H) j& k, Q8 }8 \
/* Restore the original data before leaving the function.
) O5 o3 N2 a2 Y+ x3 P
*/
& n4 }4 |) V; M; R1 n$ }! h
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
5 b4 v0 \1 y' i. `+ N+ E5 z/ J
addr = base + cnt;
; X) k O5 X' R1 J& D+ w) i
*addr = save[--i];
4 a/ T# {0 Y$ O9 _# G( d7 s
}
: j; p$ z7 i& |* p3 F# g; I
return (size);
@2 v) W1 q6 n- l( Y* L
}
2 f/ F4 _* Q7 a$ a
}
1 H. M9 x+ B$ }4 x4 c [
& a! L e2 D0 k& s
return (maxsize);
a" S7 N6 Q2 e2 e
}
. z6 G# w4 G5 b4 \ Z* ?$ J
int dram_init(void)
! N' H0 n5 N6 v& W0 q" A& C
{
1 _% G8 Q3 S& R \0 g8 d1 U+ N
/* dram_init must store complete ramsize in gd->ram_size */
2 M& ?5 `2 g* l; O3 v( v
gd->ram_size = get_ram_size(
( ?2 |% c# |: D$ g" W2 ^
(void *)CONFIG_SYS_SDRAM_BASE,
# l1 d0 a$ a, m/ A
CONFIG_MAX_RAM_BANK_SIZE);
2 j {. Q& ]1 U) {& O }
return 0;
2 T" A6 t1 X! S4 y7 ~
}
3 V$ D* n3 j2 K8 @5 Y- k& f1 }
' Z) w5 B, W8 ^+ j* M3 N
+ \: j$ Y& J8 A
3 k- B v4 X9 r! }2 E2 z6 `7 D# b
; W/ _+ ?7 s/ y! W+ y8 ~
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
+ \" [. x) U1 }
9 M8 b/ Y( X% E9 e2 T' p
& V8 D' H5 a# P! b, R0 }& D! O
" C$ E2 G8 j4 R( `, b4 @
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4