嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
" b8 u6 ?: K' _7 o3 d
核心板2:DDR2 256M Byte NAND FLASH 8G bit
2 p7 @0 R% c5 v$ W8 @0 [) u
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
2 Z9 b# d* r, Q
' N* ?- A- l8 h# d. n! Y9 d
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
1 s9 `2 B7 K* q) s: L: ]+ u, @, n
9 G a1 v+ A. o3 j
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
7 g" V7 y6 z# x7 ?
/*
( v; r5 f* T0 K e: d. ]
* Check memory range for valid RAM. A simple memory test determines
9 K. Y0 j5 M+ B& J" M3 ^& K8 f: E
* the actually available RAM size between addresses `base' and
$ q! d9 H/ Y5 x9 u. h
* `base + maxsize'.
, E( ^- x: W3 C. h* k
*/
$ T; ?! f9 | m7 U$ ?) G1 ^
long get_ram_size(long *base, long maxsize)
, x7 A% i, l9 S) l* r, {! k
{
2 e: e9 j9 Z$ i" j9 N
volatile long *addr;
' t) o$ @! T0 C# l6 E! D
long save[32];
# V5 a" H. D7 p7 @) \
long cnt;
& r9 T$ s2 s/ w4 C$ V7 F
long val;
Y+ b4 o/ n! i0 ~6 w# l. v
long size;
1 `* B- y! U; [8 y; U2 |6 v& \
int i = 0;
0 v6 B2 s: `) O; o
. e8 Q$ o1 _" y G7 {* t
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
/ }8 c! ?2 B8 P% L
addr = base + cnt; /* pointer arith! */
# |; Y$ u) ]2 K
sync ();
) @! ^0 c) u. d& v! I3 T. h
save[i++] = *addr;
" Q. h$ W- l2 N1 G& ^* i2 P
sync ();
. [; \! X5 C# g8 p |+ b4 V
*addr = ~cnt;
2 k8 m& A4 A c2 n( D
}
8 {3 [5 O% g- M. w" b$ @1 b0 e
1 S7 T: o! r+ J) ?$ Y! t: z' ]- R4 z4 Z
addr = base;
: X# |. x5 P- E4 d; I
sync ();
+ Z6 j# ]3 f# q$ m! s! s
save
= *addr;
5 \4 i+ C \6 U, z6 q
sync ();
) V" |3 n8 [3 A, G
*addr = 0;
% U/ o2 S1 G, E c: }+ T, I) _7 i% J
% }' M0 L8 O5 \" j( w1 s7 l( x
sync ();
& e: B# r) ]" o/ r# X
if ((val = *addr) != 0) {
o- Y/ q4 r3 |! h7 W7 L) j% i
/* Restore the original data before leaving the function.
* `5 f. |/ M- Q* I
*/
6 K8 i. O/ y0 A
sync ();
5 F1 d/ g& Q1 O# X
*addr = save
;
) D6 e& s" X1 K1 _+ I
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
- k4 [# C% l5 g" E) F" ]! X
addr = base + cnt;
& i+ R. ^' O- q
sync ();
* ]* K9 k+ `2 g* M: x
*addr = save[--i];
$ Y: ] Y3 s! M5 Q5 L; K' @
}
( |0 D6 s; U! v# U
return (0);
" _7 M+ S& A0 Z" e9 [( ?! `5 _; S
}
- y9 z% x/ x- _- w
$ b$ ?, ^( g; E6 \" z- B
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
0 I% F3 C2 D! y, D* J. w
addr = base + cnt; /* pointer arith! */
3 q j* `. E {% }/ c* D
val = *addr;
H, w7 Q' j! C& }0 Q$ c
*addr = save[--i];
/ e# H# ~3 p! }: C! A* d' H
if (val != ~cnt) {
, S( v. W6 ^" q/ B$ Q6 r+ \
size = cnt * sizeof (long);
& u8 v- Q# T% b8 R: u# m: |
/* Restore the original data before leaving the function.
) W; A D+ v4 n* `
*/
" Q4 @: S+ d( }& U6 f8 T' E" ^- j G
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
9 [) K1 \2 Z! Q& Y' p' p, A# E
addr = base + cnt;
& ]2 F( L0 ]4 V# w$ N
*addr = save[--i];
2 [; k/ R' p9 z1 `" `7 I
}
7 F: d& Z" ~( Q
return (size);
4 C& e7 [2 m# o: A
}
9 {( G* `$ W9 X. R$ G5 Y) Z2 O
}
8 }$ S6 s) T2 \7 p
! A- K: ]$ v# P: @% k
return (maxsize);
( \& @% C) _& Q5 O
}
$ R( @2 k* r- w0 i
int dram_init(void)
. z) S) X: z6 D9 R0 j- P
{
+ W& M+ v+ |' \, N- S
/* dram_init must store complete ramsize in gd->ram_size */
: x: P' R4 J. W4 ~) Y" f
gd->ram_size = get_ram_size(
3 [, Y9 ~( ~/ I
(void *)CONFIG_SYS_SDRAM_BASE,
) k, G& ^+ G: @, H% ~+ I
CONFIG_MAX_RAM_BANK_SIZE);
1 D% U- X' R! z/ \) K+ i& z
return 0;
8 T' A4 ^: j$ E5 ]4 J
}
8 M$ \& \! u* {* ` `
0 j9 v$ R; `7 y- M# j |. W$ k
. f3 a/ v) E% U5 o# s6 t4 K1 E" R
. ?/ j2 O) Q$ z- M R W
6 Z& B0 M8 I, b" |( g4 g Z
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
' E5 Z! z+ U# {2 O% a/ O
0 a$ U, l1 W8 p( U* \
8 j/ Y0 Z" \& ?- Q" V3 x! {
$ p# W+ f# H" N; f/ U, ?: }
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4