嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
" h; ?1 d N! i$ _* e) P: x
核心板2:DDR2 256M Byte NAND FLASH 8G bit
& H, P! r9 l( s; N6 L$ [
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
9 L( U X9 j* Y |7 r: z
! p# x* b2 R G+ _ Z+ J
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
" n+ F( M" { ~7 A/ e
! d; k+ P( I/ C! e2 l1 _5 _
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
5 }( i U7 T; F+ L: [6 [$ y
/*
0 m0 C+ j8 u- a1 G# J: f
* Check memory range for valid RAM. A simple memory test determines
5 Q$ A6 E* J& }% j) D( k
* the actually available RAM size between addresses `base' and
2 o: I3 M. I7 T8 W- L% y; S
* `base + maxsize'.
- @% A, W* C6 {
*/
" r8 V, E/ v3 u
long get_ram_size(long *base, long maxsize)
# ~( y' m/ ]& U, l5 c
{
- e7 Z3 }' W) }
volatile long *addr;
+ _/ v- G* F# t
long save[32];
: T5 E) T" O% Z
long cnt;
6 e5 Y5 x! X+ @/ ?* q
long val;
# z2 M/ e/ l! _. b5 G: w
long size;
; T, U! Z% G) j; Y& i" ^* e w" }3 R
int i = 0;
& M) B9 m2 x# D2 M, s% j/ f" D
6 m/ t$ B# n& T1 G$ M8 {
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
, S5 V& D4 P$ h. H: M
addr = base + cnt; /* pointer arith! */
: p) s9 U9 U% p& t0 B7 H" M
sync ();
$ k; S! ] u. e1 M3 W2 [0 a
save[i++] = *addr;
+ @( h1 _$ n- F" d6 V; d" r
sync ();
$ m/ s: k# L, N9 k U
*addr = ~cnt;
) n- ~. k! w5 V0 T! z% z4 p/ m+ J
}
& }5 s" a, M- Q6 Y: Z$ f' B
- l1 [+ ^6 i: E% [& u `0 Z/ C# C! u7 Y
addr = base;
# ^, ^( Z3 {7 ^0 ? t) @3 s( f7 R
sync ();
; u) G( f4 S- [6 n# K: t
save
= *addr;
* V6 ]0 C- Q @$ Z3 J- w
sync ();
& h; Z1 {6 ~$ o% E
*addr = 0;
0 G5 x) w X. ^, M, f! ], b
0 R/ O. Y5 ^+ S6 @
sync ();
" K* E0 w) G3 Z# `. F
if ((val = *addr) != 0) {
4 W% a: s1 D- Y0 E1 p( q/ K
/* Restore the original data before leaving the function.
4 P5 R+ ~+ @7 L" T) H
*/
/ `. C9 P! Z _( r+ u
sync ();
/ Y) ?4 w. w5 B- z) M
*addr = save
;
" u# B+ B: i D7 E* |
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
2 `5 Z# U6 W2 q
addr = base + cnt;
" v) I) G" f1 n2 H2 U @
sync ();
* N3 s3 |* ]* Z+ e2 O3 \+ J9 ~
*addr = save[--i];
( \) S; h* p6 v# l& ^
}
1 P& B# |- |1 e& r( ]# r1 \2 T
return (0);
; z- X, N5 }: j) ~- {" P9 N
}
i5 [$ y8 x: T. V' E6 F0 l. ^, U
) v$ U7 ^4 |/ k) z- a( B
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
$ d! Q& Y0 l- l5 j2 V
addr = base + cnt; /* pointer arith! */
! e7 \/ V7 I9 m8 p$ o
val = *addr;
1 m2 [8 m6 @4 | u: ]9 a- c H7 M7 r
*addr = save[--i];
% p. e8 a/ N+ J3 O$ l2 b
if (val != ~cnt) {
- b) W) F O2 n4 }. q7 L' B O
size = cnt * sizeof (long);
# L' D2 w" c+ s+ J. v
/* Restore the original data before leaving the function.
4 y K4 i" h3 M3 e: C6 E" q
*/
- W" G1 W3 x% S" U
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
+ c: F q; H/ x; Y
addr = base + cnt;
& X0 I) p0 F: a, V2 N9 z6 G) |1 U7 s
*addr = save[--i];
: |- B8 z" r* e7 p- G( V' j4 q6 B
}
9 @$ L! N# l. M, O7 j) q v9 T M8 \
return (size);
4 i: w+ t# v3 J% J3 J0 i
}
2 L* ~2 Q7 X% d( ?& Q$ Y+ i
}
, M4 C! W3 c9 L5 |0 N
7 d& z) N3 `5 h& P* w- l6 t* p3 {8 X
return (maxsize);
3 C t9 \% R& ?. G
}
* `1 F: ]+ ~0 m) x1 p; c2 r
int dram_init(void)
, W, ?! M5 |( u& g+ C1 W' X; B6 ?
{
4 j8 d1 u7 t/ C( B
/* dram_init must store complete ramsize in gd->ram_size */
) E) S" V& A. u6 H
gd->ram_size = get_ram_size(
, @" c. Y. `: u4 r
(void *)CONFIG_SYS_SDRAM_BASE,
! ], B. P1 u; U# }! I6 v
CONFIG_MAX_RAM_BANK_SIZE);
5 I' G6 H4 V7 l# `) C0 f$ _
return 0;
. J. h; Z2 B" a1 t' u7 Q
}
& J9 ~1 k$ @. ]! b. u2 J% D
/ x( K& X( C0 U% q5 i" P
1 H0 z. @+ W, W* `8 v" z
. n; ~# d' V- i9 @+ E
3 n' X9 r( `. T6 g$ u6 I
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
/ i: W' T+ F# {0 X/ i# X
, c+ P) ^+ W) A9 r. @9 ?
$ K( A& K* e3 e2 \9 C6 ?
+ @! }( M0 G9 [7 h5 ~
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4