嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
/ U0 P9 u$ _( l3 h9 |8 O& k
核心板2:DDR2 256M Byte NAND FLASH 8G bit
8 d' | {5 p, E/ H' `$ f
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
, E; x1 e! ?/ |
{$ I$ [3 A0 Z
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
* o; Q6 d9 ^0 @
2 Y) d& l4 x# T- p' Y6 s) s2 z @: S
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
- z. ~+ v! d7 ~4 B
/*
+ g6 r1 c" u0 {. A1 q% l
* Check memory range for valid RAM. A simple memory test determines
: h# H0 H. O8 r% u' z) t2 X" t
* the actually available RAM size between addresses `base' and
% \& }' G: d4 h! G1 K6 W. j6 |
* `base + maxsize'.
! V& ^( r; |8 A$ ?; @1 b, Q6 J7 t
*/
8 L; J) Z" ~$ s& Q
long get_ram_size(long *base, long maxsize)
' G+ p. g3 A7 \* j6 O# i
{
+ J. j& T/ F: A6 b
volatile long *addr;
j3 ?- G8 Z3 a3 w5 H1 A7 y
long save[32];
5 a8 u5 h! O9 u& x7 y
long cnt;
6 Q3 Y! O8 [) I- r6 y
long val;
* [$ ~3 j; S- }# G( w1 x
long size;
6 R. H% G, ~ R+ I; D! w+ G, N
int i = 0;
8 i% K; ?: ?& E7 v- x3 n% w( ?5 m2 P, Z
1 J' ~$ {; R+ O/ k
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
5 u* ~7 H. E4 z Q0 s, C% O4 _+ K' Z5 K
addr = base + cnt; /* pointer arith! */
9 @9 G, G# a5 s) T/ m% {8 C9 C
sync ();
# ^5 a4 t% e, T6 L4 u
save[i++] = *addr;
% R9 x: @$ A4 W- x
sync ();
G: \( X X, P6 Y
*addr = ~cnt;
7 x4 `; `' Z, q* [, O, U4 j. L
}
2 a( ~1 l/ h' d
+ M; M) T) c! J! T1 p! C4 @/ Z9 n
addr = base;
; p* `+ P: \4 v0 H- V8 ]/ R
sync ();
, p# w5 q/ A2 i8 s/ H: Y" \
save
= *addr;
- ]9 f. c2 p) d2 \4 X) L
sync ();
( h6 W/ p+ h/ e; I; b
*addr = 0;
1 J* c3 n. \' ?9 N& Q
. u) r+ _9 ?$ B$ [( A* M
sync ();
l$ w) I% H: v6 U. O( Y, Y- g
if ((val = *addr) != 0) {
3 g% B' l2 E3 c: P E* a
/* Restore the original data before leaving the function.
1 w, W$ W, g. [" ?
*/
7 O5 | W" c1 U
sync ();
/ u- e8 ?5 H! ?; M, W
*addr = save
;
% o2 X9 q/ W' f/ W4 X9 ^
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
# P i- Q# q( K- m) D) S) r
addr = base + cnt;
|0 `2 E: W( a# J1 K
sync ();
. z" O/ d" k" }) n
*addr = save[--i];
( n. z: [5 q, V0 t
}
& \5 L9 s. _- O3 ~7 ^
return (0);
' r0 B4 s; Y3 b5 N# q; o
}
# s* l }- I7 x7 }7 t# x) h
H( A/ ~# B( b/ A. i: K( Y
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
8 w7 i0 c' A% q Y G/ I
addr = base + cnt; /* pointer arith! */
. M, G% x; x; I
val = *addr;
1 R# I3 _3 Y; V/ m! T3 P3 H: `
*addr = save[--i];
+ M: y6 w$ X6 f, D4 g
if (val != ~cnt) {
8 h7 L: p' I& c( R `5 R, P; o& Q) W L/ f
size = cnt * sizeof (long);
% J6 Q( t: `/ b) B' T! ^) n
/* Restore the original data before leaving the function.
0 z. `% S: k$ \' S* p0 A
*/
! B! R$ C4 Q! `. u0 n/ p! B" f
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
5 O5 Z7 [0 h4 V
addr = base + cnt;
/ q- g. ?9 L. }
*addr = save[--i];
* p1 ~) Y9 |- y& }1 T1 d
}
- u! W; v+ u% o9 P
return (size);
. ^4 b) x% O0 G5 s2 q' \, |
}
3 y a% M) W6 Q
}
) X/ t4 Z3 T4 @/ _* C5 I4 k H
' x& ?7 R& n4 F* R: p
return (maxsize);
1 V) H& y! f. h7 ]2 ?0 N! O
}
0 a( j& u+ w1 A8 R2 }+ B1 \! O
int dram_init(void)
, Z7 X4 Q5 V/ ]; B* o
{
3 r7 \9 r2 ?! t( i3 e( |7 t& n
/* dram_init must store complete ramsize in gd->ram_size */
: J) e' q/ O) s+ m7 p" p7 A3 E
gd->ram_size = get_ram_size(
' V( Z) o" j% k# l
(void *)CONFIG_SYS_SDRAM_BASE,
- p' U* P! `; E/ l5 m
CONFIG_MAX_RAM_BANK_SIZE);
* V Q/ S& @) b- h5 k+ o
return 0;
+ x+ M+ Z' s6 ~7 X$ s+ b5 o
}
3 I: d7 ]/ j0 ^
# P1 D4 v& v3 |! H! E
7 ` y" s% {5 [; E
9 e; O7 k8 G* w$ e
3 G) |2 k8 B* Z6 z+ a4 [, W
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
. @/ U3 w: t1 Y* H u3 [
. x8 s5 W4 w/ t: D
$ y, W# G, ^2 p5 f) s
3 C3 g# v# i( S& t
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4