嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
6 u- R3 s1 l7 a; r7 Y9 v
核心板2:DDR2 256M Byte NAND FLASH 8G bit
) @7 t$ Q. h; T+ v+ v N2 A+ ~
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
& F, ^1 Y5 r6 J, h; e: P8 M& f
, ^$ _2 i, K4 h' P3 t) g, q
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
& H- T: r* l$ q) y5 ~9 @
6 c- w( N# {8 c0 Y* z+ C K; ~
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
2 m% ]$ k% r2 }6 \# Y6 K
/*
* h2 {7 t0 d0 o6 R+ y; j
* Check memory range for valid RAM. A simple memory test determines
! h) Y1 _) Y" T6 ?: G0 X
* the actually available RAM size between addresses `base' and
' H2 C0 ]0 b+ p
* `base + maxsize'.
* {. g+ g9 ?+ f2 u3 ?) i9 A
*/
& L* A8 _0 E" Y% l- \
long get_ram_size(long *base, long maxsize)
, K7 T/ W. q$ Q; W
{
; [. T( t; M$ g0 G1 Z ^
volatile long *addr;
$ b0 x' g6 b& W9 m) W
long save[32];
6 T! h/ |4 b G
long cnt;
$ _' q2 a. O2 K6 ?0 g" ^
long val;
+ G( h! Y+ _5 P$ n
long size;
& f& W5 V* L2 `* F6 \) u
int i = 0;
6 p, ~$ T4 f8 @" F. k/ u5 I
/ h# p9 {- ~# P% u3 s
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
, z& h" i7 u6 _
addr = base + cnt; /* pointer arith! */
g7 ~/ H% ^ ~1 f" `' t+ G
sync ();
5 d/ p4 N. V6 G- G& W/ p& i
save[i++] = *addr;
0 e1 t! ]6 E9 f0 [
sync ();
' R0 R" m; A( v2 b
*addr = ~cnt;
- C2 A2 ?) L$ d W# v+ D
}
, G% ]0 a& q- n4 U; v5 m- @& i) S. V
; `2 T8 ]& K( M( c1 D' }2 d
addr = base;
: B z3 P: v- l8 r3 q: C! d$ C
sync ();
+ N7 s! V$ [9 W3 i3 Z; e3 l! b
save
= *addr;
3 P. b( ^# r& B! a* L) f
sync ();
; a1 q$ K P+ o. h; t: s3 S) B
*addr = 0;
+ ? o( p: q( Q# z5 o( W* {0 [
# a+ B! \* z+ Z/ I6 k% z7 u
sync ();
( H" ]/ v: G/ Y5 N1 _
if ((val = *addr) != 0) {
3 i1 |& @3 f7 G
/* Restore the original data before leaving the function.
1 z- ?/ n; }( |2 k
*/
, l4 L3 s) k# L$ M* u8 F. ~0 M, A
sync ();
. l% i& e" u9 z/ C" F* u" _
*addr = save
;
7 Q1 r- O1 g/ L6 e( b
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
+ |3 q ^4 @, S/ o
addr = base + cnt;
7 q7 M5 K+ G* G/ ?9 G: ]- ]
sync ();
4 v! g% ] F" t: w* g6 Z
*addr = save[--i];
1 X" f* Y" a& H3 `) Y
}
/ N& @) K* f5 M5 {1 x6 ?
return (0);
9 s% _; @; M h7 \, Q
}
?' k3 R, i$ J' ]2 H1 a, t
- B2 i# s# N- i
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
# H! v7 ]- T! I) }. |5 k
addr = base + cnt; /* pointer arith! */
0 T% q0 j3 k2 m. s9 g" r- h
val = *addr;
; M0 U- q. U" s
*addr = save[--i];
1 k, R4 }' Z# T9 b( E/ M
if (val != ~cnt) {
* g R+ U$ o$ \; n K( T
size = cnt * sizeof (long);
. P6 _. ^) \9 Q, Q
/* Restore the original data before leaving the function.
( n1 Q3 M4 |- m, m8 I8 o3 d5 g9 f
*/
0 {' \6 r1 N' ?
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
; ?$ M, o" D- [' n% c; s+ _% Z
addr = base + cnt;
0 O Z J& w4 ^- h6 z: ~
*addr = save[--i];
, z2 `; l- A( a7 m h6 N' F3 [
}
0 {. L3 M: I, c/ n0 B- @2 X4 ]# F
return (size);
) ~7 u9 b, @. u3 d! N& U B
}
) C) T$ n( r* l! k' X t+ y
}
5 f4 w8 K/ q( p, d2 I
?1 D9 }% _3 m9 B$ {/ |
return (maxsize);
: m, s! Y. W, d; Q: V
}
" s( Q3 l( w3 E* i7 U" }
int dram_init(void)
! {! h% P0 g! G, V/ {+ @/ w8 |
{
/ m$ O9 N6 R+ O+ _% }
/* dram_init must store complete ramsize in gd->ram_size */
* ]. }3 B& X% {& Q' R5 y, W
gd->ram_size = get_ram_size(
0 ?. t' F8 B6 i D: A
(void *)CONFIG_SYS_SDRAM_BASE,
7 q$ }9 n% l* ?/ E9 Z5 }! t4 _
CONFIG_MAX_RAM_BANK_SIZE);
: ]' }* y: y4 T- s8 z$ W8 ]
return 0;
6 a% S6 `9 V% p. Q' V: Q8 S* X
}
, \6 h: ?& V( N
) C; H+ m2 d7 X
- W7 h! k- s% n( N
* V0 M) t5 H- W* Q! i
2 S+ i0 V6 S7 I. w
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
8 q4 s" L) L( o6 P5 Y3 }- f
9 {$ m' X# E+ L: A2 |7 i) F
; N4 \) P/ [4 S* I9 Q9 {9 Z
( p* }4 o2 {% v/ g& {6 W
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4