嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
6 E* S$ f* U W9 i; J7 O' R$ A
核心板2:DDR2 256M Byte NAND FLASH 8G bit
% q1 Y4 z) T j, C
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
# z1 [# H% F/ ^; e9 L! \: c- K+ F
g0 o; _# A( n$ f4 u0 e
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
# j+ D: V3 ~8 U
; c* B% u9 Q& w3 @: \6 {
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
! q6 X* c' i6 \: q4 \& N$ [
/*
8 {6 h' i* d' m$ l! b% W3 q
* Check memory range for valid RAM. A simple memory test determines
: Y: h) ]. b$ v& ?- J
* the actually available RAM size between addresses `base' and
- D' } [1 h& [2 C; J9 \
* `base + maxsize'.
% ?4 U. {4 K# T; p
*/
H) }! n+ c5 [
long get_ram_size(long *base, long maxsize)
1 P2 f( d( L9 G
{
b( u& @5 t4 E" l+ p j
volatile long *addr;
! N" _# Z% b# Y
long save[32];
2 f h0 X; _3 D, d
long cnt;
$ G: r: ]1 F3 I) O' s
long val;
( z3 C0 g# x& Z0 ^4 E6 z/ z
long size;
. l q/ G$ V* |. [# Y* S' P% k
int i = 0;
7 ]- }( |1 S8 {4 P
( \2 s9 N; R' \- t
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
: k) d- s' h3 D5 L# A
addr = base + cnt; /* pointer arith! */
+ z0 k; c, G; _' M/ n
sync ();
S# \5 j6 R+ O+ Q7 q" g9 c' v# W
save[i++] = *addr;
# e* u: x H- O8 X1 p7 y+ q
sync ();
. t. t# u$ U# S' `
*addr = ~cnt;
4 S, A7 A1 B9 u. E% T: {' l. A
}
4 k6 n3 n) n) C5 {5 ~
; Z9 h, L4 r3 x; z8 W8 F/ h5 b7 W% R
addr = base;
6 M1 i) R* X% m6 H7 B- {
sync ();
# z$ M5 F$ t. `+ t# e; c! G
save
= *addr;
, M7 p% L$ k7 G8 C$ M5 x
sync ();
3 U, s7 H' r7 T) M! Z% A7 v
*addr = 0;
1 E2 _; p0 p V# T4 j+ W
5 P6 R. t$ o5 u6 O& U" x$ E7 V
sync ();
5 t: |6 s2 a7 \
if ((val = *addr) != 0) {
/ u% |: ?& }3 ]% T+ i7 l% Y9 J
/* Restore the original data before leaving the function.
: U/ b0 W# }2 W* ?- ^
*/
1 X- I) q. X# r) K
sync ();
2 Z9 f- ^, g/ R- V, e: s5 L
*addr = save
;
; T6 W s" A6 R7 N/ `! a( D, A
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
& W, V3 M2 K& w m
addr = base + cnt;
" A" Q; G; P7 k: F" t! h; @3 \8 b
sync ();
! }/ V& m. k" v A! N% c
*addr = save[--i];
" O& p' e& p9 S& V1 j9 |
}
5 _3 E g1 m& e. G! f
return (0);
4 X* a/ Q L# n; L# N
}
2 _. O* I' i6 L% G9 g8 U/ E' A
' V+ u5 W7 [" @0 S' \: U+ M Q; I4 c
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
# s) o4 T5 C; p* K# P: R
addr = base + cnt; /* pointer arith! */
1 T2 X, a* i4 k# F+ q a9 M
val = *addr;
1 C7 C" I$ ?4 U
*addr = save[--i];
! ?. L9 p, c' s0 X
if (val != ~cnt) {
; Z$ v" x: \4 ~- @$ h
size = cnt * sizeof (long);
0 y0 Q9 G3 X# v+ `( e7 U$ x
/* Restore the original data before leaving the function.
! ]6 m* _' c2 }% A
*/
# u) E2 z1 v8 N' \: Z m+ I7 I3 z
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
3 E* P: ?3 T" f% o5 V- U
addr = base + cnt;
( O' n2 W) c/ W+ W- J; O/ F
*addr = save[--i];
% ^) {0 }! b- H
}
0 ?2 \6 I* |3 s& q
return (size);
) i; D8 k: x; E, I/ [# |8 C
}
0 }: d H4 z7 L7 X
}
7 |$ ? L, A# t8 j# r4 u1 t3 D' @, s
% _9 r( b+ y2 \3 I; v1 o
return (maxsize);
* H2 G- H( x8 {; } |
}
; r5 L/ ~( x3 K3 }- `) K
int dram_init(void)
, P. R1 r }+ y& }" q$ y1 |) U
{
' U& @8 _/ F& ]1 A; n" f2 f
/* dram_init must store complete ramsize in gd->ram_size */
1 Z2 |6 @' q6 n( ^% z5 t" D% \
gd->ram_size = get_ram_size(
3 N/ Y7 `! ?5 m% m, Q. r
(void *)CONFIG_SYS_SDRAM_BASE,
0 f3 V R: s6 b: c
CONFIG_MAX_RAM_BANK_SIZE);
# S I: U3 U$ q5 y# k2 I
return 0;
* n! e! J! k$ X8 Y' ]
}
' M4 t- ?% b7 f. @+ @+ r& ~5 U
8 T- x! \! M+ S+ v
- n' u. X' n; s" e7 w6 G( ~
# j6 B' x/ |2 v
2 `. \5 h l$ o2 M
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
7 X( x! Y( o- v5 M1 Z
O. H, B$ U7 {* C! t$ w
3 R9 a# p' k1 Q
. t5 i, @+ t+ m
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4