嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
6 p. ?$ o& S& }& N+ k( L
核心板2:DDR2 256M Byte NAND FLASH 8G bit
2 X# ?( d% X) h, D, p. i5 @# r
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
2 j$ a% E1 A2 v1 O. E
. x" Q$ t/ e6 s T, R6 W7 V' A) G
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
8 R4 c9 s, I7 V" o5 r9 @6 y
' s& {1 {3 t+ [; L& G- n: C
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
( c6 ^# a9 B C' x7 L) N
/*
4 y. o0 C+ I& t m; D( G- r
* Check memory range for valid RAM. A simple memory test determines
" \) f5 _+ x' X
* the actually available RAM size between addresses `base' and
7 R6 d2 I8 h' }# F0 ~0 b! d% W, R
* `base + maxsize'.
7 ~: v; Z" s7 X2 h; o
*/
" @) \* ?. v, N
long get_ram_size(long *base, long maxsize)
; l! B. N1 Z" N/ i% {& [$ h
{
5 c. c0 P1 r e1 |) e l L
volatile long *addr;
5 k' W. ^. ?0 |
long save[32];
& ^! H8 k9 V. Q1 M5 s
long cnt;
/ p- Y6 a- r X0 O& \
long val;
% E, n9 R5 A# E t6 q% h
long size;
0 K m, g7 ~+ j+ e4 Z
int i = 0;
+ s6 ^3 s. f7 k! A! g6 a
% s; K9 n3 p9 ?9 z" e I
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
' L1 z; j6 @# g% O. t* M1 @4 h
addr = base + cnt; /* pointer arith! */
( t- ?& T& e8 L6 o
sync ();
; {! k3 }! N$ U/ J% c1 I0 Q
save[i++] = *addr;
8 n) Z4 _" x8 O
sync ();
" }, C% r2 U m/ k- n2 `. J5 `
*addr = ~cnt;
( v0 m8 ]. R8 O' j0 j' ]# X3 S2 B4 H
}
4 m" n! n, D/ z8 H( |6 N0 x
# Y+ B3 b: S. q9 F8 d" x5 L: T' {
addr = base;
8 E2 n& F4 M( V5 W* q
sync ();
4 a9 A& C3 ^/ G( z* Z0 n2 A! p
save
= *addr;
7 B" d5 M9 d3 L5 U4 o
sync ();
7 j; Z4 }( N( c1 k/ f, b) q' ~+ N O
*addr = 0;
* z6 h2 l& |8 m+ b
5 C3 |- a" |# v8 T5 C
sync ();
9 z8 f& k: A+ z: Y7 I; ]0 d5 C
if ((val = *addr) != 0) {
( }5 B& C7 d# a, I" G8 `/ @
/* Restore the original data before leaving the function.
1 b% A! J$ \$ X+ }* ?" y
*/
2 t# M o* o8 L5 \) {8 c2 M
sync ();
% i, u$ c1 Y& f+ ?6 c! L$ e) e' O5 U
*addr = save
;
" z0 P; w0 ?- v: N0 G
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
/ k, ^" x- P t9 r; l; \7 o: r
addr = base + cnt;
# y6 l9 y# P; x) z2 G" \8 K
sync ();
. J2 e# E% q% ?; k
*addr = save[--i];
! Z9 k7 Y" F( ~( T: E" m: D2 o
}
# R3 _8 C4 Y( ^' s; z" W
return (0);
1 A/ H( ]1 Z3 Z+ z
}
2 B- w) w. s6 e$ S& [ E
$ U# t) `$ b. C4 R/ D
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
/ v& n& D7 Q, V9 L, C, \. v
addr = base + cnt; /* pointer arith! */
9 m/ T) {8 n7 y( F' |
val = *addr;
" v& p ~$ w$ H9 E
*addr = save[--i];
. c, O( s6 R s% I* L8 d8 \
if (val != ~cnt) {
! K; p7 _/ ?$ m" l) Z
size = cnt * sizeof (long);
, c' R9 o! x! }' K
/* Restore the original data before leaving the function.
& r) Z. T. G$ _2 S D0 z
*/
]9 g2 {& u4 ]
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
4 u2 }9 ~5 ?7 Y( A W
addr = base + cnt;
& ?; ~( R1 z4 y$ `* l% q
*addr = save[--i];
! P* A' ]" r/ t" X2 G1 E: t6 ~ |
}
5 b# Y8 P1 {" D" p$ u; ~
return (size);
' k2 O( Q/ ` N% P5 @$ B# H8 T6 G+ A" q
}
1 K7 L; r0 ]% u; P. r
}
& @" `' e I4 _
. P, k' S/ F$ Y A" ^
return (maxsize);
, S f4 y6 j" f3 j4 E4 L! [. b
}
' J/ H* P4 d$ r5 Q) M9 `
int dram_init(void)
5 G6 ]; Z9 e s$ b
{
7 b v* T. Y' }$ X0 Z4 M' m
/* dram_init must store complete ramsize in gd->ram_size */
: O5 S' {1 J( a6 x1 y
gd->ram_size = get_ram_size(
! b0 Q3 p( A- a- I8 ^$ x3 x5 I
(void *)CONFIG_SYS_SDRAM_BASE,
9 K7 ?6 t9 f; b3 ]
CONFIG_MAX_RAM_BANK_SIZE);
# }8 ?" L0 Y9 ?) T# V& B1 B3 L
return 0;
2 P6 g3 b6 z+ i
}
' V% l/ f/ v- |
7 \& P0 f' I* P/ b
- ?- w/ k( x. D: E: U6 C
' A: J5 V, J' ^" A' K# `
# Y: x& Y$ I0 Q
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
# k9 d0 B' e3 S* g
2 \2 A! D4 m5 F9 p
/ Q" m5 w! q* C6 O5 _
# h) s7 q! m u5 ^4 S8 G: [
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4