嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
' k+ j/ l; @% d- Y' q% J
核心板2:DDR2 256M Byte NAND FLASH 8G bit
3 T. s6 m. E. a U- p
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
9 K/ k& @+ R1 X& x& N
* G+ N( g3 g; m, F
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
. K" e/ A7 r$ i
S/ g3 p, W) Z. [/ f4 r
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
9 ^ D v# [, i) N
/*
& I8 r( L5 Y3 i" [3 L, C
* Check memory range for valid RAM. A simple memory test determines
\8 R% ^ Q2 J+ g1 O" L
* the actually available RAM size between addresses `base' and
; p4 _) b" x, y) b& }
* `base + maxsize'.
9 s# i. H' g; L- ^6 b3 W
*/
. |* m9 D. W; {
long get_ram_size(long *base, long maxsize)
" h9 D+ ^7 t2 J# V9 e
{
" W8 V( x7 r E6 a
volatile long *addr;
- x f* D; Z4 ]" p( E$ \& U
long save[32];
' R3 O. _( h0 a+ h1 d2 V
long cnt;
! B. G1 G6 T% W' t% B: A( P
long val;
" G: |4 Z4 ^/ ^" W
long size;
9 r7 A* f$ G, X+ ~' N1 N; R
int i = 0;
, x* M& p$ }: A1 N ? |
% n, M0 ~1 n! {1 C
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
C* z+ G7 S" a: g
addr = base + cnt; /* pointer arith! */
" G% w4 S& k r- ~/ g8 o; ^2 v+ Y' H$ u
sync ();
2 ?9 o) `# [+ S4 h7 z' V8 A
save[i++] = *addr;
, O8 }! b ?/ A- }! o
sync ();
" Y5 q" Z* N: A1 x! | Y3 p
*addr = ~cnt;
; Z; |+ V, }: j- Q' U
}
$ S) e' R) v+ P
: H9 p% O+ K2 {" t; F5 }
addr = base;
$ x: [6 {; |& p7 C$ {( `- c
sync ();
1 Q. G5 [; Z1 |7 t
save
= *addr;
. J6 E1 \$ P; \- |- z% l3 v
sync ();
0 B/ a* n1 _7 }' I4 e8 D
*addr = 0;
& V I2 g! f i5 |; y; O
5 b+ N4 A X$ x! {, m, k
sync ();
# Y" j4 C* a- ^. ~" k3 e) @
if ((val = *addr) != 0) {
8 |; @) l' w% e- L& I
/* Restore the original data before leaving the function.
' w5 l# i9 u& X% c
*/
3 w6 X# L/ Z$ Q8 q( A9 Z
sync ();
9 B) F7 n/ Q# R' Z4 \* W3 u- i
*addr = save
;
- t$ C3 x: d- H8 F
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
7 t7 d3 g. z& e1 V/ s$ b- g8 s$ b3 n
addr = base + cnt;
4 p( W- I F/ R2 T. h0 K9 Y, u
sync ();
% k# d2 T2 d }# z! B! ]$ E' Z9 z0 v% @
*addr = save[--i];
; |+ e5 N- C$ K4 o2 P% j- E7 J
}
8 H$ c. I Z* C6 A
return (0);
7 u5 Z, r/ v& R/ I# @
}
' T% A; v2 c, K1 K
( \9 \6 C6 H7 L1 {$ L/ O8 m
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
& Q8 T. \6 s# l3 m, e
addr = base + cnt; /* pointer arith! */
( v# W" k9 E4 {: C
val = *addr;
9 B o& m* w7 ] H
*addr = save[--i];
7 S! R6 i, a! U1 l% n: B! f$ v
if (val != ~cnt) {
$ p( T5 E: e0 r
size = cnt * sizeof (long);
3 g7 T9 a9 L* m# C
/* Restore the original data before leaving the function.
7 R2 ]; l3 I9 u. N, K2 H+ |% ^
*/
& C7 F# e. O5 f" p* ]
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
) }3 D' \* k$ v: z3 ^9 m
addr = base + cnt;
) @6 k/ e8 l7 A* G# s& c. c, _5 h
*addr = save[--i];
& V' d) c, F* D5 b- H
}
4 i! @+ @. K1 l% I" `, j" r
return (size);
. l# t b% A* [
}
. ]3 U# @% V! ^0 y6 F8 n" q0 M
}
1 H6 D. f# V4 y
5 }8 i4 I! k: E. D4 w5 Q9 o R
return (maxsize);
( }6 f" _2 P: D' A
}
% O: C. N0 x4 {* {" b. @7 O. Z& n
int dram_init(void)
- u* j. b7 b8 ?- s! B
{
' ~/ m3 a) J9 p* [# L+ C4 P
/* dram_init must store complete ramsize in gd->ram_size */
( _3 ]* @5 r) D+ |. c
gd->ram_size = get_ram_size(
; R- t: V+ L1 E8 N1 o9 u0 D' l+ X {
(void *)CONFIG_SYS_SDRAM_BASE,
2 T" S) r c" j Q# b
CONFIG_MAX_RAM_BANK_SIZE);
' o8 Z; ^) p7 k. h1 `8 H
return 0;
+ u# t; C* f' a Z, V
}
. O' ^7 {, `$ I. V3 G. R
, E; i' ]! C2 ~4 k7 \# a
- s% M$ U6 w. Y9 ]! t; T
/ s$ B* Y. |9 E k! H7 k
w: ^4 |3 i7 T& }9 ?
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
6 v! a ?2 _$ L" L* c/ ~7 ^
7 x$ |. r' d; [/ a: U, J
M) R' k6 q& _# Z
- X. c. ?, u+ i. h
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4