嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
) `8 J" c, p2 e4 {
核心板2:DDR2 256M Byte NAND FLASH 8G bit
( {! j! G- a# g+ v; L) H
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
+ Q- H& O1 c* z- A+ w) _
# w3 b5 b2 p% ?3 v
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
d o8 w; q$ K5 y! Y& A1 T- G
4 n( f! q# g% e7 V7 o
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
6 m& I9 T* e7 H9 c% z5 D% ^
/*
) E0 u; O4 A2 ]
* Check memory range for valid RAM. A simple memory test determines
( D7 p! M+ w- G" F# l
* the actually available RAM size between addresses `base' and
( c: A" b7 B( H( k9 U) U1 o
* `base + maxsize'.
' P; m9 i, m+ v, i) r, b b- m2 o/ @
*/
( Q8 r' W2 R- C0 o
long get_ram_size(long *base, long maxsize)
2 j% t, r! k) x6 |6 m
{
2 V6 v8 ]& |1 M
volatile long *addr;
d. |: [: a$ v3 d. H% j: M
long save[32];
: p/ y1 Y2 W) V' g! X; g. z
long cnt;
4 s) g6 N/ v7 d4 t0 O/ p
long val;
* C( U& A4 l @' Q$ W0 V
long size;
+ i' K5 P: f8 Q. d
int i = 0;
! v1 X# [# }' c, F
: E6 m( b+ D7 J5 V/ P$ k" e
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
- x8 H }. H/ t; D4 h7 d( B
addr = base + cnt; /* pointer arith! */
6 i. c% V' w- u' m# a! K
sync ();
2 w- m' T9 n" ` x o
save[i++] = *addr;
) }( l- V" r! `6 H; |! {
sync ();
; Q5 Z2 e- z2 v. C
*addr = ~cnt;
8 B7 ?9 b9 A: m( Y. [2 C6 W
}
8 d6 a# n9 W9 L" d9 v- E
$ d* {) P9 }! z& s* l
addr = base;
; L! y* Y! C; D: _- g! S
sync ();
, @: X5 Y) c/ g' E
save
= *addr;
, n& V! p" ?* h' ~8 x
sync ();
: d2 i* g ?, a& u/ r
*addr = 0;
6 ~6 b ?3 g0 i- u8 X4 s
- y2 R2 Z" h" `2 J, A, u
sync ();
/ [# p/ B; o9 @7 B% H$ M: T
if ((val = *addr) != 0) {
, p% s) e9 K. w# k
/* Restore the original data before leaving the function.
! {# K; S' c- Z3 \5 d- L- A5 {
*/
7 [; a5 Y2 u6 e! Y3 _, L
sync ();
! k& T, K- h+ r+ X z4 q' ]
*addr = save
;
% e2 @. F+ \9 c6 `
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
8 R6 h: Q0 N# R; W9 u4 w8 b
addr = base + cnt;
# h2 z. R" n& b- x2 j' ]
sync ();
" U! K$ j0 T5 _3 _
*addr = save[--i];
$ x( P- t: H4 p9 \) R# \
}
3 d2 ~$ b; s2 d$ x. u' _: ]
return (0);
7 |7 S& g- A& g( S8 j% i, l
}
# v$ S# w. h8 @6 D( q
( J+ H+ X8 ?, o, N) l6 R/ V1 ^; K, _
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
& N- U1 Q$ I8 V7 m6 r/ V
addr = base + cnt; /* pointer arith! */
* Z- }! K& k5 m/ Q" D, v: G
val = *addr;
5 _3 j* c0 V. \0 E- F% F
*addr = save[--i];
6 X0 a0 B: ~; f- t% A0 M5 a, W% o
if (val != ~cnt) {
0 M' \) J$ c3 j+ @
size = cnt * sizeof (long);
+ S) J9 \- }1 r: Y; b
/* Restore the original data before leaving the function.
/ y( K3 ?2 R8 k; _8 o5 h; j
*/
( f, Q! S$ m6 e- m" w& A' }
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
# h# d0 p/ F1 x* o5 ?" z% G' h
addr = base + cnt;
3 i2 n' Q9 U' N
*addr = save[--i];
( M0 S4 i% I0 F; s2 y( Q
}
% _' x) o9 o( O
return (size);
8 }% K1 J7 j* R
}
+ T) A* { Q6 d. F/ e8 t$ K6 A& ^
}
/ h) g- N) W m2 g- F
' v- }4 H/ N' V9 f8 U
return (maxsize);
6 L% K. h) B7 a4 i
}
# v+ C) S( c, n1 l% @
int dram_init(void)
9 j4 c5 I# t% X! M) y5 U
{
& U8 ?( [% d5 T; }
/* dram_init must store complete ramsize in gd->ram_size */
' x- K, L2 K+ G' r
gd->ram_size = get_ram_size(
1 P3 V* ]& a2 u- q5 g% g
(void *)CONFIG_SYS_SDRAM_BASE,
" [( M; ]6 T2 v& H }& Q
CONFIG_MAX_RAM_BANK_SIZE);
' L! k; H2 D+ h) G7 u# a: K
return 0;
+ x A& d* l9 I) l# O, h/ x
}
" I: C# T0 d. \" Z, q8 p2 K
- d& ~ y! {9 D! y% r
1 @7 W W% E1 u6 _2 Q( _
6 F( a7 f a+ X- x2 \6 r
, ^& Z1 u" o; ~8 |/ T2 L
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
- i4 y! I \+ f) E6 M
9 s; j5 ?& W* d" z' y& \
7 y& E; r- f! C" P
8 w) _7 B- X0 c! P
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4