嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
2 Q- p' h1 y* m! F0 m. v9 F$ `6 l9 B9 e
核心板2:DDR2 256M Byte NAND FLASH 8G bit
2 W3 w" G' Q) e/ Z# T8 h
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
0 Y& |) G7 Q7 Z( N
/ J+ i; Q: d6 c% v
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
; @, \$ m1 `: i8 K$ s* L2 x
L) \5 l* i, T5 f2 i x- W) V9 E
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
* f& D( e1 X6 O' q3 R
/*
: e$ ^1 C2 Y7 s* }
* Check memory range for valid RAM. A simple memory test determines
! i r1 D# N L* f
* the actually available RAM size between addresses `base' and
3 q$ A/ N: ^0 ]
* `base + maxsize'.
1 C: Y" ]) a. s: V4 i" v0 Q. I
*/
# O" F# X8 M; L- s. j
long get_ram_size(long *base, long maxsize)
1 |0 Y; ^( \8 r; p1 ]. }
{
( F3 R- P& U& e9 H) s
volatile long *addr;
5 T2 G- a/ `, |/ F5 Q# [# I( ?
long save[32];
* k5 s; n/ B( o) n: C
long cnt;
2 S0 }" A; N( R0 S
long val;
) X' K; `3 C L+ R% M
long size;
5 b" ^1 I7 E9 T4 E" M1 U( u. I
int i = 0;
0 ]) h( L0 x6 }# U. H
4 s$ i8 f# }& H: Q# t: O# t" L: Q! `
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
( e r' X) z' x( O7 I! C) }
addr = base + cnt; /* pointer arith! */
% O4 I4 c. Z2 B7 [
sync ();
9 ]: r5 }6 J4 ?: m6 m3 m
save[i++] = *addr;
; h: i. v! l" _) ?" H
sync ();
- a" B( ]8 q2 Z0 q+ q
*addr = ~cnt;
! J" `+ i7 b) ~: T6 N# l
}
f8 F- }# G. X& s5 Z9 ]
% L. q. A! l% N, Q: j
addr = base;
5 @* V B* c" {, H3 g
sync ();
- k% j% R6 z' m$ p
save
= *addr;
. u! d0 D: Y, r; D
sync ();
" @: Y- s0 `8 J7 i: F4 Z! s' w
*addr = 0;
. Z$ p; j* [1 E
' `( T( n8 m& }: Q9 x8 C
sync ();
, s* Q' ]& C- j; B
if ((val = *addr) != 0) {
, u& t- F7 _7 K# j4 g5 G
/* Restore the original data before leaving the function.
) |/ q' b8 X' f7 @
*/
& K% W' I7 S. c8 i
sync ();
3 M. l) C4 w2 F; {7 F; y4 k9 |$ s
*addr = save
;
- B7 _; U3 E+ I3 q3 o
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
7 D+ Q* Y" U( E6 m& S' {
addr = base + cnt;
' j. K# j2 a2 S, B
sync ();
# O$ l7 O% A% J8 ?& k# F
*addr = save[--i];
2 p c6 `& {& U+ l1 l" U% ?( `
}
+ u8 f: \: M( J, X( B8 ?0 {7 z! q" z
return (0);
. [( `) x. I6 z6 K2 P" ^) I/ N
}
% F0 ~$ p7 C$ X5 b. q
' F$ U4 K" T* O1 I9 C$ S7 t3 K0 a
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
' h/ t, @, s6 b# L% Y% J, @2 |
addr = base + cnt; /* pointer arith! */
0 \; I' U/ F% ^$ m
val = *addr;
* I; D# d7 W" @3 U2 L6 X7 x" m, l
*addr = save[--i];
! p8 k% O3 x/ F: |& R
if (val != ~cnt) {
- ~3 H1 m( Y+ h
size = cnt * sizeof (long);
; h. E/ Q) \# Y9 z. g. J$ G
/* Restore the original data before leaving the function.
' ]0 H: u, E8 s$ [
*/
$ m8 |! z v( j' D9 ^# t
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
9 b& u0 d) V" b I N0 ]
addr = base + cnt;
$ X9 {' s0 X" I9 R/ n7 {8 h- J6 E
*addr = save[--i];
& Z `0 B2 ]; B3 L- [- ]+ |+ R$ k* H
}
1 r$ |1 z7 C" j8 E- c/ u
return (size);
! n- p% J/ @2 n4 q$ p; d6 w
}
: X: C" |' f5 d i4 B7 k5 r6 f
}
+ g3 Q+ v0 ^$ H( J% x. C; A
; O$ H- g7 r1 i. s
return (maxsize);
* i8 S" L! L ^5 |3 v. _# P5 t
}
( y% `0 `8 m- i7 \1 K" k
int dram_init(void)
8 A: c. t2 \1 U; p1 J! |) R5 @% c
{
: x5 c j* q# X c
/* dram_init must store complete ramsize in gd->ram_size */
5 I0 W1 y& k+ o6 p/ T6 Q
gd->ram_size = get_ram_size(
, T* F7 x, G7 q+ J, V, ]' u B9 R& E
(void *)CONFIG_SYS_SDRAM_BASE,
( j5 c2 Y: j7 h+ c1 W1 G" ?8 i( Y
CONFIG_MAX_RAM_BANK_SIZE);
* F9 ^3 |8 q* D6 r
return 0;
# @7 N% {8 n4 }6 H; H, I& v
}
# k$ [, r/ p* \8 p* ?$ ^
; T/ G' G; P5 [6 s1 @" {
) Q1 j3 d$ Z! f9 E
: e0 ?; G0 ~4 Y( q
7 n0 V# S: I; x' n5 t( w }
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
4 p& ]+ i' B: ^. A3 u* j2 X2 R
2 i, j* N4 q+ I9 m
7 p% w& p4 \) V
) M( r9 `8 _& G0 D/ j% v
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4