嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
9 K6 S, F" V) R% }5 {* H a; z
核心板2:DDR2 256M Byte NAND FLASH 8G bit
5 j# ?1 R* U. e1 N( Y$ Q% ~
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
. H7 y8 C) Q- g- O- J0 q, M
9 c6 z9 z+ o- A1 e
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
2 N" ^" P& R% C
# v4 [ w f' s! E! |% g
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
( f, P; D0 w) z# y& r- k9 M* y
/*
. s9 i% h# d: q& c! M4 P2 T+ X
* Check memory range for valid RAM. A simple memory test determines
0 @. W0 b6 v6 Y/ C' T# b) Y c+ X) M
* the actually available RAM size between addresses `base' and
( |+ n+ `, H. y! ?9 O; @2 M
* `base + maxsize'.
9 @4 N6 e8 C7 Y
*/
" j5 G% K7 G, \
long get_ram_size(long *base, long maxsize)
% y9 @# q) k- }& D$ \4 c
{
) ~0 N& f) D9 c3 g
volatile long *addr;
' \0 Y2 C6 I9 k" _' v6 F3 R
long save[32];
* o) J; F+ C9 T. o
long cnt;
' q; K, k& I9 G; g
long val;
+ Z. B/ ^1 r7 T& K1 X# p7 j
long size;
$ F- W. D j$ Y) x0 ]# R
int i = 0;
- m5 Q; z9 B% u& I
; f+ Z; u i9 t3 q: R
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
1 l' | K( f$ F, \; o- C; v
addr = base + cnt; /* pointer arith! */
2 a8 v# b. y, q5 h* [
sync ();
2 M9 H- p9 P8 h1 B' @4 |* l
save[i++] = *addr;
' t. d: ], i& F
sync ();
$ ^4 g. ]& d% ?; ?5 F
*addr = ~cnt;
* W, r7 C8 g# g q7 m: B# j9 G
}
. M, a8 u% c6 g7 A& O( v7 E
$ o1 Y r$ S- ^( d4 O/ A: N" w
addr = base;
5 C' T8 E9 e: [' Z; C% ?9 E5 S- D
sync ();
8 o) [3 e' y9 N7 G* P
save
= *addr;
! a5 k' _9 Q3 M& ]
sync ();
$ K+ H, j& ^8 `& _7 y+ ]7 ~! m2 @
*addr = 0;
0 _+ u! u* |% g9 M7 T
* f) H/ T1 u! m
sync ();
- N* C- z. x; x, g$ c+ o) C
if ((val = *addr) != 0) {
1 Y1 G1 g, s9 P% Z$ Z
/* Restore the original data before leaving the function.
# T7 O! f0 E) E' E& x
*/
5 M; L; `" S1 K3 R" t" [0 f
sync ();
( T1 \% z2 x( ^4 u
*addr = save
;
9 d. K& E% N8 V' y, C
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
9 @, Y9 A" \" F
addr = base + cnt;
% k2 H. K w# w
sync ();
) r# g) S5 t. q O2 s* l
*addr = save[--i];
' K% O. m8 u; q: W8 r, ?; Q
}
, x7 J8 t5 l6 o# c4 y+ b) D
return (0);
* E* T- g2 ^/ s C; b5 c( W1 l; [" j2 ?
}
+ [' l( k$ [. f0 B/ i; O
7 |& X6 U' A% w$ i( F: E- l
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
7 o- S6 V# x& l- f7 v: t! F
addr = base + cnt; /* pointer arith! */
; Z1 V! n1 @" Y; s$ M/ z; ~$ P
val = *addr;
6 Y. q$ r9 Q2 }
*addr = save[--i];
' q. ]. S2 D8 d: o+ d1 ^
if (val != ~cnt) {
! T' a' S6 V( R( G- F
size = cnt * sizeof (long);
4 C! \& v+ d3 V8 r, H- ^. O4 u
/* Restore the original data before leaving the function.
3 d. ^/ G: Z7 A2 q4 @
*/
& P6 X' o; i) [) ]7 t( i
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
' N. O t, Z4 m2 `
addr = base + cnt;
+ {- {1 j6 ^$ H" j* u
*addr = save[--i];
+ T" |: v+ {6 F9 ^+ m, l' r6 D8 Q1 V6 M
}
3 v/ r7 _/ Q) ^& @, \, I3 ]& E# [$ a
return (size);
- t' R; e" ^$ `
}
# X! B, Z; z" L+ R1 B% Z
}
/ r7 _9 i: Q( `1 `; m" e
7 l8 @! [9 H) o" o0 f
return (maxsize);
" m% f% K \7 r! G9 L% k* I0 L
}
' ~& O3 x% u6 x, u+ B$ ]
int dram_init(void)
+ I- @! S. u/ k7 g F/ v
{
$ u& g G. H5 G
/* dram_init must store complete ramsize in gd->ram_size */
) w, A6 P9 g2 n& g: g. W2 f; E
gd->ram_size = get_ram_size(
6 }" T- q- |* T J9 P
(void *)CONFIG_SYS_SDRAM_BASE,
( c( s4 T/ o S$ t" N1 i
CONFIG_MAX_RAM_BANK_SIZE);
# m/ O8 {8 e9 e% X0 J
return 0;
4 J3 L& K! I* w# ^$ n, }& d& ~+ ]
}
# X/ W8 t1 ~9 {- f L0 ~7 e
2 ]% b! S5 o" N7 v
, Z3 s0 w, b+ F9 e
/ N, k2 q! {: s4 l# z
" u0 K& m; I. y5 }: n+ |* c) q
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
1 @2 f& i. \6 V5 ~: C3 Z l
+ z* A) M: I) W4 p! V
* L8 B9 n: e( K5 V
. ]" h/ D- i7 L, V
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4