嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
) w# s% y0 V& c' ^) }
核心板2:DDR2 256M Byte NAND FLASH 8G bit
3 t+ ~+ @' A" s. B: |1 Q1 Q
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
% H4 J# z7 D! w* S% H4 p
) p* }9 Z0 P1 n
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
# N# f& H9 ?! w3 m3 f C) _- A- D
" O1 @) x+ k" H. p* o! A( a, ^0 X
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
9 x- L( [) l8 B
/*
- g7 @3 z, u/ B8 a# L
* Check memory range for valid RAM. A simple memory test determines
9 ^+ g( n' T& Q! Q# X
* the actually available RAM size between addresses `base' and
8 C: I" K! D# o0 V
* `base + maxsize'.
7 M" l F( `+ b5 P9 w* M! e
*/
. K, t9 q7 {$ s5 w
long get_ram_size(long *base, long maxsize)
+ O4 H/ x' k0 a7 ]' ?; q' V; t
{
# Y5 L2 Z6 P- M f5 c3 K/ T
volatile long *addr;
' s! M( D7 N9 m# ^! s' J
long save[32];
- U; W# D# v. ]0 e5 Z% q
long cnt;
$ R9 J3 q# G4 d* R2 I% _+ G7 X
long val;
' r6 M. M* s, j! g
long size;
* e% ?9 F3 z/ T+ a
int i = 0;
" {+ `* \. e- [# F
: D; k* k* o) f9 X* B) i \
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
6 A/ G* @% X( Z+ p6 Q) Y
addr = base + cnt; /* pointer arith! */
, ~, L9 E: l( G. E
sync ();
4 K1 a7 q/ W/ ^) a
save[i++] = *addr;
. B) i5 p$ }9 ^" ?# E
sync ();
6 n, @: `# k# Y9 Y
*addr = ~cnt;
. k7 B2 s" L) r' \7 f
}
4 q" c% m7 C. G$ C9 ], b
/ b) X8 k/ q+ l3 ]! W# y' u9 E q
addr = base;
0 q. y% r4 Q4 d! c+ D
sync ();
7 R# f( J: z5 n$ ~! P
save
= *addr;
1 ]1 t; R8 [9 ^( o' C
sync ();
0 u2 z _5 x$ S0 @% V. D
*addr = 0;
/ [( u8 a1 A, u7 q: d
4 h) p/ u) R- |6 M
sync ();
, k/ D, c1 L% O" ~: R
if ((val = *addr) != 0) {
/ j8 r, Q; ?2 ?# B3 {/ U5 a% \1 R
/* Restore the original data before leaving the function.
4 r! ^, l G& ]- O: t0 y; W
*/
W9 ^1 ^( ^% a9 [* N/ ^
sync ();
* H7 d% I. @: N
*addr = save
;
$ z* \. B2 ^( ]# ]8 c2 P5 o
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
6 S- Q/ S4 d K3 {# Y! }/ K2 ^
addr = base + cnt;
" {( c5 x7 p1 ~( h: ?
sync ();
! \# ]) D7 q6 J. ]% p
*addr = save[--i];
" R: o- X* I/ A7 ^6 \/ g
}
* X* a$ I0 J) J3 P7 v
return (0);
2 J; g+ h$ g/ N7 v' {1 y
}
6 s7 z# W7 m" c
& K0 v. t0 O H5 l0 q! H: C
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
6 k4 U% |$ J' K
addr = base + cnt; /* pointer arith! */
; ?- |* [5 W I" C
val = *addr;
4 h- X; a7 H* w1 N. C) Q; B' {' Q
*addr = save[--i];
" a9 c* A2 O+ n8 L. X8 w" M; V- \- i
if (val != ~cnt) {
j, J4 z3 r5 ]5 V I& k- e
size = cnt * sizeof (long);
' T" u. U0 {7 l* c6 p
/* Restore the original data before leaving the function.
9 L8 ~' z) S+ K: W' A- J/ ~0 x6 a
*/
' L0 {2 Q, t( @: R" k2 G
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
7 z# m2 p& [* N+ @( {
addr = base + cnt;
( }: J6 F- A1 @+ G- y: T9 d8 |
*addr = save[--i];
* N; p2 E/ ?% ~/ n
}
; I2 b9 j; m4 z1 V+ z0 [
return (size);
) `. Y1 D: o1 [' v
}
9 g8 q1 s/ x6 m* v: B: P5 V
}
! R+ A+ e! |: _4 Q# D7 K+ e
5 n' }7 ~: A1 Y" j5 {8 T+ c
return (maxsize);
* w7 m% i5 v* b9 `* X
}
' F/ O m$ ^) a
int dram_init(void)
# H* |" W) h& G- x% ?
{
) I1 }. z& p2 Y$ H/ s6 c
/* dram_init must store complete ramsize in gd->ram_size */
; e1 E$ x1 R) \# t
gd->ram_size = get_ram_size(
2 I3 D) T6 w# [1 I( J3 i
(void *)CONFIG_SYS_SDRAM_BASE,
& O# E' |( ]/ j# P- l- ?" M1 S
CONFIG_MAX_RAM_BANK_SIZE);
+ @4 L0 w) i4 i5 Y
return 0;
! }, x, b! _) [2 M0 P
}
% ~' b' j6 I' t
7 G$ v6 D* j8 y) n7 q% z; g
9 N3 C. C! |& Z, r9 Y0 S( z
$ m4 u% Z0 v0 o$ E( @4 v" i
! u$ l2 c# \* d1 I
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
4 k9 D% L: O4 L$ n- [9 W
/ E- T' w3 W' ]
6 x, T! P/ q, O% C( X4 q1 w
1 ?2 R5 z0 n0 k" s" S7 `
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4