嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
' P% z( a' Y6 Q3 c0 m6 C
核心板2:DDR2 256M Byte NAND FLASH 8G bit
. b2 w2 a1 {. B5 }) M
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
( Q1 R5 ?7 J8 i4 u
# ^* T: B* q/ H( c. B
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
/ E; E, \0 u% t* [' _! }. p
3 D8 Q5 z% S0 R. d. |, x
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
) Q: A0 B0 _" e/ e7 _) L
/*
! l! L$ t* U8 W# r7 u
* Check memory range for valid RAM. A simple memory test determines
+ n: k7 k- v& R+ A' _0 S" C
* the actually available RAM size between addresses `base' and
& x& |$ ]% I& c/ i2 ^* q
* `base + maxsize'.
+ V6 Q- B4 B3 J& p8 b7 Q2 o/ Q
*/
3 w, a& [. ~$ m! w" P1 _
long get_ram_size(long *base, long maxsize)
% o& S) R7 g1 b( H& a0 g# J7 C
{
" g8 H; q0 T) O3 ?
volatile long *addr;
+ r9 y& u7 B! V+ ]3 C F
long save[32];
; S5 H/ b3 M; s) b. ~! C
long cnt;
0 P& ?; y' c" X+ s' {( U; Y, v
long val;
% v# P+ ^( K4 U3 S+ g
long size;
4 x* j0 X! w+ c( ^, }( x
int i = 0;
& X+ M1 Z0 V( k& l
3 t* Y. T, o/ s1 [2 ?& J
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
0 B) D. O) N: M& W3 n) W- [8 r
addr = base + cnt; /* pointer arith! */
, d% i" S. D) ~
sync ();
; p9 f8 t! C2 J: Y0 L
save[i++] = *addr;
( O& ~2 I! e1 w3 |/ f: _
sync ();
+ q' Q; Z3 b/ u5 q3 }+ B$ j
*addr = ~cnt;
, Z/ `$ C7 U% C4 o+ G: P- L+ G
}
& J$ `/ ~' M8 x0 I5 E0 C. g: o* C
& C0 w1 ]1 G& j+ d8 u4 M
addr = base;
; c/ o) K( e& g( q$ ^9 V' b$ x- g
sync ();
% I8 P+ U% P! M3 G% g9 Y
save
= *addr;
$ J1 A( u* F- b D, d4 Z' O
sync ();
, ?3 H- p( ?6 B. }% \ v# h
*addr = 0;
; a3 [; O' D- ~, J/ s- P6 n
: b3 `# I$ e6 F* X
sync ();
. W' o1 j# k; S' R% g
if ((val = *addr) != 0) {
& R B1 R4 I6 D5 I2 Z/ ?& \
/* Restore the original data before leaving the function.
7 o* J) u1 o6 n( |. `& w0 A% i
*/
9 d R3 L8 j3 V/ w: \# k7 B2 L
sync ();
0 B. Y0 f& S& y) P* P
*addr = save
;
- B4 }5 W! I4 ` I# t9 b4 b. v
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
) N( n; q. S* u* c1 l* p
addr = base + cnt;
/ u. ]( c; v( W" ]: v0 C" Z& Q
sync ();
8 s% J; |. {1 T0 v: c
*addr = save[--i];
% h# s* {; T- L3 E* }0 b
}
7 j, y) Z) Q9 b/ M( B b
return (0);
0 r) g- j) ?' T" E
}
3 |! J5 a! l. O" v1 M+ a
: Q$ N9 l) b5 h5 s5 \4 y0 m
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
/ x# G' @, E: K& B Z
addr = base + cnt; /* pointer arith! */
) K- {; q6 v- B: ]. R
val = *addr;
7 F3 ^( m, ^( }" d/ N
*addr = save[--i];
" c- @8 [) _0 l- R
if (val != ~cnt) {
+ H& L/ D4 }# C$ F3 e
size = cnt * sizeof (long);
$ o4 m7 F6 J. E; L" _
/* Restore the original data before leaving the function.
0 Y; `; F& Y7 a) }* s
*/
5 Z2 y, v4 [ j2 G: w
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
! W. z ^ }: ]6 \
addr = base + cnt;
8 w! ~" d+ N: p/ s3 m% f9 i
*addr = save[--i];
6 D- @4 ^4 k s) _/ Q
}
( X& a4 a$ B z* y! ~" g2 E
return (size);
c0 o, S. A( y- l
}
- a" D8 }! Y) V1 D5 o+ J
}
: t1 o9 r+ V' v0 y: Y0 r7 ]/ I
! A' Z' n4 T3 u& Q( i
return (maxsize);
+ E- ^9 x. |( P2 {3 Q0 y* J7 i
}
& m" ?) s8 o5 b* w
int dram_init(void)
7 h* ]1 b0 [1 \/ }$ B# d3 D
{
" u+ C5 E, `3 k4 i4 A$ ^
/* dram_init must store complete ramsize in gd->ram_size */
8 l) c0 J, H& X8 v$ Z" z
gd->ram_size = get_ram_size(
q& z. I# y% @6 n' ?" m
(void *)CONFIG_SYS_SDRAM_BASE,
3 l' o' U8 ~ d6 P& W% }6 j4 Q5 G
CONFIG_MAX_RAM_BANK_SIZE);
, Y5 c9 A3 L }0 n
return 0;
. F, b7 Y+ ], Z$ z( z) [
}
; U$ F, O/ S: x" Y+ ?: V: J
3 a$ R) }6 o1 @* E( y( q7 o
5 M: ^& b% R* E
# `' e% k6 T) V( b( q
- T! j( Z6 M5 [) {
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
1 c2 g. x! o" z) i+ T
" T7 A/ x4 W9 }* t7 P/ G
, q, d+ u2 w7 H8 @
* z& D# F; w' X
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4