嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
8 i0 ^6 n; T4 T' E2 o+ R; E2 [
核心板2:DDR2 256M Byte NAND FLASH 8G bit
9 `3 T, |0 U1 F/ I
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
) n2 Y7 D" C/ ^7 F# ^
) P* }2 D9 v1 e, h/ Z! q
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
9 ]$ N# j" y2 N5 l
8 M& j! ^- a/ [# M2 e4 ~) g! U
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
0 q1 J Y4 x! z3 j2 X9 c6 o
/*
0 }7 g: a1 H: x7 p# a
* Check memory range for valid RAM. A simple memory test determines
+ h+ u e! d& j; N, o
* the actually available RAM size between addresses `base' and
# S" p& v& ?1 D1 M. t! \3 r4 Y
* `base + maxsize'.
" E3 }0 p. k$ L8 W
*/
" Z" m$ k4 Z6 ~# u
long get_ram_size(long *base, long maxsize)
! ^" L) z) z8 ~
{
; y$ N3 c3 p" V3 Z% B2 j
volatile long *addr;
* U+ ^5 ?, @9 N) w# x
long save[32];
P) @( G6 d$ p9 `- `& E' X+ J
long cnt;
$ p# b7 r* X7 c5 n* W" t3 S9 l
long val;
/ p8 G& g- T9 d* c" _+ u; }
long size;
& W# n. r' f& d, V Z f. V' e
int i = 0;
+ G P+ u8 U* t* ]
! ]5 O M& w0 Y. m
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
, O8 _* C0 ^3 I6 c8 ^) P+ D
addr = base + cnt; /* pointer arith! */
: z+ y2 \* u! G6 S2 @+ S
sync ();
$ i; V4 p! e) F+ n) x4 u
save[i++] = *addr;
9 v0 a" P- q9 P
sync ();
9 H1 ~8 R9 \/ @2 ~- v6 m% ]
*addr = ~cnt;
( h+ \. j0 p5 `( g& N
}
9 d2 t( w/ Q, X6 ~
7 D* h' C5 |- n3 q0 j+ A
addr = base;
) M+ V3 y7 B5 n' [& }' x3 u/ j6 v
sync ();
6 U5 P1 @% G9 T5 l2 `) C
save
= *addr;
5 Q$ J: B6 U# n; T' h' J) p- V
sync ();
8 k0 E$ z' j. f9 t4 }( S
*addr = 0;
4 ^) L O! M1 V* \5 U F! X4 J) J
) e& X1 ?6 J. s0 t; g4 ~. S% t9 F
sync ();
V, J( t! [! R' D/ O. [$ R
if ((val = *addr) != 0) {
" L. M6 \ F' J0 j1 M3 h
/* Restore the original data before leaving the function.
6 V/ _* q9 O4 W; o9 f; Q$ _
*/
( a1 V* q8 u. u3 c2 `& c
sync ();
. F. R4 `0 K+ T' E/ }
*addr = save
;
2 Q) _. Q Z. k u2 D: P
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
' K& `! L8 C" e) E: _
addr = base + cnt;
# v/ \# W8 a. e6 }
sync ();
) l$ V4 C& a. f# y; W
*addr = save[--i];
4 z+ D$ |6 X( a% G$ Q
}
* j$ X, R. i$ ~2 g0 t0 `5 N
return (0);
. ]7 j' ~2 d( Z8 k5 q
}
$ V7 {3 {2 _1 D0 Z: ]% G; P
* i6 m" h0 I; \" H! [4 M& D
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
- P( H6 U9 d1 n2 m4 [5 j
addr = base + cnt; /* pointer arith! */
; M5 s& v" U6 e) g' d" Y# |
val = *addr;
4 s& ?! X& G) u; e* N
*addr = save[--i];
1 L$ b! N: e8 g+ x: ?* j5 ^- {7 `
if (val != ~cnt) {
# s; s7 I' C9 R% r- r# H
size = cnt * sizeof (long);
2 y& s4 `$ v4 B4 ~. c
/* Restore the original data before leaving the function.
% `6 r! [9 E2 O! P2 l
*/
) G4 x0 z+ x2 S( b& \0 ^
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
' Z' o: [, `& s1 @
addr = base + cnt;
& S" {6 W2 J6 B
*addr = save[--i];
* l5 b. `' A( K
}
/ b, k0 `' r9 X, I0 M' U2 f
return (size);
* @ m6 A: ?0 w M+ n3 c
}
8 F3 n. R1 _0 Z) ]" Q; N" C
}
* |) `" v) h* d/ k4 Q
( ]; W' J) ~; X$ A" K
return (maxsize);
) k6 M4 k0 C0 O# v
}
m" J3 S8 X) C8 c" i; }
int dram_init(void)
) S% R( D& b c8 }6 Y5 w8 Y
{
* H# z' b+ Y0 v( A0 m
/* dram_init must store complete ramsize in gd->ram_size */
9 t. |+ I& y9 P+ \" A
gd->ram_size = get_ram_size(
4 ^5 X& i+ } ]
(void *)CONFIG_SYS_SDRAM_BASE,
7 c7 i. X" l* N
CONFIG_MAX_RAM_BANK_SIZE);
* c' C* } E- i
return 0;
) E( s3 ?. R9 P! P
}
) y6 F+ ]: O" V8 k6 p& q
+ r& o& n0 }7 p* K( Q
1 { G7 a+ Y2 f" [* e9 m! P2 i' E2 X
7 S- _3 B2 w9 |: Y' w6 q) Y
4 D- p3 V! r5 g" ]4 D
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
2 Z, F! w" D h# o) j
- O! o- S3 x, ~6 O+ L
9 a4 h5 i$ X2 _8 q
& w, D$ O) [7 n8 [) K+ m
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4