嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
6 Y* F* C# b2 H8 J4 W9 R/ g
核心板2:DDR2 256M Byte NAND FLASH 8G bit
/ }: q( z; }4 _
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
2 G/ L. Q" F6 ~. A( e& a6 f4 j
! F. A9 @; n0 H: y
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
8 C) M V+ g5 X; w
. W. r" J% z% B2 F
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
: o* V6 K. g& a7 ?) d6 A3 Q% ?' j
/*
6 N+ H0 x5 v6 a) c" {
* Check memory range for valid RAM. A simple memory test determines
; j) o7 M) s* A+ x2 N- Q: ^ e
* the actually available RAM size between addresses `base' and
5 ^+ {5 C3 U3 m r: ^& S- b3 |
* `base + maxsize'.
0 Z1 O/ y5 Q4 ]7 Z
*/
( i. D1 A* v' {. G0 l8 o
long get_ram_size(long *base, long maxsize)
5 P& [/ r) y& z+ I8 y0 x O, z
{
3 |0 s3 P; u* h7 |
volatile long *addr;
9 v( W* {$ ^7 q: @% P q0 ?) T
long save[32];
+ A% X* B, i* ]" \$ @' R
long cnt;
( v8 q2 ?. b7 i* M
long val;
0 Z! v; L. k* n; j: l5 i
long size;
8 B6 R6 z7 U& p- w$ P2 n$ Y
int i = 0;
7 c# q/ Z' W0 m5 Z5 k- N% Q
n9 H& \6 T6 f6 b: Z: M% R
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
: d, i5 e* r. q/ i" Z
addr = base + cnt; /* pointer arith! */
2 S+ q% v: c" h O
sync ();
8 w. h( h5 t' X& U, D: a
save[i++] = *addr;
+ {9 y& G; H: F- B. P9 b
sync ();
+ Z! j: i4 N" m( @9 n% P
*addr = ~cnt;
! s9 V( \4 y7 a- y8 r# {& W
}
' q: U9 L2 Q. o& M- ~1 w
$ U7 e4 P) s+ |8 ?5 O- A6 o
addr = base;
& E* O' A, a8 K2 a
sync ();
; e8 \7 U7 }) W, h7 d
save
= *addr;
- v. F8 g, M6 J; K2 t0 _+ S
sync ();
2 P7 M$ T% {# k8 V
*addr = 0;
4 |0 {2 I! _4 h2 \. K
) b+ h5 r; V) y$ c0 @1 U
sync ();
5 D7 |. e6 _; P2 t+ Q3 Q* N+ N! R$ o4 t
if ((val = *addr) != 0) {
. i8 B" K+ M, Z. C
/* Restore the original data before leaving the function.
% k$ B) F7 L1 Y* e z& P4 h: k. G
*/
6 b( M2 z) B/ C! b0 e/ I) O
sync ();
6 j/ \; O: M' U4 q8 b9 f8 k( |
*addr = save
;
8 T( U3 }; _5 d
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
( Y) D- o8 M6 u# A0 z! {. S2 D& K3 h
addr = base + cnt;
1 A5 }# t0 O3 ~ X" s
sync ();
! M( y! q, H2 N$ U
*addr = save[--i];
" X" ], ?4 s' \9 ^" p9 B
}
# i6 c. |) @5 R* Z
return (0);
' x! ]2 g* Q6 V) L7 G! G2 ~0 L
}
" _( {' @0 A4 V% ~" U
. l! j* t o' d3 _1 q
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
+ k# F" O: _# C
addr = base + cnt; /* pointer arith! */
/ J0 V* h0 f) k% O2 |; _
val = *addr;
, r5 _) o9 Y2 w* `3 P1 M5 O
*addr = save[--i];
7 @. k* X) t0 a! o
if (val != ~cnt) {
0 q9 d9 `" O0 c5 H& L
size = cnt * sizeof (long);
* Z9 K5 o2 ?" ]- [! V* {
/* Restore the original data before leaving the function.
- b" z, ?1 I0 @/ ~9 T
*/
* F Q- A8 F$ {) @
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
9 T" n5 r6 v3 h; Q+ S5 p+ y
addr = base + cnt;
( W; c. }1 g# D
*addr = save[--i];
2 ^' B1 R! |$ l
}
( R9 J- n1 d4 g
return (size);
6 l$ y% g) g( X+ b
}
0 `! t: H' Q9 @0 X1 H. b
}
5 m3 y; `6 a5 {. P4 k
8 |' E4 e/ r# N( J: n, }8 Q; ~
return (maxsize);
) _- L0 J/ W0 |$ x2 z9 r/ ?0 T" ?
}
' ?/ |3 G9 j0 S% n
int dram_init(void)
+ j$ N* m8 K! y- N0 v
{
: O* D7 m, ]' c+ b( s
/* dram_init must store complete ramsize in gd->ram_size */
& l7 ?" ]6 n4 O5 _' G
gd->ram_size = get_ram_size(
) p0 D( V; }7 y- @
(void *)CONFIG_SYS_SDRAM_BASE,
# S1 G* r4 H; A4 d
CONFIG_MAX_RAM_BANK_SIZE);
# Y. }; m `, I# t- v3 U( S
return 0;
8 l! ?; d# d: ?5 P% y( i
}
; A5 ^' B' _: _ n
5 @0 }+ N: v1 q# O( I
+ E& m- O3 b* {6 n6 G0 ?3 l/ B c
4 d7 k) Q. b' M( Q' A$ F3 p2 ]3 X
( l* S4 B* |* F& _$ m$ @& u
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
8 B8 _% u: k, d: w; U" |; z
! h/ s$ K& U3 A4 P
4 \1 w- b; t$ R
9 Q- d/ M8 t- J4 _& r! T6 f$ }
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4