嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
" a" m) Z8 ]$ A" M( j- v1 r7 i
核心板2:DDR2 256M Byte NAND FLASH 8G bit
/ G7 p( o' w0 z
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
! O* b- E# Y6 A
6 h3 e. F( b; B+ J4 N
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
8 m9 D# d" T D
9 d+ Y5 X1 h. c( P
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
& W' v6 D& j. ?' J7 J2 p
/*
% H: r* G4 [8 ]9 E) A& b/ t
* Check memory range for valid RAM. A simple memory test determines
3 F J/ l( M1 g2 l6 \7 h
* the actually available RAM size between addresses `base' and
: U1 t4 M/ n( N5 I; v8 B
* `base + maxsize'.
% d9 @3 R# a# `+ U0 T+ m: X+ P/ K# C
*/
+ L: A f8 }) j) v/ c% W: V" b( I
long get_ram_size(long *base, long maxsize)
+ ]4 D# O& J; L: Y8 Z8 o7 G
{
% b$ m! W( U; e
volatile long *addr;
9 Q s3 C9 ?2 M1 |& x- Z4 w0 x
long save[32];
- v. s" T! l8 W
long cnt;
. L0 k& c! T8 u( T, w3 u
long val;
% \. k) \8 }4 m# K- M2 O
long size;
8 a4 |+ o7 A7 t5 A# w
int i = 0;
% M8 W6 r& S/ L" b' H5 V4 C
% A, q7 x( R0 r% Z3 f# }& I, x
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
% n" T& \# H0 e, p
addr = base + cnt; /* pointer arith! */
# i( |3 O5 G) Z- } e7 {
sync ();
. o" Q) g, s+ Z8 K* h' ]* w
save[i++] = *addr;
6 M8 L' W/ Y) B& o6 P$ U0 r
sync ();
^6 O( @* y6 _
*addr = ~cnt;
9 @+ H% |7 O; \, I4 ~; M
}
x! G! I1 R7 {1 W4 G
, ^* L1 v" l1 h3 p# h# N/ d& L- E
addr = base;
& D# r6 ^1 o- x6 b( A; F
sync ();
0 V2 J0 c$ Y8 H7 `/ y0 A
save
= *addr;
. r+ D& C3 ]! p2 d
sync ();
$ z) o7 c1 H& A, H- \
*addr = 0;
$ W" o7 l: y) Y- f \( r
4 I1 b5 A, F- s2 Q( K) n$ f
sync ();
7 A' g+ p6 [% f1 W$ _/ e' T9 X# W
if ((val = *addr) != 0) {
) h: Z8 T2 e" S4 V% X
/* Restore the original data before leaving the function.
m6 Q, S, b5 j7 s9 t$ h6 E7 c
*/
0 \2 u( j* g6 X. v' ?& q" ?
sync ();
( k) S* R5 ?9 U; y/ v* O
*addr = save
;
& }$ Z" o- E+ S( e
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
# u' ]3 p/ E; j/ d9 R
addr = base + cnt;
) |: ]3 T5 F! n
sync ();
/ f+ x4 J" W* G ~; Q% V s6 H
*addr = save[--i];
* C R7 e# O) |% |6 m( O
}
: g! \ d6 }$ q. Q5 x- N; M
return (0);
. E7 b9 p9 s& |+ d4 w
}
. p: t% `0 Y* `* B' e' @( E0 l* V
) j) o2 L" i) y# E/ k" q2 Q: w9 q# X" o
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
2 K0 A" ?3 E! L
addr = base + cnt; /* pointer arith! */
5 T- i2 C, K2 K6 m8 a ~
val = *addr;
2 g7 }4 u1 `; r+ D1 m
*addr = save[--i];
, G P6 I/ {0 `
if (val != ~cnt) {
: e. F- Q$ ]+ f7 T" v" _, I
size = cnt * sizeof (long);
- S& G/ z9 x+ @
/* Restore the original data before leaving the function.
) T0 t. O" V |
*/
4 T. _$ D [. p$ F
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
& h# z% d5 o2 W E0 ~
addr = base + cnt;
# @4 D& W( j: z7 p
*addr = save[--i];
0 U+ b! m* X1 Z: ~- u- t( n
}
$ H' X/ B% I! ?0 |& N Y4 y8 F& ?2 _) y
return (size);
8 A& L1 y( j6 `: f, r
}
6 C5 t0 D- H9 X; i
}
! o. {2 o2 K4 M3 D6 ]
6 N; A' z0 ^' w* [
return (maxsize);
6 \4 D/ r8 ?6 [; a3 k: r
}
7 M& N& C. n( o2 u' H* D
int dram_init(void)
% r1 B* w- {0 t2 G* A0 ?
{
; S1 D/ S) x6 [: c# }0 N
/* dram_init must store complete ramsize in gd->ram_size */
# B! X0 _: w7 m) s* Y9 E
gd->ram_size = get_ram_size(
6 a; W& A: { g; ?% s8 B7 x% Z
(void *)CONFIG_SYS_SDRAM_BASE,
( a+ N' F1 ~1 y
CONFIG_MAX_RAM_BANK_SIZE);
' J$ r8 B$ E* q, k4 J
return 0;
* J4 h( y' O: F
}
& m4 z& ~; }0 E8 s
e5 `6 z4 l" O+ a6 P2 r, X
, ~( o6 E' ^- y# B( }5 y$ ~
* [* d0 D/ q, }5 X: w4 k
V, A, w1 h: z4 u: Q1 Y
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
% ?% k' J- Z( p0 \0 l2 S
6 F) {( c- ?* }+ v
3 E8 O3 e8 I1 q5 v7 e
Z" F3 X2 e+ p+ o8 W- h+ q t
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4