嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
% g: [2 }, v4 N) C! f. S2 F
核心板2:DDR2 256M Byte NAND FLASH 8G bit
5 S- w& o, H. O K" G* E
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
( A* G4 n+ Y- B$ f+ x" X
: o. }9 ~8 F9 @* J
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
$ ~; i: c6 x/ A& J
, Z, r+ w' V+ o- @ C' |
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
5 F* H8 r, k! T* i. s+ g
/*
7 L& \, y) e. R0 I2 F( _
* Check memory range for valid RAM. A simple memory test determines
; b* z9 V- F0 x- l, w& N/ a
* the actually available RAM size between addresses `base' and
: Z* ^: a: n7 p; P4 F- o
* `base + maxsize'.
0 {! I' v* J) \
*/
4 T" z% r: H& {* ~0 K% i
long get_ram_size(long *base, long maxsize)
+ }+ Q o2 T- H
{
5 y9 w' Y! O' ~( G( i3 r
volatile long *addr;
9 e& t1 A/ x& q/ z9 }5 l2 b
long save[32];
( s; q% C5 M$ v% k5 Z" ~3 q6 D
long cnt;
( a ?/ L* D4 P$ q7 B
long val;
" G% Z8 l* X/ u2 ?/ J
long size;
4 q C2 e0 [- {5 M" x
int i = 0;
& Y1 v1 R6 I& f; J& r1 a" W
1 B6 z: r/ A4 x# j. X# j' d1 I
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
3 L# F: J7 c( J0 y# U( I0 Z; @
addr = base + cnt; /* pointer arith! */
/ q$ S0 `& F, L _8 Y
sync ();
. x8 P# o) j6 l# L' Q0 C
save[i++] = *addr;
' S3 A# Y; j5 O# S% M; y8 x0 G
sync ();
' g1 o6 q; J; O+ Q, S! }$ P
*addr = ~cnt;
. O8 U: u. R# g0 k+ X, G/ F6 w: q
}
$ Q- L+ U* ^& W; e5 ?* N
$ A! H# e' E: A `7 `6 f; K
addr = base;
$ r- H3 P- }% \6 i& H- T
sync ();
, a% K6 ~& t1 C+ S
save
= *addr;
; ^* l# }: F) a2 p
sync ();
D+ y* s2 E3 m% p4 P9 ~: q+ s
*addr = 0;
4 y" u& B8 k$ N) s2 g
" ]% e/ P' @3 A& l$ |
sync ();
R) x: o; P" q- ~! e) l. b _
if ((val = *addr) != 0) {
. ]5 q9 C+ b9 y
/* Restore the original data before leaving the function.
9 r1 i% ]! s+ j. Q; u: M# Q: z$ B
*/
8 b$ F, @/ D, k2 @. ~, v
sync ();
|! m9 p$ s$ x+ }; D
*addr = save
;
" q, F0 s% y( u! I5 U9 j+ o: s
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
y6 [* u5 R9 m* v" H
addr = base + cnt;
; A3 T" \4 @5 C2 M+ F: m
sync ();
1 j4 p6 a% w, L+ R
*addr = save[--i];
6 P+ B- @" V, q* @ |/ n& A5 e
}
, G& u! H7 K* D( a' C
return (0);
8 r+ ]% c c/ C. K0 Z
}
5 e1 a# ?0 L8 q' {7 b
7 a+ h; D# ~8 f: ?+ |/ `5 g
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
! w3 I1 V4 f) X6 C7 }6 O/ c
addr = base + cnt; /* pointer arith! */
+ b- G9 Z' T1 ?" a) v
val = *addr;
0 o0 v0 b2 q+ i/ `, ^0 H0 u
*addr = save[--i];
E& N( b3 S8 C; {6 W
if (val != ~cnt) {
4 C+ ~5 @/ ^' l& q( B
size = cnt * sizeof (long);
# K6 k; J4 v- k/ Q H
/* Restore the original data before leaving the function.
1 L& c! L8 d; P3 ~* q! J8 h
*/
7 s7 U/ [: n& {; d _4 u" p0 H/ x6 J
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
2 O; b0 a- U% _* J$ M- j
addr = base + cnt;
. ~/ \/ Y* f- E9 t
*addr = save[--i];
8 K+ B* O# U5 M0 H) ?
}
% Y6 z- `' `, G3 M3 @( w; W9 y: y
return (size);
& g e" A: U( t! g* j
}
1 {4 Y# j2 ~2 Y6 t2 _7 L
}
! b& n* j: L1 ]9 J
7 e/ g' \- f1 _2 B; x+ K9 a7 I
return (maxsize);
v% B( u6 k9 L, M( @/ w
}
! \* E6 |; b# k% ?
int dram_init(void)
& `# J- i5 ~! k- Y
{
. p* z1 }# I: u6 F8 W9 {
/* dram_init must store complete ramsize in gd->ram_size */
1 M/ X, f8 a4 C: c: Y
gd->ram_size = get_ram_size(
' f- x9 I' b+ x+ O& o
(void *)CONFIG_SYS_SDRAM_BASE,
) r" N; o, T# m3 A m) E+ W' B) }, G
CONFIG_MAX_RAM_BANK_SIZE);
4 f1 ~5 O7 F: S8 h( L4 H2 X; |
return 0;
7 M2 ~9 {& T4 _8 i5 @! ]( }
}
1 z6 ]& X, p: C( ~+ m ^' M
- g' g- a6 u V( I! W2 O
# i' ]/ K: ?* \' A+ q
' X7 f, S3 y$ f5 A# y
. h( k4 l5 U+ C* x- m
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
) g" A# ~; o5 {2 @7 V
9 ]" @% F7 J: f+ c3 j, e! @% P
9 Z/ U6 d" X2 l8 g" \
0 _) ~' C3 k6 p1 L0 \7 b9 }! F
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4