嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
2 N3 w4 R5 W! e* G! k. Q$ f1 G
核心板2:DDR2 256M Byte NAND FLASH 8G bit
p ?+ e& w0 b* Z' p) X
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
9 I2 V5 A3 p6 \) l
- }; o, A& A, E1 l6 ?" G
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
. S) I) X1 @& ~/ e$ a
* ^9 q+ P2 V/ I$ d. U
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
. T+ T6 b0 v% I" A2 ] ^3 [
/*
4 L" t$ g& H1 M$ W; v+ N! {
* Check memory range for valid RAM. A simple memory test determines
: u% n; o/ B7 G& W' o. S
* the actually available RAM size between addresses `base' and
9 s* I x, \6 i% l& B
* `base + maxsize'.
( s e( r3 |# u, Y
*/
; D7 k3 z' t, C
long get_ram_size(long *base, long maxsize)
" N" X! r% k+ L4 w, o! t+ {
{
3 {; _0 ?5 f* l* _; }
volatile long *addr;
& `1 N1 C+ \0 z8 w
long save[32];
) @9 J7 g4 I7 a5 I, D0 }
long cnt;
% v3 T; }) V8 g/ U5 m
long val;
0 ^. g( ^2 Z% f, _0 p R
long size;
T% e$ m* C. w8 r, X* r4 [# X
int i = 0;
9 h& w( h4 Z. i
3 o/ Y3 x$ s8 Q
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
0 _2 U; i. T* X1 Q) Y
addr = base + cnt; /* pointer arith! */
8 M- y% r h9 x4 D1 y. s( n2 u
sync ();
7 E% c+ |) _" c0 f
save[i++] = *addr;
' r/ T6 i, {- C$ N
sync ();
|$ V" m6 u8 [9 A
*addr = ~cnt;
5 G( l! w8 P- `, `( O' b
}
# \4 G: Z' s# N( ]2 O
: S9 Q+ w5 e. f" q {
addr = base;
% e- e+ [- H! M) H
sync ();
- r+ Y% H4 _; Q
save
= *addr;
4 E4 s p- _/ d6 g0 p, S2 c3 u q
sync ();
- ]7 j' i6 x" `! j* V
*addr = 0;
/ H S: H& R+ P& _0 U! g
9 {' W; S; e/ G5 Z( t+ |* a7 t# F7 J
sync ();
1 Q3 A# T/ ?2 G1 k6 _1 E% U% n1 p% K
if ((val = *addr) != 0) {
. K* h0 {! `9 h8 o
/* Restore the original data before leaving the function.
. {! Q6 h# X- \( _% M0 h: G' T3 i }
*/
: H' Z7 A; R7 F9 a# B k
sync ();
% A) p/ V- m( P3 X- K7 C& d
*addr = save
;
: V9 A0 U- V F) K
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
! u3 _* v+ Z6 r& `
addr = base + cnt;
3 O/ q+ F Q% w: \8 w$ {$ \9 z3 T4 ]
sync ();
- O. G" E. F1 u% s( c
*addr = save[--i];
# m9 Z9 J" f5 k- t
}
/ Z9 E* g( a v! J
return (0);
( E& ~& \0 i$ e5 G. G
}
3 ?% b" e, D/ B R
! ?% B( v7 c2 o( r! _3 h
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
; a5 h* z" w" D5 H; H+ W* l
addr = base + cnt; /* pointer arith! */
0 g7 |( M# N1 D" f/ U2 u
val = *addr;
% a$ H* v/ C. a
*addr = save[--i];
$ H) Y1 t9 ?( S& S4 v
if (val != ~cnt) {
9 w. w; _( W% L# d1 m- v# ]3 P
size = cnt * sizeof (long);
3 J4 }) A! m9 h6 u
/* Restore the original data before leaving the function.
% a4 g" t! ~0 L. p1 [
*/
4 }2 I9 ?0 J% }7 C2 s
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
1 E1 r8 A' \# e( Z: ^
addr = base + cnt;
6 L ~3 @9 Z. r" R7 h3 ~5 [
*addr = save[--i];
+ Q( |7 @3 q4 K6 Q
}
1 K2 ^# F" C! p* [3 D
return (size);
+ L o& n$ f; g5 ?# D: B
}
- s( N; Z% {) E! G9 o8 X4 h' g! y
}
r1 s' N# M5 [$ p+ x/ D+ l! b
% H3 f. J2 c' P- M
return (maxsize);
, F3 h6 X$ Y0 s+ {3 ?: ?
}
! ^' B% j. b6 |1 G- p
int dram_init(void)
7 x) `/ i0 }- I3 d2 e( a! ^: W! S
{
1 c. c4 W8 s; ]# E
/* dram_init must store complete ramsize in gd->ram_size */
4 p+ I+ X; t- l8 b# A3 Q; c
gd->ram_size = get_ram_size(
8 }' L7 p3 n" g% G, X; h! [
(void *)CONFIG_SYS_SDRAM_BASE,
3 E! r3 ?5 G8 ^+ {
CONFIG_MAX_RAM_BANK_SIZE);
) P) i( R9 U2 S
return 0;
2 G- A4 x# M: P8 s3 }8 S
}
8 w: i/ k0 i1 n' J) G$ G v/ Z
& ?5 w2 W8 r0 y; \$ h: h
" `: z f2 G% h. m( c% k8 x* Z- }- _
" ~" s' K2 V" b' g
3 Q: k/ Q" b u/ C$ j0 X" [" ^
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
; r' s3 Z: {; M6 B
& ?* h% f5 T$ {/ m; z
2 Y% G" t( w4 q
$ m0 k6 r- R! p2 T
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4