嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
" a+ M/ c# `! m) A) B* v: N. @
核心板2:DDR2 256M Byte NAND FLASH 8G bit
& U! C; ^; F0 d
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
^+ J& z" j5 @+ w9 i- h ~2 p
- ^, c8 |6 f2 k+ E8 ^! J
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
& g3 w( D+ U2 j, O
* w# F1 C% ~: N- m
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
" a- a8 k& j' ]2 V
/*
9 ?5 P H0 P8 B; l- ]' J7 h) F
* Check memory range for valid RAM. A simple memory test determines
7 @5 L1 v# d @& R" k* \
* the actually available RAM size between addresses `base' and
0 p$ ?! {, ]# f4 A! K8 F' \$ f
* `base + maxsize'.
1 S/ C: `7 T1 W: c4 }% n3 ]
*/
. I! _4 E+ c8 l- Y: t0 P3 x3 g( a
long get_ram_size(long *base, long maxsize)
. z+ p# G& l# G+ L/ Y
{
' a9 G+ f8 Y: e6 b
volatile long *addr;
; `% M. k3 U. a$ h
long save[32];
+ Q: ~9 v0 o) G* r t6 R# }- q
long cnt;
9 E; {+ a2 s1 Q5 a* g% n+ c4 m* c
long val;
) b! ]+ e' U! W' k! E5 X4 E
long size;
# U D0 [( H8 y7 u$ J* a
int i = 0;
% F; \, F7 ~, H& Y2 u
+ E9 U- h0 s* }: }/ m
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
* R- i$ _ O- {7 U8 `
addr = base + cnt; /* pointer arith! */
3 o; J# p* z3 j+ L8 Y. ]; c/ {3 ?2 {
sync ();
; b$ U+ {" W7 B; k3 l( p4 s
save[i++] = *addr;
' b+ U4 J* L+ }# w" T. u
sync ();
4 G8 M. v9 C- x: W% D
*addr = ~cnt;
+ @# k( h% e, p1 |4 g% d
}
% K2 A+ N' Q5 D; S! d1 H2 H& f
& l1 a" u. o. ]" X
addr = base;
8 d1 K& N' [4 l. Y4 F4 ~3 g* i
sync ();
$ c4 b8 s, }: [8 A4 e! r: w
save
= *addr;
9 E0 \5 _# K! p
sync ();
8 v9 `- c5 D: D4 ?
*addr = 0;
2 M0 G$ ?" q- C
- F! r: E* M( ?4 n
sync ();
- C7 z7 S! Q7 ?' B# [
if ((val = *addr) != 0) {
+ Y) b, B; W: J0 f! p
/* Restore the original data before leaving the function.
5 y# J! D7 F7 u: b! `* ~
*/
8 ^4 T% O% ?9 _6 p* L9 H* p: \ g: G
sync ();
; y: p2 G/ d8 @/ F' x( ^5 k
*addr = save
;
6 K# `* O _, R) Y0 O, ^8 X2 ~2 K
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
' |) _9 E$ s: p! r1 U
addr = base + cnt;
# J& v1 B' s$ i% [# G* F. T
sync ();
/ f) ^( f5 [5 M/ d! H2 ^# O9 @
*addr = save[--i];
' J# `9 v1 Y/ r
}
7 n8 Y* R9 I7 g4 N O J8 x
return (0);
/ L# A5 \" {' A1 N! z0 S
}
# Q7 g* }# g V @& n
1 {; G* U6 r/ K" u0 L' ^
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
! \ s5 e; q3 b
addr = base + cnt; /* pointer arith! */
/ ]( M: N. b( _
val = *addr;
0 h s" U7 [. r1 i' G6 q1 k
*addr = save[--i];
% j2 m! E* z2 E1 i' j8 a
if (val != ~cnt) {
6 ~% j |% I9 v6 }- ^; Y
size = cnt * sizeof (long);
% K2 n* [- p. l0 _% x
/* Restore the original data before leaving the function.
$ y. u+ G3 @5 |- r% Q, t
*/
& J Q+ e7 Y3 B
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
- z' d1 m( _# E" Q8 y
addr = base + cnt;
+ [. m: i, W1 f0 d9 P
*addr = save[--i];
% o8 @: O% |) c. l
}
+ V+ E) Q9 q; r9 u5 l" A
return (size);
. h+ s3 |5 i L" F8 S2 y& V A
}
3 p+ P5 p, X0 I: z" g" H
}
) k. W2 U( ^7 V' M2 c" m, S- j
X' K$ L# J8 {5 v9 K q
return (maxsize);
, k2 ^$ p! ?% Q$ C
}
: O1 P, B9 a9 M4 y9 A2 r, ]" a
int dram_init(void)
' r8 M# u3 p! d3 u
{
9 S. m6 w: B) S8 M% l9 h
/* dram_init must store complete ramsize in gd->ram_size */
1 _0 |# |' A6 {- y( {
gd->ram_size = get_ram_size(
* h2 ] Y8 m) m5 S6 [9 b
(void *)CONFIG_SYS_SDRAM_BASE,
8 L6 w k" e; k5 v
CONFIG_MAX_RAM_BANK_SIZE);
0 t) S. J* X) A3 E4 y+ ]- }
return 0;
( P& V8 }% K8 H# F$ J$ ]6 Q
}
0 Y7 u0 G" [, d$ d+ i
; _; D; y7 }" W$ t" q) G9 Q) [
+ Z2 m; C1 P* m9 [# H
+ ^2 v7 I. e1 F. M- t
e# U( T% H# x
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
9 C0 H. i1 q9 k( d- ?' q. F
+ D- Z# q2 A3 N( }! t' B
/ G- Z( v7 P" Q+ M' D
6 M: ]9 A4 i% M/ P* t
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4