嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
8 f: a9 c- O* l; r3 u+ M
核心板2:DDR2 256M Byte NAND FLASH 8G bit
- D$ V+ c, s) I' O
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
! U1 b' c* u% p2 m* E( u
7 @2 _/ g% ^& c. o' V' p
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
! y: d2 \9 ^6 n% P5 Z( K
) m% t; k/ Q2 |# u8 r9 y( E
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
4 t* q; Z& h( W
/*
$ ~" {9 f M; F! ?8 M; s0 q
* Check memory range for valid RAM. A simple memory test determines
9 s8 t0 u- E; q4 @9 t3 F# _
* the actually available RAM size between addresses `base' and
; g4 a* P z* i% ]7 Q+ L% z4 N
* `base + maxsize'.
l: B7 F" I$ O1 q, I& g
*/
7 \$ H: H& F9 V+ F
long get_ram_size(long *base, long maxsize)
z' S8 G: V! b
{
2 S3 g1 W* b- P, {- k
volatile long *addr;
8 A- Q; H3 U- T
long save[32];
; T. Z) r$ X% X9 ]' Y) X
long cnt;
1 o. ^9 ~6 v9 V
long val;
% i) @4 K0 A3 h* ?
long size;
) P& ]' O+ V2 g* V" z: f! L+ P% @
int i = 0;
* m0 j) N r" S# w7 }6 s/ W
+ f$ g X( K/ M% X; f
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
+ h- k* \2 ]6 [- ^% y% }7 l
addr = base + cnt; /* pointer arith! */
* |! D0 B3 n9 j" {# e( X' s( x
sync ();
8 M# A; `4 g# H
save[i++] = *addr;
% F) C z1 `' a4 P; _
sync ();
; G( N9 d8 k: K# Q) B: f1 K p
*addr = ~cnt;
8 _5 H9 F" m1 T' Z
}
' p& p2 k8 R* z% y0 Y, r- T2 T
' [/ @: P6 h! s- R$ B! d; @
addr = base;
6 T& Z! \" q) T, B/ N5 e
sync ();
7 [% Y. y6 S: P+ L6 W1 o8 M
save
= *addr;
) Z& G! Z" T/ s( [% L0 `
sync ();
- J3 R3 P- g! |* I# d
*addr = 0;
. r: @: @# c+ c# K! V" v" X
4 H# |# q7 }; B' X
sync ();
, H0 @: `4 d' f2 Q v- a
if ((val = *addr) != 0) {
* L& ?$ h8 l# h! H% ?
/* Restore the original data before leaving the function.
! Q. v9 R0 o( n% D. d a
*/
' C" `" D7 Z% ~
sync ();
6 U$ U. L/ H6 Z+ T2 ~ A
*addr = save
;
- F6 @3 ]7 h% y* h
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
2 z) X' C+ `; p5 V
addr = base + cnt;
- |, v/ e6 R) n6 @) r
sync ();
3 z9 N. j0 ?: o, M0 O" ]# `6 S' j3 X
*addr = save[--i];
, ]3 R# d9 H3 Y' j( B' e
}
& s. E5 v, |% X6 I
return (0);
: I4 e% F2 n, n9 v# u
}
' m w& l+ p' h8 l
7 Z3 j$ C1 d. ]8 c
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
7 I# d# s" Z9 j0 N, k8 s# N$ ^
addr = base + cnt; /* pointer arith! */
$ M4 n: C* t6 e: J- @9 p5 o- r! u0 r) i
val = *addr;
" n2 r; y2 W# N/ a* h
*addr = save[--i];
4 L9 |0 x7 u$ ~) s% I/ E- Q5 Z
if (val != ~cnt) {
9 d1 I( g: S6 g" X8 @
size = cnt * sizeof (long);
' J1 a! G/ B& I
/* Restore the original data before leaving the function.
# v2 H5 P0 S& O
*/
- C! ~2 }$ k% N* w8 b3 }: q
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
0 c- r+ J/ G8 v6 ~4 l+ ~6 k- P1 A
addr = base + cnt;
$ L, {0 ~3 E9 ?
*addr = save[--i];
. Q v# ^% [# ^3 V3 @3 `+ K
}
4 B% `. z; }" h' ~& R: c% }
return (size);
; I8 k1 O6 Q) l# y% n G
}
" ^0 }: O+ H1 S, t4 U$ ?( X; H
}
; d9 k' v& r% Q; q1 w% v
1 w! B2 s0 s( W, k3 K. a
return (maxsize);
$ t: m; Q: _9 y$ v$ P
}
5 c; s9 G; g7 o- P& d: D
int dram_init(void)
1 u2 h) p# o% c, @( p3 S
{
# k! L8 v9 J2 j2 S5 x2 B. L
/* dram_init must store complete ramsize in gd->ram_size */
; ]: M+ a7 `& @9 I; s0 j
gd->ram_size = get_ram_size(
2 Y& h& E0 O6 m" l& J
(void *)CONFIG_SYS_SDRAM_BASE,
0 S. {7 k$ C% |- i: C0 o Z
CONFIG_MAX_RAM_BANK_SIZE);
4 {8 n& {: ^ v* y1 c
return 0;
9 I* w7 b8 E6 `- M& V0 l5 d Q- [+ t
}
' t4 i; A7 H! g- P; U; n3 Q% A
4 T* ]( t) D. a7 b; T! R% S, M
7 g3 _# E- H: j
) K0 { F& o1 Z1 L1 m* E
5 B+ ~/ n6 R& w- }" }9 Z0 j5 h
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
% d1 E# y( K0 q; f
! l1 t/ R9 u t: }/ X) `+ x1 ^. M
, H1 ?9 z) f. \, p
7 z6 Q% @0 G; y
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4