嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
3 I9 L$ Q7 \0 g9 H$ }0 v
核心板2:DDR2 256M Byte NAND FLASH 8G bit
, i, h# I9 r, i
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
) Y& P2 w/ l6 o" A) Z
, m# K5 a, I% D$ `; H4 ]# w% R
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
' i+ Y6 j- u+ d% C' i/ v
' t; U1 A; `7 s& ]1 m$ z
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
2 [ |8 {3 ~1 a
/*
& | H+ @# l3 |1 k. \ u G" M
* Check memory range for valid RAM. A simple memory test determines
+ h: ^+ W0 O/ f1 A w# w( G0 ~
* the actually available RAM size between addresses `base' and
4 _" g, V: Y/ N" D( z
* `base + maxsize'.
& J- t/ v' N8 [ \7 ^8 X
*/
$ w t- |2 j5 H( j! c, T4 p
long get_ram_size(long *base, long maxsize)
' W0 _" P& }1 u8 E/ q d
{
4 X& p- U F; Z) k4 c5 C- w: _; c
volatile long *addr;
- w! h' R; z0 \" t5 X- y
long save[32];
J# T- w0 v+ ]" A) }8 |" i! c
long cnt;
3 Y4 P! T2 l6 U7 N9 ?: \
long val;
$ s5 R: J! o0 _+ b( }/ o
long size;
) o* G9 ]0 i" }2 p: `( m6 t% F4 ]3 E
int i = 0;
) c- X6 R/ W) B- U2 A# E3 Q
2 e0 s! H1 Q8 r9 Z G+ G+ s8 y& ]
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
* ?) L2 O/ V+ K! n/ a7 ?+ f/ w3 x
addr = base + cnt; /* pointer arith! */
# {2 g: w2 @* v( f; R. O
sync ();
- a) o2 I/ v9 q! \1 P$ `) M1 c# H
save[i++] = *addr;
- o2 y2 T5 l0 V
sync ();
5 X+ N( e: o) {
*addr = ~cnt;
6 L. j$ v- o g/ `; Y
}
( g* \1 Z8 [" Q% N
: w8 ~: F7 l+ _3 c6 L2 M6 G' g$ ]2 R' Q
addr = base;
8 x' t3 O/ C& X2 w3 d
sync ();
) N. d) h4 T" @
save
= *addr;
4 v* q" D0 q1 u9 q: h! S
sync ();
7 H1 `" b8 I" ]7 b& Z# @
*addr = 0;
' P5 Q. x1 `! w7 M t
6 Q) ^) v# b9 O2 Q/ d
sync ();
' O" T8 |& b" j/ x( V& Q
if ((val = *addr) != 0) {
2 w$ \# S5 D2 f2 x8 r
/* Restore the original data before leaving the function.
3 s% u+ m7 b3 ~, Z$ R, c0 t
*/
) G) W$ \( ~ l, y
sync ();
9 b# \' m1 T( k% f& t9 y
*addr = save
;
2 N! d* c: n& f: r9 Y3 j" m
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
! Z9 ^/ Q3 Z, J2 B
addr = base + cnt;
Z+ H% l. C) S. `
sync ();
. z1 n1 @$ }5 @* |( E
*addr = save[--i];
# b5 P5 Y1 @: |! D; v5 D
}
$ g% v7 A" K9 `2 ~7 f
return (0);
2 S( u$ |- u8 a" z5 j) W
}
8 N4 Q& E, z( K5 K1 h, _6 n" H- @
2 K! C8 U3 \/ j: h; y% I
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
0 W' F4 J# o" F7 M0 @ N
addr = base + cnt; /* pointer arith! */
3 @. C; D0 t; `& f X: y0 Y/ k+ _, O4 r
val = *addr;
2 o6 I" {# Q4 t3 m4 A$ x% C7 w
*addr = save[--i];
) o& R% k: T$ |& g9 \9 s
if (val != ~cnt) {
3 z- a C' p7 Z- e: s! j
size = cnt * sizeof (long);
$ d) q; S2 W5 o* W% e- q3 H
/* Restore the original data before leaving the function.
! p w* h Q' _2 Y$ M/ s+ q! i
*/
8 P2 r7 E. E) u8 [- H' `
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
, v& J& P) ?8 v# ~* u g, [% {& Y
addr = base + cnt;
0 j+ x& i2 A3 J. d) m( _! w/ c
*addr = save[--i];
4 |( I- f; l- H/ q9 `# ~
}
) h0 I$ h) z) t9 e7 I; Q
return (size);
8 ~$ Y2 |5 `3 w* e, }
}
/ t' w4 H4 s0 ^( M2 w: q3 X
}
* f$ b5 x2 e6 R; t0 J4 r @
# H" e0 G4 n; V( c( z }
return (maxsize);
C# f A% @8 F1 @
}
& e1 b) w: P5 k
int dram_init(void)
- y( ?4 I7 E+ Z6 J
{
7 F: V' |3 h1 a, a: Q' L' g9 Q
/* dram_init must store complete ramsize in gd->ram_size */
6 {0 e( i- d4 T$ u1 u! }
gd->ram_size = get_ram_size(
. }5 s) ~0 J Q6 @9 ]0 X- N
(void *)CONFIG_SYS_SDRAM_BASE,
7 S9 d- m- V0 i# ]
CONFIG_MAX_RAM_BANK_SIZE);
- b2 X0 \7 k( m K/ f. _: i0 O+ g
return 0;
, j9 R% a0 w$ W/ Z! b E
}
* T3 K: m' |5 ?3 [$ r
5 w# k) r x$ A- O5 B' c4 p' q
7 e% U3 P3 U# D0 ? J" B9 X# m- `
$ s$ b. `; N- Y2 [5 h' D6 h0 ^
4 h# L6 D& {0 o0 U; l$ a
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
6 b; w/ N% u: o. j( d
+ I; f" g% f$ L0 }/ t: G
" P7 F( ?0 @/ f0 E8 D7 p+ Y
* f6 \: P! _% c& }: A1 Y
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4