嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
" @8 H3 y. E* b4 S; q4 J# k
核心板2:DDR2 256M Byte NAND FLASH 8G bit
7 X6 h* s# |. \3 A* U) h4 }# N7 R
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
7 u; z9 E, t4 ]
* l& E/ I6 |3 n8 u N
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
; U" u# J: R! x. I* z
3 c% l4 @, o" S. Y) f
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
^9 P4 h- G5 z; H. G
/*
' Z5 |4 H7 U2 |
* Check memory range for valid RAM. A simple memory test determines
" s( v% X8 c2 y! v( R7 S
* the actually available RAM size between addresses `base' and
- G* R! s' { n- F6 X7 V' s0 K
* `base + maxsize'.
0 D" O# f& \+ N0 I
*/
/ I% t: H9 t! }0 z% E; M3 b$ Q
long get_ram_size(long *base, long maxsize)
, m1 A4 }2 x8 H* I9 t' M$ I) w. B: B
{
2 E2 U J4 c7 r) g( s
volatile long *addr;
7 q/ z! h! H/ t7 h5 Z
long save[32];
$ M% F0 j3 K2 Y; x: [) G0 o
long cnt;
: L% s0 H$ Y& Y- {
long val;
0 S Z. w( P5 Z
long size;
. L8 K: |$ n+ x: o
int i = 0;
8 `: |+ o+ ]( H) i
, ~- {( B. a) q0 V
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
; o" j) d$ s3 T: a% m* S# q
addr = base + cnt; /* pointer arith! */
2 j; [% [/ @ q
sync ();
$ N1 u( J* ]: M; [
save[i++] = *addr;
9 t6 n1 i, b; p( r
sync ();
6 i6 g1 d! o8 L: e
*addr = ~cnt;
% K. k }* `9 W
}
& e2 ~' s1 b& m" w
k5 S# e* V6 V! Q- J6 u: A
addr = base;
( c% a- \% _( c5 c0 o2 Z
sync ();
9 Z& T4 X, r b- ?
save
= *addr;
( V( f: F7 Q' S/ V
sync ();
) n: q1 Y" h# V W5 \
*addr = 0;
% B% b- B, i* H# q- h
B2 |* `% g5 h( Y5 K$ R2 X
sync ();
# Z: J: B. s9 [+ i. D
if ((val = *addr) != 0) {
+ p' x/ O0 O l4 x* q6 _1 i$ _0 }
/* Restore the original data before leaving the function.
& V/ s* }9 ^, `* M3 u
*/
1 s/ I8 U7 e* M0 c8 I9 e W
sync ();
8 t* s3 a' e$ {5 B
*addr = save
;
6 p% Q- c5 A w4 E& e
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
# q0 @2 C. U; Y- A% k
addr = base + cnt;
- Z+ X N# d! J: N
sync ();
2 O) A- r: P* Z; z! ]0 G
*addr = save[--i];
8 | _& l5 f- f @2 E/ o& O( H
}
+ l {% {: J" H
return (0);
2 s- ]' }; ^/ U4 k) c: w0 p2 b- f! @
}
0 T; N' d9 z) x; }2 N
. E+ [# u1 K+ H
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
9 ` i8 |" X6 p" A
addr = base + cnt; /* pointer arith! */
* p- v, I4 i( t9 O" G" H) X5 f
val = *addr;
9 j4 g7 [8 ?, P9 h+ W. R) w+ A/ ~
*addr = save[--i];
. {) J0 R# ^, u" ~6 H+ E/ c# o
if (val != ~cnt) {
$ b5 @) j" V. W4 ~: ~
size = cnt * sizeof (long);
& O$ _/ z9 y/ b0 T4 w+ G) t( R
/* Restore the original data before leaving the function.
( Q- J' i* T# e) o4 J
*/
% U; B5 v% c7 O! u4 F
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
, u1 F$ d1 O& ]2 S
addr = base + cnt;
9 g" h5 J& r- Q2 r5 c
*addr = save[--i];
1 w5 ~. W1 m$ l, V
}
( h+ d0 b5 s& M8 p8 U
return (size);
# ~4 l. O. S' C, S
}
! R4 m6 a9 Z5 f0 B! ~ Y" K/ D
}
3 J2 o9 |& q% d
6 S8 u! [4 \4 }$ v. j
return (maxsize);
$ g$ v# v- M6 r( m$ [$ ~
}
) B8 S8 l! I1 Z3 a! ?' z! ]7 m
int dram_init(void)
, i+ y6 }! o X q3 G
{
/ d i" A0 }/ E; l* U
/* dram_init must store complete ramsize in gd->ram_size */
- X3 W( M4 _! I, ]& H; H7 r* E: [
gd->ram_size = get_ram_size(
) ]" N7 U+ T3 Y8 @& W2 |
(void *)CONFIG_SYS_SDRAM_BASE,
$ S% L M! ? Z
CONFIG_MAX_RAM_BANK_SIZE);
# S+ T% c) y$ F) |9 M" l: f
return 0;
, ]3 Y7 j% @' }9 v
}
: {" S( u! G# R; Z- U9 G9 y# d$ ?
) o+ J4 f: V# F; V- s
# D1 `2 h4 u; V! p0 t# c# X+ d; P
$ ~/ H; l7 C, X& `: `7 S5 h: A
l4 \; M6 r. b1 Z/ i
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
8 \& M+ m, y0 t
2 ?! D! }( f# j" i2 q" r; v7 b
1 w& C* h' |+ G' v, A
) U4 K: z6 ], V' L+ N( E& k6 S/ p
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4