嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
7 r5 Z8 ~0 y1 N* H* Q* y4 J! s
核心板2:DDR2 256M Byte NAND FLASH 8G bit
, R" X C8 F) \8 A% Q$ q
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
- Y) _1 [/ Z# w# T" O2 P
( @9 d2 d H, E' d1 B+ M4 Y
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
! L- l! A, @1 j3 U
6 A0 t4 H, X. G
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
: r/ I9 q; H" F. b$ V P
/*
6 K. a' P- o& _' S9 X
* Check memory range for valid RAM. A simple memory test determines
C5 \- k' y+ F; ~
* the actually available RAM size between addresses `base' and
* p: I% M9 R4 E. `8 c+ p4 f
* `base + maxsize'.
$ _; ^" d5 a# |3 g3 S3 o
*/
/ F1 K; `* k/ I4 w
long get_ram_size(long *base, long maxsize)
3 j% a6 R- R. ]) \5 A6 L
{
A2 f3 x v+ K! t3 q
volatile long *addr;
$ Q% |1 D5 a- h( P- Y6 Q2 H
long save[32];
& W/ P0 h7 { G; r1 P7 v
long cnt;
) m d1 G6 W* r) ^
long val;
" Q! Y* e' V+ R; W$ N
long size;
. K* {7 c( ~/ D0 C. S9 U
int i = 0;
( Y. t9 k2 C* ]5 k7 }
) M1 J8 _, t4 e
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
% V6 J( ?% {- a' x- @) Y
addr = base + cnt; /* pointer arith! */
$ E2 j5 H* h' D+ f/ Y3 ^4 F
sync ();
H1 B5 I% ?# D5 \ |
save[i++] = *addr;
5 N& P( i5 s* s0 t
sync ();
# c0 y0 o) k7 \4 B
*addr = ~cnt;
; z K4 V/ o4 y9 N
}
8 T" L% _& A* [* X, V# F R( i1 s
; T7 R% H/ [3 p' a, v8 f, C9 N
addr = base;
+ P/ C ^0 y3 w
sync ();
o% ]! X4 s2 {" o5 V5 G9 V
save
= *addr;
0 g: m2 Y5 {) c2 {4 o
sync ();
/ ?4 i! B; i8 K" e
*addr = 0;
: C n7 \, g+ K2 X
t% X- b# n5 `# @( [: g0 D
sync ();
: [8 X, A" Q% w# v
if ((val = *addr) != 0) {
; j8 I0 E# I1 @6 m7 K L6 @
/* Restore the original data before leaving the function.
1 g- a' B- u! N$ ]
*/
' D& z% X0 G0 _6 H, D. b6 M' e
sync ();
7 i. v6 d& H" e& D
*addr = save
;
/ A1 K7 v* D% v9 j
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
2 ]5 c8 e# w6 I1 s2 }- F
addr = base + cnt;
6 O9 ]; e+ S2 j( C+ V4 l
sync ();
" _, |7 I4 \- ~
*addr = save[--i];
. {& u5 f1 @1 Q6 ~8 G. Y
}
, ]% e# ], r; D1 @' W. O e( M- V
return (0);
" r8 T1 Z/ ^8 N; W+ N
}
( ~# b( ?6 x3 e2 z# i6 e9 F1 X
; h+ Y8 @5 x. H9 g# _: o$ Z) h
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
5 Q: h# [/ c1 K0 W; z: Z
addr = base + cnt; /* pointer arith! */
6 U4 Y- X, |* x! m
val = *addr;
+ _3 H: s) d; W
*addr = save[--i];
8 Z5 _$ G- ^& n. z1 `8 W9 X3 r
if (val != ~cnt) {
5 h" F3 C9 U- o) P; X Q; V+ ~( x
size = cnt * sizeof (long);
/ u' t6 \2 R& G8 k. v6 O9 x( j
/* Restore the original data before leaving the function.
! }2 h4 R, B: K. U7 q7 a5 i5 y
*/
+ O) |6 ?1 W9 v2 Z3 P' v9 Z$ k
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
) t: M- c: q; H) A
addr = base + cnt;
1 @* w# y7 ?, k+ n( a8 d6 b
*addr = save[--i];
1 C, r% O- b0 f \
}
1 s: [$ G. e! x* E/ g) P+ G
return (size);
9 @: \; `( J1 t j" R$ e
}
! u9 m; `* Y* j Q8 P+ \: X
}
% v5 Z" {. ?/ m
' U4 Y2 ?7 l+ `0 P: P6 B! m r, L
return (maxsize);
9 I( a6 t* y9 [
}
. y4 o P9 P |3 u
int dram_init(void)
3 }8 P* L% B4 j4 a' S) i( w
{
$ Y7 b$ V3 x( D3 G+ \
/* dram_init must store complete ramsize in gd->ram_size */
/ }/ v* e; P2 b7 k: Z6 |, L' S
gd->ram_size = get_ram_size(
, P& D- x |( c
(void *)CONFIG_SYS_SDRAM_BASE,
* N( j9 ^3 N- F1 U/ @
CONFIG_MAX_RAM_BANK_SIZE);
9 G$ |/ n4 U! q; ?3 Q
return 0;
+ Z( J# d0 ]( i4 E, A/ G
}
( U7 @3 ], C) I0 U4 }1 _
2 O" o1 i6 C& W) [$ G$ Q) j
1 _: S( s4 d% W8 k# K2 K, Z2 W
5 ^3 _$ n* w s1 U; a
{* h, u* ^. k
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
; i% k& P+ N, i3 z
: w( t! e9 S3 q1 D2 |
: P( v- S0 H" C; s. V
8 C# H& b/ Y& h( b! I5 z1 K7 r7 B, j
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4