嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
4 O* u L: S: i8 [+ x5 e2 p
核心板2:DDR2 256M Byte NAND FLASH 8G bit
3 {# G. g5 C! y' s
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
: s9 D1 u. J, T8 V/ M
) K' J- K( m/ U5 {4 _
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
7 q6 N; ]' i/ A% r- {& Y
8 K5 \( ?+ L' e2 M* i7 r0 ?* U9 ~
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
9 I- e; R: a) t6 q$ A! T: K/ [
/*
3 ~( E2 _* r2 D$ u$ P6 T5 }
* Check memory range for valid RAM. A simple memory test determines
) ]" j; W- i2 s7 u0 s
* the actually available RAM size between addresses `base' and
/ ]+ ?7 N6 B* ^! c, r& Q
* `base + maxsize'.
, @+ v9 [3 }* E
*/
, j' z( q2 y: k9 Q; t
long get_ram_size(long *base, long maxsize)
- {8 h4 t5 V! q. i# }
{
0 I- [2 `$ o- l' c/ `8 q
volatile long *addr;
' r: h8 k. E" ^/ m, M8 U
long save[32];
$ [' V7 ~3 d2 H: j
long cnt;
4 X8 J( I1 n) P4 f, \3 o" h
long val;
( X3 v, a- w0 t+ s0 p( ?
long size;
- L& q8 W* W) T! G5 f6 ~6 i# m5 V
int i = 0;
4 f* v. q+ X6 a; e2 _4 }! }& @
, i6 ~6 S8 b; I! u& p) ]' Q
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
4 ^' y9 V7 E$ g$ G- B2 h5 M
addr = base + cnt; /* pointer arith! */
P. T% I% ]5 b% m. b
sync ();
$ y% O+ f/ L6 A- O( a) R
save[i++] = *addr;
/ F% g# {+ y8 }5 B. F! E
sync ();
9 E2 X! K. c+ N3 E, h, u+ {- p
*addr = ~cnt;
1 a4 L) k* T+ V; J
}
8 u- W( {6 l- K
$ L$ d# d2 r) D/ u* b, {
addr = base;
. X% {* R6 d! d* n% G- F6 A. S
sync ();
% S# |9 b7 k1 e- y
save
= *addr;
W2 \% Q5 d) j
sync ();
1 v; n+ z+ k2 V3 S, H
*addr = 0;
% A, t8 }3 t+ L, k4 L$ j9 p
0 R* G% i- }& @7 q z8 f
sync ();
& i4 C5 z) q$ J8 x j* U* N* @
if ((val = *addr) != 0) {
1 ^2 d/ F1 j' N+ {; P+ t
/* Restore the original data before leaving the function.
8 \5 j* }0 E% |( z+ c
*/
0 F$ |' f9 f2 k9 E# `5 H
sync ();
8 z$ |! h6 b" g
*addr = save
;
' z8 @1 q' G4 N; P$ m& L; r
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
5 }. M. t1 U/ d; Q1 N
addr = base + cnt;
! N# M; A ]( C% o! c$ s/ W
sync ();
9 N8 i# Q1 E. Y/ ?8 [
*addr = save[--i];
4 v F% N; p, O: S3 ?4 \9 b9 F& T
}
$ I6 C2 z, x7 [. [2 \ U; h
return (0);
! D. K# v) `8 g5 b2 F5 x! I
}
' r' u. s+ ~) W# T* O, [
0 C, ]7 W0 ]; V7 x
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
' w7 ~ l' g, L# F F+ W
addr = base + cnt; /* pointer arith! */
X, \2 N/ ]% e4 h
val = *addr;
# t3 Q% A3 Y. q% s3 P
*addr = save[--i];
: k# D1 d& @' X3 P7 t7 d
if (val != ~cnt) {
0 u& p2 i1 X, A7 k4 ~$ H$ G
size = cnt * sizeof (long);
! h: n0 U- E) @* r. p1 {" i
/* Restore the original data before leaving the function.
9 p) v( x, b3 E' O
*/
9 `1 q8 d. G) ]4 o3 r) a8 c. `" T
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
' b. T, b) u! N C
addr = base + cnt;
- _" |" m8 \. v) G( n$ x
*addr = save[--i];
9 W! u |/ m; H5 U
}
' ^( q! a9 d2 S
return (size);
8 s" h( }$ ^3 n. C. E l' a7 e
}
9 r* S3 Z& D# s8 G L, ?
}
# @, m0 R1 D+ T
q5 \! G" `+ ^9 G
return (maxsize);
- p S$ u) `0 X: G9 @* @
}
" a0 K o( }9 t2 O' L6 H' l
int dram_init(void)
, X: ^+ g/ X6 u2 A) K0 M# w2 {) V) ^- s
{
3 f; L: \5 m2 t- z) w5 { |
/* dram_init must store complete ramsize in gd->ram_size */
8 J( d3 N" G+ x3 m5 s* F
gd->ram_size = get_ram_size(
( G- x% g, N8 ?
(void *)CONFIG_SYS_SDRAM_BASE,
0 C+ A0 V2 I3 B& v5 J
CONFIG_MAX_RAM_BANK_SIZE);
, |% k5 N, q S
return 0;
2 k* m! w; N+ j
}
. G: g+ I* F+ c" ^# q
. s5 k* v: O# P: R& J
3 _" ]/ Z X. v7 f- A4 T
6 i8 N2 J& c1 \6 ]- T/ u* w9 F
7 |! g: t! b- h
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
) `" u+ Q j. U! G$ L, `
) J' a$ r- R/ V
! x2 d5 l N% I+ U
# {( ]) ^; z1 M2 A; i
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4