嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
$ O( ?( E0 Q" H+ L1 R
核心板2:DDR2 256M Byte NAND FLASH 8G bit
4 u$ q/ Z+ R+ g' u
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
' K0 l; J& K8 N4 s+ C
9 U6 @: A' Z3 Y! A0 X
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
0 {6 u1 h+ i& m" B
0 W5 _% k- n7 C, u' u
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
" A$ x+ u7 u- X3 o& k0 Q3 T
/*
3 n% ?1 x2 @; G- r/ n0 K& j2 ]
* Check memory range for valid RAM. A simple memory test determines
$ @* [7 m9 {( L9 h' \: P
* the actually available RAM size between addresses `base' and
, _3 [1 M$ h4 P8 f- \& ~& {
* `base + maxsize'.
- I0 l4 |0 I. T) `) G0 C6 P
*/
% a* k- L g$ R& J0 c
long get_ram_size(long *base, long maxsize)
7 w: {: ?/ m) u) O
{
( |. ?6 y- W+ f& {! E/ }+ W2 t! z8 t
volatile long *addr;
+ X/ p! p k/ Y# Q @
long save[32];
3 x; j& b0 U( J$ N% e9 Q% G
long cnt;
( n8 i+ q+ A$ \' X2 N) S
long val;
3 |" ^7 d3 o7 |' g& h6 c g7 ~
long size;
9 t! t6 S; C: Y9 I+ n% o
int i = 0;
5 N ]0 ^7 o* Y k2 k. j, J! i
8 m; Z' ~& ]" g: j% K- q
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
# z' i# E# O/ t3 f" \
addr = base + cnt; /* pointer arith! */
5 L, n- I( i' w8 g, N
sync ();
4 ]: D6 [5 b' I/ z
save[i++] = *addr;
: y- F6 A" H6 W( k# z
sync ();
+ J! |. b% F3 g, T2 F
*addr = ~cnt;
' `* @1 N/ u$ f# T- i7 ]
}
3 x) S. C8 j6 V* U, l* Z
]( P* j7 @. R' D
addr = base;
5 m8 {- w9 N( m; w6 B1 M' L. h
sync ();
) G0 ]3 x. M+ t, K" w3 }
save
= *addr;
: v- r {% ?3 p y# }
sync ();
5 [; T p$ R* I# X
*addr = 0;
: a1 P2 y9 P, [, i2 T3 K
0 j% r. Q+ ]0 g* a
sync ();
* Z6 f; c7 K, ^
if ((val = *addr) != 0) {
! o: w) u5 @! b
/* Restore the original data before leaving the function.
, I) N5 q3 j$ a8 W4 ~9 |
*/
% w" i: B" ]) H; C" M) _0 v
sync ();
) e! X4 B4 m( g; B
*addr = save
;
/ [6 \, b5 n; E- e+ w% E5 \1 w
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
3 r( A" [6 `! K7 G
addr = base + cnt;
6 N- C7 z$ R J: p; E+ g) D
sync ();
; m7 y; i# C8 R8 W( _5 W4 ~
*addr = save[--i];
$ A T+ G8 E9 I- Y* r" S
}
8 |' k I( q% G4 t2 m
return (0);
! ~$ o7 O( H# h0 v/ l# X1 G
}
5 w/ C* l4 ^) C a& [, V- e
' q( D& U) b5 O# ^
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
) M6 d: u) G" ?* b
addr = base + cnt; /* pointer arith! */
+ k0 \* I9 U1 C; h: b6 ^: |
val = *addr;
* ]: N+ t. ~9 t6 L7 w) }( }5 L( P
*addr = save[--i];
3 i# O, u( k+ C- q0 V. y2 T) W
if (val != ~cnt) {
9 F/ p4 c! _5 Q; q
size = cnt * sizeof (long);
/ {# o+ Y4 u/ \8 E9 c7 P
/* Restore the original data before leaving the function.
2 q$ K- J+ k! ^3 d9 k5 A3 [
*/
( S% z' X4 Z2 a6 O! M
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
1 w$ N) ]' F! L# M P1 K
addr = base + cnt;
: j) L4 M! A$ R* }& a8 z: O( v7 H
*addr = save[--i];
' o1 s: h- a( y" @5 J9 q
}
: u9 A2 V* ]: j" }4 N
return (size);
: q# B' ]/ h. Y! @" F/ I
}
" Y! ?! y& d9 U$ L' G% U
}
5 N4 d( E' j- E( t3 T+ e0 h
6 q9 u+ d) b8 [# M% @
return (maxsize);
, G" B8 m+ L2 H/ V: n
}
3 Y7 l5 F/ x' Q) M4 P
int dram_init(void)
5 D2 E- n( H( `' @
{
- |1 L( ]# C' R+ e+ ~; x
/* dram_init must store complete ramsize in gd->ram_size */
) G! c2 b) ]3 A
gd->ram_size = get_ram_size(
) @3 Z# j2 Y8 _6 Z$ `9 p- M
(void *)CONFIG_SYS_SDRAM_BASE,
$ @, N4 C7 C9 `9 ?
CONFIG_MAX_RAM_BANK_SIZE);
- `& j& ~; ^) s7 ^* b% ]
return 0;
3 b. M7 F5 Q, |, V9 Z
}
( \ N, s* f% x. T, i7 s" h6 ]& M
/ z( e1 o- o( n6 u
) z! x- b4 j k" }
! ^/ p3 `$ t# D+ ~7 K6 {" j
) L3 C8 \0 b2 o- ]6 J1 j8 ]7 ~3 e
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
; e0 d3 R& X, c* G- b& n/ }" U
7 w v: a9 q2 R" \ j
9 @ [( K4 f& W2 R
( |! z9 ?- i9 t2 _
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4