嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
) Z! N4 M* R. q& A4 X
核心板2:DDR2 256M Byte NAND FLASH 8G bit
% n1 U) J+ d' x9 P
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
# S3 T% J- `/ ^2 s+ q. j
2 J: W! q1 P4 h( M3 w; t
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
$ @2 _% N4 Q3 Y: V8 }* {
{6 Q9 T' H5 M" t
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
& z/ j- S. H( i& P' P) ~
/*
: t2 W3 L4 j7 S$ d6 P
* Check memory range for valid RAM. A simple memory test determines
* m I% w, y7 O- Z" i7 C
* the actually available RAM size between addresses `base' and
1 j7 W2 E U: m& L8 g s; a% v
* `base + maxsize'.
8 ?( \! o& C8 y% q. s* j t1 S
*/
* \/ E( [ R$ C: ^
long get_ram_size(long *base, long maxsize)
) E& M3 c& g6 {7 q+ T" C
{
/ k. T& a2 F, ]6 g
volatile long *addr;
1 E+ V$ _+ A& S A7 x6 H W, x
long save[32];
, I: E! X9 V! _1 {6 Y. O8 b
long cnt;
; K0 {- e2 `5 k8 Z0 i
long val;
6 Q# P9 O+ [0 M% Z/ g; P1 u9 N
long size;
) d% }8 D( p7 u
int i = 0;
. T4 z6 ?& S; Q& z
: ]$ R, G0 F; t+ T9 @8 Z* `
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
9 n, T! C! J$ s$ ]0 h' c$ U
addr = base + cnt; /* pointer arith! */
- o7 W R1 B ]* G! k
sync ();
$ C' o: Y# `) O @1 [& O* ~" m
save[i++] = *addr;
& S5 M7 }: h$ ]6 z
sync ();
/ J# x* f% ~6 G* {+ H6 @' s3 P
*addr = ~cnt;
+ f& H5 a8 c1 ~ ^- u2 S; S
}
+ J3 w, g- p4 D/ s4 m
' k/ J X e3 ^5 h7 m# `8 J9 j
addr = base;
" q# ^7 V( t2 z. i2 z: ]: H
sync ();
0 g, L$ J* C2 ?) @
save
= *addr;
0 Z( |2 i4 k5 E# q) K3 _
sync ();
! M: P {8 T% D
*addr = 0;
: {7 e8 A- a4 C- w L
+ o, e8 [7 S# U
sync ();
' Z3 [* F2 u) f; u) r" e
if ((val = *addr) != 0) {
% |$ r7 Y. }2 a. S2 C2 W& A3 ~
/* Restore the original data before leaving the function.
; I1 D7 I7 d. H4 q
*/
0 G) s" K8 O1 x1 k$ h
sync ();
: ]: n2 J) T6 A. V# I* w2 a3 m
*addr = save
;
) {' i9 U# S, Z$ P: a/ m- I5 r
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
! @, B! {) n* T+ {! s
addr = base + cnt;
1 y( t. _2 ^, e' S
sync ();
: W' [: D' T9 E$ }& S8 f- m9 C! h
*addr = save[--i];
1 w, |# f; i6 S
}
" ]! Y$ T. m9 ~! s4 \$ @
return (0);
* n# J S4 B0 V F' Y
}
; {6 k+ s: h9 B5 k, W& g
) x3 d$ ^# d( C/ L0 s: a i& f
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
; x. w: g1 S% _8 z$ O+ ~
addr = base + cnt; /* pointer arith! */
/ f" s! A, `- `) ?1 w
val = *addr;
O' P" y3 ?8 y, R; Z) H1 F! F
*addr = save[--i];
% z/ L! h& P' U# y# s* j, ]
if (val != ~cnt) {
. J8 t7 X) s4 k2 `; A, j# D3 n) v
size = cnt * sizeof (long);
- X$ e. Q/ q( X! o8 f) L; t
/* Restore the original data before leaving the function.
U; S5 @1 f! O3 [) i$ N
*/
! o+ h5 N9 b5 m6 x1 A7 M2 r& f+ g$ ^! M
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
2 C, o" e. k6 e) u' a
addr = base + cnt;
) }5 e, \* u/ _& f. g9 U
*addr = save[--i];
, K& e- v: l. F a) u; h
}
8 w% S- s& c5 f! S% V
return (size);
2 N0 M; k) T" I- ?# I1 o2 M
}
- N5 U& V8 j9 q" K _
}
( C( s( T! {+ }* s7 ~
0 y% R" C* }+ x* M% ~, U0 @/ M
return (maxsize);
( |8 t+ ~% H; g% |6 B6 y4 E
}
0 s B. b5 E a. d3 x$ N
int dram_init(void)
& P0 ]1 X' t- {
{
. O5 J/ O3 a- z( `8 N) q }& a
/* dram_init must store complete ramsize in gd->ram_size */
6 @3 o' w6 A9 b% R* }
gd->ram_size = get_ram_size(
" i- q' ~# J, Y* T9 I3 b% R* @
(void *)CONFIG_SYS_SDRAM_BASE,
* K* q) ]0 Z) J# d4 c
CONFIG_MAX_RAM_BANK_SIZE);
$ f2 [, b9 ~ Y( K
return 0;
% ^: ?; x s+ a! l3 M
}
+ h: Y& g0 X# |, |/ n
' |0 N( W; m2 c0 ^5 K5 U' r/ ]
8 c1 M1 T6 q& k! O3 D% v
7 _! ]- B7 f0 z9 h
9 V* n/ ]! o) A% A K. B
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
( O7 T6 H6 b& K1 o+ e
! M0 Q' e( v5 Q E. w. F. f% I( q
3 f; v0 S" U. t" h0 I
, [! C" U+ }3 q4 k5 m
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4