嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
( W+ |0 a- c( o# T6 j
核心板2:DDR2 256M Byte NAND FLASH 8G bit
U' P1 t( b+ [6 @! h: d# I
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
) q+ Z7 R, S, s9 s. `9 f
" `2 M5 ~$ ]; v: w: i; {
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
" W3 Y' c% F( a8 v9 J" X. x) d W I
2 c0 f: V9 L2 R, y( K8 |: m2 f' g
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
. c" D, E' b" p3 V7 w
/*
9 S) [$ [1 c) L# D. y9 D3 ~
* Check memory range for valid RAM. A simple memory test determines
8 }9 `* x( }: k: F" C4 C
* the actually available RAM size between addresses `base' and
! ?6 ` K2 O% m. M. s
* `base + maxsize'.
2 p9 {% G W/ F$ M) A7 x0 L. l4 |8 b$ a
*/
. C5 m. j2 E2 E* C
long get_ram_size(long *base, long maxsize)
V! v+ M0 K2 t9 B o
{
" f2 R/ d( ~" Q$ J6 t
volatile long *addr;
( W) }1 a5 M& i
long save[32];
! ]& O7 g9 w* D4 m
long cnt;
2 W7 `8 f4 J6 d
long val;
D+ N% C+ \* u( }
long size;
# ]$ X2 }0 {( O# {
int i = 0;
m* G- p/ D2 U4 j* H
7 T9 z5 j' e. {2 {8 s
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
3 o' F" u. o7 S; \
addr = base + cnt; /* pointer arith! */
& D( |7 h5 P7 S" A+ @. Z+ ~
sync ();
/ B8 }+ @# J+ c
save[i++] = *addr;
! R; M4 i- {4 ]8 J% ?8 q
sync ();
9 x3 o+ F5 u6 v( q* a7 D
*addr = ~cnt;
/ @! c; `2 o' O
}
; i- G# P' w3 n6 [( e) ^' N
2 W; h2 `6 }7 o! q0 m8 S4 s& b
addr = base;
3 F, W0 Y2 V: h
sync ();
, | g6 y; Q2 |/ k, N" q: J
save
= *addr;
1 i( I6 @3 U+ ^% V2 P6 N
sync ();
& u* V5 N3 U" n, Y3 ^. P
*addr = 0;
( H& W! r! |5 _6 z7 P
% D9 n& ~, n. o9 D c0 H
sync ();
) c8 Y) e+ d9 N% y: s
if ((val = *addr) != 0) {
6 x/ T! j ^7 @9 f/ I1 B# x% Q
/* Restore the original data before leaving the function.
# Q; ]8 ^ }; {& [) d* {
*/
, o' {' {' R2 o. }* F$ y- A
sync ();
- ~1 Q3 C6 i' A. W2 I
*addr = save
;
( l; Q$ f2 I [7 { I2 p
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
* x# }: _0 I# z# `- |4 A
addr = base + cnt;
: w0 I4 E1 o" X
sync ();
& r+ V, _. o/ d: O' Q
*addr = save[--i];
! e6 b6 l! `# Q7 p1 A
}
2 A; L6 [$ H1 f) ]* E+ k: C
return (0);
9 H5 Y" x( [7 A& x$ x
}
) U# L6 N" w# W' f1 E L0 ]
% B) e$ c! {2 A, S
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
( }0 Q- n @5 f1 [; D0 I+ R
addr = base + cnt; /* pointer arith! */
# a$ f2 i3 |7 [, t1 ?! k
val = *addr;
1 j8 r# L( I2 ^
*addr = save[--i];
# [4 m: z2 S6 v; l9 \& t- e
if (val != ~cnt) {
* a. u M5 J/ ?$ o4 f3 o0 m
size = cnt * sizeof (long);
) X& d8 H/ R) s
/* Restore the original data before leaving the function.
1 t" \0 m& @: M/ Q
*/
' P, k$ o6 z- x8 Z2 z ^
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
d. |3 T: Y: U; T# `" u7 ^6 j) y5 O& _
addr = base + cnt;
6 `% _3 ]( K2 R4 t3 |
*addr = save[--i];
3 `* v9 c! }$ Y3 S
}
) P( z f' B) W
return (size);
) v- G8 O" K& G) I
}
( C% U* R; J: |9 t) O
}
, w$ q0 d% @+ c
" T& J* `+ k3 c+ F" C) d7 P
return (maxsize);
. S i' {5 j7 _$ k
}
9 R4 r5 y# P6 k% F, d% r
int dram_init(void)
3 l/ M1 q0 T7 S( }% A. R( N
{
& b0 q! J( I) ^8 l" w4 E& l# J
/* dram_init must store complete ramsize in gd->ram_size */
( I2 [% {' c) Z A8 r7 A6 h( ]
gd->ram_size = get_ram_size(
( V. J# t, s1 }2 F# c b
(void *)CONFIG_SYS_SDRAM_BASE,
8 V7 R% f: f: @0 p
CONFIG_MAX_RAM_BANK_SIZE);
* M+ f; B8 W5 w8 d6 b# c F
return 0;
) Z3 @3 O. L7 }. n
}
9 ^( F9 `, O# b6 ~$ W
e% _" _3 i. @1 l6 ^% @
9 e" w6 S. e' j: x6 g; a+ i8 p- p2 x
1 u# F" f4 @% B( m6 J$ Q3 L
4 Q* v1 G0 M. ~9 v
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
/ D' z8 z- A @. r0 p
; {$ B$ n$ ]8 V P
: n) i) ]- }. o" z8 Y- x
/ f) A$ [, w9 e. t7 Z
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4