嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
6 u: q, h& w' z1 S) d7 c7 g) }) f
核心板2:DDR2 256M Byte NAND FLASH 8G bit
3 A& E3 F0 b7 m0 u" R& m
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
7 M$ s( R# \1 |. M) Z( ]
4 E* ~/ T, v! P! w3 ^
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
' i( t" S! v, R Z4 ^0 r
- N& i \) W. C; ^. H* c; I
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
+ h# y! R0 m% Z! v& L
/*
; S$ [# M! P8 O. k' W" F& ^- T+ v2 K
* Check memory range for valid RAM. A simple memory test determines
" Y' e( f2 q8 F% q: D3 I
* the actually available RAM size between addresses `base' and
3 {- F! c$ E ?5 x" R3 X4 o% {2 P
* `base + maxsize'.
1 a- Y- c" Z6 ?( O' ? V
*/
0 X* F9 i6 M: N: R- m5 s
long get_ram_size(long *base, long maxsize)
7 H1 c7 y) D# P( S; f2 X. A
{
6 m) r5 A, L& F' |
volatile long *addr;
/ h& U# b- X* q9 y% \) u" v
long save[32];
# @- Z% E) [8 Y: h$ M1 |. U
long cnt;
/ m- P6 f" n! p2 J+ ]/ c
long val;
6 r; [, r! B4 G- n, K
long size;
- N L3 j# R8 [3 m
int i = 0;
( ?4 z0 {0 j: P0 c3 w Q
+ J( }) c+ v3 p
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
2 |4 U" | T S4 p1 e$ c
addr = base + cnt; /* pointer arith! */
2 d% k; E$ M1 v: _, V5 f4 _5 j) x
sync ();
4 b1 I# k; c* \/ v8 c9 F
save[i++] = *addr;
0 e! b5 `- S( i- ]. d+ }
sync ();
7 k/ ]2 x7 U- ^* r6 c
*addr = ~cnt;
( _( d9 T* Z. n4 y# |6 c1 d
}
. m9 K% b0 Z3 X6 W0 b2 T
6 X( p, _8 x8 a9 ]1 U6 M6 x9 L& b
addr = base;
2 |& ^: s8 R9 i! p9 J Y
sync ();
- i% l% n/ a" t# L* Q
save
= *addr;
4 r- l& ^2 V( }7 v" _9 _5 g
sync ();
- Q# [) F& P$ ]# U2 a; u4 t% W
*addr = 0;
0 L, b+ g8 k, V1 i3 I1 m; b
- Z, q' B) B4 j; D1 b0 P' d2 _3 R
sync ();
9 P. |0 n0 A8 H5 R0 p
if ((val = *addr) != 0) {
1 A% R; ~$ u' B, p
/* Restore the original data before leaving the function.
3 E" B6 w! H) L& U
*/
8 S( V1 ^2 C1 L( k
sync ();
) T n( `8 z8 ^/ R
*addr = save
;
5 {: ]( b3 P+ f2 x
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
; u, d% v4 k' \" n
addr = base + cnt;
& t: e0 z) l( B" V
sync ();
& C, I/ n- k, c3 }! |; g4 l
*addr = save[--i];
- A0 d( ^: b* n' ?4 L* p% l5 o
}
) X% H+ k2 T2 F! U- L) X: ]
return (0);
5 X3 u3 d/ Q0 O) C0 T: c
}
/ v, k' ~4 e$ S
6 I9 A$ J' K1 ?( I
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
: v3 F2 j4 Y& c. q7 ?# R
addr = base + cnt; /* pointer arith! */
, X3 s H( `8 e0 ? ^4 ]
val = *addr;
# [9 E6 Y+ |5 Z9 n$ t
*addr = save[--i];
$ K, N. G6 [0 k5 l& D0 ~" T9 N
if (val != ~cnt) {
3 Q: s/ |* M) n; F4 s5 H
size = cnt * sizeof (long);
$ s; T0 P8 S0 w7 U8 k0 N9 n, ~
/* Restore the original data before leaving the function.
% S: b+ g( q! |1 n+ l. r! I( J
*/
# |! Q4 i+ y. D
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
" C+ {' v0 d) k0 p
addr = base + cnt;
/ T2 q+ N1 o: G" y2 j1 V
*addr = save[--i];
" o, O _9 M7 L1 |
}
& c/ B; h$ k+ `% Y" i- Y" u5 D3 J
return (size);
, ~7 o0 }: l+ c1 c( v$ ?
}
7 f$ @3 s8 {' f1 |; o
}
1 _' d; t4 ^+ M5 s9 u2 D4 g& O
; a8 X2 [+ E& d# |" H. o
return (maxsize);
5 r2 {. W7 c- X
}
( j7 e, i( i6 x# o4 Q
int dram_init(void)
% U6 d" S+ s. o
{
- P2 a4 m( R6 z1 z% q
/* dram_init must store complete ramsize in gd->ram_size */
9 X4 }' a7 I1 b+ w* O
gd->ram_size = get_ram_size(
3 ^6 C. t: N F3 b6 j6 t3 t
(void *)CONFIG_SYS_SDRAM_BASE,
}4 v3 p2 R# X( @# ?
CONFIG_MAX_RAM_BANK_SIZE);
* C3 Z) y$ R- M
return 0;
: h; C3 |- ?# y' ?( U
}
* p# k8 x+ k$ B# ?" Y* h' Z1 {+ T! ^" ^
$ |5 n$ z' W- n3 {* T
9 v7 M; i' q+ }! ~6 G, {1 Q
/ Q6 T2 Q- }6 x% s4 q! i
) h( e- k3 K$ {' d; ^
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
4 s, R+ k# w( I1 @& `
! s% P: v. b" ?. [1 Q5 R8 O# `
' l6 G! {/ d+ J3 c( a
' R1 N' \ z9 }& R3 P- r6 y! c, P- {: c
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4