嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
- z6 x4 q& ~" W0 J7 o3 M
核心板2:DDR2 256M Byte NAND FLASH 8G bit
7 n7 B( J& k+ H w2 t) R
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
2 I: w1 Z9 o% U) ^
, X- }# r X Z$ C
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
7 \/ Q- t: Q# }& G
5 b* E- r8 \- s9 Z8 }2 g
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
! h; W9 C% {- ^$ m7 g
/*
( k c$ O: Q( {. [9 n5 r
* Check memory range for valid RAM. A simple memory test determines
/ X. s- g7 k! Z" W' f) R
* the actually available RAM size between addresses `base' and
% n p( }5 q0 N5 ~5 O
* `base + maxsize'.
) A$ g3 s- l! Z
*/
7 L1 J4 h* l; [4 M5 ~ C3 u) V) @
long get_ram_size(long *base, long maxsize)
. \& {. E. S2 F( k2 q/ t
{
7 y) T8 ~1 X% G5 v- U* U* P
volatile long *addr;
. _7 `0 w' m+ l3 d1 d1 j( g
long save[32];
; G/ p0 W' |% f$ E3 i5 j! M
long cnt;
; `' w# M0 f' b
long val;
: k m4 r( }6 U, e
long size;
4 | ]/ c/ v9 Q6 B+ W! u M$ ]
int i = 0;
( U: u/ C2 b# F; ^! K
6 |# n2 o8 P4 }/ M/ ^
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
* o( O$ P4 A& H5 Y/ W8 Z& r
addr = base + cnt; /* pointer arith! */
: n% @4 B; h0 v/ A
sync ();
' j; S6 B( j7 Z1 Z K: H2 L
save[i++] = *addr;
y" q0 W; t O' h9 d1 x4 \
sync ();
# {3 x* q% ]! i6 H* s
*addr = ~cnt;
: s. R) M2 b# I1 @4 x& p7 E1 T+ l
}
% V b- Y9 Q. e0 M6 ^
" F- ?" W% r8 n" W
addr = base;
: W/ z, Y) H9 ~
sync ();
r! C( T* i, E, r) A3 ]
save
= *addr;
7 G `) T3 r: C. L
sync ();
- U4 n+ D% v5 w( ]1 ^' I% {3 L
*addr = 0;
8 N1 g3 [/ s4 j: @5 e
: c9 p' X8 X2 v- @& V
sync ();
8 W! ~5 e5 F2 C- H
if ((val = *addr) != 0) {
& U1 [# g' ] A; b
/* Restore the original data before leaving the function.
/ t4 o6 m# c9 q- `6 ~% f3 [
*/
- N" \8 _6 i6 w0 ?0 ?- b( p
sync ();
+ P) F2 W+ q1 ?. _( Q1 w
*addr = save
;
3 x. B) ~4 H( N" S- E
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
4 D! [5 _# l, E. {$ U3 |
addr = base + cnt;
' d! D0 c1 m/ ?! X
sync ();
, o) ]- {3 ]! E( S! x, q) ]$ ?8 K
*addr = save[--i];
- N6 o- ~5 ]# [" k
}
0 X8 W# Q' `. K+ W) M% i. N7 f
return (0);
8 S- Y. l! n: M) Y' b0 {5 F7 |
}
0 Q: h7 |# w6 ? @
- {4 B6 g# M; u
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
& V2 K! k3 n- T$ P
addr = base + cnt; /* pointer arith! */
5 [' O4 {9 J% ^( O2 q) D4 o1 X
val = *addr;
9 @* P$ N: H+ O2 I
*addr = save[--i];
. w& O# e4 t# l0 o4 T' g
if (val != ~cnt) {
& [. {4 u: a8 E; E" u7 v
size = cnt * sizeof (long);
H4 ^& ?8 s3 N* @# |7 n6 w3 a
/* Restore the original data before leaving the function.
2 H0 l, K. W7 S: t3 W; F
*/
& f$ H1 \. x, D9 i8 O I! o
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
8 k. M3 ~7 v/ X$ a& C6 [4 m
addr = base + cnt;
( z' V& d* C! u, ^! B4 A
*addr = save[--i];
/ v6 L; r% f4 t( N
}
: O! u& @% O6 Y6 f
return (size);
5 h' d5 ?( z8 W) b z
}
5 D$ X6 g/ x2 q7 i( S/ a
}
3 k3 ~2 y% W' I \; f+ T! Z
$ {8 a3 L+ [% k5 i( |" f! k4 o
return (maxsize);
/ V+ _$ o; g* o
}
' E/ O3 ]8 K9 x
int dram_init(void)
! j5 v' \4 ^/ m7 q" l. `
{
2 `+ A1 I) l( d% q. M
/* dram_init must store complete ramsize in gd->ram_size */
7 H7 A8 h t9 {, C
gd->ram_size = get_ram_size(
4 H& Y$ R4 t, ~* _' P: v% `1 L
(void *)CONFIG_SYS_SDRAM_BASE,
3 v" e- y) A9 n4 f0 g
CONFIG_MAX_RAM_BANK_SIZE);
+ |$ j6 J* p" C" S/ S7 P5 \
return 0;
1 ^0 [5 d6 i* a. L# j$ J* N; ~ q$ \) @
}
6 ?. B3 [ l6 \5 n* c6 I# B
6 P5 |; l8 n& Z- l) v
' v0 Q7 K4 u" K4 n# K
4 U& R; }/ w, Y
: S" O% v# ?5 Z2 | }7 g2 c5 K1 @" n
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
; X8 A- X& c( b3 l0 J2 O
- p+ D; X2 Q- d6 p1 n8 X
! d p; \( a' A2 _ R
. _1 h1 t" ?% ]) p. D
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4