嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
' f, n a1 D2 P, |
核心板2:DDR2 256M Byte NAND FLASH 8G bit
2 Z Q! |* L. ]" k% k- p
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
8 e ?1 v" c: N# _
( J9 i9 Q+ U: A# k
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
/ ^$ r3 L5 w3 R; n
u6 u* L3 N. F7 g
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
4 g# ]: p% Q( @' o" d
/*
c( b2 Q: F, D2 n+ T* d$ L
* Check memory range for valid RAM. A simple memory test determines
5 X2 z3 O/ ~6 f3 W- S& `8 y& e
* the actually available RAM size between addresses `base' and
8 D: m! O3 j- U% P* ^
* `base + maxsize'.
# i( @) a- d* j( D; Q
*/
3 Z7 ]; x8 D1 a2 s) L: V: T
long get_ram_size(long *base, long maxsize)
2 s) |7 L5 ^2 |% L2 M* z
{
$ i4 y+ r: Q2 f1 X6 T I
volatile long *addr;
0 }) D- L, @3 u# J0 T+ `
long save[32];
$ M8 v8 p, e1 Q/ m
long cnt;
& e# J; X, [; j9 g/ ~& d
long val;
% u: a/ G, C' F- e; ?: U! o& @
long size;
8 W3 r% p0 X$ n% X
int i = 0;
9 o# J8 t5 V+ i ]7 g
' C% C) o; B3 P7 q
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
) I" S/ O$ ^# v( O
addr = base + cnt; /* pointer arith! */
6 n, B+ t7 j8 J" ?) L
sync ();
6 C7 Y+ D8 Z! O d' {
save[i++] = *addr;
* d0 c* a* Y. ~
sync ();
+ z' w! D8 B& Z$ B9 v, z1 b( o3 J
*addr = ~cnt;
h; |! Z6 n& F7 x9 L( G
}
4 t& a' \, `/ u
" [6 J, F$ E1 C" A* L; {
addr = base;
6 l9 F# C9 R6 k5 _+ k6 i2 A
sync ();
; R' @2 a, |7 H& F( j) R
save
= *addr;
- M( O4 z. P0 n F& s$ I$ i0 T3 |
sync ();
7 m" p% ?1 v" E; l) ]" F
*addr = 0;
' P4 o* \- e) {( v1 ?2 h! ?" H
4 M2 x5 ^" ~5 m& F
sync ();
' o! \1 U% U" `# v0 Y
if ((val = *addr) != 0) {
2 h3 k9 p$ _$ ?- R# s0 a
/* Restore the original data before leaving the function.
$ |" @2 f5 A$ |: I
*/
# ^3 }- i$ V4 Y
sync ();
4 x) S' _ o" \; m3 |
*addr = save
;
5 P3 m% _0 `$ I6 ?+ a* i- }4 J
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
! n, B/ D9 V2 r, ^
addr = base + cnt;
, t S; U4 A, O0 H3 q
sync ();
; ]; r$ b) [) f, q" M8 L
*addr = save[--i];
: B. k# J* J- G! d4 C
}
( C3 N0 R' e8 G p. H
return (0);
6 I5 ~9 Z. g/ h
}
( I" l, g: T& O% L
6 |. _/ [, Y p \, T
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
2 e3 |; `& D+ \( Y2 v5 @3 P E8 i1 w$ }4 @
addr = base + cnt; /* pointer arith! */
, \) b! v! X# {1 I5 h1 _* S2 s. `
val = *addr;
$ q0 A+ {" y% ~3 x4 _8 d, g: H
*addr = save[--i];
3 A$ {, G9 M' ~
if (val != ~cnt) {
6 X; o8 t, n5 }5 @- S
size = cnt * sizeof (long);
5 @2 j, ?! F' E
/* Restore the original data before leaving the function.
& D+ i) H& f/ S9 ~6 q) Z
*/
4 Z3 l2 {3 y) ]5 ?) e; J! r$ y- f
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
q) u- ^3 m- {
addr = base + cnt;
- p, J8 `" S: b. Q
*addr = save[--i];
* f. a! c# l& h/ b g, M
}
; L5 z' J. A- a! g
return (size);
" I) D, \9 x( v5 h" L) K- e
}
; v4 Y0 O- L- j
}
) }) m) o& A2 u4 ?- j
! P# W$ G7 `3 N* L( f6 U- \, T. o
return (maxsize);
, E1 V& f- k; n- q. N3 d# J
}
& l( a% J. h2 k* U- E
int dram_init(void)
2 K6 |7 b( Z" i
{
* v% V% c) p! j% B& u Z
/* dram_init must store complete ramsize in gd->ram_size */
; l" F. r% A5 u1 J1 K$ b
gd->ram_size = get_ram_size(
! ]; M7 J4 e8 e$ A' ~8 a
(void *)CONFIG_SYS_SDRAM_BASE,
6 \- r5 O6 X' |9 v$ d8 V
CONFIG_MAX_RAM_BANK_SIZE);
. j, D2 F) G x, W/ i% a5 O
return 0;
- \% c+ m- J, n2 S+ K
}
- g( A9 O( r* r
" y: j# t$ M9 q9 ^) m U" V& T& r, I
$ p- j; b+ E" q% d- [
7 O) T& y6 n' l! @% w
- U7 y) h: k$ T8 o |% q- x: v
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
4 T7 y- D4 y x
k5 S4 b* o$ F
$ Y6 v( p3 e6 w( a$ R
9 T0 ?9 [& l" J, M) f) _+ [
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4