嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
( |4 N5 `6 p; J2 ?4 H$ |: x
核心板2:DDR2 256M Byte NAND FLASH 8G bit
9 I% L7 ~* ~, l, f+ J' |" n( Y. h# y
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
: a8 L1 G) Z' Q; m! _* M0 Y
8 q: H9 {8 {- C6 P" w7 b
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
2 O4 m! b4 W1 m* S0 x, c6 V5 s2 P
. U5 y7 _: u5 l8 a: y% l
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
1 S e1 o, R* N# `# }) _
/*
6 q7 `" s/ \9 m
* Check memory range for valid RAM. A simple memory test determines
0 W: Y, ?# D0 `- X1 W
* the actually available RAM size between addresses `base' and
. V; ^% G& Y) E% k# }$ R8 W. X
* `base + maxsize'.
6 \: M) K9 X8 Q; Z$ G3 ~2 a! s
*/
- u9 t" L% w6 l2 S4 p- e8 F
long get_ram_size(long *base, long maxsize)
+ P, x4 B+ v# G5 |) t* l8 [
{
4 p+ e/ M+ m+ l9 n' _( R
volatile long *addr;
9 h3 Z1 u( d' W3 p8 S9 V# |
long save[32];
( X& D [ M7 Y' n% O" a$ U
long cnt;
, Y# ~9 K I* D
long val;
' r2 T8 T- Y0 e) F
long size;
9 M1 @/ D! F9 p2 Z
int i = 0;
. z* V+ _7 d Z* l3 X
# _+ L( i I+ a$ _5 N* Q O- t3 f
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
( }% j1 K1 R( l
addr = base + cnt; /* pointer arith! */
1 ?, _+ W5 L) C
sync ();
+ f- P n8 a9 O: v+ ^
save[i++] = *addr;
( f4 m9 t- g% y6 m) B) f$ P
sync ();
- V+ f* o3 ^4 E% a8 R
*addr = ~cnt;
" ^6 x( G6 K' v4 b a+ \% j1 a
}
8 C9 n5 A" p# ~- f0 V1 D1 T' F) N) G
7 w+ R- X( h& a( i) a0 c7 d, s
addr = base;
3 d! k7 Z% i- H$ o7 F/ }
sync ();
0 C- k e+ f& c! X, a
save
= *addr;
5 b4 p+ E# y, L' V/ e: L% ~
sync ();
& M1 D8 l" U- C
*addr = 0;
. _+ a4 C% |" }" X7 P# j" y
' }" ^5 {, V( ~! ] P+ ~- Y
sync ();
2 D2 V# p2 A# \' o6 B+ b) w& L
if ((val = *addr) != 0) {
H3 s) l* G3 w. g. a- m' L0 z
/* Restore the original data before leaving the function.
- f4 t/ R/ f$ q
*/
9 s t6 ]& V9 p. m5 E- F
sync ();
1 |% n" l/ `. [# [& V5 q9 V( J9 y
*addr = save
;
" y, W( {3 }) d1 [
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
2 I5 W3 m0 d3 P7 }# A/ f2 @
addr = base + cnt;
' Z: d( \$ [/ ~3 m7 e
sync ();
8 H( m& |% V# m! G( ^! Z/ r
*addr = save[--i];
7 l" |, m6 @0 b
}
2 w+ |) |5 y0 p x; t
return (0);
- u' F3 ?7 s7 h6 J. k8 g
}
9 @+ B# o- a; R% N* j: D% \
" T- d' O9 `, Z
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
; ], l6 [. S' F! m5 b
addr = base + cnt; /* pointer arith! */
( t% S* y: r$ T/ K5 Y1 n
val = *addr;
+ ~- H: f' M0 a8 @
*addr = save[--i];
* v1 j4 [0 z$ N
if (val != ~cnt) {
6 ]1 s/ t' W$ D: ^% A3 O' z
size = cnt * sizeof (long);
# C( _& n9 o9 z* m0 ~5 ^! w; X. l
/* Restore the original data before leaving the function.
, t6 ?* J0 D" ^
*/
+ g' e$ s5 k! C2 w0 m+ l% ` X$ s4 P
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
) u! T1 _: x: h( g* ?: e
addr = base + cnt;
7 }. r; i& J) i, O( X/ X
*addr = save[--i];
6 Z2 Y+ r! p! Q, T0 K
}
1 G* d, r1 z3 M5 B& m9 O
return (size);
|8 g5 d; o$ y# Z# m: Y
}
; @; r4 Q" C. j( Q R- a" N2 \( D
}
) h: K/ I) c# z% o2 L) A5 v' F% M
# [; i. J5 q9 y4 b; m" j
return (maxsize);
$ s5 f* j: O5 A% }9 v( H
}
0 Y. m( o( X& S) I4 `$ N
int dram_init(void)
5 r" K) D! w! ]: w/ b& ^" f
{
' b0 h$ l% z8 L
/* dram_init must store complete ramsize in gd->ram_size */
6 v* b* a: n5 w
gd->ram_size = get_ram_size(
, {, s- j. d" |- O) S6 i
(void *)CONFIG_SYS_SDRAM_BASE,
F3 K& ~& b$ C
CONFIG_MAX_RAM_BANK_SIZE);
/ n- Z5 I& U4 `. o8 ?
return 0;
0 d& a' P: }+ a1 v4 U& D
}
H3 `0 a9 R4 a( g5 {) u( l
' Q2 c: h# j. A% V' i5 M+ B% z
$ [0 O; c# U4 V* W8 T4 N) t/ }
. G7 J: i1 L. J$ l( x# X
5 D+ h3 V: w8 `6 S, u( u" O% _6 v
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
' F+ u9 G' C" P* M
; n, D/ r0 \: o0 j( S' _" `1 i
) [9 b' w) p) D5 o7 O/ F$ U
- h+ a- ?$ E* f9 L. ^2 D
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4