嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
- ]0 j( v2 l6 j$ d8 b6 `
核心板2:DDR2 256M Byte NAND FLASH 8G bit
, C/ P9 V0 L h# u/ D
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
" Q; H7 h9 q+ f. F7 {& F! i
' |8 m. A% b7 [! I' e; `* p
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
! V* u$ j& |+ G
8 k6 d( _9 i6 x) s- @
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
- `. p, W& O6 H; k: q
/*
- J" u2 a7 [% P! M2 Z% O
* Check memory range for valid RAM. A simple memory test determines
2 A3 l* O+ ^- s1 X$ f% Y
* the actually available RAM size between addresses `base' and
0 k: V- `9 M. h+ q& D7 T
* `base + maxsize'.
9 o& |! R( M: J* V) ~: B2 \- E& ~
*/
& h% X* d- v% D! X
long get_ram_size(long *base, long maxsize)
% [0 x2 A# \+ R+ K) }
{
o" U) y' h( g0 d4 |
volatile long *addr;
6 w, e1 N' D% C& U. t
long save[32];
& G9 x3 }% a, c3 w; x% @9 Y7 Q
long cnt;
& [: L/ O3 o+ `3 n3 o" c
long val;
, ^* d% I" w w* E8 X8 `
long size;
: g7 `* A: r J2 V5 V% X
int i = 0;
, g6 W: n9 A; l8 {7 F K) ~( D
& y3 R! u8 W+ N5 P2 N8 [/ w8 p
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
* Y9 P& p- t4 [+ Z/ }, G+ Y W- r
addr = base + cnt; /* pointer arith! */
4 c. O2 `! L7 h
sync ();
: O& E9 E8 P" e
save[i++] = *addr;
& \0 R, @" W. R3 z8 r
sync ();
$ C8 ]6 F/ n/ o6 `
*addr = ~cnt;
# ?! C. W, P* Y' c% a, D
}
- a! v9 z4 r1 b# O' f9 H
& F6 C* {7 o# h/ Z) z( c! C* N
addr = base;
4 y# }! R5 S+ N
sync ();
5 f4 P$ v6 s: H0 ]" s
save
= *addr;
* H0 [, v f% p
sync ();
$ S& s; x0 T) V' g$ z: D. o, n
*addr = 0;
: p& A( }+ a9 n/ s2 H$ o, h; {
# h! S4 ?) `0 `$ {& d4 ]8 w
sync ();
3 _. P) ]# |+ \5 C3 E# W2 a6 @
if ((val = *addr) != 0) {
! v" E5 [! b: ]( M& q# G
/* Restore the original data before leaving the function.
& o4 I$ Y/ H6 _
*/
! u- G x" K7 U, ~8 e1 k
sync ();
0 {/ U$ U' u# }: q
*addr = save
;
3 Z$ B I) W2 {1 M
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
8 }3 }, y$ f$ A. |1 F8 e
addr = base + cnt;
$ c6 v5 ?' ^& r. h
sync ();
0 I/ s0 b( }. h8 I$ q
*addr = save[--i];
; i) r( X, ~6 @
}
) ?/ x% {) g8 F* ^" J: H3 d
return (0);
$ V1 E5 G( e% w1 M; f
}
' S! W7 H3 T. C) e* r7 U k+ v
6 f8 |/ A# P$ X5 {
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
& f* T3 k& V! O. x$ U: f
addr = base + cnt; /* pointer arith! */
2 Q* b2 c! v7 w+ H" j/ W
val = *addr;
) v7 ], S& N1 o2 [: Z
*addr = save[--i];
, b+ V e4 K$ U' B/ P
if (val != ~cnt) {
. z7 X0 p$ O, w: _ [* v
size = cnt * sizeof (long);
) h6 a1 y1 C4 W3 m
/* Restore the original data before leaving the function.
3 h6 m/ H% j+ U! i
*/
! y+ a* F/ X' J* f1 v
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
! a9 g- P% B7 _& b, B! \" L
addr = base + cnt;
. W; G$ M2 c, `
*addr = save[--i];
3 u; m. }% h; X
}
* P3 G5 E8 U6 P, I- _) ^+ L$ R, p
return (size);
! K% |* l- X0 o: W
}
u& r6 Y5 I* H, W) L; M
}
% N3 E( D( y' l0 M6 E' e# W
$ a% d- j1 E6 j
return (maxsize);
]6 K3 _. U" h5 {
}
2 L* d0 T( E2 B+ r& z s8 ]4 T
int dram_init(void)
6 e) ^$ {: t$ Y4 U
{
" d1 H) ~8 a) U% R
/* dram_init must store complete ramsize in gd->ram_size */
+ O& X( d& z ], l4 p+ H
gd->ram_size = get_ram_size(
, Q" z% L: p- ~
(void *)CONFIG_SYS_SDRAM_BASE,
" n$ z$ j4 r: ]! K
CONFIG_MAX_RAM_BANK_SIZE);
- J, ?) \' {& ~% t g
return 0;
# E3 l9 M/ ?/ }
}
) X) f) @6 ~$ j% r+ X
( ]; v+ k4 }7 L: g" w* l$ `: G, [1 W
% O8 y+ a- b- M% W" q, E
R& c% y- P5 B& r* W, I
: a1 x1 P5 y: S0 p
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
# E+ Q% D" W- i. C: D" F
/ ~$ M& {, y) B& ~; |
$ h$ J* b0 B. m4 V+ t
* z9 h+ b* Z) K
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4