嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
1 k+ W9 z) I& s+ s4 m1 i F
核心板2:DDR2 256M Byte NAND FLASH 8G bit
9 @- b- E1 R" o1 l! k5 M! B! `
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
4 h, Q% I- g D% V) T& S
' Z0 T4 x& ~8 {3 c% V/ z
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
$ s7 ^) c8 g5 ^* H% {
* X4 Z" q7 U) s$ K, b
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
( y) g2 p* u+ x* b4 s: l8 R
/*
9 L; a7 U4 c3 F# w
* Check memory range for valid RAM. A simple memory test determines
5 x; I: S0 C9 I0 d+ z
* the actually available RAM size between addresses `base' and
- w6 C; C4 b& L6 \# ?
* `base + maxsize'.
F$ S+ v- O7 f) x: x+ M" v3 z
*/
@; h+ j* X* y7 Z
long get_ram_size(long *base, long maxsize)
, f0 r) E0 Y" [) D4 \8 Q' t6 F
{
. M7 j# j/ N" Y0 A. [' v
volatile long *addr;
+ W/ P0 H/ M' \! ?( |: ~1 A, o
long save[32];
% e* b# I% w9 b$ J3 Y) u( d1 x* Y8 C
long cnt;
+ |& ?0 Z. F6 c8 k
long val;
# B" T' V3 a8 _' D% _4 L. n: I
long size;
; Q" x1 i( V0 `! F; u' x
int i = 0;
, X- o" F. [4 E# g
) B( i+ M0 W5 J) g4 J
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
3 t R) C1 t8 \+ K5 h K% I8 w
addr = base + cnt; /* pointer arith! */
( B8 j0 p8 { D, }
sync ();
; P6 l( Z6 V/ F# H* }: m
save[i++] = *addr;
* y$ Z+ P. \/ V- y* B. u9 f
sync ();
^0 h+ G! v$ w9 E
*addr = ~cnt;
3 Q7 @3 O" u$ m, I8 j5 H% @
}
/ L9 y4 k* X/ g' G4 R2 @2 q. u( x8 x
. | e, `5 {& `
addr = base;
8 @/ }) Q6 K9 B, c7 P8 C/ n4 y' u# z
sync ();
, H2 p6 I- I X, C0 s4 Q9 v
save
= *addr;
. [, [5 U+ w$ D& O3 X
sync ();
m9 t2 X$ t" v- e4 O
*addr = 0;
" O6 f# G V: {) y- G
& J: G# n+ r7 v( G
sync ();
- R- P* p6 u0 R% V1 ~
if ((val = *addr) != 0) {
9 o8 v2 Z+ ]: i
/* Restore the original data before leaving the function.
1 [ Y% e+ t4 B( ?2 N7 o: B
*/
6 a e: M T M- u& I6 O' x- o0 y
sync ();
6 ^1 Z! K/ Z* f# {5 T9 B/ T
*addr = save
;
7 z9 z+ \% d% A: k- r$ n% |
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
+ i. F' m ]+ Y9 a. Q
addr = base + cnt;
3 a1 m# v* A$ B% a
sync ();
+ y5 \( O5 ~. n8 o0 @# Y0 H
*addr = save[--i];
2 Z {& [( C5 z+ l' F) B, e a$ E
}
& ]9 ^: V) x& G) i) Y; J2 @, {
return (0);
8 f+ I: ]) M4 ^
}
9 \. [5 w+ ]1 B- I
) k x) U! f: c0 I* t
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
7 b0 N, A D/ f/ c! \. p
addr = base + cnt; /* pointer arith! */
9 W5 n, e9 P0 A$ {, S2 w9 s
val = *addr;
* E A6 d) u9 y& A
*addr = save[--i];
. M: w( d* w0 v* ]( N. j9 n
if (val != ~cnt) {
/ b9 \; n/ N& P! T( E! y6 u
size = cnt * sizeof (long);
* ?$ x7 ~" d# [; l: ]
/* Restore the original data before leaving the function.
0 P7 D- a2 H* F# \ N# Y
*/
( s/ _2 Q2 J8 o- _' k
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
/ D! H; C% r1 c- ~" B
addr = base + cnt;
* ?6 Q0 x, `0 U
*addr = save[--i];
9 b$ }" E2 z$ O/ \1 H
}
0 D* J0 p) H* _1 r% U
return (size);
1 B" p5 z$ m* [
}
+ e6 A3 ~4 t& B5 ^
}
9 I) f- R( ^0 v0 |( ~
8 J# D3 q& r& j5 k% M, G: ^/ b
return (maxsize);
! t% B5 B; Q5 S0 h
}
, _4 S0 M' C6 P7 E$ {9 k, _' L
int dram_init(void)
" [1 T0 c% C# A
{
. |+ x$ d8 |3 Y7 h3 ?" ]0 g
/* dram_init must store complete ramsize in gd->ram_size */
; g% g" \. e) a) _8 w9 I+ i ^5 `
gd->ram_size = get_ram_size(
, m/ E( q! Y2 Z
(void *)CONFIG_SYS_SDRAM_BASE,
|9 n2 U/ i6 \# A' c
CONFIG_MAX_RAM_BANK_SIZE);
1 K) Z+ M2 C- L# z+ c' I
return 0;
& r' B$ e3 J1 u
}
9 [& k4 t1 T5 X) [; d
4 Z5 ~/ b. P8 Q0 T
6 S6 D) ]$ ~* m$ `* R
6 u5 Y# g9 F: k7 V* J& q
+ z4 c4 b @! N1 N5 m
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
2 Q- C6 ]) E F( Z
0 k, `7 e6 u- _# m3 R
- h+ E1 L' Y" z, X( f8 B$ }& ^
- C! z5 I! d2 Z u* ~4 @1 B( p7 [
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4