嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
7 o$ q: R$ [- n; \& C# x
核心板2:DDR2 256M Byte NAND FLASH 8G bit
9 R0 ]: ~% Z; h0 D) D: x2 X' Q0 V
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
8 V6 V( C, I; E% p6 Y
0 d5 q& M3 a! }$ m. a
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
: v5 I+ s0 Y; d( f N
* v4 e q0 K1 V' X
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
% f( ]5 R0 R1 P8 j' K% j
/*
) N8 V# G3 q( H, F, n/ i
* Check memory range for valid RAM. A simple memory test determines
" @+ p$ W! v# }2 ]
* the actually available RAM size between addresses `base' and
. Q: J4 B: d, v+ E2 E9 U# e# e
* `base + maxsize'.
# X) s7 x# o: t7 Q
*/
9 Q' w3 ?* A9 z
long get_ram_size(long *base, long maxsize)
# s% R" c5 i2 s- H- A
{
; O$ D7 g9 ?. U
volatile long *addr;
: Y( R! C- k0 A0 s" x$ v
long save[32];
M* H6 }$ e I6 X
long cnt;
: I; s% t& P/ q+ x
long val;
7 n4 e6 V- f& F3 `- N( S! n
long size;
7 l, h$ V! [9 v
int i = 0;
3 A+ n, [8 w; C* F# h8 ^0 L
+ t- J# T0 e* x( w& ^
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
' Z1 ^. y2 X5 `* z& S4 p, {; s' m
addr = base + cnt; /* pointer arith! */
' S/ h" `: a2 o! t& P
sync ();
" B3 ?$ [& ^* @3 }( F
save[i++] = *addr;
; m$ J; F6 |, [+ M) I1 \
sync ();
( c/ X! \ Q0 J- C) {3 w$ i
*addr = ~cnt;
: C9 m; V3 T0 A' [* h* |$ R |, R
}
8 S4 x9 p! \$ X% n; n2 W) o0 E( m
3 P+ R' i9 [# @
addr = base;
( L- z: ]3 Y1 j: u
sync ();
0 p0 I, F6 I2 s3 E s
save
= *addr;
7 u, L% d8 f! Y5 W
sync ();
; h8 c) ]( P" o
*addr = 0;
/ V+ j$ ^* A2 |( N1 [1 Z) ? t
! ~9 J' u; A# V4 L, c1 T: T
sync ();
, \; |0 \2 I& L
if ((val = *addr) != 0) {
8 h w. ~6 B* Q4 }
/* Restore the original data before leaving the function.
+ r; C. ^. q9 W3 L
*/
1 U8 j: ? d( o% y3 T2 V" i
sync ();
* ^; q4 B( p4 F8 b, r' ]
*addr = save
;
* X H7 C6 w6 R" d
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
' o0 c0 t8 G) ]5 o
addr = base + cnt;
) L: x& |2 b* y, ~0 |5 H
sync ();
' T( u7 M; ~' `3 g! P d. u
*addr = save[--i];
- W" @- U$ S2 q& d0 m+ S* G3 U6 j* T
}
" ^% j2 J3 y- N% o" }8 ?5 g
return (0);
# A5 m& V6 Y# I( r
}
/ N8 k% W, ], a. ]
6 X: e* e9 [1 {. j0 W* \; G
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
8 I4 _# Z$ U' a% v
addr = base + cnt; /* pointer arith! */
1 `9 ^, A X, n# l# l) Y9 Y
val = *addr;
% T \1 U9 Q, w7 B# _$ ?, V5 k
*addr = save[--i];
- l% g" Z1 q( H
if (val != ~cnt) {
+ E0 r2 w+ ]! u/ Z( z; O
size = cnt * sizeof (long);
( s6 I# f9 y0 M
/* Restore the original data before leaving the function.
; u( D, z( F$ R; C9 Q' l9 M
*/
6 w4 [1 U, ~! Q/ A
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
7 _: C4 X/ v& ?( H; r
addr = base + cnt;
, T9 i: A+ Z4 |. u/ H, ^) l
*addr = save[--i];
3 d7 Y C/ Z& x& g
}
% U ^3 K2 y! @0 r( e
return (size);
9 U! J; l% z7 G4 O0 H( Y- p. D
}
6 \8 k& S! {( |. K4 y
}
! T/ ~" [; n; @6 t, c7 a
8 q/ L! V! K0 f X+ f1 f, P
return (maxsize);
* E- }9 E3 `. B$ t& ?/ y' |4 u
}
( G/ v% O }+ N& A0 n4 s
int dram_init(void)
7 U# L5 V9 Y6 X! C4 ?
{
4 Y3 z$ Q* i5 g- v1 q5 H, l1 s
/* dram_init must store complete ramsize in gd->ram_size */
3 i8 |1 i# H6 f, a6 r! n, M
gd->ram_size = get_ram_size(
, S' a& Q3 o* h4 _! N& Y' n
(void *)CONFIG_SYS_SDRAM_BASE,
" Z! M6 n8 _% O5 w, g
CONFIG_MAX_RAM_BANK_SIZE);
& o# r$ y0 N; V# a' I! Z. N9 A
return 0;
& h- o. j/ J. c' t: [
}
8 A6 g/ z' k8 ~" Y% T/ R
9 k1 t( M$ M- S6 N
8 n x/ j' R9 W! \ J
$ A; ^: |- b' r. e
( W# J/ G( o2 ?( t% E* x
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
) c4 X% q4 {+ S5 U
8 D; r) P9 ?# `* A% t: Z
% E* M( C& W, N5 q: T
8 U* w/ i6 r$ Q; a, w: O
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4