嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
/ `" i! K! |* o2 G
核心板2:DDR2 256M Byte NAND FLASH 8G bit
, ^8 o0 G9 U2 \( M
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
( u8 P9 }7 L6 ?6 @# T
& y* q1 \+ D" ?. U
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
% p: |+ I3 A$ g! |
; q. ~' Y6 `% a1 v: a
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
) o! M4 o/ ]& m* Q$ W
/*
$ x: x$ p5 e: Q ^/ V$ S4 ?6 y2 F' a
* Check memory range for valid RAM. A simple memory test determines
5 @7 Y! }5 x' m
* the actually available RAM size between addresses `base' and
. i9 X9 C9 K/ w
* `base + maxsize'.
& w+ e9 c4 ]- r0 d
*/
2 H) C/ a/ [8 i9 n, D u$ v
long get_ram_size(long *base, long maxsize)
+ j: I0 n2 R3 l7 r; y5 b
{
* ?. b4 w/ o: o V2 v0 e3 u
volatile long *addr;
5 `; ^* B) d. Q9 h V
long save[32];
7 s: S# `9 X( l/ o
long cnt;
$ w4 f- T# {+ l m; C; p) R) q
long val;
+ r P3 o6 z7 R; d
long size;
6 x" ?/ t7 c8 n% N# G
int i = 0;
* ?- S& h$ s4 w f- M
: [6 W- @) b; S+ b9 _; T
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
& Z/ v3 t/ T$ F' t' Y& U8 T# J+ j( n
addr = base + cnt; /* pointer arith! */
$ U- n* R3 R$ `2 G8 l2 l& e$ C
sync ();
- b x9 W1 j3 D, K
save[i++] = *addr;
; U! q. ~. f+ i+ J
sync ();
5 `) R: q1 P2 k
*addr = ~cnt;
" [% O- [: w& C0 \
}
! v# `: `( t1 g7 q3 [. X( N
) y- v7 N4 x/ V* m" [- y8 u: a) l
addr = base;
/ V' c" w1 x* C) F
sync ();
: D7 ~) Q4 F S, G# z/ s. H
save
= *addr;
0 X1 G H" _6 v2 ?
sync ();
/ j+ l4 G: I$ G, V* X8 n
*addr = 0;
% o2 l- ` J( {
' Y8 d- D: {+ t2 g8 @: e/ `
sync ();
; @( l; w" ` p5 Y1 O4 V
if ((val = *addr) != 0) {
& z9 \' u& e2 M) t$ z: Z4 g" G- s/ ?
/* Restore the original data before leaving the function.
& F6 N# F6 P2 E8 r
*/
1 Y P; P! H5 Y+ H3 P0 s
sync ();
7 n, F$ F' @5 R/ |5 o) Z2 H: \$ |
*addr = save
;
2 T6 A% {% A; E8 A% \
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
* O/ |* \; N4 B
addr = base + cnt;
6 x- d8 s! i# K* p" a. r. @
sync ();
( n- @% l. n' ~2 d6 F0 e. i6 z% w
*addr = save[--i];
3 k I1 G6 E% M% G$ ~( ]* o& K
}
# Q. y" R: X& J' w/ F
return (0);
" Z; o& t3 r) O" X9 D" I
}
& C3 a+ U& a) {- b5 b; E5 M
7 a4 ~. Z; `2 G7 `
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
( \! K& H4 a/ I# |
addr = base + cnt; /* pointer arith! */
3 C A$ q9 C- {* M7 N, l
val = *addr;
/ U; G; x& }6 Z6 f. X
*addr = save[--i];
1 e* j* e7 z% p9 O
if (val != ~cnt) {
& J. _: D% X5 U% W0 l
size = cnt * sizeof (long);
: z5 q6 h A( I
/* Restore the original data before leaving the function.
0 r- ^* Y, a& k" s& j* q
*/
Q5 n( R# o( J# C& `* [
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
O- }, J& R( l3 \ ~
addr = base + cnt;
3 F. P9 N" O! |$ G' y: W4 Q
*addr = save[--i];
- ]- S3 m* U3 D; ] ^
}
0 y; a4 }9 \0 x3 ^2 ~4 L
return (size);
& R9 P! Y- u) i6 N: ?0 {
}
* c5 x- B8 n# B4 }8 }/ Y1 K$ m
}
# [% ], O) J' {& c
- t4 O" n! F5 f; E! ~. B
return (maxsize);
/ X. r+ s7 V$ C3 N
}
$ \. X+ S! |7 C# | `
int dram_init(void)
2 Q- {1 d+ h1 k+ W+ K( _7 P4 a
{
/ S- l& L3 s+ m% O+ d$ e. |. Y
/* dram_init must store complete ramsize in gd->ram_size */
4 \$ ]. T5 c. q+ z( o0 r# ?: ?
gd->ram_size = get_ram_size(
! G. L3 N! E4 i+ U
(void *)CONFIG_SYS_SDRAM_BASE,
3 ?3 l9 y$ \( e( A6 S
CONFIG_MAX_RAM_BANK_SIZE);
+ ~% J% ]( Z T
return 0;
0 ^% u% z% u7 n
}
7 u, q$ y* ?% H
1 X% D# c1 \$ A1 z& `8 t
0 O2 n1 t0 B' X' ]5 e9 r3 ?
5 N5 o" t% N6 k3 |
/ o$ O, ?# P& n9 m' ?4 a
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
) ]* ]; }! f, b4 Q: \: n5 q
5 E1 M) N1 b# q% s& H5 u
5 I" N" B" n7 H7 S. U7 Q
" B% J) E7 T f6 n- ~8 ^
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4