嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
' N9 [# k9 m) K2 ?
核心板2:DDR2 256M Byte NAND FLASH 8G bit
r9 Q: g; ~4 J- ?# d6 e
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
0 O7 q9 y( E6 E/ H6 B. b0 t
# a5 e/ X, w- i
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
% ~; L$ e$ R8 O
9 A+ p0 d9 g) c% ]3 e5 ^" r5 y# e
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
" ^/ H/ U+ Q) G) K5 t0 E
/*
& ?/ a. X- d5 d
* Check memory range for valid RAM. A simple memory test determines
- y/ }. R( ?' ]" v% E+ F4 J; P3 K
* the actually available RAM size between addresses `base' and
3 D* ?2 |9 b# _6 s7 @- K
* `base + maxsize'.
& [# Y! @6 |- @3 d' j6 I D
*/
5 M' u' z& ]3 s5 i4 g
long get_ram_size(long *base, long maxsize)
- u# M1 P) [/ ], c; j5 P
{
h7 u1 y) B# j8 m
volatile long *addr;
2 [: c+ E3 q* X* h" {, J4 z
long save[32];
* y9 |* u5 `- x7 B/ G; G7 X$ k
long cnt;
: b& r/ S, x+ u! F/ F
long val;
0 h, M1 E4 }, u; r
long size;
H8 Y5 F9 c ]: g& D) W( C
int i = 0;
; j8 n( g8 v$ c) J$ ]' T5 [5 L( ^: f
& W1 c8 q I2 f" E
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
3 |2 M4 B f( f" J3 ]0 \! @' v
addr = base + cnt; /* pointer arith! */
$ r4 L8 N6 g! j! m( p, [
sync ();
5 v4 a( {3 T1 v
save[i++] = *addr;
3 J u. \( O( e& b) x$ {) {
sync ();
/ q& A8 I8 x4 }5 |# J: Z
*addr = ~cnt;
7 Q' B* {/ r9 z$ [
}
4 r. S# b7 Y( s( ~( E4 r
2 a; A" S6 V& J0 n) G, T5 I7 C! M$ A
addr = base;
8 l+ | ~: x/ `3 E3 e4 l( D
sync ();
6 o* h1 A7 r2 D- g% _. k1 k
save
= *addr;
1 h( f3 P& _6 T2 C. R! L
sync ();
- u9 k2 l& W7 T c
*addr = 0;
$ O4 i5 F; ?8 J3 U
' N+ f8 M5 C( w6 o4 U
sync ();
# R5 J. z& O* A6 D
if ((val = *addr) != 0) {
- x- C8 i2 f* s6 h
/* Restore the original data before leaving the function.
5 u1 G6 q* R' E# ^# ^
*/
, M* j4 \9 @% Z) b: ~
sync ();
6 z7 k9 U0 Z! a" V4 x
*addr = save
;
) S+ X, e' O' w+ @+ Y
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
$ X6 ?2 ]4 I& K- q) B8 k" C
addr = base + cnt;
$ Q/ T7 ^3 K, {" l
sync ();
% d, E/ ~. z" n7 h, V
*addr = save[--i];
) ~+ @- z% D U) o8 G* u
}
' f" j3 X6 R% z/ B. ~" x# w; @% G
return (0);
4 f* R, m; k$ t: J
}
: m$ u* U' a/ R! M' Z" j
$ J& N) p( d* V* y+ x1 D9 A
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
# ? y; Q0 M' A9 w* z
addr = base + cnt; /* pointer arith! */
Q0 Q1 D. O$ m% \3 J! V8 N
val = *addr;
& e6 N+ c% H- W" j
*addr = save[--i];
0 L4 q! ?# j0 ~% f7 k
if (val != ~cnt) {
$ J# q% T P1 N% O
size = cnt * sizeof (long);
* D5 l8 G' h) t3 q) _
/* Restore the original data before leaving the function.
7 V4 p1 V/ x! y, B8 @- \
*/
$ p- B4 b7 e, I2 T7 [3 v
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
2 n! L$ G# M" N- ~+ S7 a7 m) R
addr = base + cnt;
# y( Z# F/ y0 E! d( ^
*addr = save[--i];
7 a9 v) U: r+ X6 l; n- P
}
( B) s$ P. t8 ?& W5 |7 y! F8 H
return (size);
Z7 P# Q: B/ r
}
1 g2 n* K0 x" g1 z2 ?% s
}
% [: Z2 D6 F' t) V, H
m) F; G, `3 ]- t
return (maxsize);
4 s/ u# b& l, _2 M! ]% S9 n7 V4 z- G
}
6 w# X5 h6 z' F+ C* D& ? v% q
int dram_init(void)
8 v# F' s, y* k6 W- ~
{
1 T6 L: X9 ~0 d& X+ A% V
/* dram_init must store complete ramsize in gd->ram_size */
1 G! ^/ x" ?3 u
gd->ram_size = get_ram_size(
Z. z' t7 x% f) l) P) B
(void *)CONFIG_SYS_SDRAM_BASE,
; ?5 S% @8 b& `: D B1 t0 P# ?
CONFIG_MAX_RAM_BANK_SIZE);
& m9 _3 {8 v. P2 R
return 0;
3 x" _0 e: R# N
}
8 q" C. j4 R: r
% z" E& W# J$ R$ b$ v6 V
% v; Y$ G+ S0 i/ t4 G6 F; C2 ]
/ e! c: S4 E( o/ V( H
+ I, q7 c6 t" o5 K2 J5 U; [
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
% t9 P# ` s2 {" j/ G l2 {, }- q3 t
l4 T p! O0 A
% v$ W9 s" c1 L ?; w }9 K- I. \
( i: e7 R! A0 g5 O3 F
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4