嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
3 d1 R& @, r3 N( z# J
核心板2:DDR2 256M Byte NAND FLASH 8G bit
6 {% q0 w7 J. n8 Q
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
]+ y w2 I. J+ y
( C$ z" j' L6 d9 \ M" E6 d
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
% s! i$ s6 o# I1 T; W& R. Q4 {
2 j2 r$ W7 I% O2 s( W) H0 `/ h# I
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
% r1 z7 v7 c. A+ Q
/*
1 t! X" Y4 D; F$ I6 C! G6 k
* Check memory range for valid RAM. A simple memory test determines
' U1 \" N4 Z: |0 a- q' ^. c& m
* the actually available RAM size between addresses `base' and
3 \. o2 m! u$ H& S6 a/ L
* `base + maxsize'.
0 n" t$ f2 V9 \2 C+ w2 e
*/
! }% {2 x- D6 \- x* h5 \3 s) |
long get_ram_size(long *base, long maxsize)
! h! O5 @6 h0 z1 S
{
7 [( Z) e; D9 g# o8 e
volatile long *addr;
, f8 O: z, H; T3 h
long save[32];
9 |$ h% V' R# z: E, z o
long cnt;
' d0 t0 @/ X6 L( G
long val;
, E1 y/ H9 u$ h' `! N9 l, \
long size;
+ R( ~- u: }% F
int i = 0;
% b+ p9 D! G$ R7 O9 I- j3 X, M' |
0 V4 y* s: z6 {+ M3 }
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
( ~& R+ g5 g# d3 M
addr = base + cnt; /* pointer arith! */
V$ H w! ~* ~9 N9 Y$ Y
sync ();
; y% @, X; _8 M+ e
save[i++] = *addr;
/ e- j2 j! c/ H" J% C6 |& F* I1 ^: e
sync ();
6 n `. D* G0 S* v1 i6 \2 u3 H0 V
*addr = ~cnt;
8 G1 M6 {# f2 B) F
}
; e1 P: }' i: Z
5 s+ Z; D, S) p+ A# o; N+ ^
addr = base;
* r- d8 t, y% s; I* Y: |
sync ();
) Y1 t& |* A. H( s8 f; u/ A
save
= *addr;
4 X/ a! {. L# ^7 ^4 t f, |: w
sync ();
6 V% ?# C9 m; u! C; l
*addr = 0;
2 n' X; E a' T2 ^
K5 ~% i/ V. u% B
sync ();
2 D* J) B% U( [. D. h; F
if ((val = *addr) != 0) {
3 m/ M$ Z% u6 t7 N$ Z. _3 U
/* Restore the original data before leaving the function.
: t" H) F# n+ ^8 ~
*/
9 x, m4 M/ C. }
sync ();
' k+ Z5 d8 S H' R% L h
*addr = save
;
/ ?# g. D. F4 j' M# Z" |
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
4 u/ h8 P5 Z! \9 K: b# N& e1 }- H* d
addr = base + cnt;
1 t2 S+ R- C+ M# p) q
sync ();
5 k% R6 ] s1 i! a, O+ m
*addr = save[--i];
! j2 ^) e2 T @
}
; |8 S4 g* Y& o8 v6 k5 a
return (0);
3 E6 ~3 }9 d8 {0 {! l5 O
}
1 r+ \% ]6 l& N' n) T
( A* K- ~8 B1 G
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
* R1 N/ {. X. W5 E: t
addr = base + cnt; /* pointer arith! */
0 K: [! K' B6 H. N, E8 h3 O, o) A
val = *addr;
: [# _) a2 {0 b# g+ m, G8 B' N
*addr = save[--i];
4 ?4 c: _7 I: q: X# n
if (val != ~cnt) {
. C: w1 E; N) ?4 j/ k5 V
size = cnt * sizeof (long);
% I# Z# J2 h4 T3 K* b
/* Restore the original data before leaving the function.
" r- N( B2 v9 s4 Y+ F; Y
*/
$ v0 _/ S* g$ G& K; ]8 L+ B
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
g2 t' q. [8 t: g+ A. N
addr = base + cnt;
) G$ g" z, s& m9 j+ F5 J9 T
*addr = save[--i];
" ?, h! ?' Z- q, A
}
$ F4 \: V5 i( ]( ]: P
return (size);
* G' [/ ?# P" d# v9 N
}
% x% |% Q* F. E
}
9 B9 {$ X* ^9 ~' O8 S, D1 ]" f
7 L! b |6 q8 D# d6 q& E
return (maxsize);
' j6 Z9 P! ~8 ^
}
/ p/ D; S8 ^& Q2 X- M+ N3 V
int dram_init(void)
% P* D8 D. ]6 r5 v9 t
{
1 s; h: S/ M# }1 w
/* dram_init must store complete ramsize in gd->ram_size */
3 |9 M, r+ @$ S" o
gd->ram_size = get_ram_size(
* u! E" b+ n0 ?
(void *)CONFIG_SYS_SDRAM_BASE,
9 U: N( S3 e3 N i/ h1 s2 h& a
CONFIG_MAX_RAM_BANK_SIZE);
2 |' i, Y$ s) ?) j y7 p
return 0;
9 u2 j6 D' X i& z
}
( k9 O' y$ r# X9 U, e4 D# H u
& U5 _% E* p1 @: d, u5 Y4 m l
t3 {/ l) P- i% r& c
6 r+ E& o+ Q$ q) B! r W7 j4 G' y
$ y7 O" W* v! H5 I, T
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
& u. ^+ e7 v, B) |5 A. V; k& v; @3 [
# F# {" |* f$ X/ ?
) i6 q/ I: I; n! \8 G# H: Q
3 I1 m& D% b3 m8 U% z0 `9 Q
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4