嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
. Q+ k) e5 Q8 Y, N% Y5 Q% d( b, x: \
核心板2:DDR2 256M Byte NAND FLASH 8G bit
) K1 G1 D0 J4 q$ a
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
( G' h& @: J* P% T" l
) ~! p0 e7 v- S# w! ~0 k
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
9 m" K+ l+ {6 V" r, N
$ B! M4 I: @8 A$ g
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
) u* a% n9 F& G8 \- L" c `) Q- Q
/*
7 O3 H9 ^- E! }; ?% g9 l
* Check memory range for valid RAM. A simple memory test determines
5 b! n5 ~6 ]2 }2 ]) K
* the actually available RAM size between addresses `base' and
* w# e0 c. P% q3 {1 s% A
* `base + maxsize'.
' x5 y6 {$ z5 G" l) y/ [- G4 M$ t. O
*/
- L Q. s3 S' Y" k
long get_ram_size(long *base, long maxsize)
& ?: C0 Q# f, ]
{
7 ^+ x. `+ A$ Y' \# v
volatile long *addr;
! }7 a/ M& Y B" J
long save[32];
" M' G9 N4 Z6 g
long cnt;
9 }3 j" P( d8 h9 X5 R& _
long val;
- a' g, Q. C" _
long size;
* Y n1 O# d. I& a8 ?
int i = 0;
+ g+ I/ o- z7 C% o4 d0 D
; }* }/ \& |- j9 f8 r2 g: H
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
7 w" w; Z3 D- U. m T$ O: ~
addr = base + cnt; /* pointer arith! */
# B# n4 z! b0 r- c- m
sync ();
9 R8 B) n, u6 ]
save[i++] = *addr;
& Y# {5 ^+ F% I" [
sync ();
8 R7 F$ P+ p, C: c
*addr = ~cnt;
" `6 w& l1 o. F& D9 b7 ^
}
; }2 q2 f3 o% |; Y. g0 ]4 u
E" ^% U' e! _/ q* O
addr = base;
- p m2 V+ ^, S2 C, b8 W, Y+ r5 i
sync ();
; f# V- ]& `8 n2 I, Y$ k
save
= *addr;
' P4 J4 S( h- L1 ]0 j- Z! s
sync ();
; U6 K1 F2 X4 x! d
*addr = 0;
$ B# B# D% ^8 ~
9 }% ?- H5 X# Z- E8 Y# y
sync ();
]0 {4 U) f$ G" i1 x
if ((val = *addr) != 0) {
! ^/ d- S: l$ `2 G i. }
/* Restore the original data before leaving the function.
9 ~$ r& x) t7 Z9 K7 I( K* G
*/
0 d1 N7 U7 a: \; r5 D" R
sync ();
8 v, v+ v8 `+ [+ ~) R
*addr = save
;
; n: ]7 i; t: Y1 @/ b
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
/ P$ @5 i3 V3 b) G: u% h
addr = base + cnt;
6 ]/ _! L. I0 i* x
sync ();
$ z) D6 J8 R4 E/ G, @1 W4 @
*addr = save[--i];
, \9 h U/ E; B
}
6 w+ y, S7 o# s. J
return (0);
: E6 e4 g) a/ z6 p* x% l& u1 S
}
) b: N- F2 y1 ^; F( O1 I7 P) R
9 Y3 C3 E2 |5 q- q+ x
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
( G7 e! F$ u& N, V- s3 u
addr = base + cnt; /* pointer arith! */
) T+ I% l; t( G0 \+ J; t: P; D7 @
val = *addr;
! U" ?# A+ E: N; P6 J4 L f
*addr = save[--i];
. M6 [* G7 w1 A d2 O. q% L; m% k
if (val != ~cnt) {
) }9 Y3 h$ ^% b$ p9 i2 C
size = cnt * sizeof (long);
/ v+ N; A4 j5 P) ?3 I4 \* m7 H8 `
/* Restore the original data before leaving the function.
5 i- V. _% Q6 t2 z9 r) }
*/
4 J% N. K+ K2 H: |2 j: ~& e
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
H& \7 w2 O3 a5 G
addr = base + cnt;
1 k1 P1 R6 \/ a4 Q1 ^
*addr = save[--i];
. U6 r. d& ]' S1 Y7 u% m; ^
}
) K& ?8 r7 H3 y9 x# g! S
return (size);
. @- Z) [, @* {7 ?" J* x2 M
}
, H7 y5 A9 t. D. X
}
4 W# _3 x% v a1 A P a
: @$ q8 Q/ d* O* |) m0 \
return (maxsize);
3 H$ x7 q/ g) s/ ]& x
}
0 |7 v. j; }! J6 |. v, s6 k' L
int dram_init(void)
' Z5 b6 Y, m5 D* ~; s
{
% _: O+ Z+ b9 P
/* dram_init must store complete ramsize in gd->ram_size */
( R" @1 c' J/ U/ m: x+ l6 F
gd->ram_size = get_ram_size(
$ p% {/ G" C) K6 N
(void *)CONFIG_SYS_SDRAM_BASE,
) [* u- ^7 C5 p0 ^4 f
CONFIG_MAX_RAM_BANK_SIZE);
: l l# q& O( k' b
return 0;
9 x2 ^. }0 R( F' W ~
}
9 y1 N7 d) _% v
! f9 t0 m9 I4 h i' t8 @1 w* d* f
+ ^ U* e j& [# C( M3 b5 X
2 @4 q4 x& L- v8 d2 J: g1 _
i, ~) Q+ _6 H; M. Z7 n9 b
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
. |0 m X! X `: E( ? l
! ~! P3 `$ W4 h) p8 V) F
7 a7 J8 g8 J7 V
* ?! E* H! A. S8 Y! P
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4