嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
; p; S$ O; K* }% |1 B$ i
核心板2:DDR2 256M Byte NAND FLASH 8G bit
; x/ G7 r+ m8 A1 a1 ]4 u- |
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
, a6 ^( i: N8 v8 r4 L7 s
* f+ D3 _/ a; a4 E! v1 J! D
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
9 x4 N. D) }4 j+ @7 T% G
, s7 h- @( I6 D) f
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
1 u8 G& \6 o) _& e4 ]2 A: E
/*
: J8 X/ x" }# p- [7 E. A3 J* {
* Check memory range for valid RAM. A simple memory test determines
. y; H! g1 O" T3 ?9 c7 x8 t3 F7 `
* the actually available RAM size between addresses `base' and
0 {- r2 {6 L5 x. O/ G. G. ?! j
* `base + maxsize'.
8 K0 I& W2 i# z& _2 @# P
*/
9 S, [( O) z# u& ~0 |" T. V6 `
long get_ram_size(long *base, long maxsize)
4 H, _/ s# s5 Z0 u& _
{
7 e) x/ M" _& y3 B
volatile long *addr;
5 a" w8 Q1 Y0 h8 g- [4 n
long save[32];
2 G) T' }% d2 R: o
long cnt;
6 z3 G9 p8 ^ C! S1 w6 \
long val;
- |9 ^# q0 V0 A$ B: c; @# C) U
long size;
% p! z) R8 L, R: H2 G {6 J
int i = 0;
0 X9 H) r8 T& o
* Z: W2 c( ?. F
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
! Z' t- v# w" N6 f4 t- d2 t
addr = base + cnt; /* pointer arith! */
4 S: t) C9 ] B6 I) Z6 J
sync ();
) ~& L8 O7 K, d2 N
save[i++] = *addr;
% _/ ~/ N$ i+ Q; J/ q* Q5 K% z) a
sync ();
( y. U9 m) |5 t8 a- L, ?; T
*addr = ~cnt;
" C0 \% a2 }( ~% T8 {+ q7 b
}
/ Q! ]' _8 I6 t: A4 P5 r5 b
. Q, |8 |! d; ] y( j% \! x5 Q- `
addr = base;
+ l! U4 c7 S) J! n8 C
sync ();
& N7 h0 [4 _' i! w' Q# i" n
save
= *addr;
: ]5 A- U8 Y0 M/ Q2 i
sync ();
) D1 l8 f C* m# j' K4 Y, t* ^
*addr = 0;
) V; Q; P& I6 F7 c% }4 o' L
4 E8 N2 h! K7 D' k
sync ();
' \3 X/ h* G/ w8 z$ S, j9 Q8 R c
if ((val = *addr) != 0) {
' A7 B5 B( `/ F0 G
/* Restore the original data before leaving the function.
/ h5 P8 e5 |! ^; o) J1 k0 O
*/
4 `$ g6 U5 |* |9 {3 Z
sync ();
6 _& l! S8 z( B' J* @ v
*addr = save
;
6 r1 |* \# G. m7 a( A- d9 H
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
' T0 B6 {$ G% l6 B8 e0 P$ ]$ g/ g% A
addr = base + cnt;
8 D0 u: S8 z6 E
sync ();
) o2 E$ f2 M: F% |/ [/ K
*addr = save[--i];
! ~ D1 W3 r& t% i
}
2 w; a+ W- o% y7 U% I+ T/ Y
return (0);
& \+ }" c3 {% D
}
5 \/ B% O3 K2 \$ j
( _8 u3 S( r# U. l0 y1 @. l! j* n
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
( Q t1 C* F5 \/ T7 ^4 |4 ~& e) R
addr = base + cnt; /* pointer arith! */
$ f4 G; ~! w5 ~8 y
val = *addr;
/ V+ \9 l( v, o8 }* D* _( K- R
*addr = save[--i];
5 p1 @$ P- G* | P
if (val != ~cnt) {
2 v1 X( p0 u& |, }) v% G
size = cnt * sizeof (long);
_/ I1 f' l$ b; ]" ^4 [) Y: |. B
/* Restore the original data before leaving the function.
' I! G: b+ p# E
*/
0 w$ A3 T/ R g
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
# G w7 w' w, X0 y% i2 a B) X
addr = base + cnt;
% G4 [1 ^" g% z4 O+ @
*addr = save[--i];
( Y- o* W" j% t( {
}
, J: o7 a% O! T3 ^
return (size);
7 I' v' h- t7 [
}
8 A) K& e6 z0 i, X+ }
}
" d G. D2 k5 m q
& B$ h+ U& |. M7 e5 I0 m0 A
return (maxsize);
5 {' O" v/ I% Z. c
}
1 e9 N% D0 M3 `8 d2 ?
int dram_init(void)
4 F+ ^7 L7 N0 j8 i
{
4 j; H$ M* Y3 k1 w+ D6 F
/* dram_init must store complete ramsize in gd->ram_size */
/ Y% `$ S* _. |$ J$ y# L
gd->ram_size = get_ram_size(
! E/ k6 q" x$ ?/ E5 |' X
(void *)CONFIG_SYS_SDRAM_BASE,
( r k: h3 e6 q ]# |
CONFIG_MAX_RAM_BANK_SIZE);
1 r8 c$ S8 y$ @ G* u& Q
return 0;
0 w0 P7 |/ m& j, |
}
9 S; C/ V3 ^$ L% j6 J
7 `% `, j9 w: ]0 _
" b( H! {( }3 D) g. V6 d7 c
) }( L" v7 u, P* D f" G/ {
) E& }3 N) Y7 P# g
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
4 W {- [. J! N, Z: H' F$ g
2 J, d1 ~' R5 L6 {- }
) I4 T8 O# W3 b, ?/ y; l5 x
4 A$ t- h6 P0 |# d9 ^( Y3 S' e
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4