嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
- e, l$ q+ j7 y2 k8 _* `( N4 h
核心板2:DDR2 256M Byte NAND FLASH 8G bit
: v0 a: s. ^$ L. X4 L3 S
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
8 I* D4 H7 \0 ^* ]( ~0 U
$ r0 P* \( p. J2 J8 \( `1 `, e
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
: N7 J8 C7 }7 p+ a8 b
9 a. g3 N* E; p' E( b# H
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
/ I' ^3 t- x: r+ f( v+ c
/*
- K. [0 s: k3 a$ l: I4 E
* Check memory range for valid RAM. A simple memory test determines
U% r- n7 S" ?3 Y( `4 A% T% a) m
* the actually available RAM size between addresses `base' and
8 E) N) A, b1 ^* y3 C# c" s
* `base + maxsize'.
! e( O- w0 i' I0 E& m4 H- J
*/
8 E9 X! }. J5 V% L) M
long get_ram_size(long *base, long maxsize)
; d6 L1 H7 a+ O6 J7 d. i- E
{
5 V- r. Y* V) K6 O
volatile long *addr;
1 c! x1 R5 X: p6 V1 I0 _
long save[32];
! ]3 Z# K$ {3 n' o( A7 @
long cnt;
& a) o1 C* B' R$ s: J) s) J
long val;
0 \! V! b h g& r$ Q
long size;
3 z8 g" z7 s7 W. W* E+ _
int i = 0;
+ r0 _) |4 f; u
' D" _9 B8 K& c: J" E2 ? y( X
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
5 r/ P) |0 m/ I/ U( P4 o* M; ?
addr = base + cnt; /* pointer arith! */
b# [" v* z" _ P2 m% ^4 X
sync ();
0 ]. W0 U( ` u. @8 F, b
save[i++] = *addr;
* g2 \- x) w/ `4 A9 r# y5 {- o
sync ();
# s! `0 I5 s w% ^: v2 N% I
*addr = ~cnt;
( b' P4 ~2 R2 `( P: Z
}
E6 Y/ r+ J! x5 _1 y! @
% z9 Z% y: f8 i4 ]# l. f
addr = base;
9 E) ?) r; E; Z/ h5 O$ ]
sync ();
% U& P, m$ m2 U& D2 e! j2 M4 q
save
= *addr;
1 `: K5 c$ G& g
sync ();
2 h2 k% U8 A; ]7 _7 q
*addr = 0;
8 b Z; q9 _9 \ f) x- Z m
6 T3 E8 _; G/ d3 S2 W- y6 _- {
sync ();
2 _* y% y% u! O* v1 M
if ((val = *addr) != 0) {
% o" c* |# m) R9 I( F5 c
/* Restore the original data before leaving the function.
$ a6 ~6 w) A% @
*/
2 a+ o1 k# k8 I
sync ();
6 [: ^5 U9 _" g( D- }8 B
*addr = save
;
( ?7 Z$ l6 c) `) [' X2 U& @
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
7 R2 g' _ C6 \% q. B
addr = base + cnt;
% D" i' f6 v) i
sync ();
# W. L$ @4 R' h+ U4 W) { X
*addr = save[--i];
# D/ z: B, d5 N# D. q
}
0 k3 u3 M8 l5 r' w1 |4 R
return (0);
1 U1 r; j% l0 g* ?7 t: T! n
}
& h" J0 K6 a2 a2 l8 G! R2 P
, h Z" @7 J9 M' I$ b0 H
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
# O+ _, w! I; y4 n! S( C; d
addr = base + cnt; /* pointer arith! */
# V" Z4 [4 C h5 S/ m
val = *addr;
1 y, h4 a: L3 L' D7 {/ P
*addr = save[--i];
+ m/ p' ]/ J2 s& P e
if (val != ~cnt) {
) q- H: j* M" v4 O; v9 L
size = cnt * sizeof (long);
2 h d' x- s- a. x
/* Restore the original data before leaving the function.
( q0 m8 V+ g* c" x6 H/ A
*/
* O0 v7 O, J+ `% z1 a
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
: E; U# K+ _/ e! V5 _, b
addr = base + cnt;
* W( a6 S4 w& Z3 C6 c1 d; L
*addr = save[--i];
& V0 t, p2 M% N |+ t' B( q
}
# P8 m, h5 F+ ?% O- G
return (size);
4 {2 }. |2 f3 Z
}
' d# f9 J0 Y( I
}
' J: J) g) ^* Y' F
z( G: A# U- ], j- I! C
return (maxsize);
$ N& ?4 R, d/ p4 u' m
}
% `5 d8 W: e+ n1 Q) T
int dram_init(void)
( U# ?1 @* M3 R4 B( u
{
3 q9 g W ?; K1 _4 O
/* dram_init must store complete ramsize in gd->ram_size */
8 f7 m3 r' l3 Y- S% E
gd->ram_size = get_ram_size(
( G$ s9 q' k! ?" {" W/ [
(void *)CONFIG_SYS_SDRAM_BASE,
) n. S, O7 y) E7 ~
CONFIG_MAX_RAM_BANK_SIZE);
+ ]2 Y5 [& k2 l, R. D; X. d
return 0;
* T& {, ?. `/ G
}
1 R4 C0 p( Q( G$ v& `
1 S3 }# Q9 G- Z) f' t) ^ N* J! A- e1 [
# i' i- D: X4 u9 q
3 g0 q" L8 M7 _+ d- W3 R
* b! g! E3 y% W4 O, h' Z. E: g4 T
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
+ T3 L5 N$ Y6 N4 [* b. S' ^
5 s+ a1 {0 X. Q5 x2 c
; i7 t" K2 O1 S. R7 \
n& t; W: m" R$ v6 a7 E
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4