嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
% p0 V3 @) t5 j$ J
核心板2:DDR2 256M Byte NAND FLASH 8G bit
' i9 \* Z, _' L$ \7 \5 Z
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
, I2 n8 [: B0 C# R4 J
) x5 U5 ]( A; b5 Z& w
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
7 N. \3 f& E5 c& J6 L1 Y; I7 q
0 X$ P. I W! r: w6 m. f" w( ?
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
8 I! g* N' K+ d( A0 J& |7 z" p
/*
! a8 `# O8 D/ Z3 E$ n& l8 _0 @* _+ M6 o
* Check memory range for valid RAM. A simple memory test determines
/ t. K3 [2 g' c1 p0 q* M1 U$ O
* the actually available RAM size between addresses `base' and
+ Q' [: A+ ~0 Y; v8 K
* `base + maxsize'.
) ]/ W! O; i- B2 G
*/
K, V8 h0 R2 y' d. x
long get_ram_size(long *base, long maxsize)
% b/ H. E+ [3 M; ]/ z& i: N& d
{
8 w, l9 a2 j) {6 P9 c1 n: L
volatile long *addr;
5 O" a) N- d( x' T; C0 Q
long save[32];
1 }% l6 h6 }" Z( @% F$ G
long cnt;
- k0 m# }3 k, z$ }+ h6 ?4 P% u
long val;
$ }& y! Z7 p/ Z- r+ G% \) x
long size;
/ k7 s9 ?$ H' K- g
int i = 0;
' z3 S3 D5 z( w7 U2 {) S
, U, h( L |* ^" i5 o
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
$ W" h4 j* b! A* F5 C4 T' t' J
addr = base + cnt; /* pointer arith! */
" K" Y# Q7 f" i
sync ();
( j+ d t1 K, d* F" A* D2 Q: G
save[i++] = *addr;
2 |% l" \- e/ s& z. W& X- ?
sync ();
& n) R d$ P# ^ r4 J
*addr = ~cnt;
( h. G9 z2 y0 I# C) Z
}
8 h2 @3 D: l3 n Q8 k9 x
% z) L- O3 h' v5 u2 I' W
addr = base;
; M2 N0 I4 H) G5 ?: q6 b
sync ();
3 l( M/ u1 F; @; Z9 R7 T, |: w
save
= *addr;
% P0 Q Y, \& ~1 Z {+ W. N
sync ();
5 x+ f+ }6 ^0 |; O5 x1 C
*addr = 0;
0 I) C+ o+ k3 x8 Z+ s; h
# T4 y* E8 X, E7 G/ u. G
sync ();
1 ^6 m$ X; ?* {5 [* w6 L+ p
if ((val = *addr) != 0) {
6 P" P2 s9 E, A* i7 c) b
/* Restore the original data before leaving the function.
; `7 s. {( U2 }! I5 s3 T
*/
# [4 b9 s+ R3 F- G) O, r
sync ();
$ d \1 y, E& C6 _$ ^" P3 x
*addr = save
;
6 w: g' ^0 r$ h- Q/ Z% c9 Q
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
+ l' d3 s: {) v: Z9 c" d I2 ^
addr = base + cnt;
6 U$ |3 X+ H6 c9 i
sync ();
9 ~ }- n8 C* k6 a& H
*addr = save[--i];
) L) j+ K7 V, p0 j/ u
}
2 I/ F8 u T! d5 x P
return (0);
( E9 @" O, I. D1 y) d/ ]
}
( {. c5 y5 P( b9 Z2 S' v9 g3 t4 ~
; F7 T y6 c8 z3 C" L. h
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
7 O/ ]* _* X5 L z* k1 O
addr = base + cnt; /* pointer arith! */
+ T5 [1 l1 s7 w5 Q
val = *addr;
: d* Y& r! P$ M$ V) Q
*addr = save[--i];
" @% q! v) v" @4 ]
if (val != ~cnt) {
- D7 T2 o) R5 d$ u' [
size = cnt * sizeof (long);
# @3 w z( {8 i, A! a
/* Restore the original data before leaving the function.
: ~9 Q) ?/ a2 J
*/
3 ?9 U8 n! ~6 h) F4 e% K: J: g
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
1 W; H" u: f2 i8 X& |& N/ c/ ^( \" U
addr = base + cnt;
$ J3 ?' f; Y0 }
*addr = save[--i];
, B) s& j5 v h( U1 _
}
; V4 K0 I- f3 x
return (size);
, B. k5 l/ ]' {! D1 k
}
6 G* J# e1 j$ \& A
}
M& @( R; }2 {
: _/ Y5 \) l6 p0 `8 j# [
return (maxsize);
& N' H7 u: V; W* Q
}
3 N) s/ E8 F- E% Q+ @0 K- \* e5 C
int dram_init(void)
+ I0 j! k' X6 \9 W+ O9 N9 t R
{
l7 G% x4 X, x$ r1 `
/* dram_init must store complete ramsize in gd->ram_size */
7 [+ Z; x6 t0 j, \1 m
gd->ram_size = get_ram_size(
4 [/ z2 ~; u5 F2 [/ r: Q! X9 K, s
(void *)CONFIG_SYS_SDRAM_BASE,
" T) ]# V% I7 X9 x
CONFIG_MAX_RAM_BANK_SIZE);
* l+ }0 \! |( W6 e9 j/ C
return 0;
! V$ }% V2 _/ H
}
) I. l1 i. `$ j: v' a
; G+ X8 X! L4 T9 a
Q9 q; Y. p2 Z U
5 C7 E0 q- z! i5 l
4 p! S) G+ ?0 o0 g: l6 u7 Z
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
2 N. J2 e2 x6 ]" b- L* B7 C$ C
# G; @4 f. `8 G9 I$ [7 x. T, N
9 b$ B0 m/ k$ @
. R% m- ?3 d4 Y9 @2 a/ |) O7 L$ m
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4