嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
( j% O+ O M1 d6 D
核心板2:DDR2 256M Byte NAND FLASH 8G bit
( S* C. f' q5 [2 U1 S' N
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
9 U: V9 {, c1 S0 A/ I8 S' e
/ B9 f+ s9 E9 v2 E% {' @/ V2 c' ]
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
* q" O4 R) K! P9 V' j6 k' z E5 ~& F
+ F" x7 \" E; E+ H, P* r
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
9 b; t( I: C! T j- O$ Q
/*
8 r9 i U- E6 i; t" y: w0 f9 O
* Check memory range for valid RAM. A simple memory test determines
x( l: W! z4 a2 ^5 B2 R
* the actually available RAM size between addresses `base' and
1 D2 i( ~- {1 Z; c$ v3 d
* `base + maxsize'.
/ |6 t1 Z7 ~8 ^. _
*/
) s! {" C' S6 b0 i3 {* x) V# X
long get_ram_size(long *base, long maxsize)
4 u# J! W6 K- y% ` s6 [
{
1 U! [6 s6 Y, [0 p) D
volatile long *addr;
' }/ O0 a8 K; G9 Z
long save[32];
( o' i/ o0 j$ f6 ~6 i
long cnt;
* O; V6 G2 [1 ?# w
long val;
/ S+ j9 {5 x- i
long size;
. G. F2 ]) l9 F" j @& l+ }
int i = 0;
L4 ~4 W- r4 a" z3 D5 B# C
* G' x# b- `$ Q& s" x( r
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
F1 g9 @9 o% R: @* X
addr = base + cnt; /* pointer arith! */
3 m& l& M, O! z6 g
sync ();
. J/ t# K; \. S v
save[i++] = *addr;
& K: n" S: ?+ O. L) A3 ~$ G2 v
sync ();
, K6 [ v$ m. D2 r3 M$ V m" Q1 q
*addr = ~cnt;
7 a2 b% y" x5 g$ R! {# a
}
: |( ?" |5 y* s1 A& y3 Z0 v9 [4 X
$ i) z1 \8 \, L+ h# w0 u0 Q ~
addr = base;
! N+ J6 v4 y# ~; q. C
sync ();
/ d) R2 B8 G3 ]- n
save
= *addr;
0 w9 y. x% C! m& `4 \
sync ();
N$ b( ~' f8 ]" v* J8 F
*addr = 0;
+ _' T2 p7 ?( G
6 a! N! ?; F! \; [" a9 K( n6 [
sync ();
8 F/ G, t, V+ d2 H! x# P) _
if ((val = *addr) != 0) {
) F* R# @3 | s* w4 X/ x
/* Restore the original data before leaving the function.
' I. P% ~/ D/ a; S7 Y" e! L; G
*/
( X0 C) i/ Y0 t: i6 @% Q2 H
sync ();
5 H6 l/ B4 H0 q p' [: K4 k
*addr = save
;
. _8 ^: H: h8 o2 ~
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
& B, ?) T, C& I% s+ T( A5 @
addr = base + cnt;
4 W! I" p% ~" U9 L) E/ t
sync ();
3 I/ y2 C) {1 X k1 G5 ?! l
*addr = save[--i];
$ j9 f5 j% x2 m2 y/ H5 s2 p6 A
}
: S- ] \4 `3 M
return (0);
' f9 f7 \* j- l& e/ g$ I0 _
}
4 {' z% t# P) C6 |
1 G8 P# T( J, k( [( c
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
4 N& w$ I" d6 a3 h
addr = base + cnt; /* pointer arith! */
* z- `' E; N' ^
val = *addr;
- j4 A* K2 I4 N- }3 L @
*addr = save[--i];
# A6 V! S( S0 `# T
if (val != ~cnt) {
& z+ V: _& p# L* q& M* h: R) K
size = cnt * sizeof (long);
( p6 R- E/ N, P* `. ?9 T
/* Restore the original data before leaving the function.
9 c" z& @5 D, Q' z) M- E. r; H
*/
6 F6 m* O: u; ]9 J+ `1 b% H8 s* p
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
9 ^: p2 Q8 P+ f1 h
addr = base + cnt;
, D, G' \- L- t$ e4 l! p0 m
*addr = save[--i];
4 n% S4 {' a& P W0 ]& g
}
: O7 e5 ?5 @4 \9 H) w# W) h0 i
return (size);
& F1 @" c8 i! z* h1 e Z) q
}
% K; t0 S' y% c% a" m
}
+ a% U# W% K8 W N
6 V" J" r; m) D& @6 }/ O
return (maxsize);
( q; o V2 `8 V' f: ^; A! P' u
}
' P5 Q$ r, ~9 B j$ e0 @
int dram_init(void)
2 R, v1 V$ p* K; @" m" ]
{
c2 _# R" F$ L! Y9 r: r" D3 {
/* dram_init must store complete ramsize in gd->ram_size */
6 L! i2 p* s. x2 w+ W4 u
gd->ram_size = get_ram_size(
' u3 W4 t$ n4 ?
(void *)CONFIG_SYS_SDRAM_BASE,
9 |& X6 [3 g, H# @. C
CONFIG_MAX_RAM_BANK_SIZE);
& k$ p0 S! Y+ n$ u% p
return 0;
* |( n+ y9 D. F4 A: E& j
}
3 A7 t- l! V6 H$ P) @, K: ]
; O- W# x; V: F
5 P+ m% l3 `3 ?
5 m: a y: \1 D. ~: F
) P; c" o: w8 J. X. u8 v, l
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
4 ~' g: a5 q7 M7 I% N
: ?9 c f& o: c$ x$ X
$ ^2 B5 U% d) N4 z
& ]6 c+ h) |% M4 q' ^, V& d" i
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4