嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
1 _; A [2 Y0 ~' }1 N7 n3 b7 M
核心板2:DDR2 256M Byte NAND FLASH 8G bit
8 i6 |' E( D5 N
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
, {$ o/ {& }, n6 E" n( Y- R4 Y. a/ z' a
$ A5 V3 y& s9 |: X: w
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
" y( j. d1 ?( f0 _) z/ ?
: Z9 n2 ]: Z: r# l- I2 D
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
3 Y( B/ @5 W9 l
/*
) \) Z0 y; s7 H/ Q
* Check memory range for valid RAM. A simple memory test determines
! I4 o! J& @2 d1 J- |
* the actually available RAM size between addresses `base' and
+ ~; y" W" N" a1 n
* `base + maxsize'.
2 r& ^) E/ O1 O. z/ r+ F4 N
*/
2 r g5 G ]) m/ \
long get_ram_size(long *base, long maxsize)
# B* I( t4 L7 L
{
2 u/ I3 a( ^+ \( x' a/ q- y" w
volatile long *addr;
1 T$ S, Y0 s C1 w% H- \& I
long save[32];
! L* {# N( H! O( i! H
long cnt;
3 n0 ^# H2 f6 u' H8 X$ u
long val;
: ^8 V7 B V2 c, a
long size;
2 l( G0 J" j9 M! k( _ Y+ u* X
int i = 0;
, x1 x- C' S! z' [- N
j! G2 e6 a1 }$ B0 a+ j( H
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
2 ~* ~+ L2 A$ m% F/ L# U
addr = base + cnt; /* pointer arith! */
/ I8 V4 |, T- H+ n9 n2 g- z- ?
sync ();
3 `! _ Z. k2 @" u6 p: z: \ L; m
save[i++] = *addr;
$ g, p0 |# r; H
sync ();
+ p# y. N4 u0 S. V
*addr = ~cnt;
' i+ w: P+ s* n7 J+ I! b0 W
}
' y* {) E1 c4 X
3 y2 B8 X" l% j) b- ]
addr = base;
0 S; K: C$ q. D. K
sync ();
( [4 D6 e5 X- d& n" e
save
= *addr;
( O6 z4 x& @8 g, L9 z" X8 F% b
sync ();
5 O- w9 D( U! q* V$ l2 E' L
*addr = 0;
r3 A' A- M0 j5 d, O
7 j! d, h( }, x5 C' X3 c
sync ();
. Z4 ^% F+ u F' w3 P7 a
if ((val = *addr) != 0) {
3 I' j; P; O2 d
/* Restore the original data before leaving the function.
+ k8 \" v, H# L* l2 \2 Y
*/
~8 q5 u: W3 l% t6 ?7 A& Y7 g% g
sync ();
! M+ A: }$ y4 T9 x$ b9 ?
*addr = save
;
" c, ]1 t" J3 f5 @) e) @- |% i& ?
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
% `3 l; m- S- |
addr = base + cnt;
: `) R- @% l9 G; J) p; ?2 }
sync ();
: I& Q0 g4 P+ n' T/ e; R( L
*addr = save[--i];
. s2 v4 P5 P/ X! n Y
}
& k4 K) i% q0 w/ T P0 S6 t8 q
return (0);
0 _1 S% N3 K! p2 V1 o. j: D
}
8 j4 Z/ w! v, ]1 [/ X( }! L
( x+ f/ `3 e8 G/ {
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
2 m' \: c, W H( b
addr = base + cnt; /* pointer arith! */
9 c3 s- X: `& H" ]
val = *addr;
- Z$ s1 e/ w( X( I
*addr = save[--i];
; O; o" z' Q4 y; v+ E
if (val != ~cnt) {
/ p* C/ b7 l+ S7 M9 t7 G& n
size = cnt * sizeof (long);
7 \( G& t, _& ~8 D5 E- E, S
/* Restore the original data before leaving the function.
; {, {! r2 c% f
*/
& j& G: X) ]/ ~2 V
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
. ?2 q- c. N8 x) X6 A& f; M& }
addr = base + cnt;
# x8 D u# j7 E$ @' p" J- X$ Z
*addr = save[--i];
1 F0 j6 j& V8 D/ T
}
1 V" z/ p( Y e
return (size);
' x9 g" v. Q& m0 z! z4 ?
}
- {* _" z/ t1 J/ P( e
}
; [5 g+ D) l) k2 U- ]$ A9 u& ?
2 F/ y) [& z' G9 n( }
return (maxsize);
% B7 b6 D. {) [; D6 w; q/ u6 @
}
- T3 H* ^2 O8 x. s/ D$ {7 W2 E4 B
int dram_init(void)
1 A- x4 ^/ }3 s& B
{
1 Z6 N/ b( P( ]+ }/ x& ~" T+ b
/* dram_init must store complete ramsize in gd->ram_size */
8 P7 B5 B7 O0 z
gd->ram_size = get_ram_size(
# |7 G+ l* D( u
(void *)CONFIG_SYS_SDRAM_BASE,
8 B) N2 H$ J( |( r, A4 C
CONFIG_MAX_RAM_BANK_SIZE);
z+ q) q7 Y3 s D4 J4 ~
return 0;
& |" @0 P# J" h% e5 f3 ?8 m
}
5 W' A( o8 ?$ h2 ~ ]& f
3 ^9 S% F- J0 Y6 D) x- {( Z
; y8 I$ u* |# C* B# I. y
+ E+ r0 }6 @; N6 J% e
& w2 a, |; i; |* i( |5 ]
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
4 t% z9 k/ H3 S, n; [
5 {3 ^( [$ G" {0 p8 @5 k
! r: |2 i2 _7 l6 u* g& K$ N- M; L' b
6 y$ e4 s8 |" y" ]8 x; Z
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4