嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
* L4 P f4 Z: b
核心板2:DDR2 256M Byte NAND FLASH 8G bit
5 L% U, ~* }7 V) Y6 q
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
) o1 Y1 y( E2 V# d
; \0 e* _1 U6 D- M
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
/ y6 b- D( t5 h
/ u9 T' G2 W/ \: x0 |
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
& F& q) ~; o% W9 `( S3 z
/*
. s9 L/ ?1 y' y) P' f
* Check memory range for valid RAM. A simple memory test determines
6 ~7 p" D p$ W, P
* the actually available RAM size between addresses `base' and
Q$ A' U( l2 ]' c! ?
* `base + maxsize'.
- V U5 h% t% v( r8 L- D2 K; C& m
*/
& O) ]# p. V( @$ Z7 T2 Z7 o
long get_ram_size(long *base, long maxsize)
* H/ n2 X: y& D6 u+ \
{
4 b. P' m# Z' `2 S1 c3 _
volatile long *addr;
) _/ @! f$ b3 u7 m( O: A- i
long save[32];
$ g# ?! w0 x2 @, Z
long cnt;
+ b$ x) D4 e' p* l; Q8 T+ L7 B/ k4 ]
long val;
' B' I4 N: U5 f0 ^% B
long size;
, }; a' t5 E' o/ b2 Z8 `3 X
int i = 0;
3 n9 w! [/ O/ Y3 b- a
. l& N! m8 |% E, ]1 _! S
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
0 W5 A3 C% T" q" X$ Y$ M5 Q
addr = base + cnt; /* pointer arith! */
" y2 |1 o9 t# Z" t+ ]1 }, \) C+ P# B
sync ();
# E7 ]$ ^8 W* J- Q7 z2 H& T& r
save[i++] = *addr;
8 I& K" ^$ t; [ l3 v1 W* {3 F
sync ();
: M& ^( V0 Z: U/ E5 |. N$ ~
*addr = ~cnt;
$ L. q& P$ w- [
}
+ @' z9 r# B- a7 P
; {2 k% k3 Z% w4 o1 G3 a# h
addr = base;
* e! A2 e' c$ X' V3 M3 U" f" C
sync ();
2 @8 u) x# A# a5 ]: @6 N4 Q& X+ r: X3 \
save
= *addr;
0 k; @8 s/ m O; F
sync ();
4 ~# ]" p9 M$ W( s% s" h. d
*addr = 0;
2 Q+ P$ W: r+ u* @" @( f3 ^
5 M0 f5 r) e5 H
sync ();
1 l) ~8 D& c2 O$ t9 b
if ((val = *addr) != 0) {
9 `: k$ Q z, L& Y# A& e C( A" D
/* Restore the original data before leaving the function.
$ N- F( c: f' Y4 H7 U6 c
*/
5 w2 o4 t, E" ]3 q5 L6 ~1 w
sync ();
) k$ E b: m- K. T/ _2 x9 _
*addr = save
;
% n/ {: @/ m4 N5 x
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
! Y6 b: b/ J/ g# r% d3 c, P' o0 |
addr = base + cnt;
* q0 Y+ f$ n N6 e+ _
sync ();
7 P2 u) E" \) A1 _. ]' n( o' s! o f0 j
*addr = save[--i];
1 F$ C# P. [9 `8 m/ @5 T' B
}
# t7 N& A8 i; p# b8 C2 b9 h j
return (0);
" F+ k% J/ ?/ G9 Q( ^7 u. E
}
' H' f) W8 L& x2 o: C
; U, x4 p' ], @- C; B0 I. y( |
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
7 w" ?/ }( n% p
addr = base + cnt; /* pointer arith! */
2 R9 Z2 G9 s- y
val = *addr;
# C3 L/ C9 G' u$ k' n/ u8 \
*addr = save[--i];
+ ]; q3 z2 C6 d1 E* |
if (val != ~cnt) {
1 Q" O5 w8 h0 `& R2 M
size = cnt * sizeof (long);
* T3 J1 |: b7 M: W Z
/* Restore the original data before leaving the function.
+ n/ T' D- h4 H: N, r
*/
! `* Q! Z8 s+ J. W3 \# k' |/ R
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
. l; L- ~( h8 ]- \6 V& r
addr = base + cnt;
2 g' s7 d r7 p. V, N8 F) a
*addr = save[--i];
. b7 g$ z* O$ c
}
6 [+ `& q- D7 N' A4 F, |
return (size);
5 f' y3 ?# s" r1 q1 K. i0 I
}
. M+ B+ {5 W; X( e6 E* E
}
9 j( m% k' O: T8 D0 e
" t) o1 ]3 U6 ^! k
return (maxsize);
E" }, K# z |# C7 _
}
) h1 i1 B! N6 f
int dram_init(void)
: `9 K+ l5 U. z( C# N: d7 ~; g0 ]
{
6 _& W( [6 P ~; |! F3 _
/* dram_init must store complete ramsize in gd->ram_size */
_( d2 }# {$ z; g& w
gd->ram_size = get_ram_size(
, h+ ?8 T6 ^2 o' i
(void *)CONFIG_SYS_SDRAM_BASE,
. |- |8 Y# R3 B
CONFIG_MAX_RAM_BANK_SIZE);
* @6 b4 C$ p( v, D/ u4 t; K
return 0;
+ ]" v1 k! y6 c( ?6 t
}
X5 p) v- H2 Q
' }8 K1 y; u8 _! L
: Z, w* ~9 ~5 o8 M
, F7 p" V: v% L1 [* p( J+ c, P
7 R' s8 J' Z5 K( k, t# z
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
% q- u6 K0 a2 z$ y
0 m" J5 \2 B8 a+ h; U6 I3 a% N
2 x- o( ~4 I) K7 K3 b% D
! k. g% O9 W9 t% Y6 T' S
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4