嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
, r" [/ Z0 x5 q
核心板2:DDR2 256M Byte NAND FLASH 8G bit
: l. o& ]/ E' _$ d U
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
7 f, @4 }0 R* b2 X% V$ k
M( x' M3 @' B* | P
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
3 l" F/ C( D9 @+ m- `" T& |+ j, v
6 C$ S. L4 A6 x5 ^
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
2 s9 y4 W+ J5 h
/*
3 \# v3 {5 L3 ?. \# k E5 Y& m
* Check memory range for valid RAM. A simple memory test determines
, T; b; `6 u1 c8 F
* the actually available RAM size between addresses `base' and
- ~! a, O, r$ O4 d" l+ _4 V
* `base + maxsize'.
" P# |. r& q( |" [* R) _8 M
*/
3 {; Y) y1 i- d: T8 o: u. N
long get_ram_size(long *base, long maxsize)
2 x' _9 o& e2 j9 u, e: R8 A( B5 N
{
5 e# T6 E$ ]9 ]3 i* s I& k. ?
volatile long *addr;
$ o2 _' [( ]- N
long save[32];
- f+ B0 @/ q% ~* h6 c
long cnt;
8 F1 Y( l1 f/ k/ P
long val;
) w: H. N( ?) J( o5 `. D( P& I
long size;
" q2 b6 W# f9 r7 Z- e# V
int i = 0;
) I6 {. J ^1 v% W( l! A* R
, b8 ~. D! ?# }/ C
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
y3 t/ g2 T% T% x& e2 U& W
addr = base + cnt; /* pointer arith! */
0 f0 z" |/ Z! j! ^
sync ();
]3 c, c/ g2 j2 h/ M& E: b
save[i++] = *addr;
3 J1 [' t% D) v; O1 j& a5 M/ |
sync ();
. L4 D6 p& o, J; X6 s8 N
*addr = ~cnt;
* d0 T; f; m2 w* B9 e9 l
}
8 m9 @/ n3 l1 W7 h3 r
7 G" W6 Y0 H: ?- d( G9 L& l
addr = base;
8 y9 p' Y0 {2 Z
sync ();
% c- ^6 h. u$ m8 D0 k1 M" L" b0 |! z8 i
save
= *addr;
) n" U7 U3 D0 X q9 ]5 t
sync ();
' D4 R5 A, Y" O
*addr = 0;
% B8 w. d9 G+ Y, b' {
3 }/ I2 a. Y6 C9 b
sync ();
$ x& C! b4 h" |: p
if ((val = *addr) != 0) {
# K( y3 L1 A- J, A5 N( e! s
/* Restore the original data before leaving the function.
( _/ I! i; t, d- i0 T; z4 Y* N
*/
; R$ J3 }. K: V. V+ G" [+ C [5 D9 ~
sync ();
) g8 {, @% ^2 d
*addr = save
;
( `7 ~' s7 Z: B2 ?' K
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
; i0 k$ f, J T3 e) h
addr = base + cnt;
9 f( e6 E0 T/ w0 o( o7 p e
sync ();
* N9 l5 K f- ^* W( t5 @
*addr = save[--i];
7 t2 A& T1 V7 I D8 h5 N [
}
& m) \2 o/ O- x z6 }$ ]* J( o8 ]2 m
return (0);
3 q! W3 `8 Q, c2 G+ p0 N! W7 p
}
( `3 \3 O1 P3 S: v/ U3 b
$ H( X7 d4 F7 F `9 w$ {+ P, E
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
- r; x( T) b, ^4 ^4 [
addr = base + cnt; /* pointer arith! */
F# T' Q( m( U# N( y, f) F$ ]& ?8 h
val = *addr;
4 A: T B5 d! A( p% }
*addr = save[--i];
: d a; U" v1 Q* x: _1 _+ o
if (val != ~cnt) {
( D8 C" x3 X% m# y
size = cnt * sizeof (long);
8 J# S) S- Q! I c1 p& |% X' M
/* Restore the original data before leaving the function.
: |0 W+ Y, n* U2 U) D
*/
" T3 o" m: x9 ~
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
( T' B. o: ^" P$ d. D3 E; |' c0 p
addr = base + cnt;
; l( h' _# c9 a& r7 M
*addr = save[--i];
7 q5 G E% B+ O6 w( r
}
" d2 M" N# Q3 m0 S) c
return (size);
& \$ _" F6 K2 s1 n9 J
}
& ?2 ]+ b6 J. c7 Z h5 n
}
" u$ T, I4 E3 z
, L! ~7 R R. J
return (maxsize);
% o9 D8 m3 x/ \* o1 A
}
& i/ C% b7 b& j0 R! U# g& J1 w
int dram_init(void)
+ U/ c2 h4 c' J- E& ]4 V
{
' v' ?# m. X2 P/ y
/* dram_init must store complete ramsize in gd->ram_size */
, H& x, s" E" G# D0 Y0 W$ t5 u
gd->ram_size = get_ram_size(
3 S/ a# L9 ?4 ?
(void *)CONFIG_SYS_SDRAM_BASE,
( G1 p# a. r9 |- ^0 L2 R2 Z
CONFIG_MAX_RAM_BANK_SIZE);
- |+ D+ A+ Y4 r# `% c( f
return 0;
# _2 R" M4 j: z2 D/ N! q8 |" U3 f
}
8 |) T, T X3 W P( M
1 ^! H: K* T% I# Q+ ^7 Q$ f
6 f& J4 b. v$ b. x& ]
. g$ B4 |8 h l' R
+ f$ U9 l+ b. |! r7 l7 ?5 u3 B4 W* `! l
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
( L8 d* E- A# j& o! ~+ \) P' ?( {
# ?# Q1 `( p9 d; U
( L: C. q& o/ K C- h
: W" h5 n+ ]/ q* \3 w- j. P
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4