嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
1 W% O3 q$ ^: g0 F" M1 D* j' {: C
核心板2:DDR2 256M Byte NAND FLASH 8G bit
2 ~! E- t3 t$ V, g; [9 ^
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
7 w3 V( ]/ F% R5 V* l+ t; }. v6 |
, M. I6 R+ n5 X# D0 ]/ g
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
* l* R+ n7 v9 h5 H9 W7 C
( V+ ~- \! s# L) H5 B% N# b0 J& L. O
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
- x+ A* K& ?/ Z! Z% f
/*
0 l( ^# [3 `/ w6 W; k
* Check memory range for valid RAM. A simple memory test determines
+ g `2 r. _0 j3 @5 C" \- V2 G S
* the actually available RAM size between addresses `base' and
. H6 |6 Q6 [# v- A' C% E9 q
* `base + maxsize'.
: N, f- w9 B5 ]2 S, Z8 ?& P
*/
+ [* `2 l, t A0 D
long get_ram_size(long *base, long maxsize)
4 a# k, g5 s6 N) P& K: p: W
{
' K1 q; X! ~2 Y7 W( T2 l" S
volatile long *addr;
% N& y. D4 _ y; W3 T
long save[32];
- p" ~. ~7 X- ]. Q6 G: V
long cnt;
. ?; `* H3 i5 c% P4 r; U
long val;
+ `7 h3 a* a! Y( L6 W4 U
long size;
9 k \* D2 N0 s- d/ U% @
int i = 0;
1 Z4 J3 T' s9 c5 }& t
4 y/ J3 D( C5 x& X( P1 I2 S$ e
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
" y9 K) v; m" N; J \$ T
addr = base + cnt; /* pointer arith! */
0 @' I& a- ^, J# S/ T5 p2 r; D
sync ();
Z0 i0 M, }& s* P5 G, k7 ~+ _
save[i++] = *addr;
& m# t7 b0 P* U; V
sync ();
% S, l- ~! m9 m' ?/ q/ a- I7 f
*addr = ~cnt;
; G2 n- V1 L K. w7 Q1 X
}
$ b2 o. w) H- A- `
+ \9 \/ `" v; V5 ~
addr = base;
% p4 W* K6 |% \# x8 m( K
sync ();
! c: W, {! _6 M5 K: J4 v c# U/ w
save
= *addr;
, ~; B5 F' R0 _: S: z* q
sync ();
2 y& ~& K' b p+ Y9 I# O$ a; {. U
*addr = 0;
/ N6 @* o/ f1 C2 T8 u2 m1 B1 _
4 }5 M* C& _+ b# y3 ]+ t
sync ();
$ `2 y5 j3 O0 L4 }
if ((val = *addr) != 0) {
2 S* U7 c! q, }2 d
/* Restore the original data before leaving the function.
: D2 J$ j, a/ c6 C) d' c: N" k- f/ B
*/
8 M6 `, q$ R) J( e
sync ();
9 p) e" o- Z3 b1 p
*addr = save
;
1 ]6 W' r1 w- N2 d+ |2 ]% w
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
7 V6 ^: w- T4 C' m
addr = base + cnt;
3 q0 J7 p; H5 f, F$ w [: j g
sync ();
# S! b; a3 S9 H4 j
*addr = save[--i];
0 f( G. ?8 z* l$ Q* _/ l, u
}
) F0 t. w5 S( e. x2 x) a2 |
return (0);
, J1 w% Q" W( d& V
}
7 n# c4 `& V% w, V2 Q4 F
: n( l& |$ K8 n! z
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
: P# p; d7 [5 {, b Q3 ]0 S9 x. S- h
addr = base + cnt; /* pointer arith! */
. x3 L( A0 D# q- Q. l2 H
val = *addr;
: L2 V5 E$ F1 f# h2 I. ?) t2 }
*addr = save[--i];
" l7 @4 Q& p$ P8 p- b6 q( t
if (val != ~cnt) {
' s o2 g1 P, {" Y+ I; ~
size = cnt * sizeof (long);
, T( S$ h+ i" B5 h. B0 x
/* Restore the original data before leaving the function.
- |8 h3 ?+ x0 @6 E
*/
7 M0 \2 {; e% ]$ m4 Q/ H
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
. F1 s$ Q" u, R. I
addr = base + cnt;
) c/ V A" Q% v) Y( \9 |: d
*addr = save[--i];
+ [% M8 b+ X' C# `
}
3 F# F3 Z- c3 I* `3 Y
return (size);
: N( F: d6 n) v( m
}
+ t0 \" H) {2 W, ?0 m/ \. H( r
}
$ q) V. g- e. a: r# H" u
) F% ]- j& p+ y3 D
return (maxsize);
+ h% C1 h1 o% n8 r
}
( K8 `; |" v8 I {' c. z8 C
int dram_init(void)
2 h x8 q5 I ?5 U2 |
{
i y- w$ b' T S+ C* F
/* dram_init must store complete ramsize in gd->ram_size */
! C4 e- ?7 l z' c5 a+ B9 m
gd->ram_size = get_ram_size(
1 Z1 U: g! ?& j5 Z o
(void *)CONFIG_SYS_SDRAM_BASE,
' O$ J( n& z+ m. `1 j
CONFIG_MAX_RAM_BANK_SIZE);
$ @" s/ y9 m) i& ]: p
return 0;
0 Y' f0 R! x/ V/ w& x) k
}
, N: x- O$ {/ J
8 O' e+ w$ A" V4 B/ B" m
' x9 F( k- j: l, E! {; ^3 ~
% `9 n0 g; ^% u, I2 g" q4 x
, E7 c E+ K, Q0 P
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
. K0 F4 R7 o5 R4 K
1 X4 {- c1 B3 [9 v, c. D
/ T) r7 e5 I1 L
) J+ U! J$ I0 b' U9 k
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4