嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
5 J R) s/ s6 @. n
核心板2:DDR2 256M Byte NAND FLASH 8G bit
$ O/ H. d1 _% I
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
4 w8 }4 \$ R( u2 e
. K, q( Z% W3 Y. |
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
9 A; t4 E5 |9 G' t
) E: c9 q: }( h* {3 G
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
$ T3 i4 J& k6 R
/*
7 y1 V4 }0 S/ n# ]
* Check memory range for valid RAM. A simple memory test determines
" a* v- k6 X- [+ Z; c+ S; q
* the actually available RAM size between addresses `base' and
7 C+ P9 [& @' L$ S* G2 m
* `base + maxsize'.
) M0 z- ]. G& I+ ?) j9 U. _: ]8 @
*/
8 R6 ?% n* b/ o4 }" S
long get_ram_size(long *base, long maxsize)
! {& Y( M9 A c
{
4 A1 g4 S% B* |
volatile long *addr;
/ W6 c* {- q! o/ Z( b; g
long save[32];
! V" Y% U. T% l! c! A+ |! V7 C
long cnt;
7 L& V$ ], w3 [! h- z) |/ y
long val;
, {: u# s; D8 z1 I0 c
long size;
3 t; t4 Y' ?, M$ Z) Q
int i = 0;
* \5 ^% V" K& ~2 @+ ~
8 Z7 h* ~' V- c( M% u' \3 ?
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
6 ~7 M+ a1 p% a) x
addr = base + cnt; /* pointer arith! */
" y1 U- I! @! x) Z8 J d
sync ();
, R5 |- j( A! a- V- Z5 f# W
save[i++] = *addr;
& F, [: \" R" p5 b) J* ?
sync ();
, W& v V) E$ g
*addr = ~cnt;
" H; b! T8 T1 `9 I# G& _8 Z
}
$ C, a& d3 E3 n# u8 h5 ^
2 X) u! j3 V' \) ~' S! \8 t
addr = base;
) m) W2 d: ?8 |- M" D3 C6 ]
sync ();
% @1 S5 k. f0 O) e
save
= *addr;
' _* u4 s, w; l7 K; I+ y- q- w7 L
sync ();
) J2 N8 d) X9 l' x& @- B& I
*addr = 0;
4 X7 l1 l% W) L; w3 y
: k7 [2 O; c5 u/ K& C3 ]' C
sync ();
5 ?4 Q' T6 e4 l: K, t. ^& d) B. F
if ((val = *addr) != 0) {
# g) x" j" X+ e( \1 m3 i. d
/* Restore the original data before leaving the function.
- S6 _( B# d5 p& e' Z4 G
*/
& f) T6 ] P' u* l( ?6 G( [
sync ();
' z3 c/ W4 w7 ~0 ^) c
*addr = save
;
" M6 T$ w) s* x3 r; s! u' |
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
, Y; u7 ^8 V, s
addr = base + cnt;
' V2 O: X9 w/ T
sync ();
& A' ?" j- |* ~, C
*addr = save[--i];
; F: H0 |/ B+ {( Y( B. @( T( Y
}
- ?6 n! s, o6 G+ ]
return (0);
9 J- d }/ h1 V5 M/ e. G
}
! p. i. o- q& }0 k- \
% M7 |- x" Q% z! ]/ ^
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
5 L3 P# d5 T3 @& _0 Q7 m0 G
addr = base + cnt; /* pointer arith! */
- Y3 z0 v7 |* B( a: s- Y
val = *addr;
# g( |- b# `, `2 U @2 M9 m
*addr = save[--i];
( z- n4 w: Z2 A5 S& a c( G, j
if (val != ~cnt) {
' Q4 B" d0 h) i/ \: c8 |
size = cnt * sizeof (long);
7 t4 O5 w9 a0 c5 t$ }+ a
/* Restore the original data before leaving the function.
5 n, @& ]; a# r3 b* M/ k
*/
; x8 j. n' z" X9 t( h9 ?% ~
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
6 D3 t/ v: Y8 T4 T, f2 J% n
addr = base + cnt;
7 u+ I. f$ S( F$ h8 R
*addr = save[--i];
! T& T& I1 X( G! x
}
8 n6 ~! w! h( e' J5 @6 |
return (size);
7 k1 q+ l7 ?8 G7 l1 c ^$ r
}
; _; w; h9 X6 G& L5 L: v$ d
}
9 {" W& M6 W, g" @! W' j
$ C( a( i0 K, k, R
return (maxsize);
3 u" E2 Y- A0 R! ~7 q. [% h& {
}
0 r1 ]; W! C5 ^
int dram_init(void)
& `5 Y8 J+ I! z( E# k
{
" W+ o! |( ~4 q; X
/* dram_init must store complete ramsize in gd->ram_size */
9 G, H: ]7 n9 f4 {1 p
gd->ram_size = get_ram_size(
! I* {( w$ W! K w( ~; E
(void *)CONFIG_SYS_SDRAM_BASE,
" w Q) E. v: q$ t# n) x
CONFIG_MAX_RAM_BANK_SIZE);
( J7 l4 X6 k0 G9 F ]" c
return 0;
/ B, t' `% i' ~: f5 E
}
1 C" q6 @3 x; N, _' {
; O' ~ _6 u8 _- ^# j
" t1 b8 ]) g/ m; d* N5 L3 F1 f
% i; z1 K1 `6 K2 B
! t( m8 s- G% F3 N
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
" {. j- m& A% p; G+ _
& M; g5 h. c, ?" d2 [- c8 _; ?
' b/ U/ ?0 n4 s
, m V5 u8 D3 @4 m* i
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4