嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
/ i4 H5 X& L' j& U
核心板2:DDR2 256M Byte NAND FLASH 8G bit
+ B1 B z( h8 O/ ^& D
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
& K+ C3 K# c1 y
[2 Y/ r3 a5 x/ i# x H+ N/ m
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
6 h5 U4 u& s4 X- A: P0 A
8 \9 g% T+ k+ P1 d
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
3 |9 L/ @5 b2 X
/*
2 y3 O$ I- a, @8 l# {4 k
* Check memory range for valid RAM. A simple memory test determines
3 G7 {" o/ Q# {' F
* the actually available RAM size between addresses `base' and
1 u4 G4 S. m, `; P2 F7 V: p
* `base + maxsize'.
1 y3 X: G- |% T8 |5 w5 ?( I% m0 z
*/
( Y9 n: i9 Y# ^* O1 D' B% C; e$ I, l
long get_ram_size(long *base, long maxsize)
& q$ f& N+ w1 p% l9 ?* D
{
x- W: ?6 J8 f0 l
volatile long *addr;
3 _" o5 l3 Y, @
long save[32];
8 t+ ^( r2 g9 R) F' r! i
long cnt;
8 U! E/ M, t, q& Q) T1 y
long val;
: ~/ u% H0 y8 r$ l/ F4 R7 L9 q5 ?/ d
long size;
$ G. m0 L; p7 A: y5 D# T
int i = 0;
1 z" X( ]+ S) l% e0 Y0 {6 g
) A/ p6 t2 A$ i9 \# s8 o
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
5 M( X6 w. v9 d
addr = base + cnt; /* pointer arith! */
1 v' h' Z. g9 ^2 f
sync ();
! R: A! w+ [! y9 p' a) U
save[i++] = *addr;
9 x5 {) k3 D4 e1 m ~: w
sync ();
) Q' y! z# z6 g0 P
*addr = ~cnt;
, B; Y& C; g R. ]. u8 Q+ P" `
}
; x0 L; f6 k$ s. ]( J E: N
2 P, k7 X2 H& y# a* d
addr = base;
- X/ r. x B# I' t
sync ();
& S+ [6 C( [' a9 i
save
= *addr;
8 O, o# W; x% m
sync ();
( o; C9 y8 E* e [9 W# k1 L
*addr = 0;
; w) C& R! P, q3 a- q( T8 U
[" {. V$ u8 }0 k
sync ();
4 J' C2 G8 q7 g* H& g
if ((val = *addr) != 0) {
/ x5 |* R/ J$ S6 Y/ B O
/* Restore the original data before leaving the function.
& @* b3 n- b9 M- g. C
*/
7 K+ ~$ [" e) Q- j% U
sync ();
' \' N+ J; K1 f2 [! N# K
*addr = save
;
+ \4 U. h) D% {5 Y/ k$ H& x
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
, K5 ^, A8 `4 y8 \/ k6 G
addr = base + cnt;
2 j2 e! a0 N; `- k1 g
sync ();
G, Z$ ^( l; k- t$ \5 K' Q7 t2 A
*addr = save[--i];
- J, s! ^" P- f" E
}
( u( [" c. ?4 t0 z5 D' M1 ~
return (0);
8 o( u9 R7 N+ ]; ?7 y4 t
}
8 A. t3 _* U! y" T/ A" L
) G; T) f4 G" a: s( k
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
' R: c! @ e% U# y1 t0 N5 X3 u
addr = base + cnt; /* pointer arith! */
( z( {' b8 [8 g3 p) M, j; ]; z1 d
val = *addr;
2 y# h2 t# `* q3 ~2 Y
*addr = save[--i];
( f, G6 h) F0 z# A% o
if (val != ~cnt) {
# u+ ~. G' X; _8 `
size = cnt * sizeof (long);
% o" \6 k" [# e9 W$ E
/* Restore the original data before leaving the function.
* D) m' b1 l' n$ y4 ^7 _
*/
2 [# c; S' e6 w) n9 s
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
# X. x8 X! M6 q D2 x
addr = base + cnt;
3 X/ z7 |0 x1 u& O& x1 p
*addr = save[--i];
% a/ G' w" D* t; k$ E
}
J& S5 Y, l5 B& ^/ V
return (size);
0 }* X& |2 o' t i
}
: N$ F w0 {) S# F% T
}
' |* i% b, _: o! T% R& m
S& C6 l, I& ^5 r
return (maxsize);
1 d: r. b9 x& Y: c4 S; t
}
6 K/ h; k, [9 L6 ~' M3 L
int dram_init(void)
( w1 g% H# V, h9 ~/ ?. L
{
& [' \3 b8 s0 u. s! q8 ?3 d6 j n o
/* dram_init must store complete ramsize in gd->ram_size */
6 J/ V. V+ Y6 Y2 Y8 u8 l; F# R$ H
gd->ram_size = get_ram_size(
& o4 d3 U& O8 y
(void *)CONFIG_SYS_SDRAM_BASE,
4 U0 }3 A/ `! q) u- r
CONFIG_MAX_RAM_BANK_SIZE);
2 ~0 h3 J- m9 N* M3 L
return 0;
$ ^4 V" }. _8 G, p3 R! F
}
9 e8 V8 l; x4 }" E8 w4 Q& C+ d' M
6 ^% U% J8 Y$ {2 [& j U
* f% {9 _5 y$ N. x7 m
* ]$ X% J4 x2 F; X- u, u
" y4 ~; c+ W+ J3 Z
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
; l4 @2 }: l3 G) B+ U
! e; R0 v# n# J& G' I$ Y
5 k9 c5 l9 g- L# ?2 k9 e; h
; D! m# c3 L* |: S
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4