嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
% q# w) @1 O9 I2 G( Z
核心板2:DDR2 256M Byte NAND FLASH 8G bit
' U* X( z8 k- V1 g
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
r1 F0 }7 T+ h: n! l. k, w
# E& f* i/ P: O% ]2 d
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
' q0 q6 C- F+ R- ^0 k7 d1 }
( E5 a5 e5 E0 j+ w+ [
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
4 V: U/ t, q: K2 D: P( F. S
/*
( e( E8 T8 k- w1 ?. Q, M/ N
* Check memory range for valid RAM. A simple memory test determines
& j1 G. y. g; L; L
* the actually available RAM size between addresses `base' and
7 {# ~0 {" ]. w* |/ I" a4 V
* `base + maxsize'.
/ ^9 P2 y2 g/ D9 ^6 |& d% I
*/
) \; {1 T3 _6 c$ A/ k: [8 x' h
long get_ram_size(long *base, long maxsize)
9 I$ M0 ?$ B6 E+ O4 }) M
{
" g& i6 c* Z. [% l- k
volatile long *addr;
7 [% |* r% a* ^8 ~6 p
long save[32];
# ]* x% g& F( C& Z$ h
long cnt;
& Z9 m7 c2 [6 F# `/ f7 m
long val;
# i% B8 I' e3 y' E
long size;
, @" P' a9 l: z# q
int i = 0;
6 d7 D; u4 _4 S! U$ J( t' n7 p0 i
; ]$ U; H: ?$ Z
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
/ T) D# e3 L% ^5 y
addr = base + cnt; /* pointer arith! */
' g7 B( U0 h O/ f% b5 p& x( H2 B$ p
sync ();
3 K- \+ H5 \+ L7 @* p6 T
save[i++] = *addr;
* m2 d I' ~1 x8 R! W8 Z/ Y# ?/ N
sync ();
3 z4 e) ~0 Z, W
*addr = ~cnt;
% T$ b, F/ O6 t L
}
2 N2 q, [ D Y' l# K1 v# _
+ K7 u: A V2 p( A/ s9 J' a
addr = base;
: R4 C: _9 o4 E& ^9 s
sync ();
& ~# Q1 i, V7 ]/ K& j8 x
save
= *addr;
0 \) Z. l$ |/ K/ f! M" N: h' e
sync ();
2 |5 V1 \$ `0 x7 u7 z
*addr = 0;
( A9 x( z, @% s/ D
- g2 Z' g1 g) U
sync ();
m" l x6 Q9 @3 E# M0 L7 G5 _
if ((val = *addr) != 0) {
* K j0 i7 @# D0 \9 A& g# Q: u
/* Restore the original data before leaving the function.
0 ]( B9 Y: y) X" M0 x* Z
*/
) v# ?2 ?6 A/ U o6 _# d# L, D
sync ();
! o- l. g7 R6 |8 P( n. ?9 F
*addr = save
;
+ i! l* i( J6 U+ r. _+ S6 \3 [3 H: ?
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
, K8 |9 w' i) {. F7 ^
addr = base + cnt;
1 |" N. ^6 M I5 F: J2 V V; w0 R
sync ();
1 S8 L$ v) F+ E6 g
*addr = save[--i];
* b! z; H3 S( z% @& u5 @. a% r
}
* D- Y2 i+ @1 _, j0 ~
return (0);
* j, }3 }6 _$ `$ g% g
}
# J& s, V* m8 V: b. v8 u* _
1 O0 u: Z. x1 }
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
3 \% @: a5 d; j" p3 B, X9 o
addr = base + cnt; /* pointer arith! */
: K+ r( h& b( o% @
val = *addr;
" q6 z0 q; F" X) `8 C& C
*addr = save[--i];
' n- [, |" n( L6 c$ b9 C& P
if (val != ~cnt) {
8 K. {% z) l, j
size = cnt * sizeof (long);
9 [- C( o3 i4 ]6 q& S) D. j
/* Restore the original data before leaving the function.
# n1 y. H3 A0 N* Q* D1 a
*/
6 G- E" I* l* R- L
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
( l# g6 S) D7 n! D* N3 y3 C3 ~
addr = base + cnt;
, n" @) I. F$ ?( ^( s9 l Q9 ~1 t
*addr = save[--i];
G1 E& [/ u! G7 t: V1 z* w
}
. w, Y7 I* `6 T/ T- W) ~# x: k% r
return (size);
4 \8 P7 z1 z# z$ ~1 {4 |- J
}
. U: X9 F( T; ?
}
" v6 @5 n$ p# A5 C5 L
. Y6 p$ u& ?' S9 F4 S m2 N
return (maxsize);
# ]7 w# K, W( O, p9 n l! l
}
8 l, Z& m" a; T. _9 ^; o
int dram_init(void)
3 b8 \% u* O, p7 [
{
5 Q/ t# `! w* h+ [$ I+ y
/* dram_init must store complete ramsize in gd->ram_size */
6 j5 B9 A1 \' x1 w- Y# {8 l4 E" g
gd->ram_size = get_ram_size(
T" x! `/ i4 H4 y9 n" N) y0 F
(void *)CONFIG_SYS_SDRAM_BASE,
3 Y- }) T" Z5 b& T" d
CONFIG_MAX_RAM_BANK_SIZE);
- D0 R7 S* [! W4 P6 P# Q8 U% R
return 0;
! D% A0 Y$ ~& ^$ i- j" g
}
' _% E+ Y V, K
6 X. D( C, Y4 o' f1 B- b
, T# {6 r! L/ A
* E4 j/ \( `' Y- F$ l
+ K2 ?. | Q% e* ~7 R/ E2 e& e$ v
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
; y: S0 W8 j, n
. Z7 ]* S! j3 P- j# x8 \" Y8 Y
6 ^# }1 z$ A6 ^5 @
1 `9 I% y2 Q! |0 w/ [/ k$ p) x- S- n
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4