嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
1 R) H) F. |1 b* H
核心板2:DDR2 256M Byte NAND FLASH 8G bit
0 k& `- p+ Y/ f0 I( y
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
2 T7 {8 ^) r* z$ r# `
( F6 G7 B( l# U; m
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
2 V0 w, e# }& H
' b, g* `0 ?. \+ j- c& r# M
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
9 u( M% Q5 t. m2 V9 ~7 M% b
/*
5 z3 y5 ~- `0 g9 X
* Check memory range for valid RAM. A simple memory test determines
- ?# W- ]% {# u6 c+ K+ C% e0 c
* the actually available RAM size between addresses `base' and
5 l/ l2 k( P0 s. }( k
* `base + maxsize'.
4 g3 T% a5 O: x8 r% _0 H/ s3 Z
*/
$ _9 C) _$ ~! i! r
long get_ram_size(long *base, long maxsize)
# m7 N3 C" k# G7 c, T$ l) w
{
# ~( X2 p; x# E" b8 {+ n8 n' _
volatile long *addr;
" t$ A( V% ], o1 h3 e7 ]
long save[32];
# y1 ]" H3 I: Y9 x
long cnt;
, i" b& k: S7 z* T7 J
long val;
0 L" K. G# J/ Y
long size;
+ }% r5 w G: q
int i = 0;
2 o6 y7 r Y9 T; L' ~4 [/ r$ I3 q1 h
4 W$ T5 T) N G! \8 n/ N% M* W
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
! \' N, B3 I N4 O. ?( Z
addr = base + cnt; /* pointer arith! */
5 O5 M) ~* M* r% \1 b& E K0 A
sync ();
- a( `# h9 b0 ]2 |- o- S1 Y5 b: R9 e; R
save[i++] = *addr;
4 U- m. k5 Q8 v Q4 X% e- k
sync ();
8 O) }2 R. A: r9 X: X
*addr = ~cnt;
8 k6 l+ G& Y7 q3 s$ @3 ^
}
# q/ u2 p& A# O. ]0 r2 m2 [* l# M
* s, Z1 S F3 W- K
addr = base;
; W l$ t. y* i6 _6 I
sync ();
8 T: R* Y# o: ?# Q8 O( X1 x* ]
save
= *addr;
2 h+ t9 U: V( ]3 ^. s/ Z
sync ();
! g2 s" U* B- m
*addr = 0;
% B) I! s! T: o) C+ E2 `5 f
2 D! \5 {) S7 p
sync ();
3 P2 g7 }* k' J; h- Y3 K3 R
if ((val = *addr) != 0) {
: s# `5 o6 x3 s. J
/* Restore the original data before leaving the function.
7 |' ^) J; j' S& r! J9 |
*/
' _1 y: }. R$ f* J& x) r. u# P
sync ();
# l, [; @+ c- j( u7 N( r' l/ G
*addr = save
;
# \0 h6 A; |9 b) y$ j
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
4 B5 ]$ Q1 f( X ]
addr = base + cnt;
* d4 Z3 G5 M: E7 z' C1 }3 ^
sync ();
1 }5 J7 x1 T2 e- m* J6 }" X9 f0 a
*addr = save[--i];
$ H8 w0 [# ^* i
}
$ p) R P9 S7 \! t8 I
return (0);
) \& Y0 }9 [; C' @3 |5 r8 H
}
$ g0 _5 S$ {* Z8 B8 l: ?, A- h
& y/ D$ I$ d5 C
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
0 d E6 _# v$ y0 m6 m ?
addr = base + cnt; /* pointer arith! */
- `2 z/ M2 u# @/ d/ O
val = *addr;
1 z @( Y. ]* x/ C3 u$ T
*addr = save[--i];
1 n! N6 K/ g$ `5 s8 @$ r' t$ _
if (val != ~cnt) {
9 K0 G8 m. n5 b" _* W
size = cnt * sizeof (long);
6 n# k$ k% o' {+ c/ z& y h
/* Restore the original data before leaving the function.
# [' ~; J8 C/ p
*/
* l6 ?3 J; F/ [: I6 ^9 m7 Z% a
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
- |1 l, k0 j- I# O% c* V( y% A
addr = base + cnt;
6 S$ D3 O+ o* M$ a, I) A9 ~
*addr = save[--i];
b# I/ V: k7 ^! r* [
}
+ p/ g* `) c0 s' F0 r6 h
return (size);
6 e( S8 D% j- B8 ]! L# w( j4 t
}
7 m5 Y. X" S2 X
}
# j6 v; _; U3 }+ I, [- T
3 c) b& c) C( d+ ~! g! I0 f
return (maxsize);
/ Q& Z3 u( O& r" U6 O
}
7 I* e3 E# p: C) L7 T
int dram_init(void)
3 n$ N+ K" t& m+ Y
{
' t; G1 ], P) q, z$ m$ [, X0 O" s( j0 [
/* dram_init must store complete ramsize in gd->ram_size */
$ }, B1 P9 P: S0 @" P( A
gd->ram_size = get_ram_size(
) o6 \: ^ K3 V7 F4 }- G7 W9 r
(void *)CONFIG_SYS_SDRAM_BASE,
! h! j# X( y6 [8 t
CONFIG_MAX_RAM_BANK_SIZE);
1 K" V o/ R- r$ W, t
return 0;
' j# \" J# a' u- `5 T
}
, E& b( y# S \$ j/ Y% F% ^2 ]
5 C( J; Z& ^: ?
0 R; D* `( v6 r4 ]
7 z1 m2 V9 h) e7 K; c( g
6 C% A. J6 r, f/ |3 S- l
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
: h: _7 ~+ e5 s9 D0 b7 U
9 }& u E b0 q6 Q3 e
2 c J3 v+ f- @7 t" y
. y/ U5 L1 h* H# h1 ^
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4