嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
6 Z% g k" _2 v; S2 _
核心板2:DDR2 256M Byte NAND FLASH 8G bit
; k1 s1 A) p' m- n# Z/ Z5 A
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
: `6 m# _. ? Z/ X: X/ N
0 w2 Z$ Z# U( y8 E
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
6 B2 O0 G( ?( g% C" |/ \# g; S
3 Y: I& X Z$ `- ]( O
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
3 I }6 s& Y) a ]& _
/*
; A; p3 @+ A3 D( A$ L
* Check memory range for valid RAM. A simple memory test determines
0 Z3 p# L8 U( M; [( x6 `$ P& Z! ~
* the actually available RAM size between addresses `base' and
: P0 S. g# S+ h K9 g; _: ^
* `base + maxsize'.
# {- I$ P4 C9 m4 v. c" O
*/
5 u5 f. r! ?# c# B
long get_ram_size(long *base, long maxsize)
2 ]. A w( ]" O. a- h/ q& F
{
/ v3 j. Y O8 D0 f
volatile long *addr;
6 |/ N4 Z5 w2 v, l5 ^8 ~
long save[32];
/ `' e. X8 {. d* q
long cnt;
" d, g- K J2 {: {" T( L, J) p$ E
long val;
& ]$ o9 T: S& _* {4 j9 g
long size;
3 k: \: T" }5 |6 q; b
int i = 0;
( n0 ?1 ]# O( m X! @5 O. ~2 P
- L$ w$ k1 Y# h2 X. A/ G
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
2 `$ y B( C2 h% c4 I
addr = base + cnt; /* pointer arith! */
1 g# y0 X' _. W& b- r1 T
sync ();
$ Z; ^, c: x- _5 V* I. x7 E6 t3 L6 @
save[i++] = *addr;
7 {! ?; s b O, T9 R6 b# `# m8 a
sync ();
: n2 v/ P S1 _! a; \
*addr = ~cnt;
r- `: h8 v/ \7 E9 h& C3 E* a
}
7 W U3 u$ B# o& E3 S2 C: `
9 A# r$ i: l; D/ Q! `# F
addr = base;
% N$ a' ]. Q" v5 a& x! n
sync ();
M' a1 O9 S' u# M- X/ C
save
= *addr;
4 ~4 l3 P7 A- B4 J# P
sync ();
& o1 H& p& Z9 S" w
*addr = 0;
; V$ r' F% Q }
" Q; n( A: C: P6 M) d
sync ();
5 g. c3 X3 |6 C
if ((val = *addr) != 0) {
$ \- z0 { p/ t( x* G; F, t$ c
/* Restore the original data before leaving the function.
" x- E# r9 T: I5 E" F
*/
$ j" \+ M$ d- Q3 |( `6 j+ H; A/ z7 I
sync ();
# z; C, v5 I! w- x J$ w" b; g
*addr = save
;
`5 ~9 }. ~& g9 t! ?: {9 o
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
9 p2 N$ G+ G$ A7 T0 _+ f5 b' {/ u
addr = base + cnt;
' H$ d! R+ _6 l
sync ();
% j- p0 `9 Q7 a; d" \2 Z9 x
*addr = save[--i];
$ L1 @! S/ k: c r
}
; I5 l+ G" N/ j8 K
return (0);
) ~+ w5 z' h9 U$ N
}
+ W3 ~3 i+ n2 d( Y4 J9 r6 p3 i0 g
$ D7 h$ i7 T) I+ ~, L
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
2 P2 ~0 G* a$ |- k7 n
addr = base + cnt; /* pointer arith! */
o) X9 L3 }3 N+ N1 D
val = *addr;
/ c' I0 `9 W+ i- F; M' P" G' K
*addr = save[--i];
1 h$ q: i# o' S$ K7 ?0 M* \6 y
if (val != ~cnt) {
4 p0 D% @ A3 m1 ~# x( v, c
size = cnt * sizeof (long);
0 O4 B( {2 k2 c; U8 y! G
/* Restore the original data before leaving the function.
$ Z1 i+ R, I" V6 A2 V
*/
" J+ q3 q$ q" P' [0 I0 {" t2 V
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
& @: z6 l9 T9 }
addr = base + cnt;
) ^$ M% ?' g" i
*addr = save[--i];
, ]: R4 D, u1 d# C
}
. r5 @: {: S: o$ ?( C) }$ j
return (size);
6 a/ L7 N. m! A* H! ^ l7 o) K
}
9 e: Z& O% q Q4 t/ [
}
1 u: V! X1 r5 F5 h
4 K( t; x" ~. M" }5 J# L+ i
return (maxsize);
4 J! s( n) i- x6 ]( b3 l
}
, x1 X, Y: Y; i- l
int dram_init(void)
* Z/ d6 ]: d, A; N! F
{
5 u. b1 o$ ?. I9 Q3 h1 _
/* dram_init must store complete ramsize in gd->ram_size */
. T+ N# G* F e9 @$ Y
gd->ram_size = get_ram_size(
4 S. t% o G1 D/ S! }) X
(void *)CONFIG_SYS_SDRAM_BASE,
8 |8 l- x6 i1 o3 x
CONFIG_MAX_RAM_BANK_SIZE);
" I# g: T1 h5 x) ?6 [# G9 V/ U2 J* V
return 0;
- a, @" `1 V# v( q. @: X: N' ?% P
}
0 q! h+ i* T) q. P8 d8 D
! k0 o* J. g! ? E) V ?2 F6 Q# u
( k' K9 v1 O% T1 [0 O
; p3 _2 D# f3 X$ O
# ~0 m4 D9 I2 B" B% y8 k0 I9 o
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
: D( T) ^! N( D
3 K( m0 I# Q& K
; W6 {3 T/ X6 z, I, o& t. }
, x. |# r2 Z2 o, z1 m
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4