嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
: ~, q* A- q6 t% w$ C
核心板2:DDR2 256M Byte NAND FLASH 8G bit
! y$ N4 Z" x* n R) }: o% J
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
0 N+ y4 d' A( V6 R
$ C0 T/ |& M! X- a9 O$ k0 R& I
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
7 I, _5 [5 e7 y6 A, d/ K
" h; A$ U; R0 I
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
4 t! S5 z( K) w1 c0 w+ {
/*
7 x! K: ?2 L/ g# D5 g; _) a0 e- B
* Check memory range for valid RAM. A simple memory test determines
* A v* A( i' @' h9 H6 f6 O
* the actually available RAM size between addresses `base' and
8 Q& ^: `' N$ {: e4 K3 A# ~/ q
* `base + maxsize'.
2 T+ O% [4 T+ ?0 P
*/
& r: B8 f; R# j; H, c+ x3 _
long get_ram_size(long *base, long maxsize)
/ D$ X( S5 R @; ]$ ]2 Q- k! ]
{
d1 L8 P% ?7 x7 S, k7 e
volatile long *addr;
8 d/ D+ i' X ]0 g1 U+ m
long save[32];
' S7 {( |5 {* k- i) E4 }+ ~
long cnt;
8 c3 M5 U; d, J% J) A2 l
long val;
; W3 H+ c2 R1 F& [4 j9 w
long size;
0 a; _. G0 B" I1 B
int i = 0;
7 K j1 l ^7 m0 q
- r$ u- H3 S& j' c+ D3 l1 ]. p
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
; [; F$ v2 y* i9 A
addr = base + cnt; /* pointer arith! */
& V8 d- R, i5 W9 z9 t4 |
sync ();
. q8 D/ e/ t# ~! V |) g
save[i++] = *addr;
+ a4 y. j5 g) r5 `8 y
sync ();
; Q7 g( C5 O: }3 [2 {6 M( W, V
*addr = ~cnt;
4 ]' l" w" D3 c; P0 c' i8 a# k4 F
}
# E5 J; S- I3 t A
2 y R" N, _* f3 @7 b4 O% d
addr = base;
2 b% A0 _- D6 c8 Y
sync ();
' g$ ^) r; p( N
save
= *addr;
/ j' G3 u/ v* {& Z& `2 i- E
sync ();
' y' [$ j4 x* W0 b
*addr = 0;
; B+ g2 G! [' w# }% j v
7 X. L1 a: u0 n$ m
sync ();
% p1 U" e. [' q1 {0 i4 X- j
if ((val = *addr) != 0) {
g5 } [1 c( j M) r. s
/* Restore the original data before leaving the function.
) q, W# w3 J7 j, N$ k$ c
*/
; O7 J6 W& U4 R R$ R! l
sync ();
- F6 U9 Z. Y9 E5 n( X9 g
*addr = save
;
' E2 Y4 f! _* k
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
# k' N* J5 F8 D2 h( e! B
addr = base + cnt;
m4 V$ G& t, p7 x# Y1 ?
sync ();
' u8 y- s9 @7 n4 S- T
*addr = save[--i];
6 @/ y) L" \1 W" j2 D" h
}
3 v8 M2 i; C8 Q2 Z" c& f9 D! ?
return (0);
9 ?: Q4 }, w8 d) a: n+ t, {8 Q
}
8 L# {7 {! _' ?: e* d' Y+ a5 F
1 a9 B: D/ d% L9 X8 a% ]1 I
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
5 o h; H3 c* s# l0 e9 m' Z" u
addr = base + cnt; /* pointer arith! */
! W: I8 D; @4 v$ K! w" w
val = *addr;
/ x# K7 M( ~4 m$ j; }
*addr = save[--i];
& c2 c2 s2 d; v: U3 d
if (val != ~cnt) {
# \; r% R+ W4 n
size = cnt * sizeof (long);
8 `3 [& k( o: ^+ d- h! H8 B
/* Restore the original data before leaving the function.
6 O& \+ x c* O7 j
*/
; T, v# L" B* `4 o& ]2 q. C
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
d. E; @* _0 K
addr = base + cnt;
" ?! E! W1 N. D% [ o8 E' ?
*addr = save[--i];
_ {* P$ v" @( Z7 L
}
0 F3 D( j* S# d; D- L4 X4 O
return (size);
- t3 x% J$ E f. K! ~; k/ r
}
, ^9 T4 @+ i9 o
}
; g3 w5 O9 \: |4 ^7 V7 u( J" B1 `
, g- K! P' ]+ S
return (maxsize);
3 Q6 O1 O1 D9 N. c
}
- z( f: O5 J+ j) c. [
int dram_init(void)
$ ` ]9 F* y9 J0 g$ l0 k
{
0 g# e* T) [/ D, X7 o+ I
/* dram_init must store complete ramsize in gd->ram_size */
{0 O+ `5 [( w$ Y, L
gd->ram_size = get_ram_size(
, v& A" E, j p( c7 H0 K+ D
(void *)CONFIG_SYS_SDRAM_BASE,
P. \/ I$ R' p+ t4 G3 b
CONFIG_MAX_RAM_BANK_SIZE);
* \! c; P/ n y$ Z
return 0;
9 z0 |7 H7 U5 v4 y" c- X/ W
}
- `7 `+ e% T* w
: K$ D. q% w/ W1 |
$ ], _; F' N- t2 b, c
/ S& ?3 [# n' p) \7 i- _3 Z c, q' a; o0 \
4 B; D9 L) y5 r4 C0 g p. H
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
F4 I! L! R1 [. t( U _
6 E# g6 D! g6 {% g% H
% k" }* K4 E5 t/ P/ ]/ I7 H
# z0 J2 m0 z! R( [ C
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4