嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
1 ^& W" @! B; I, G. r0 Y3 z
核心板2:DDR2 256M Byte NAND FLASH 8G bit
& i9 B4 c- Y) o- K4 ?
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
! u0 N0 B% B* X4 w
* t1 p% U& h" N! f3 ]. `
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
& q' }/ D# R, V1 p1 V
$ V7 v$ C; ~- B9 s2 w/ D
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
X: e; }" r8 q3 s1 d8 q
/*
5 E0 N5 m: s9 l+ p
* Check memory range for valid RAM. A simple memory test determines
3 Q1 Z4 `- K2 U7 K: H, e
* the actually available RAM size between addresses `base' and
$ `/ e( o H+ \9 A0 R! ^, L, z
* `base + maxsize'.
3 C* U% i. v+ Y' r
*/
& l+ ~$ e- k z$ \
long get_ram_size(long *base, long maxsize)
l6 W/ d [) c3 E
{
" M- S8 q4 v1 i0 g
volatile long *addr;
( f' [; ~- E3 F
long save[32];
7 C; Q% U8 r5 ]* Y4 p: x. K
long cnt;
! _- ~8 z1 O6 X: o) K! n
long val;
3 A) `5 {, ]7 ~7 @
long size;
& X. N- e* f. J4 o8 Z
int i = 0;
2 N9 f# b; T& D& k5 [: P
; B# }" p# g+ Q" T1 Q/ @9 W" g7 ~
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
$ `" N5 X: {) x( y
addr = base + cnt; /* pointer arith! */
1 u, L* z. x' V3 C, E
sync ();
8 s; |6 O( X/ D9 d% E
save[i++] = *addr;
8 I8 H1 K* p' Q9 M3 `! ~, }- B4 H
sync ();
) l( \) m) r1 h. `- Q1 v. m' d: }
*addr = ~cnt;
! J) x( n2 c! e B0 A
}
# x3 v3 a, f) _! ]
5 W8 c z4 _! b5 Z
addr = base;
6 C/ m2 w' c7 R- {) R# r( o% d
sync ();
: G4 Z7 l1 _8 L4 b$ T) Z
save
= *addr;
' p+ w. d6 @9 z- @1 p
sync ();
5 C7 F R, {6 A* {' [
*addr = 0;
0 L6 ]- u) b7 V/ ~
. u" i" R, a0 C7 R, f
sync ();
. f. V+ h( b$ w& Z* ~$ D+ G- A
if ((val = *addr) != 0) {
1 v5 Z! z n4 k. v) }5 P
/* Restore the original data before leaving the function.
4 k1 Y9 r% C$ v6 X4 y+ A
*/
+ O7 h, f4 v, v7 n# I
sync ();
2 B$ i8 g+ |2 s7 H L# U0 f
*addr = save
;
9 g1 z, `+ ^4 b0 z3 V% `+ K
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
% m# p& Y4 l1 X$ t
addr = base + cnt;
' q/ ]+ W! ~6 ^1 a2 L" D) v4 k) n1 }$ c
sync ();
1 \3 n; f" _9 T# o% `
*addr = save[--i];
- A6 N. W1 U& T- r1 l0 `
}
0 L3 M- G0 g! a) c. J/ z
return (0);
! E- _% _! h' j! x
}
' u0 \* p. T; a
0 s8 s5 t0 r/ x. t2 P' ?5 G! k
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
$ [, E' t% W+ P
addr = base + cnt; /* pointer arith! */
. w* C3 H. c( q- y, B& J
val = *addr;
+ v, X1 p# r$ ?3 [4 O
*addr = save[--i];
3 q5 a) K% d5 E2 u
if (val != ~cnt) {
2 M- Z5 T( a, W$ k& T* t" s
size = cnt * sizeof (long);
& Y/ P; k% _5 }( `' ]
/* Restore the original data before leaving the function.
( I2 F/ v3 r- Y8 B
*/
) N' _, f7 j, I& g! }1 q% s
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
8 k8 V; N/ U. n5 N8 p: x4 L8 K
addr = base + cnt;
7 g. h2 e" _3 Y' r& R
*addr = save[--i];
W9 t2 k" t& [+ ^( [8 R
}
5 }% O3 t. w$ B# \6 H: F! _
return (size);
) m: }- ~" Q: ^1 e# i& G' j
}
; g3 c0 s3 ^1 k, R+ p* N% R
}
: R' ~; B* X1 |3 K5 e
! b, ]' {( `$ Q+ q
return (maxsize);
* \# h. `+ r# w
}
% l1 c( x' N }9 ^7 j) l ^" Q- d
int dram_init(void)
; N5 M. o+ B( b$ U$ l, U
{
( [9 A6 O) ^' t% @, _
/* dram_init must store complete ramsize in gd->ram_size */
' u9 H9 Q# N9 r+ e3 Y
gd->ram_size = get_ram_size(
6 T7 c# ~5 F$ A, F2 v/ R
(void *)CONFIG_SYS_SDRAM_BASE,
9 @& p: _7 d; O" b h, s
CONFIG_MAX_RAM_BANK_SIZE);
7 t6 l T% k$ E/ K
return 0;
5 ~5 V& l1 S% t3 E. v6 o: ^% z
}
+ C' X$ h( n+ G. d- l8 U, _
; y/ H: i9 _" _1 Q+ u$ E5 J
& n6 B- K8 Y& \: `5 \$ e; Q8 l. z
1 `$ ~( r) j+ V, H5 F# w `
. |0 T, G0 t, c+ Q, w+ ^
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
: S9 Z2 T8 E9 ^( _/ ^
' O/ ~2 s8 h2 [8 |7 l
# {: \3 L4 R# {* N
4 H+ [* I8 v$ E Z2 {+ k9 P, a
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4