嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
8 ~# e; H' z5 P; }
核心板2:DDR2 256M Byte NAND FLASH 8G bit
, o9 i" k, Y; R' z3 j4 H# q
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
4 T1 N( h6 N/ ]
5 |$ l3 G# ]0 q4 N! i
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
: n" y# T _: {9 e" w2 {3 t4 x, }
- X" @3 ?0 l! H% J
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
: U7 L- t; |0 O; ^1 q8 l7 u8 N0 {
/*
7 u- [9 }* F& s7 R0 ?
* Check memory range for valid RAM. A simple memory test determines
" Q% ]4 ]5 X8 o- x
* the actually available RAM size between addresses `base' and
& ?6 K3 ^ F. I- B
* `base + maxsize'.
% L. V' Q& q/ @, Z: A- l% M/ U6 B
*/
( T7 N2 ^& |. F6 |+ ^ N
long get_ram_size(long *base, long maxsize)
* s3 n2 e. V) g: J% W; H( G7 M
{
% w9 i: w1 ?3 C" E1 d
volatile long *addr;
6 K; o4 s& @0 J% o: d9 F/ z1 o
long save[32];
3 S5 U3 O7 E# r% }
long cnt;
/ N) v5 h9 V1 K1 O0 w5 j/ o8 L
long val;
+ v2 s$ K+ k W! A9 }
long size;
( j5 B$ j2 `/ X$ ^8 c
int i = 0;
4 p4 R# J: D! [+ |0 _
3 f) ]3 }( x, [% a; c, {( L
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
% ?' C: d2 l! D! W) T
addr = base + cnt; /* pointer arith! */
8 y* y; J+ X4 X4 B% A3 T
sync ();
* P3 Y+ @7 d: M$ y! A2 c, `
save[i++] = *addr;
8 |- e4 b0 U* }7 d. g
sync ();
M. z7 p8 ]1 W" `+ \% Y- A8 D2 O
*addr = ~cnt;
' u- z. S5 U; ^" q5 s
}
$ H$ @* P" i8 R# y7 \' J8 @
# E9 X4 b0 \; c) f b# D
addr = base;
# X- y( }# Z5 ^: o5 v
sync ();
& l. m5 \' j% d/ U! i
save
= *addr;
: @3 F+ n9 {7 Q5 r; _% b+ c
sync ();
6 H& \! I5 K, x
*addr = 0;
' C6 @. e+ A/ p! S9 L
) g, l" A/ K4 {0 g
sync ();
# k7 a- ~. W2 `+ |3 x1 W( Q( f( R
if ((val = *addr) != 0) {
' i' h, \ S9 g& v$ C/ A
/* Restore the original data before leaving the function.
7 g! C3 ]$ o0 m
*/
; }& e% E( t: K8 O
sync ();
! l4 _! l6 _5 A' Z f; v- r
*addr = save
;
) }; K/ v. O# V4 o
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
2 [0 V V) [& l: e& |
addr = base + cnt;
4 y r& l3 J# G
sync ();
5 r/ }9 D# |+ @" R P: [
*addr = save[--i];
+ v1 t P4 R% A1 Q4 S+ a
}
: s7 h6 m. t" C) G
return (0);
/ Z2 k7 r' [& S/ P! D# m
}
. d: U; v0 J& N6 `" I3 e( X
" b, Y5 \5 d( h" O* a7 O
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
" ?; c c) [* O
addr = base + cnt; /* pointer arith! */
8 N6 X& B* a1 R! Z- ^
val = *addr;
! c1 N+ }3 x9 x
*addr = save[--i];
& X( v8 C* E3 p; x7 m" w& J# \2 B
if (val != ~cnt) {
1 S% ^/ o4 j4 q& y3 G
size = cnt * sizeof (long);
6 }8 e, o& c: e+ {3 N" f
/* Restore the original data before leaving the function.
- `$ s" X! Z" M3 c V
*/
# X" ~% N& k, J" T: Y6 ~
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
) _( L0 z, T! J
addr = base + cnt;
: N8 p! c, j: J9 n
*addr = save[--i];
3 h6 J5 z* K) a7 }6 v+ p
}
% D# l8 v0 o$ Y, a% e
return (size);
8 o1 m' M+ g% y! ^, K1 y% i/ L& u% ?
}
, s# A9 A- T {$ E+ y
}
Y, `- I5 z; T
1 {4 p0 H8 ^2 k, o" ], x6 H
return (maxsize);
- Q* K l3 s8 R: j, e$ W3 `, v! w
}
9 O, }+ Y6 Y5 t/ r2 i8 _* ]
int dram_init(void)
7 p/ p) p+ d/ w2 c) D- k
{
6 A. L6 M( O, I% x6 n( b
/* dram_init must store complete ramsize in gd->ram_size */
I3 @$ A/ I$ g, r' p
gd->ram_size = get_ram_size(
' g! R- a( J, W6 u
(void *)CONFIG_SYS_SDRAM_BASE,
2 f$ z5 t/ y$ G5 |; Q4 A
CONFIG_MAX_RAM_BANK_SIZE);
: a% f& _) W0 E, M8 t
return 0;
3 o' j+ H5 a+ v' Y8 j$ d
}
# o/ h2 t9 K% T% g& Z6 G# k4 F
+ e# R2 K3 w/ p- t, V
" Z! r) d4 ^# |' H" c
4 h% ?2 P0 F: A1 v( i0 d
. G( k; y9 p7 A) D l; r
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
9 B/ d+ l5 U! f' k8 e, n6 [
: X; E' h0 E1 F5 N
, J7 [9 {$ Q" ^: ]
+ N- ?" P! M$ C$ _9 x# }
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4