嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
2 ^; q( b% ~- X+ D$ c; S
核心板2:DDR2 256M Byte NAND FLASH 8G bit
+ F7 ^0 [( t$ S& `) N* h
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
4 o8 q9 |; a( l# Q. v1 S8 d) y
* H* ?- W+ Y* h9 s9 ?9 E
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
" l$ k1 A" H% ?3 j/ v) F
. U8 q, |. y" Z8 K
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
0 D1 M$ S" `+ E- P
/*
* y7 B- I. C& ?5 h4 N: u: f# |
* Check memory range for valid RAM. A simple memory test determines
4 W0 V4 I3 f* K1 @4 t; p1 t7 Y0 ]
* the actually available RAM size between addresses `base' and
7 p! V- k9 Z. }' ]# \+ N5 |8 e
* `base + maxsize'.
% D4 y* j- z4 @; m- i
*/
5 P7 H7 {. b: m. i) `1 O- G
long get_ram_size(long *base, long maxsize)
; B7 F: S4 R R f8 C- r1 V0 p
{
: l( {+ q% }1 x) |" T) p2 A6 E- Q1 `
volatile long *addr;
1 i) f- @4 b, c% I- o5 A: p8 T
long save[32];
; y3 I3 J: \8 n( x
long cnt;
$ d4 V# ?; J- w, ~9 N. M
long val;
8 l* W. k7 H! Z" o' X* t N
long size;
9 K% m( I1 v5 c
int i = 0;
$ N8 k" |* I$ M5 f
1 @- }3 y5 K) [( X3 ?
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
( j4 R" f% S+ Z1 @, }8 Q4 T
addr = base + cnt; /* pointer arith! */
: ^! g4 R) X% F+ Q' ^
sync ();
! O8 s8 [- A$ }9 B4 ]
save[i++] = *addr;
: C7 v9 H& j/ c0 [# } i1 K
sync ();
! V! f2 @" e# L5 q; Y
*addr = ~cnt;
6 T# b- s9 c u0 u1 _; q# o$ I+ A
}
- N, y9 X1 `5 K
# L: l7 F& `5 L; C
addr = base;
2 V+ k/ g& z& ]' _1 h3 s
sync ();
7 @) N/ ?% c0 K ~" B1 }
save
= *addr;
0 y6 f' U8 }9 ~7 e1 i
sync ();
2 |1 y, l, m. _7 J# g( p
*addr = 0;
- B3 d9 t2 }3 f6 |- ?
* I5 y) U6 X1 q* y. Y$ A( v* f
sync ();
! _8 z/ r- D {" @% v, s) X- Q
if ((val = *addr) != 0) {
1 D/ a8 r" H0 l) w3 L7 b
/* Restore the original data before leaving the function.
$ M* [( J3 y5 k j* Q4 R
*/
1 L1 w4 ]9 u! T
sync ();
. f. h* ~, `& d+ q
*addr = save
;
N3 h' E! b& O
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
+ Z" h2 `% J% j. r$ T3 w
addr = base + cnt;
) c {# |5 C" n1 i# J% W0 X/ u
sync ();
/ [; X" Y0 t" f* g/ u
*addr = save[--i];
0 @4 ?# k$ F4 r F, s
}
% g' H& f7 u- Y" e8 z7 Y+ |
return (0);
9 {# `4 M$ Z6 A8 K* m
}
& U, u+ l" g8 E4 A8 B5 r) _8 n
" t: a7 z4 a0 r* P- s
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
" |1 B5 L. b4 p1 E% m
addr = base + cnt; /* pointer arith! */
, W5 _- |/ U# @" B! h4 l7 ]
val = *addr;
5 M3 X, H6 C! _
*addr = save[--i];
f: g6 _* c& i( z4 e7 I
if (val != ~cnt) {
- ?; ^) ?& I6 a1 o4 e: N! A) h
size = cnt * sizeof (long);
* l5 A6 G, P- c- o
/* Restore the original data before leaving the function.
( U/ {# [' _1 W* {
*/
* X! V( ]- M7 a9 ?/ X: V
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
/ N7 G0 u* i2 L
addr = base + cnt;
5 i' R/ h9 w6 O8 S3 B! e
*addr = save[--i];
2 {& N/ ?, S' Y3 F* \8 Q
}
- ]% e. N4 |5 A6 a# s0 C
return (size);
, ]9 k) s ^8 b; M. ^( T
}
6 U: N' ]. s* u; P# `. w1 _9 H
}
1 l" j. R) [. u& V+ ~* x0 }5 }! n
" l2 ], k9 E' M9 ? w9 L
return (maxsize);
! A" E" t1 c; C2 A5 W% t! Z
}
: F; T" a9 r$ N, h% @7 U" h
int dram_init(void)
3 g$ ?9 b/ v8 M- k" N2 c6 a" d: \
{
* `2 Z$ c; |$ j3 P5 V- [
/* dram_init must store complete ramsize in gd->ram_size */
2 g% i7 H4 P. ?6 J" b' V
gd->ram_size = get_ram_size(
1 X0 l# q7 o& x! g, ?
(void *)CONFIG_SYS_SDRAM_BASE,
3 |! H5 n1 {( t0 d3 e$ U, ]1 ^1 x
CONFIG_MAX_RAM_BANK_SIZE);
' v0 l7 L2 `6 \& t
return 0;
% h- T `9 ?7 u+ ]6 M
}
* Z; T) V F3 R* F- s
& w" B( i0 e# W2 r6 c+ f" M5 \. ^
/ n7 K& s3 u1 D3 X* f
' Z+ p8 S% [4 f( s; @' T' {; o
3 F, i8 p7 H$ l5 L: X! m7 ~; o
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
: K5 q" L, b# ]$ N2 F; S
4 O1 F( `7 r8 }
; I: Z2 u+ ^$ e7 l6 y/ E2 y
H* e5 J9 `/ b. Y& Z/ q
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4