嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
+ l. y8 ^8 Q. ^! t4 `
核心板2:DDR2 256M Byte NAND FLASH 8G bit
: E- \& A2 A" E1 e3 D3 S
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
3 Z L% X/ Y9 o' n, v
* t/ w/ X- \9 C9 l
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
! u3 S" I% ^; P7 _ a1 q+ [5 i6 m
' c: Y7 L3 D: j5 O' r2 x. u
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
$ X E# a$ o9 i- Q, C' X
/*
4 G! Z; ?$ x5 ^5 ^4 C) }
* Check memory range for valid RAM. A simple memory test determines
" H( ]5 @1 z* s" ~/ X5 i/ P
* the actually available RAM size between addresses `base' and
) b( C+ f4 ~* l3 Y
* `base + maxsize'.
. r6 ~, O5 p) e" h" w5 n
*/
& w9 r) c, R' ?9 B; U. G- D
long get_ram_size(long *base, long maxsize)
8 ^2 ~ V" D& @: R$ C" _6 C
{
1 R) e6 ]" {; k* ]
volatile long *addr;
" q1 E* K4 U& V
long save[32];
: Z2 m* h& {0 a
long cnt;
, p0 e! a6 F8 n ? h0 k2 X
long val;
% Q# {/ v4 k7 |* J6 |/ I
long size;
" u. M) A& _7 g+ _8 j, q
int i = 0;
; z9 U3 I0 h% ^- O/ |" P* y& S( Y3 o
1 g+ v6 F m2 ~: h/ a
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
: U4 @+ `; ]9 U# w1 `
addr = base + cnt; /* pointer arith! */
# ~, b8 n7 d. q. P
sync ();
* D% ]1 q& u: q5 p
save[i++] = *addr;
* n& ?# U" B3 i% ~* v" I
sync ();
6 w2 K; I* T8 j7 J1 { I
*addr = ~cnt;
/ }) F7 I* W j
}
2 [9 X- [ D0 x; W2 b9 J
% w ~% E: q' ~" R$ E
addr = base;
7 j. y, I) J0 S- w7 |. }) B, N
sync ();
* X- q% \* p9 x8 {4 I2 t
save
= *addr;
9 T! E3 ~. j9 p
sync ();
0 K" [+ ?- i' Z$ n) A6 H: p
*addr = 0;
6 I) w' `/ ?' p' ~0 h1 \. `
1 X- l! {' Z/ ~" s) Y
sync ();
; C5 b Y$ t" j$ b; U: [1 _
if ((val = *addr) != 0) {
6 R) E% Z6 u. J5 o9 F- e' G
/* Restore the original data before leaving the function.
& P( X( I7 H8 H) V0 |( ^
*/
! @' H' V# L9 a' \4 Z5 C8 g" {
sync ();
" X9 O5 T1 s' z7 _$ e/ n! B& h" {
*addr = save
;
* b: {+ o- u y. S
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
! [+ [; U) I" D+ L
addr = base + cnt;
7 Z6 o$ j9 G3 v2 v5 X2 ^3 |
sync ();
7 L3 j/ N8 H- R" r1 d$ k9 T: S
*addr = save[--i];
8 E* J; S. I. \7 c, r- p
}
' w4 h8 ]& E, a& }. X
return (0);
, p1 F! Z& U& j, {
}
- K+ p0 V# h/ L" ^0 W; @
; w/ y* S' q. I3 X' f- s
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
9 h) i' I& t$ z9 V8 U# e! U# H
addr = base + cnt; /* pointer arith! */
0 J- G! G9 l! b/ P. Z
val = *addr;
; }( v W: z" |: v6 {3 B3 A8 W
*addr = save[--i];
) L. o) X7 P' Y& {
if (val != ~cnt) {
F+ J1 F+ T6 g8 q$ @( c9 D9 i& M
size = cnt * sizeof (long);
: |/ Y. Z* U$ S/ G* K# a' L" r
/* Restore the original data before leaving the function.
* I2 o4 _% o5 K1 v: |; K+ y
*/
: v7 H3 c7 F; P! A4 ]
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
. W5 m; S* Q; h- p: m# B7 E
addr = base + cnt;
( s. w! K# q8 `0 |' \
*addr = save[--i];
, C" {% F! G/ h# e% f- L
}
4 x4 B9 k7 r* x4 c& O: j2 \1 v
return (size);
! i6 ~( K/ s( A8 D! ]0 n
}
3 a% D) z; p/ C2 q- h
}
! a0 ]* z$ q _2 l% Z3 u
$ D+ a, T2 \6 J" ~+ f' J0 I. x
return (maxsize);
3 q5 P/ z- `" I, v* J
}
$ h. E! X" Z# \0 M- Z
int dram_init(void)
. \9 [! K% s; ]1 k# N
{
, a! N: m) g: x
/* dram_init must store complete ramsize in gd->ram_size */
, S3 U$ [2 {6 D, ^) `
gd->ram_size = get_ram_size(
6 L, \, x1 w, H+ T& ?
(void *)CONFIG_SYS_SDRAM_BASE,
3 ?. F- B5 F2 ~' \1 z4 ~$ p1 {
CONFIG_MAX_RAM_BANK_SIZE);
6 a% f, N8 z; r; J/ M
return 0;
: R" X8 u) p# H+ T y; [
}
/ m( a7 D1 j& E2 K
: U$ d1 y. ~+ f& D! K& T
' ]9 Q6 Y5 x9 f% c( n
0 A4 v8 \! f2 c5 o
) p( r0 L. O. j9 X0 j y4 [
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
' }* ^: a: @. v: Q; N1 i# ~
6 R, f' e6 v: f3 f' K! P5 f. W
* q9 Z6 F5 X" e+ K+ u: @
- a+ H9 i7 @4 `% d
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4